RAG实战:构建低幻觉Agent全指南
本文是面向Agent开发的RAG技术实战指南。针对行业内RAG落地中知识库构建不规范、检索召回精度不足、缺乏量化评测体系三大共性挑战,系统拆解了RAG从数据预处理到工程化评估的全链路核心技术,提出了"可测、可调、可信赖"的RAG工程化实践目标,旨在帮助开发者构建低幻觉、具备业务确定性的Agent应用。
一、RAG基础认知
1. 为什么需要RAG
大型语言模型(LLM)在处理超出训练数据范围、需要实时更新信息或特定领域知识密集型任务时,极易产生"幻觉"(生成与事实不符的内容)。检索增强生成(RAG)通过从外部知识库中检索相关文档块作为参考背景,让LLM基于可靠证据生成回答,有效解决了幻觉问题,同时实现了知识的可溯源性。
2. RAG核心工作原理
当用户发起提问时,系统首先从海量私有或实时知识库中检索出与问题语义最相关的文本片段,将这些片段与用户问题一同输入大模型。大模型如同进行"开卷考试",仅基于提供的参考资料生成准确、实时且可溯源的回答,而非依赖自身训练数据中的知识。

二、RAG全链路核心技术
1. 文档加载:RAG的"入口"
文档加载的质量直接决定后续检索的准确性,核心是将各类非结构化数据转化为系统可处理的统一文本格式,主要工作包括:
- 多格式适配:兼容PDF、Word、Markdown、HTML、JSON、TXT、Excel等主流文件格式
- 内容提取:PDF解析文字层(扫描件需OCR识别);HTML剔除脚本、样式表,仅保留正文
- 元数据提取:记录文件名、页码、标题、作者、创建时间、章节层级等文档属性
- 初步清洗:去除乱码、多余空格、特殊非打印字符等冗余信息
2. 文档切分:基于语义的智能分割
文档切分的主要方式如下:

本文重点介绍Meta-Chunking(基于逻辑感知的文本分割与语义补全)方法,解决传统规则切分导致的语义断裂问题:
(1)核心原理
利用PPL(困惑度)作为语义边界的度量工具:低PPL表示文本逻辑连贯、符合语言规律;高PPL表示文本逻辑断层、语义突兀。通过计算句子间的PPL变化识别切分边界。
(2)实现步骤
- 基础切分:将长文档按标点符号拆分为独立句子,切分好的句子表示为,(x1, x2, ..., xn)。
- PPL计算:使用轻量化大模型(如Qwen2)计算每个句子与前文的PPL值,生成PPL变化曲线(K表示 xi 中的token数。tik 表示 xi 中的第k个token,t< i 表示所有位于 xi 之前的token)
- 边界识别:寻找PPL曲线上的局部极大值,标记为语义切分边界
- 语义补全:解决分块导致的上下文信息丢失
-
- 全局增强的文本块重写:识别与当前块相近的文本块,检测并补全缺失的前提、背景信息
- 上下文感知摘要生成:融合全局补充摘要与局部内容摘要,生成富含全局信息的单句增强摘要,提升检索效果
3. 索引构建:Embedding向量生成详解
索引构建的本质是将文本映射到连续的向量空间,实现语义相似度的快速计算。以现代Transformer架构的Embedding模型(如千问text-embedding-v4、BGE)为例,完整流程如下:
- 分词与编号:将文本切分为token,添加
[CLS](句首,代表全句汇总信息)和[SEP](句尾)特殊字符,再转换为模型词表对应的数字索引
- 将“苹果手机很好用”切分为:[苹果, 手机, 很好用]。
- 将token转换为id:根据embedding模型中预设好的词表,将token转换为数字索引。[CLS, 苹果, 手机, 很, 好用, SEP] -> [101, 512, 678, 321, 102]。
- 初始向量映射:通过查表获取每个token的初始向量,再通过预训练的权重矩阵
WQ/WK/WV转换为Query(提问者)、Key(被索引者)、Value(内容本身)三个向量
- 位置信息注入:为每个向量添加位置编码,让模型感知token的顺序关系
- 自注意力机制:计算每个token与其他所有token的相关性,分配权重后混合Value向量,逐层深化(通常12-24层),使每个token向量包含整句话的语义信息
- 池化处理:将多个token向量合并为单个文档向量
-
- CLS池化:直接取
[CLS]位置的向量 - Mean Pooling(平均池化):所有token向量取平均值(BGE等RAG模型最常用)
- Max Pooling(最大池化):提取各维度的最大值,保留最强语义特征
- CLS池化:直接取
- L2归一化:将向量模长归一化为1,使两个向量的点积直接等于余弦相似度,大幅提升向量数据库的搜索速度
常用的embedding模型:

4. 检索优化:提升召回质量与精度
检索阶段的目标是为大模型提供高质量、强相关的参考证据,直接决定生成答案的准确性上限。核心优化方法包括:
(1)Query改写
- Query基础优化:解决用户提问的偏差与模糊问题,包括
-
- 指代消解(多轮对话上下文补全):例如用户问“它的价格是多少?”,改写器会根据上下文将其改写为“华为 Mate 60 Pro 的价格是多少?”。
- 纠错去噪:剔除无意义的口语助词(如“那个...我想问一下...”)。
- 术语对齐(口语转专业术语):例如将“肚子疼怎么办”改写为“腹痛的治疗建议”。
- 复杂句结构转换:将复杂的长难句拆解或简化,提取出核心语义特征。
- 多查询生成:利用LLM从不同角度生成3-5个意思相近但表达不同的问题,分别检索后合并结果,通过"广撒网"提升召回率
(2)HyDE与反向HyDE
- HyDE(假设文档嵌入):先让LLM生成一个"假答案",再用假答案的向量去检索真实文档,将"问题-文档"的非对称匹配转换为"文档-文档"的对称匹配,解决短问题与长文档的语义不对等问题
- 反向HyDE(Doc2Query):离线为每个文档块生成3-5个可能对应的问题,将问题与原文档块关联后建立索引。优势是不影响实时调用的响应时间(RT)
(3)标签过滤
通过NLP技术从文档中提取结构化标签,在语义向量检索的基础上叠加标签过滤,精准过滤"语义接近但事实不符"的噪音,增加检索的确定性。
(4)重排序(ReRank)
- 原理:使用交叉编码器(如gte-rerank)将用户Query与候选文档拼接为一个长句子,通过交叉注意力机制捕捉细微的匹配关系,重新计算关联度并排序,最终选取Top-K最相关文档
- 优点:精度大幅提升;统一向量搜索与关键词搜索(BM25)的结果;减少输入大模型的Token数量,降低成本并提升生成质量
- 缺点:增加调用延时与算力开销;受模型上下文长度限制;对多查询技术不友好(计算量随查询数量线性增长)
5. 生成调优:控制输出质量与一致性
生成阶段的核心是让LLM严格基于检索到的上下文生成回答,而非依赖自身知识。
(1)常见问题
- 无相关信息时捏造答案
- 检索到信息但不按要求生成
- 多个文档块存在知识冲突时陷入困惑
- 对长上下文的中间信息不敏感("中间丢失"现象)
- 忽略参考资料,使用训练数据中的陈旧知识回答
(2)优化方法
- 模型选型:简单信息查询用小参数量模型;复杂逻辑推理用大参数量模型;长文档处理用大上下文窗口模型;特定领域(如法律)用领域微调模型
- Prompt优化:强约束禁止使用外部知识;强制要求标注信息来源;使用内容分隔标记区分提示词与检索片段;根据问题类型(事实查询/推理总结)使用不同模板
- 参数控制:固定
seed值保证输出一致性;调高presence_penalty减少重复;事实性查询降低temperature/top_p,创造性任务适当提高;通过max_tokens控制输出长度 - SFT微调:当Prompt优化达到极限时,准备"问题-参考资料-标准答案"的语料对,训练模型学会"基于参考资料回答"和"资料不足时拒绝回答"
三、进阶技术:Graph RAG
Graph RAG结合知识图谱与LLM,解决传统RAG在多跳推理和全局理解方面的局限性。
1. 解决的核心问题
- 多跳问题:传统RAG难以召回需要串联多个文档块的信息(如"A的导师的导师是谁")
- 全局理解问题:传统RAG擅长局部搜索,但难以对长文档进行全局性总结(如"这部小说的主旨是什么")
2. 工作原理
(1)索引构建阶段(建图)
- 文本切分:将长文档拆分为小块
- 实体与关系提取:利用LLM识别每个文本块中的实体(人、地、事、概念)、关系和属性,生成三元组
- 全局图谱构建:汇聚所有三元组,进行去重、消歧
- 社区检测:使用Leiden等图算法将紧密相关的实体聚合为"社区",并为每个社区生成预训练摘要
(2)查询检索阶段
- 局部检索:识别问题中的实体,召回该实体及其n跳邻居节点的信息,生成针对性回答
- 全局检索:针对宏观主题问题,检索预先生成的社区摘要,汇总后给出全局性结论
3. 代表性框架
Microsoft GraphRAG、LlamaIndex、LightRAG
四、RAG自动化评估:Ragas框架
Ragas是目前主流的RAG自动化评估工具,核心理念是"LLM-as-a-Judge",通过大模型自动计算评估指标,结果准确性接近人工评测。

1. 核心评估指标
Ragas将评估拆解为检索质量和生成质量两个维度:
(1)检索相关指标
- 上下文精度(Context Precision):衡量检索结果中相关文本块是否排在不相关文本块之前,关注"内容对不对",需要标注参考答案
- 上下文召回率(Context Recall):衡量所有与问题相关的文档是否被成功检索,关注"不遗漏"。将参考答案拆分为多个事实点,判断每个事实点是否能从检索上下文中找到出处
(2)生成相关指标
- 忠实度(Faithfulness):衡量生成答案与检索上下文的事实一致性,分值0-1,越高越好。若所有陈述都能被上下文支撑,则得分为1
- 答案相关性(Answer Relevancy):衡量生成答案与用户问题的匹配程度,不评估事实准确性。通过"基于回答生成问题→计算与原问题的相似度"的方式得分
- 噪声敏感度(Noise Sensitivity):衡量系统受无关信息干扰的程度,分值0-1,越低越好。分为"相关上下文噪声敏感度"(模型是否过度提取冗余信息)和"不相关上下文噪声敏感度"(模型是否被无关信息带偏)
2. 自动化评测集生成
Ragas解决了RAG开发中高质量测试数据集缺乏的痛点,支持自动生成覆盖不同场景的测试集:
(1)查询类型分类
- 单跳查询:仅需单个文档即可回答,分为具体查询(事实性问题,如"爱因斯坦哪年发表相对论")和抽象查询(解释性问题,如"相对论如何改变时空认知")
- 多跳查询:需要串联多个文档的信息,同样分为具体查询和抽象查询

(2)生成流程
- 知识图谱构建:文档切分→信息提取(LLM提取器+规则提取器)→关系构建(支持语义相似度、实体、层级结构、关键词四种关联方式)

- 场景生成:组合"知识节点、查询长度、查询风格(搜索式/对话式)、用户人设(初级工程师/经理等)"参数,生成多样化的测试场景
- 样本生成:通过Query Synthesizer为每个场景生成完整的测试样本,包含用户问题、参考上下文和标准答案
参考文章:
RAG 全链路技术详解
https://mp.weixin.qq.com/s/aA2PFaabKNlDq96jhAdDkQ
更多推荐



所有评论(0)