跳到正文

02 - 检索与引用溯源 ​

一句话:检索是一条漏斗——向量与关键词两路各召回一批、融合取前若干、重排后只留进上下文的三五条,代价是每加一级就多一分延迟一分成本;判断标准只有一条:该找到的找得到、找不到的明确说找不到,且每条答案都能指回原文页码——指得回去,才算可采信。

一、漏斗的形状 ​

阶段常见取值为什么是这个数
单路召回各 30–50 条低于 30 时精确串容易被语义近邻挤掉;高于 50 收益递减、重排成本上涨
融合后保留10 条给重排留判断空间
重排后送入3–6 条上下文里每多一条都在稀释注意力并涨 token 成本

两组数是经验起点,不是最优值。调它们必须成对看:召回放宽、送入收紧,往往比单纯放宽某一级更有效。

二、两路各管什么,为什么线性相加会出事 ​

关键词那一路管“必须一字不差”的东西——接口名、错误码、制度编号、产品型号。向量那一路管“说法不同意思相同”的东西——用户问“怎么退钱”,文档写“资金原路返回”。

引擎暴露的融合方式是线性加权。两路分数量纲与分布都不同:BM25 无上界、依赖词频与文档长度,向量相似度通常压在 0 到 1,直接相加时权重实际调的是“哪个分布取值范围更大”,而不是“哪种证据更重要”。

由此有一个预期失效模式(复现方式见 07 §四):把语义权重逐步抬高,最先整类消失的不是噪声,而是精确串查询——错误码查不到、型号查不到,而总体平均值可能还在涨。所以任何权重改动都要分桶看结果,不能只看平均值;能用名次融合时优先用名次,不用原始分数。

三、重排:值不值得开 ​

重排用交叉编码把查询和候选放在一起打分,比前两级都准,也贵得多:成本随候选条数线性增长,延迟量级在一两百毫秒(经验值,不含生成,口径与 05 的时延分解一致)。默认开启还有一层常被忽略的账——它等于长期占住一个推理资源池,容量与单位成本见 05。

开与不开按同一套流程判:

  1. 固定一份评测集,重排开与关各跑一遍,逐题配对比较;
  2. 看排序质量指标(MRR、NDCG@10)是否稳定提升,而不只是平均值好看;
  3. 分桶看:精确串、表格、多跳、无答案各桶,任何一桶退化都要先解释再放行;
  4. 记录每题命中的片段与分数,形成可回放的对照证据。

只有前三步都过关,才把重排设为默认开。模型选择上,本地部署(如 bge-reranker 一类)省单次调用费用但吃 GPU 与运维,API 方式反之——这是一笔成本与可控性的取舍,不是一次技术选型。

查询改写(把口语问题改写成更适合检索的形式)同理:它增加一跳延迟和一次模型调用,只在多跳与长问题分桶上证明收益后才开。

图表与图文混排块只参与定位、不参与重排打分——多模态重排一期不做(见 06 边界),把“来自图”的块送进交叉编码只会得到不可信的分数;含图题型的正确处理是落到无答案桶按拒答处置,而不是给一个看着像样的答案。

四、检索范围与请求增强 ​

托管平台通常给出一整面可配置参数,本栏的取舍是范围由服务端决定、参数由场景模板决定,四件事各有归属:

能力归属口径
标签与元数据过滤服务端注入,客户端不可指定复用内容侧已有字段:负责人、生效状态、密级、知识域、主题;与权限条件同批下发(见 03)
多库范围与权重平台按场景配置某个问答场景绑哪些知识域、各自权重多少,是配置项;客户端传的数据集 ID 不生效
多域路由编排层承担,不做产品化路由开关由 Agent 或场景模板决定问哪个域;代价是路由质量取决于编排规则本身,好处是不额外引入一次计费的判定环节
输出侧防泄漏服务端策略引用只回标识与坐标;正文按段限量、按主体按文档累计限量;答案不复述原文整段

第三行要说清是一次反向设计:托管平台常见做法是“拨一个开关,由模型判定该查哪几个库”,我们选的是范围由授权与配置派生、不交给模型判断。理由是同一个——模型选错库时,同时是质量问题和安全问题,而日志上看不出是哪一种。代价是新增业务域必须显式配一次,少配就表现为“查不到”,需要在零命中清单里能被看见(见 09)。

五、引用要能落到页面上 ​

答案带引用不是装饰,是这套系统能被采信的唯一理由。生产返回的最小字段:

字段用途
片段 ID + 文档 ID定位到具体一段
页码 + 坐标框让人一眼看到原文位置
文档版本与内容哈希事后核对“当时答的是哪一版”
生效状态现行 / 待复审 / 已废止,决定答案措辞是否带提醒
主题标识 + 权威源标记 + 冲突数支撑“该主题存在多个说法”的提示,不靠模型自觉
密级与所属项目支撑返回前的权限复核(见 03)

两条硬要求:引用必须能真的打开;引用必须经过权限复核。第二条常被忽略——答案生成时可见的片段,可能在展示前已被撤权,直接渲染等于把内容漏出去。所以引用由服务端按当前权限重新判一次,而不是把检索结果原样透传。

被权限过滤掉的片段不在用户侧说明原因:涉密内容的存在性本身就是信息,用户侧统一表现为无结果,过滤原因只进管理台与审计(见 03)。

六、拒答是正常输出 ​

问的是库里没有的事,正确答案是“查不到”。默认判定条件三条,满足任一条即拒答:

  • 最高分低于阈值;
  • 命中片段与问题主题不符(如同一编号出现在不相关文档里);
  • 需要跨文档拼接且证据链断裂。

无答案题型的拒答率是质量门禁里最容易被牺牲的一项:只要把阈值调低,模型就会开始编,看起来“什么都答得上”,实际把幻觉变成了生产数据。与它对称的是过度拒答率——正常问题被挡掉的比例。两个必须一起报,只报任一个都能调出一个好看的数。

阈值取值按业务定,先按经验值起步,再用评测集校准;校准记录必须留档,否则半年后没人知道这个数为什么是它。

七、GraphRAG 什么时候才上 ​

默认关闭。开启条件同时满足三条:问题以“实体之间有什么关系”为主、多跳题型在基础链路上调优到顶仍不达标、有预算承担建图与持续维护。

代价要说全:抽取实体关系本身就是一遍模型推理,抽取错误会沿图传播;文档更新后图要重建,维护成本比向量索引高一个量级。多数场景先试查询分解——把“A 和 B 的合同谁负责”拆成两次单跳检索再合并,能解决大半问题,且不改索引结构。

八、边界 ​

  • 本栏给的是漏斗形状与判定口径,各阶段的具体阈值属业务校准项,未经评测集验证前一律记为经验值。
  • 换 embedding 模型或换向量引擎,旧的分数分布不再可比,所有阈值与评测必须重跑;这不是回归测试,是重新定标(见 05)。
  • 多模态重排一期不做,图文块只作定位依据。
  • 检索质量与权限过滤要分开评:前者答“该找到的找到没有”,后者答“不该给的给没给”,混在一起测出的分数没有意义(见 06)。

把 AI 工程讲到既懂也会用