创建日期:2026-09-23 | 最近更新:2026-09-23 本文是专题开篇,只给「链条」和「每一环的坑」。涉及外部资料的地方均为逐字原文(抓取日期 2026-09-23,留档于
source/rag-lab/official-sources.md);涉及数字的地方为本机实测(RTX 3090 / torch 2.10.0 / transformers 5.7.0,脚本与真实输出在source/rag-lab/)。两类陈述在正文中分别标注。
RAG 入门:一条检索链路的五个环节
一句话:RAG(Retrieval-Augmented Generation)就是「先去你的资料库里查出相关片段,再把片段塞进 prompt 让模型照着回答」。 它解决的不是「模型不够聪明」,而是「模型不知道你的事」。
先问一句为什么需要它。大模型有三个绕不开的短板,而且都不靠「换个更大的模型」解决:
- 知识有截止点——训练数据之后发生的事,它不知道;
- 不知道你的私有数据——公司制度、内部文档、你昨天的会议记录,它没训过;
- 会编——不知道的时候不一定说不知道,而是给一个像模像样的答案。
RAG 的思路是把「记忆」从模型参数里搬到外部检索系统:参数负责语言能力,检索负责事实依据。好处是资料改了只要重建索引,不用重训模型;而且答案能带上出处。
一条标准链路
五个环节各自在干什么、最容易在哪里翻车:
| 环节 | 在干什么 | 常见做法 | 最容易踩的坑 |
|---|---|---|---|
| ① 切分与索引 | 把长文档切成片段,逐片算成向量入库 | 按标题/段落切,相邻片段留一点重叠 | 切得太碎丢上下文;切得太大,向量被稀释成一锅粥,什么都像又什么都不像 |
| ② 召回 | 用 query 从库里取出 top-N 候选 | 稠密向量 / BM25 / 两者混合 | 只取 top-k 就直接用。k 里的「相关」是按向量距离算的,不等于「答得上问题」 |
| ③ 重排(可选) | 对候选逐个精算相关性,重新排序 | cross-encoder 模型 / 托管 rerank API | 把它和「多路召回融合(RRF)」混为一谈——两者输入都不一样(下一篇专门拆这个) |
| ④ 组装上下文 | 把片段拼进 prompt | 带上标题、出处、编号 | 不管字数上限硬塞;不标注来源,模型分不清哪段是资料哪段是指令 |
| ⑤ 生成 | 让模型基于材料回答 | 要求「只依据材料回答,没有就说不知道」 | 材料里没有答案时,模型用先验知识补上去 |
③ 是可选的,这正是本专题要讨论的核心。 ②和③的关系是:②负责「别漏」(召回率),③负责「别把不相关的排前面」(精确率)。链条上任何一环出问题,最后都会表现成「模型答得不对」,但根因常常在前两环。
瓶颈通常不在生成,而在召回
这是各家做检索系统的文档里反复出现的一句话。Milvus 官方文档的原话(逐字,model-ranker-overview.md):
Traditional vector search ranks results purely by mathematical similarity—how closely vectors match in high-dimensional space. While efficient, this approach often misses true semantic relevance. Consider searching for "best practices for database optimization": you might receive documents with high vector similarity that mention these terms frequently, but don't actually provide actionable optimization strategies.
翻译过来就是:向量检索排的是「数学上像不像」,不是「能不能回答这个问题」。 上面那个例子——满篇都是关键词、但一条可操作建议都没有——是向量检索的典型失败形态。
sentence-transformers 的文档则把「重排」这件事的存在理由写成了四个特征(逐字,cross_encoder/usage/usage.rst):
Characteristics of Cross Encoder (a.k.a reranker) models:
- Calculates a similarity score given pairs of inputs (typically text pairs, but also image-text or other modalities).
- Generally provides superior performance compared to a Sentence Transformer (a.k.a. bi-encoder) model.
- Often slower than a Sentence Transformer model, as it requires computation for each pair rather than each text.
- Due to the previous 2 characteristics, Cross Encoders are often used to re-rank the top-k results from a Sentence Transformer model.
更准 + 更慢 ⇒ 只能用来重排 top-k。 这四条既是重排的定义,也是它的适用边界,下一篇会逐条展开并配上实测数字。
本专题的路线
| # | 篇目 | 状态 |
|---|---|---|
| 0 | 入门:一条链路的五个环节(本篇) | ✅ |
| 1 | Rerank:是什么、什么时候用、怎么用 | ✅ |
| 2 | 切片与向量化:不同类型文档怎么切、怎么算成向量 | ✅ |
| 3 | 向量相似度的原理:余弦、点积、欧氏,以及「像不像」到底在算什么 | ✅ |
| 4 | 检索能力边界:同一批问题,四种检索组合各在哪失效 | ✅ |
| 5 | 失败案例拆解:六个真实坏案例,一套固定模板 | ✅ |
| 6 | 架构演进之路:Naive → Advanced → Agentic | ✅ |
| 7 | PDF 解析:RAG 链路最前面那道闸门 | ✅ |
| 8+ | 待定:上下文组装与引用 / 召回评测的工程落地 | ⏳ |
配套读物(不在本栏目,放在读书栏目):《信息检索导论》里与 RAG 相关的 4 章必读 + 5 章略读,配 11 道能接到本专题脚本上的习题——**BM25 的推导、检索评估指标、查询改写(Rocchio / 伪相关反馈)**这三块理论在这里补。
引用边界
- 本文引用的 Milvus、sentence-transformers 原文,均为逐字,来源 URL 与抓取方式记在
source/rag-lab/official-sources.md。 - 「大模型三个短板」这段是通用工程共识的归纳,不是某份文档的原话,也没有配引用——它只是把「为什么要检索」讲清楚,不承担事实主张。
- 表格里的「常见做法」是经验归纳;凡涉及具体数字的结论,都放到下一篇用实测说话。