检索是一条分层链,单点替代整条链必然失效

检索是一条分层链,单点替代整条链必然失效

# 检索是一条分层链,单点替代整条链必然失效

结论

你在知识库检索上踩的坑,形状是同一个:把整条链的成败压在一个单点上。 「只建索引就算 RAG」「只匹配标题就算召回」「只按一个分数排序就算排序」 「搜一次读一篇就算检索」「查询时现拼原文就算知识层」—— 检索不是组件,也不是一次搜索,而是一条各层职责不同的链; 用单点替代整条链,失效时不报错,只表现为「搜不到 / 搜不准」。

四层链,每层的失效模式不同

层职责单点替代它的错误出处
供给层先把内容编译成可检索的知识层,而不是查询时拼原文直接对原文做检索知识库先编译再查而不是查询时拼原文、Agent读语义文件App读结构化存储
召回层词法 + 向量 + 字段权重,中文要分词 / pg_trgm只做标题 substring 匹配、按 token 长度打分、中文整句切关键词检索的三个打分缺陷、混合检索先用RRF融合
融合 / 排序层按排名融合(RRF),分数不可比就不要校准把两路原始分数直接相加比较混合检索先用RRF融合
迭代层Agent 主导的 loop:先判难度定预算,读不通换查询,看覆盖度停止「搜一次、读一篇」当作一次调用检索要按难度迭代、RAG是流程不是组件

选源的判断另算一层:冷门具体查询决定搜索源的选择(长尾查询)—— 源选错,后面所有层再对也救不回来。

综合判断

  1. 检索是流程,不是组件。 RAG = Retrieval → Augmentation → Generation;只生成 embedding、 只做相似搜索,都只是链路的一段。判断「是不是 RAG」看的是链路,不是用了哪个库。

  2. 每一层都可以独立失效,且失效都静默。 供给层没编译 → 搜到的是原文碎片; 召回层没分词 → 中文只按整句命中;融合层比分数 → 排序被量纲带偏; 迭代层缺 loop → 一次没命中就放弃。四层的症状都是「搜不到」,但修法完全不同 —— 所以「检索效果差」不是一个可行动的问题,必须先问「差在哪一层」(对照 先定位归属层再动手)。

  3. 可迁移的动作:任何「检索/搜索/推荐」效果问题,先按上表逐层问 「这一层有没有被实现,还是被一个单点糊过去了?」 找到那个被单点替代的层,就是根因所在。

与既有 synthesis 的关系

  • 分层要落到运行时才有效 —— 那条讲分层要有人读才生效;本条讲检索这条链的每一层都要真的被实现, 缺一层就等于用单点替代整条链。
  • 按实际规模选型而不是按方案先进性 —— 重排器(cross-encoder)留成端口、第一版不上,是同一取向: 按当前规模决定这层要不要现在落地。
  • 判据要用真值而非代理 —— 迭代层的停止条件看覆盖度(真值),不看命中数量(代理)。

相关