跳到正文

07 - 原理备忘:为什么是这些做法 ​

一句话:前六篇给的是做法,这篇给的是理由——七条机制各自推出一条可验证的推论,推论能不能测出来,就是这套设计对不对的判据;记不住做法可以查,推不出理由会在选型时被人一句话带走。

一、双塔与交叉编码:重排为什么更准,又不能拿它做召回 ​

做法:召回用向量与关键词两路,重排用交叉编码只对融合后的十条打分。

为什么:双塔式检索把查询和文档各自编码成一个向量,两者在编码阶段互不知情,只能在最后用一个点积相遇——文档侧的表示必须一次算好、全库复用,代价是文档无法针对“这次问的是什么”调整自己的表示。交叉编码把查询与候选文档拼成一条序列一起过模型,注意力可以真正在两者之间来回,所以能看出“这段看起来相关其实答非所问”。

代价与推论:交叉编码的开销按“查询 × 候选数”增长,全库每条都要前向一次,做召回等于把检索变成重推理任务。可验证推论:重排的收益应该集中在“命中但排得靠后”的题上——如果重排后前十名的顺序没变而答案质量提升,说明问题不在排序,在召回或生成,重排开错了地方。

二、块长为什么影响召回:池化会平均掉细节 ​

做法:结构优先、长度兜底,技术文档偏短、制度条款偏长,表格整表成块。

为什么:一个块最终只对应一个向量,块内所有 token 的语义被池化压缩成一点。块越长,平均效应越强:主题越集中,细节越模糊,“只问其中第 4 条”的查询会被整块的平均语义拉偏。块太短则反向失效——一个条件从句单独成块,检索命中了却答不出原委。

推论:同一条内容,把块长从 300 调到 800 token,精确细节题的召回会下降、主题概括题的召回会上升。做一组块长对照跑同一评测集,能画出这条反向曲线;画不出来,说明切分实际上在按句硬切、没有尊重结构。

三、换 embedding 为什么让阈值一起作废 ​

做法:换模型必须全量重建,并按新分布重新定标。

为什么:相似度分数不是“像不像”的客观度量,而是某个模型在某套训练目标下输出的相对序关系映射到特定值域的结果。维度、是否归一化、对比学习的负样本构造方式一变,同一个“相关”对应的分数就变了;不同模型的分数不存在可换算关系。

推论:跨模型比较时,只有排序类指标(MRR、NDCG、命中位次)可比,绝对分数不可比。若在旧阈值 0.2 下不动就跑新模型,表现为召回数量骤变,这不是模型退化,是阈值在替模型做决定。

四、两路分数为什么不能直接相加 ​

做法:接受引擎的线性加权,但要清楚它是妥协,改动前先证明精确串不退化。

为什么:BM25 的分数无上界、依赖词频与文档长度;向量相似度通常被压在 0 到 1 之间。两个量纲不同、分布形状不同的分数相加,权重实际调的是“哪个分布的取值范围更大”,而不是“哪种证据更重要”。倒数排名融合绕开量纲,只用两路各自的名次,所以更稳。

推论:拿一批已知答案的精确串查询(错误码、制度编号)做对照,把向量权重逐步抬高,一定能在某个点看到这类查询整类消失——那一刻暴露的就是线性加权的脆弱处。只看总体平均值看不到它,这也是为什么必须分桶。

五、权限为什么必须在检索之前,不能事后筛 ​

做法:Broker 把租户、项目、文档、密级作为过滤条件注入检索请求,而不是拿回结果再删。

为什么:召回条数与相似度阈值是在候选空间上算的。后置过滤会让两件事同时坏掉:一是本应看到的证据被越权片段挤掉名额,表现为“查不到”但其实有;二是拒答判定失真——阈值按含噪分数决定,权限过滤后才发现不足,此时已经决定过“答还是不答”。安全上也不等价:后置过滤要求越权内容先被取出并进入上下文,泄露窗口从“返回前”提前到“取回时”。

推论:同一条查询在两种实现下比较命中位次——后置过滤版本会出现“结果条数达标但缺关键片段”与“该拒答却给了答案”两类偏差;前置过滤版本条数可能不足,这时应显式说明“因权限范围收窄”,而不是静默少给。

六、长上下文为什么替代不了检索 ​

做法:即使窗口够大,仍然按预算编译上下文,只放该放的三五条。

为什么:三层理由,只有第一层是成本。一,KV 显存随上下文与并发线性增长,大窗口在高并发下先撑不住的是服务端;二,注意力对位置的利用并不均匀,长序列中间段落最容易被忽略,材料越多不代表越会用;三,塞进来的无关材料会参与竞争,把正确证据的相对权重压低——多给是负收益。

推论:把同一份问题的材料从 3 条扩到 30 条(正确答案始终在内),答对率不升反降、引用错指上升,就能复现这两条。若没复现,多半是任务本身太简单,不该用它论证长上下文可用。

七、表格与扫描件为什么必须在解析层修 ​

做法:表格走结构还原再入块,扫描件走 OCR 并抽检,解析丢结构不在检索层补救。

为什么:版面解析是“先检测区域、再按阅读顺序读取”,表格线断裂或跨页会直接让行列关系靠猜测重建;一旦落成一行文本,“第 3 行第 2 列是什么”这个问题在下游就没有可恢复的信息——检索与生成看到的是同一串字符,无法区分它是表头还是数据。OCR 同理,错字与漏行在进入向量空间之前就已经定了。

推论:拿一份含表格的 PDF 问“某行某列的值”,若答案错但引用指向正确页码,问题在解析;若引用页码就不对,问题在召回。这一条判据能把“表格答不准”这类投诉立刻分成两个责任方,避免在检索参数上白调一周。

八、用法 ​

每条都遵守同一个格式:机制 → 代价 → 可验证推论。被追问时按这三步答,比背结论稳。推论一句“怎么测”,是把原理落到工程证据上的把手——测不出来的原理,说明理解还停在口号。

把 AI 工程讲到既懂也会用