Guide · 使用教程
Turbopuffer 混合检索教程:BM25、向量召回、RRF 与权限验收
用官方 Python SDK 以公开演示文档搭建 Turbopuffer 混合召回,检查 BM25 与向量融合、权限过滤、质量、冷查询和真实费用。
这篇教程用一小组公开的演示文档,把 Turbopuffer 的 BM25 与向量检索接成一个可检查的 RAG 召回层。流程是:写入带文本的行 → 跑两路查询 → RRF 融合 → 人工核对候选 → 再把候选交给生成模型。示例不上传真实客户资料,也不把 API key 放进浏览器。
开始前准备
- 在 Turbopuffer 控制台创建 API key,选择支持目标 embedding 模型的区域。以下示例沿用官方文档的
gcp-us-central1和nvidia/nemotron-3-embed-8b,换区域时先查模型列表。 - 安装 Python 3 和官方 SDK:
python3 -m pip install turbopuffer。 - 在终端设置
TURBOPUFFER_API_KEY环境变量。密钥只放服务端环境变量或密钥管理器,别写入代码、聊天记录或客户端。 - 为这次演示准备独立 namespace,避免和生产索引混用。注意官方没有免费档,试跑前在价格页确认最低用量和账户预算。
第一步:写入同时用于 BM25 与向量的文本
保存下面代码为 hybrid_demo.py。这段代码按 2026 年 10 月官方 Python 示例整理:full_text_search 启用 BM25,embed 让同一 content 字段生成向量。示例仅用三条公开句子说明路径;真实 RAG 应保留文档 ID、页码、来源和更新时间。
import os
import uuid
import turbopuffer
key = os.environ["TURBOPUFFER_API_KEY"]
tpuf = turbopuffer.Turbopuffer(
api_key=key,
region="gcp-us-central1",
)
name = os.getenv("TURBOPUFFER_NAMESPACE", f"rag-demo-{uuid.uuid4().hex[:8]}")
ns = tpuf.namespace(name)
ns.write(
upsert_rows=[
{: , : , : },
{: , : , : },
{: , : , : },
],
distance_metric=,
schema={
: {
: ,
: ,
: {: , : },
}
},
)
常见问题
- Turbopuffer 会自动生成 embedding 吗?
- 官方示例可在字段 schema 中设置 embed,用原生模型在写入和查询时生成向量。也可以使用外部 embedding;模型是否可用应按区域查文档。
- RRF 能代替 reranker 吗?
- 不能完全代替。RRF 合并多个召回列表的名次;若要更精细地判断候选与问题的相关性,可在应用层增加二阶段重排。
- API key 可以放前端吗?
- 不要。长期密钥放服务端环境变量或密钥管理器,客户端只调用受控后端接口。
- 为什么两路查询都要加权限过滤?
- 若只有一条分支过滤,另一条仍可能召回无权限文档。融合后的结果不能替代前置访问控制。
- 没有免费档还能低成本试跑吗?
- 可以用极小的公开演示数据试跑,但官方没有免费档,Launch 每月最低用量为 16 美元。试跑前设置预算并查看当前价格页。
- 教程里的代码已经替我执行过吗?
- 没有。示例按官方 Python SDK 文档整理,需要你自己的账户、密钥和网络环境;上线前应在隔离 namespace 中运行并核对结果。