RAG 全链路(二):向量库选型与混合检索
按查询、权限过滤和运维条件选择向量库;解释向量与词法检索的互补、RRF 融合,以及 ANN 召回和业务证据召回的区别。
更新与核对 · 2026-10-11
上一篇准备了可追溯的文档块。这一篇解决“如何把正确的块找出来”。向量检索适合语义表达,词法检索适合明确词项;选库则是吞吐、过滤、更新和运维的综合决策,不能只拿向量条数划线。
Embedding 选型要覆盖真实查询
先从公开检索榜单筛候选,再用自己的中文、专名、数字和跨段问题验证。维度更高不自动更准确,比较质量之外还要看编码延迟、批量入库成本、查询吞吐和版本稳定性。
文档和查询必须使用匹配的模型版本、预处理与向量空间。有些模型需要不同的 query/document 前缀;只有明确支持降维的模型才能按其规则截断,不能任意裁掉向量后半段。
换模型通常需要重嵌入并重建相应索引:保留旧索引、后台构建新索引、影子比较、灰度切换,最后清理旧版本。不要把新查询向量拿去查旧模型索引。
向量库:按约束选,不按“亿级门槛”选
| 方案 | 适合的起点 | 要实际验证 |
|---|---|---|
| PostgreSQL + pgvector | 已有 PG,需要事务、联表与统一备份 | 过滤后召回、索引内存、业务负载竞争 |
| Qdrant / Milvus 等引擎 | 专用向量服务、扩展与过滤需求 | 部署复杂度、更新、租户隔离、恢复 |
| Chroma | 本地开发及其支持的服务化场景 | 使用版本的持久化、运维与伸缩能力 |
| FAISS | 自建进程内检索、离线实验 | 它是索引库,API、持久化、权限要自己补 |
pgvector 是已有 PostgreSQL 团队的合理候选,但较小规模也可能因高 QPS、强过滤或独立扩容而选专用引擎;专用引擎也不只服务亿级数据。做一次包含目标峰值、增删改与备份恢复的压测,比照抄规模规则更有用。
HNSW:近似检索的“召回”是哪一种
HNSW 是近似最近邻索引,用较少的候选探索换速度。以 pgvector 为例,ef_search 影响查询探索范围,m 和 ef_construction 影响图构建;调大通常付出延迟、内存或构建成本,不能只看一个质量分。pgvector 文档[1]
这里有两个不同指标:ANN recall 对照精确向量搜索,看近似索引找回多少真实近邻;业务证据 Recall@k 对照人工标注,看答案所需证据找回多少。精确近邻也可能不是有用证据,二者不能混用同一个“95%”验收线。
权限过滤是必须项,但“不加思考地写一个 WHERE”不保证候选充足。pgvector 的近似索引查询可能先取候选再过滤,导致结果少于 k;迭代扫描、提高探索范围、分区或部分索引可改善。稀疏租户和严格过滤条件应单独压测。
-- 示意:距离算子必须与索引类型一致;真实权限由服务端给定。
SELECT chunk_id, content
FROM chunks
WHERE tenant_id = $1 AND source_revision = $2
ORDER BY embedding <=> $3::vector
LIMIT $4;
租户 ID 不能由模型任意选择。数据库行级安全或服务层授权要覆盖向量、词法、重排输入与引用展示。未授权文档不能先喂给模型再从最终回答删除。
混合检索与 RRF:融合排名,别直接加原始分数
向量检索能找到“意思相近”的段落;BM25 根据词频和文档长度排序,适合错误码、题号与明确专名,但中文分词和符号规范化同样重要。纯 BM25 也未必保证精确命中。
两路分数尺度不同,直接相加可能让一方压倒另一方。RRF(Reciprocal Rank Fusion)按排名融合:
RRF(d) = Σ w_j / (c + rank_j(d))
c 是平滑常数,常见实验起点为 60;w_j 是通路权重。未出现在某一路的文档,该路贡献为零。输出 top-k 的 k 与公式里的 c 是两个参数。
例如文档 A 在两路分别排第 1 和第 10,B 分别第 3 和第 2,等权且 c=60:A 约 0.03068,B 约 0.03200,B 排在前面。融合后按 chunk 或父文档去重,再进入重排。
图 1 · 两路都要受相同授权边界约束,融合质量由真实查询验证。
混合检索是值得测试的常用基线,不是所有语料必须启用的定律。精确题号可先走结构化查询;语义开放问题才更依赖向量。Embedding 服务失败时词法可提供部分能力,需明确这个降级的质量范围。
三个指标与一个常见误读
| 指标 | 衡量什么 | 局限 |
|---|---|---|
| Recall@k | 已标注相关证据中有多少进入前 k | 依赖证据标注完整性 |
| MRR | 第一条相关结果的倒数排名平均值 | 不衡量其余证据是否齐全 |
| nDCG@k | 有等级相关性时的排序质量 | 依赖分级标注规则 |
若标注有四条必要证据,前十找回三条,Recall@10 为 0.75;第一条相关证据排第二,该查询 reciprocal rank 为 0.5。多跳问题可能三条都“相关”却仍缺最后一条决定性证据,应补测证据完整率和最终答案正确率。
Anthropic 的 35% → 49% 指的是相对失败率降幅增加了 14 个百分点,不是业务召回率直接增加 14 个百分点。实验数据及限制见 切分篇。
运维与调优顺序
- 先建可追溯评测集,分中文、符号、强过滤和多跳查询。
- 对照精确搜索测 ANN recall,再测业务证据召回。
- 比较纯词法、纯向量和融合,保持语料与权限一致。
- 调探索范围和候选数,联合看 p95、成本与质量。
- 内容更新保持版本一致,删除验证所有检索路径不可见。
- 内存成为瓶颈时才比较量化,并用原向量精排验证损失。
向量库内部的删除与压缩机制各不相同,不能把“墓碑加批量重建”当作所有 HNSW 系统的统一运维命令。恢复演练和容量余量也应进入选型结论。
下一篇将候选转成可验证答案:重排、引用和评估。
OpenAI 托管检索与自建链路:比较可控范围
OpenAI File search[6]提供托管的语义与关键词检索,并支持文件属性过滤和检索结果返回选项。它减少自行执行检索工具的工作,但知识源质量、访问范围与答案验收仍需要应用负责。
与自建 pgvector / Milvus / Chroma 链路比较时,固定同一授权语料与问题,记录解析覆盖、召回、引用支撑、更新/删除可见性、p95、费用和运维成本。托管与自建的可配置项不同,不能假定切分、重排和过滤具有完全相同的行为;若关键实验参数无法固定,应把差异作为比较局限。
Anthropic 的 Contextual Retrieval[7]是为检索块补充定位上下文的方法与实验,不是一个与 OpenAI File search 完全等价的托管产品。实验结果与支撑范围见切分篇。
参考资料
正文中的编号可跳转至对应来源。工程报告、官方文档与研究论文分别标注;支撑范围说明该资料能证明什么,以及不能推导什么。
- [1]官方文档pgvector — Indexes, filtering and iterative scans
支撑范围: 索引类型、过滤与迭代扫描的官方实现说明;具体性能受数据与配置影响。
- [2]官方文档Qdrant — Hybrid queries
支撑范围: 混合查询与融合接口;不能据此推导跨引擎统一性能排名。
- [3]官方文档Milvus — Official project overview
支撑范围: 官方项目的检索与部署能力概览;选型仍需工作负载验证。
- [4]官方文档FAISS — Documentation
支撑范围: 向量相似度搜索与索引算法;不提供业务权限或完整持久服务保证。
- [5]研究论文RRF 原始论文(SIGIR 2009)
支撑范围: RRF 的原始方法与实验;融合参数及收益有被测数据边界。
- [6]官方文档OpenAI — File search
支撑范围: 托管语义与关键词检索、文件属性过滤和结果返回能力;资料权限、质量与验收由应用治理。
- [7]工程报告Anthropic — Contextual Retrieval
支撑范围: 为块补充定位上下文并组合向量、BM25 与重排的实验;检索失败率下降不等于答案正确率同比提高。