NOTE 002 工程实践 2026.10.11
RAG 不是银弹:
检索质量决定回答上限
有一段时间,我认为只要把文档丢进向量库,模型就能回答一切。后来发现,答不好的原因大多不在模型,而在“找到的资料本身就不对”。
01先判断是否真的需要检索
稳定常识、改写润色、格式转换这类任务,通常不需要检索。真正需要检索的,是私有文档、时效性强的信息,以及必须给出出处的回答。
与其一上来就搭向量库,不如先写出 10 个真实问题,观察模型在没有资料时会错在哪里。如果错误集中在“缺少事实”,检索才有明确的价值;如果错误集中在“没听懂要求”,该先改提示词。
02切分要服从文档结构
固定长度切分很省事,但它经常把一句话、一张表拆坏。片段一旦失去上下文,检索再准,模型也读不明白。
- 优先按标题层级和段落切分,让每个片段自带一个小主题。
- 保留小标题和文档名,使片段脱离原文后仍然可读。
- 表格、代码、FAQ 单独处理,不要和正文混在一起。
- 相邻片段留一点重叠,避免答案刚好被切断在边界上。
03召回之后还要重排
向量召回解决的是“大致相关”,重排模型解决的是“到底哪段最相关”。两者不是一回事。
我的默认流程是:先召回 20 到 50 条候选,再用重排模型取前 3 到 5 条交给生成模型。中间再加一层过滤,按时间、权限和文档类型筛掉不该出现的片段。这一步能减少很多莫名其妙的回答。
04组装上下文时做减法
信息越多不等于答案越好。无关片段会稀释注意力,也会给编造留下空间。
- 只给最相关的几段,并按相关度排序。
- 每段标注来源,要求模型先引用原文,再给结论。
- 明确告诉模型:没有依据就回答“资料中没有提到”,不要猜。
RAG 的上限由检索决定,模型只负责把找到的东西讲清楚。 A NOTE TO MYSELF
05评估要分开看两层
检索和生成是两件事,混在一起看,就不知道问题出在哪一层。
- 检索层:该找到的片段有没有被召回?可以用召回率、命中位置来衡量。
- 生成层:答案是否忠于材料(忠实度)?是否真正回答了问题(相关性)?
我习惯把失败样本按“没找到资料”“找到了但没用上”“用上了但讲错了”分类。三类问题对应三种完全不同的修法。