专题研修

13|检索系统内部:BM25、向量、ANN、融合与索引新鲜度

专题研修约 4.2 千字1 组分步图解

目标:能从语料与查询分布设计检索管线,并定位遗漏发生在召回、过滤、排序还是上下文选择。实验:retrieval.py,提供真实BM25和RRF,不把字符串匹配称为Embedding。

本章目录

沿着对象与状态理解本章

在一组固定候选上比较排名,才能分清检索模型、融合算法与证据筛选各自的贡献。

下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。

动态图解 · F29

从两个候选列表,走到可用证据

“相关”与“足以回答”中间还差哪几步?

多个检索入口可能互补。融合处理“哪些候选值得优先看”;重排对少量候选作更细比较;证据核验处理“这段话是否真的支持当前结论”。三个阶段目标不同,不能用一个相似度分数替代全部判断。

RRF通过名次而非原始分数融合候选列表的方法。
重排对召回后的候选重新作相关性排序。
证据充分性材料能否支持问题要求的结论和条件。

输入与适用条件:本图独立排名算例:关键词[A,B,C]、语义[B,C,A]、k=60。所有候选始终不变,不接用其他章节的排名数据。

1 / 5 · 两种搜索给出不同名次

第1步,共5步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

从两个候选列表,走到可用证据:两种搜索给出不同名次候选 / 关键词名次 / 语义名次A13B21C32本例融合只使用名次,不伪造原始搜索分数。

固定三个候选:关键词排名A、B、C;语义排名B、C、A。两种原始分数不在同一量纲,不能盲目相加。

本步状态由图形与说明共同给出。

默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。

为什么需要

精确词项与语义线索各有盲区,组合能提供互补候选。

怎样实现

先融合候选,再核实原文与元数据,必要时补查缺失证据。

可能的代价与误解

提高Top-k可能把更多无关内容塞入上下文;检索器成绩提升不一定带来任务成功率提升。

如何判断是否做对

分别测召回、排名和最终回答支持度;不要只测最终一项或只测搜索分数。

1. 检索是一个分阶段的信息损失过程

用户问题先被解释为查询;检索器从语料中得到候选;权限与版本过滤限制可见集合;排序选出有限结果;上下文编译器再次裁剪;模型最后使用证据。关键材料在任何一步被丢掉,下游再强也可能答错。

所以RAG不能只画成“向量数据库→LLM”。需要知道文档如何切分、索引何时建立、模型如何编码查询、返回结果是否完整、证据与答案是否对应。Contextual Retrieval展示了为片段补上下文并结合不同检索信号的思路,但收益需在自己的任务上重测。[N24]

首先建立低成本基线:路径/符号精确检索和BM25。只有它们在真实查询上暴露语义缺口,再加入向量检索、查询改写或图结构。大型框架不是检索质量的先决条件。

2. BM25:词频饱和与长度归一化

本书采用一种常见的非负IDF形式:

idf(t)=log(1+(N−df(t)+0.5)/(df(t)+0.5))
score(q,d)=Σt∈q idf(t) × f(t,d)(k1+1)
                         / [f(t,d)+k1(1−b+b|d|/avgdl)]

词越罕见,idf通常越大;一个词在文档内反复出现,收益逐渐饱和,不是重复一百次就线性加分;长度归一化减少长文档仅因词多而占优的现象。不同实现的IDF和查询词频处理可能不同,比较时应固定具体公式。[N32]

代码将snake_case和camelCase拆分,再匹配英文数字词与单个中文字符。这是透明、可测试的教学分词策略,不是高质量中文分词器。对英文代码符号通常有帮助,对中文短语可能丢失词组语义。应针对真实查询测召回,而不是因为实现叫BM25就认为专业检索已经完成。

3. Dense Retrieval与向量空间

双塔检索通常分别编码查询和文档,通过点积或余弦计算相关性。文档向量可以离线计算,查询向量在线计算;训练中的正例、负例和任务指令决定它适合怎样的相似关系。描述相似不等于事实相同,反义条件、版本号和精确标识符容易被语义近似掩盖。

如果使用余弦,常见做法是归一化后点积;若索引按内积而向量没有按预期归一化,向量范数会影响排序。更换Embedding模型、维度、预处理或指令模板,通常需要重建相关索引,不能把不同空间的向量混在同一集合里。

Cross-encoder让查询与文档共同编码,能做更细相关性判定,但候选对数量直接增加成本。它适合对已召回的小集合重排,无法找回从未进入候选的关键材料。ColBERT则保留多Token表示并做延迟交互,位于单向量效率与更细粒度匹配之间,存储和索引设计也相应复杂。[N71]

4. ANN为何更快,也为何可能漏掉

精确向量搜索扫描全部向量,容易建立正确性基线。近似最近邻索引用可控的召回损失换速度或存储。HNSW用分层图导航候选邻居;搜索候选集合更大通常提高召回但增加工作量。IVF先按粗聚类选择若干桶,再在桶内搜索;探测桶太少会漏,太多趋向扫描。PQ把向量分块编码为码本索引,减少存储但引入距离近似。[N33][N95]

不要把ANN检索的Recall@k与业务证据召回混为一谈。ANN指标可能只是与精确向量排序相比,证明近似索引没有丢太多邻居;若Embedding本来就没把正确文档排前,这个指标再高也不能保证业务成功。

元数据过滤会影响ANN行为。如果先取全局top-k再过滤权限,可能只剩一两项,授权用户反而拿不到本可找到的材料。可采用权限预过滤、适当过取、分区或支持过滤的索引方案,但需测严格ACL与高选择性过滤下的召回和延迟。

5. 混合检索如何融合

BM25分数与余弦分数不一定同尺度,直接相加容易被某一信号支配。RRF只使用名次:score(d)=Σr 1/(c+rank_r(d))。它简化跨分数标定,但也舍弃了分数间隔信息。c是调节头部权重的参数,不是神奇常数。

实验实现对每个排名列表去重,防止同一检索器重复返回一个文档制造额外票数。版本不同的同名文档应保留清晰ID,不能错误合并。融合之后还可做去冗余或覆盖选择,但不能为了多样性删掉回答必要的第二份证据。

查询改写与HyDE可以扩大语义召回:先形成可能的描述,再检索。但假设文档是查询辅助,不是真实证据;生成的错误前提不应进入最后答案的事实链。[N72]

6. 索引是有生命周期的数据产品

入库时保存来源ID、内容版本、片段位置、Embedding版本、权限与更新时间。修改或删除原文后,索引与缓存应同步失效;文档ACL变化同样需要处理。增量索引不是只添加新向量,还包括替换旧内容、删除、合并和冲突。

retrieval.Index先按tenant、principal、version筛选,再计算可见集合的BM25,缓存键也包含这些字段;替换文档集会清缓存。这样真实测试了跨用户缓存隔离和版本切换,但线性扫描没有证明百万级性能,也未实现向量索引。生产缓存还要考虑权限组变化、索引代次与短期授权撤销。

删除敏感内容不能只从结果列表隐藏。如果摘要、答案缓存或长期记忆仍保留派生内容,也需要相应治理。检索安全是完整数据流问题,不是最后展示前的一次过滤。

运行示例 · S13

权限过滤在召回后做,为什么top-k会不足

输入与条件。查询排名为[私有A,私有B,公开C,公开D],用户只能看C/D,希望返回2条。

步骤与对象内部动作中间结果 / 新状态
1先top2取A/B随后权限过滤得到空集。
2结果误判“没有相关资料”实际C/D存在。
3授权集合内检索先限制权限或扩大可过滤候选可以返回C/D。
4最终再次校验候选生成与输出时权限可能变化防止使用过期权限快照。
5指标比较召回率必须相对于用户有权访问的相关集合不能用全库标注强迫返回私有资料。

把过程连起来。过滤不只影响安全,也影响召回与“无结果”的解释。

边界与反例。预过滤、后过滤和混合实现取决于索引能力;示例不承诺某数据库支持任意高效ACL。

依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。

运行示例 · X09

近似图搜索为什么会漏掉真正最近的点

输入与条件。查询在数轴0。图中A=4、B=5、C=1;只有A—B、B—C两条无向边,从A开始。真实最近点显然是C,距离1。

步骤与对象内部动作中间结果 / 新状态
1严格贪心起步A距离4,它的邻居B距离5如果只愿意走向更近的点,就停在A。
2局部不等于全局A没有更好的一跳邻居但并不代表全图没有更好的点。
3多探索一步暂时保留较差的B,再访问其邻居C发现C距离1,替换当前最佳。
4联系工程参数候选队列与探索预算扩大,会增加访问量可能提高召回,但本例不保证任何预算下都能找到全局最近点。

把过程连起来。近似搜索不是“向量一算就必定找对”。距离计算可以完全正确,探索路径仍可能漏候选。

边界与反例。这是图遍历反例,不是HNSW完整算法或其精确参数模拟;真实实现还包含多层图、构建策略和队列规则。

依据与适用范围:[HNSW]。示例输入和场景由本书明确设定。

7. 验收与量化

建立包含精确符号、同义描述、否定条件、跨文档组合、旧版本干扰和无答案的查询集。分别测候选证据Recall@k、排序MRR/nDCG、授权泄漏为零、最终答案支持率、延迟与成本。对召回失败保存应找到的原始片段,避免只看模型最后是否侥幸答对。

验收题:重排模型升级后nDCG变高,但答案更差,可能是什么?候选覆盖不变但证据多样性降低,长文裁剪丢了条件,重排偏爱流畅文档而非当前版本,或任务评分与检索标签不一致。应沿管线逐级定位,而不是继续堆更大的向量模型。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。