RAG 三阶段原理与失败场景
检索、增强、生成三阶段详解,含 Embedding 与 LLM 调用
原题:请详细描述检索增强生成(RAG)技术的基本工作流程,包括检索、增强和生成三个核心阶段的具体实现方式。
重排与优化 · 百度真题
回答与解析
RAG 的完整链路
RAG 由离线知识准备和在线问答两部分组成。检索能提供外部证据,但检索结果和生成都可能出错,因此整条链路要可评估、可追踪和可回滚。
1. 离线准备
- 解析并清洗文档,保留来源、版本、权限和时间等元数据。
- 按结构或候选分块策略生成 chunk,并维护到原文的映射。
- 用固定版本的 embedding 模型编码,建立向量、关键词或混合索引。
- 用标注查询集验证证据 Recall@K、重复率、过滤正确性和索引更新。
2. 在线检索
对用户问题做规范化、权限过滤和查询改写,再进行向量、BM25 或多路召回。候选可以通过 RRF、规则或 Cross-Encoder 重排。ANN 检索是近似计算,不是“确定性知识”;相同输入能否稳定复现还取决于索引版本、并发更新和实现。
3. 上下文增强
对候选去重、裁剪并保留来源标识,把问题、证据和回答约束组装成上下文。要处理冲突、过期和权限不足的证据,并防止检索内容中的提示注入被当作系统指令。
4. 生成与校验
模型基于证据生成答案和引用;证据不足时应拒答、继续检索或请求澄清。服务端验证引用是否指向真实候选,并记录查询、索引版本、候选顺序、模型版本和最终输出。
结论:RAG 不是简单“外挂知识库”,而是从数据版本、检索、上下文到生成和引用的一条可观测证据链。
口语版讲法(约4分钟)
- RAG本质:用检索约束生成,解决幻觉和时效性
- 离线预处理:文档切块、Embedding、建向量数据库
- 在线检索:向量搜索 + 重排序
- 增强阶段:组装Prompt,控制上下文
- 生成阶段:引用溯源和拒绝回答的机制
RAG 的工作流我一般分成两条线看:一条是离线建知识库,一条是在线回答问题。离线把资料处理成可检索的知识单元,在线再根据用户问题把相关知识找出来,拼给大模型生成答案。
离线阶段先做文档处理。原始资料可能是 PDF、网页、Word、数据库记录,先要清洗掉页眉页脚、广告、重复模板这些噪声。然后做 chunk,把长文档切成适合检索的片段。这里不能只按长度硬切,最好结合标题、段落、语义边界,否则一个答案被切到两个块里,检索和生成都会受影响。切完之后,用 Embedding 模型把每个 chunk 转成向量,连同标题、来源、时间、权限标签这些 metadata 一起写入向量库或搜索引擎。
在线阶段先进入检索。用户问题进来后,也会被转成向量,到向量库里找 TopK 相似片段。实际项目里我一般不会只靠向量检索,因为专有名词、编号、缩写这类问题,BM25 反而更稳。所以会用 hybrid search,把向量召回和关键词召回合并,再用 reranker 做精排,把真正能回答问题的内容排到前面。
检索之后是增强。这个阶段表面上是拼 prompt,本质上是上下文选择和上下文治理。要把重复片段去掉,把低相关片段过滤掉,把来源信息保留下来,还要控制总 token 长度。通常我会按“相关性、可信度、时间新旧、权限”来排序,最后组成一个结构化 prompt,比如先给参考资料,再给用户问题,再明确要求模型只能基于资料回答,资料不足就说明不足。
最后是生成。大模型拿到增强后的 prompt 后生成答案,但这里还要加几个工程约束。一个是引用溯源,让答案里的关键结论能对应到来源文档;一个是拒答机制,如果检索分数太低或者资料互相冲突,就不要硬编;还有一个是后处理,比如检查格式、敏感信息、引用是否存在。
所以 RAG 不是简单的“搜一下再回答”,而是从文档处理、召回、重排、上下文组装到生成约束的一整套链路。任何一环出问题,最后答案都会受影响。比如检索没找对,prompt 写得再好也没用;检索找对但上下文塞太多噪声,模型也可能被带偏。
我会特别强调一点:RAG 的上限往往先由检索结果决定,再由生成模型决定。一个成熟系统要同时评估检索侧的 Recall@K、MRR,也要评估生成侧的忠实度和答案正确率。
关键一句:RAG 的本质不是“外挂知识库”,而是一条可评估、可追踪、可回滚的知识使用链路。
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做客服问答系统,用户问“怎么退货”,系统得从知识库找答案。但知识库可能有几百份文档,你怎么确保找到最相关的部分,然后让大模型基于它生成回答?能说说整个流程吗?
- 问法 2 · 层层追问
大模型回答容易胡说,你怎么让它的回答更可靠?……比如靠外挂知识库?……那具体怎么把知识库和生成过程结合起来呢?从用户提问到最终回答,你详细说说每一步怎么做?
- 问法 3 · 直球架构
请详细描述RAG的完整工作流程,重点讲清楚检索、增强、生成三个阶段分别怎么实现,包括文档处理、向量化、检索策略、Prompt组装这些环节。