←返回文章列表

RAG介绍:从文档切分到答案评测的一条完整链路

RAG大语言模型AI 应用
18 分钟-阅读

深入拆解 RAG 的离线索引、在线检索、重排、上下文组装、生成和评测流程,说明它能降低幻觉但不能消灭幻觉。

RAG 是 Retrieval-Augmented Generation,中文通常叫检索增强生成。

它不是简单地“给大模型外挂一个资料库”。更准确地说,RAG 是一条系统链路:先把资料处理成可检索的知识单元,再根据用户问题召回相关内容,最后让模型基于这些内容生成答案。

一个公司客服机器人就是典型场景。用户问“拆封后还能退货吗”,模型不应该凭通用知识回答,而应该检索售后政策里的具体条款,再根据条款解释适用条件。

RAG 要解决什么问题

大语言模型有三类天然限制。

第一,参数知识不一定包含你的私有资料。
例如,公司内部报销制度、产品实施手册、客户合同条款,都不在公开训练数据里。

第二,参数知识可能滞后。
例如,一个 API 字段已经从 user_id 改成 account_id,模型仍可能按旧文档回答。

第三,模型可能编造细节。
例如,资料里只写了“联系管理员处理”,模型却补出“3 个工作日内完成”。

RAG 的基本思路是把外部知识作为“非参数记忆”接入生成过程。模型负责理解问题和组织语言,知识库负责提供可追溯的事实材料。

flowchart LR
  A["用户问题"] --> B["检索相关资料"]
  B --> C["组装上下文"]
  C --> D["模型生成答案"]
  D --> E["返回答案和引用"]

一条 RAG 链路分两段

RAG 通常分为离线链路和在线链路。

离线链路处理资料。
在线链路处理用户问题。

flowchart TD
  A["原始文档"] --> B["解析与清洗"]
  B --> C["Chunk 切分"]
  C --> D["Embedding"]
  D --> E["向量库 / 全文索引"]
  Q["用户问题"] --> R["检索"]
  E --> R
  R --> K["重排"]
  K --> P["上下文组装"]
  P --> G["LLM 生成"]
  G --> S["答案 + 引用"]

离线链路

离线链路先把文档变成可检索对象。

例如上传一份 200 页的设备手册,系统会先解析 PDF,去掉页眉页脚,按章节和段落切分,再把每个片段转换成向量,写入向量库或全文索引。

这一步做得不好,后面再好的模型也很难补救。文档切乱了,检索就会乱;检索乱了,生成就会乱。

在线链路

在线链路从用户问题开始。

例如用户问:

设备 E42 报错怎么处理?

系统会先检索和 E42、故障处理、维修步骤相关的片段,再把这些片段放进上下文,让模型整理成回答。

Chunking:切分决定检索上限

Chunking 是把长文档切成小片段。每个片段都可能成为检索结果。

如果 chunk 太小,会丢上下文。

例如合同里有两句话:

提前解约需支付剩余合同金额的 20% 作为违约金。
上述规则不适用于不可抗力导致的解约。

如果第一句和第二句被切到不同 chunk,用户问“不可抗力提前解约要不要赔偿”,系统可能只召回第一句,答案就会错。

如果 chunk 太大,匹配信号会被稀释。

例如一个 chunk 里同时有退款、发票、会员、物流四个主题。用户问退款,检索器命中了这个大 chunk,但模型拿到的上下文里有太多无关内容。

更稳的做法是按文档结构切。FAQ 适合“一问一答一个 chunk”,手册适合按标题层级切,合同适合保留条款编号和上下文。

中文文档还要注意标点。中文没有空格分词边界,切分时需要考虑 。、,、、、标题编号这些符号,否则容易把词或句子切碎。

Embedding:把文本变成可搜索的向量

Embedding 是把文本映射成向量。向量之间可以计算距离,距离近通常代表语义接近。

例如:

问题:报销飞机票需要什么材料?
文档:差旅机票凭证要求包括行程单和付款记录。

这两句话没有完全相同的关键词,但语义接近。向量检索就能把它们匹配起来。

Embedding 适合语义相似,但不一定擅长精确编号。

例如用户问:

E42 故障码是什么意思?

这时关键词匹配可能比纯向量更可靠,因为 E42 是一个精确实体。生产系统里常把 BM25 这类稀疏检索和向量检索结合起来。

Retrieval:从 Top-K 到混合检索

Retrieval 是从知识库中找出最相关片段。

最简单的做法是 Top-K:取相似度最高的 K 个 chunk。

例如用户问:

超过 7 天还能退货吗?

系统取相似度最高的 5 个片段,可能包括“7 天无理由退货”“特殊商品退货限制”“已拆封商品处理”等内容。

但 Top-K 不等于正确。检索器可能把包含“7 天”的无关片段也拿出来。

混合检索会同时利用关键词和语义。

例如查询:

ISO 27001 附录 A.5 怎么落地?

关键词检索抓住 ISO 27001 和 A.5,向量检索抓住“信息安全策略”“访问控制”“组织控制”等语义相关内容。两者结合比单独使用更稳。

Reranking:先多召回,再精排

Reranking 是对第一轮候选结果重新排序。

第一阶段检索通常追求快,可以多召回一些。第二阶段 reranker 用“问题 + 候选片段”成对打分,选出最值得放进上下文的内容。

例如用户问:

已拆封耳机还能退款吗?

第一轮可能召回 50 个包含“退款”的片段。Reranker 会把真正讨论“已拆封商品”“耳机类目”“退款限制”的片段排到前面。

重排会增加延迟,所以要看场景。内部知识库问答可以接受慢一点换准确率;实时搜索建议词可能更重视响应速度。

上下文组装:不是片段越多越好

检索到片段后,还要把它们组装进提示词。

常见错误是把所有相关片段都塞进去。上下文太长时,模型不一定能稳定使用中间位置的证据。研究里常把这个现象称为“Lost in the Middle”。

一个更稳的上下文可以这样组织:

规则:
只根据资料回答。
资料不足时说明没有找到依据。

资料 1:退款政策第 3 条……
资料 2:特殊商品说明……
资料 3:售后流程……

用户问题:已拆封耳机还能退款吗?

如果资料之间有冲突,还需要标明来源、时间和优先级。比如“官网政策”应该优先于“旧版 FAQ”。

Generation:模型负责表达,不负责编事实

在 RAG 中,LLM 的主要职责是理解问题、整合资料、组织答案。

例如检索结果里有三段:

资料 1:普通商品支持 7 天无理由退货。
资料 2:耳机类商品拆封后不支持无理由退货。
资料 3:质量问题可走售后检测。

用户问:

耳机拆封后还能退吗?

一个好的回答应该是:

如果只是无理由退货,拆封耳机通常不支持。
如果存在质量问题,可以按售后检测流程处理。

它不能额外编出“检测需要 3 天”这样的细节,除非资料里明确写了。

Evaluation:不要只看答案顺不顺

RAG 的评测要分开看。

检索评测

检索评测关注“有没有找对资料”。

可以准备 50 个真实用户问题,为每个问题标注应命中的文档段落。然后看 Recall@K:正确段落是否出现在前 K 个结果里。

例如:

问题:企业版支持 SSO 吗?
标准证据:管理员手册第 4.2 节

如果前 5 个检索结果没有第 4.2 节,生成阶段再努力也不稳。

生成评测

生成评测关注“有没有基于资料正确回答”。

可以检查:

  • 答案是否忠实于上下文
  • 是否回答了用户问题
  • 引用是否真的支持结论
  • 资料不足时是否拒答

例如资料里没有价格信息,模型回答“标准版每月 99 元”,这就是生成阶段幻觉。

RAG 不能消灭幻觉

RAG 能降低幻觉,但不能消灭幻觉。

常见原因有五个。

第一,检索错了。
用户问“病假工资”,系统召回“事假申请”,答案自然会错。

第二,chunk 缺上下文。
只召回“上述情况不适用”,却没有召回“上述情况”是什么。

第三,资料过期。
知识库里只有旧版价格表,模型就会基于旧资料回答。

第四,上下文太长。
正确证据被夹在大量无关片段中间,模型可能忽略。

第五,问题超出知识库。
用户问“竞争对手最新价格”,内部知识库没有相关资料,系统应该拒答或提示需要外部检索。

一个实用的 RAG 提示模板

你是知识库问答助手。

回答规则:
1. 只根据资料回答。
2. 资料不足时说“资料中没有找到依据”。
3. 不要编造数字、日期、价格、政策。
4. 如果资料之间冲突,说明冲突点。
5. 给出引用来源编号。

资料:
{{context}}

用户问题:
{{question}}

这个模板的关键是把“拒答”写进去。没有拒答机制的 RAG,很容易把资料缺口变成流畅幻觉。

资料校验

RAG 的基本概念来自 Lewis 等人的 Retrieval-Augmented Generation 论文。关于 dense retrieval,DPR 是开放域问答里的代表性工作。关于句向量和语义相似度,SBERT 提供了基础参考。关于重排与 late interaction,ColBERT 是常见代表。关于 RAG 评测,RAGAS 和 ARES 都把检索质量、上下文相关性、忠实度等拆开评估。关于长上下文证据位置影响,Lost in the Middle 提供了直接参考。

参考资料

YL

我是姚磊

大模型应用开发者,关注 RAG、Agent 和产品化工程。沉淀实践中的判断、踩坑记录和可复用方法。联系我:yaolei_agent@163.com

LLM AppsRAGProductEngineering Notes