检索是一条分层链,单点替代整条链必然失效
# 检索是一条分层链,单点替代整条链必然失效
结论
你在知识库检索上踩的坑,形状是同一个:把整条链的成败压在一个单点上。 「只建索引就算 RAG」「只匹配标题就算召回」「只按一个分数排序就算排序」 「搜一次读一篇就算检索」「查询时现拼原文就算知识层」—— 检索不是组件,也不是一次搜索,而是一条各层职责不同的链; 用单点替代整条链,失效时不报错,只表现为「搜不到 / 搜不准」。
四层链,每层的失效模式不同
| 层 | 职责 | 单点替代它的错误 | 出处 |
|---|---|---|---|
| 供给层 | 先把内容编译成可检索的知识层,而不是查询时拼原文 | 直接对原文做检索 | 知识库先编译再查而不是查询时拼原文、Agent读语义文件App读结构化存储 |
| 召回层 | 词法 + 向量 + 字段权重,中文要分词 / pg_trgm | 只做标题 substring 匹配、按 token 长度打分、中文整句切 | 关键词检索的三个打分缺陷、混合检索先用RRF融合 |
| 融合 / 排序层 | 按排名融合(RRF),分数不可比就不要校准 | 把两路原始分数直接相加比较 | 混合检索先用RRF融合 |
| 迭代层 | Agent 主导的 loop:先判难度定预算,读不通换查询,看覆盖度停止 | 「搜一次、读一篇」当作一次调用 | 检索要按难度迭代、RAG是流程不是组件 |
选源的判断另算一层:冷门具体查询决定搜索源的选择(长尾查询)—— 源选错,后面所有层再对也救不回来。
综合判断
-
检索是流程,不是组件。
RAG = Retrieval → Augmentation → Generation;只生成 embedding、 只做相似搜索,都只是链路的一段。判断「是不是 RAG」看的是链路,不是用了哪个库。 -
每一层都可以独立失效,且失效都静默。 供给层没编译 → 搜到的是原文碎片; 召回层没分词 → 中文只按整句命中;融合层比分数 → 排序被量纲带偏; 迭代层缺 loop → 一次没命中就放弃。四层的症状都是「搜不到」,但修法完全不同 —— 所以「检索效果差」不是一个可行动的问题,必须先问「差在哪一层」(对照 先定位归属层再动手)。
-
可迁移的动作:任何「检索/搜索/推荐」效果问题,先按上表逐层问 「这一层有没有被实现,还是被一个单点糊过去了?」 找到那个被单点替代的层,就是根因所在。
与既有 synthesis 的关系
- 分层要落到运行时才有效 —— 那条讲分层要有人读才生效;本条讲检索这条链的每一层都要真的被实现, 缺一层就等于用单点替代整条链。
- 按实际规模选型而不是按方案先进性 —— 重排器(cross-encoder)留成端口、第一版不上,是同一取向: 按当前规模决定这层要不要现在落地。
- 判据要用真值而非代理 —— 迭代层的停止条件看覆盖度(真值),不看命中数量(代理)。
相关
- RAG是流程不是组件
- 混合检索先用RRF融合
- 检索要按难度迭代
- 关键词检索的三个打分缺陷
- 知识库先编译再查而不是查询时拼原文
- 长尾查询
- 短期记忆与长期记忆的边界 —— 检索索引不等于记忆,别把检索层当成记忆层
- 答疑是功能层搜题只是手段层 —— 搜题只是这条链的一段,别把整条链的成败压在它身上