--- source_url: https://mp.weixin.qq.com/s/aA2PFaabKNlDq96jhAdDkQ source_name: 大淘宝技术 title: "RAG 全链路技术详解" author: 驰海(淘天集团品牌行业架构团队) ingested: 2026-05-18 sha256: 9b9c05c6f6749ba99ada5df4543baed0ee1568f7c563615c79b350d7873e80f9 tags: [rag, pipeline, embedding, chunking, retrieval, rerank, graph-rag, ragas, evaluation, meta-chunking, hyde, agent] type: article --- 在Agent的开发过程中,RAG技术的应用水平直接决定了Agent的业务上限。本文为RAG技术实战指南,聚焦Agent开发中的核心挑战:知识库构建不规范、检索召回不准、缺乏量化评测。 全文覆盖RAG全链路——从文档加载(多格式解析+元数据提取)、智能切分(规则/语义/结构化方法,含Meta-Chunking原理)、索引构建(embedding模型选型与向量生成详解)、检索优化(Query改写、HyDE/Doc2Query、标签过滤、重排序)、生成调优(Prompt设计、参数控制、SFT微调),到进阶Graph RAG(多跳推理与全局摘要),最后落地Ragas自动化评估体系(Context Precision/Recall、Faithfulness、Answer Relevancy等指标及测试集生成)。强调"可测、可调、可信赖"的RAG工程化实践。 为什么需要RAG? 大型语言模型(LLMs)已经取得了显著的成就,尽管它们仍然面临着很大的局限性,尤其是在特定领域或知识密集型任务中,特别是在处理超出其训练数据或需要当前信息的查询时,会产生 "幻觉"。为了克服这些挑战,检索增强生成(RAG)通过语义相似性计算从外部知识库中检索相关文档块,从而增强了 LLM。通过引用外部知识,RAG 可有效减少生成与事实不符内容的问题。 RAG的工作原理 RAG,全称Retrieval Augmented Generation(检索增强生成),其工作原理为:当用户提问时,系统先从海量知识库中检索出与问题相关的实时或私有信息,并将这些信息作为参考背景与问题一起提供给大模型,让模型像做开卷考试一样,基于提供的可靠证据生成更准确、实时且可溯源的回答。 RAG核心技术点 文档加载 文档加载是RAG的"入口",它的质量直接决定了后续检索的准确性。简单来说,它的工作就是将各种格式的非结构化数据转化为系统可处理的统一文本格式。 文档加载的主要工作如下: 多格式适配: 兼容各种文件格式,如 PDF、Word、Markdown、HTML、JSON、TXT 甚至 Excel。 内容提取: 从原始文件中剥离出"净文本"。 如果是 PDF,需要解析文字层;如果是扫描件,则需要 OCR。 如果是 HTML,需要剔除脚本、样式表,只保留正文。 元数据(Metadata)提取: 在提取文本的同时,记录文档的属性,如:文件名、页码、标题、作者、创建时间、章节层级等。 初步清洗: 去除文档中的冗余信息,如乱码、过多的空格、特殊的非打印字符等。 文档切分 按语义切块的实现(Meta-Chunking) Meta-Chunking: Learning Text Segmentation and Semantic Completion via Logical Perception:该论文给出了一个基于逻辑和语义的chunking的方法,有完整的效果评测,可参考。 原理:计算文章中各句子(sentence)的PPL(困惑度),以此判断哪些句子应该被划分在一个文档块(trunk)中。 PPL(Perplexity,困惑度)源于信息论,是衡量语言模型预测序列好坏的核心指标。在该论文中,PPL 被巧妙地用作一种感知语义边界和逻辑完整性的度量工具。 直观理解:PPL 反映了语言模型在看到一段文本时有多"困惑"。低 PPL:模型觉得这段话很通顺、逻辑连贯、符合语言规律;高 PPL:模型觉得这段话很突兀、逻辑断层或不符合语境。 实现步骤: 1. 对文档进行切分:将原始长文档按照标点符号切分成一个个句子(Sentences)。切分好的句子表示为,(x1, x2, ..., xn)。 2. 使用轻量化大模型(如Qwen2)计算每个句子与其前面句子的PPL。得到一条随文本流动的PPL曲线。 3. 寻找PPL曲线上的局部极大值(Local Maximum)。当PPL突然大幅升高,说明这一句与前面的内容在逻辑上"脱节"了——这个点标记为潜在切分边界。 4. 对每个切块进行语义补全:全局增强的文本块重写(Globally Augmented Text Chunk Rewriting),识别并补全因分块导致的上下文信息丢失。 5. 摘要生成(Context-Aware Summary Generation):为每个文本块生成富含全局信息的简明摘要,增强语境感知能力。 索引构建(embedding) 基本原理:将文档根据语义生成向量。现代embedding模型基于Transformer架构,以"苹果手机很好用"为例: 1. 分词与编号(Tokenization):切分为 [苹果, 手机, 很好用],增加[CLS]和[SEP]特殊字符,转换为数字索引。 2. 映射初始向量:通过预定义表格将数字索引转换为初始向量(如1536维)。 3. 转换Query/Key/Value:通过WQ、WK、WV三个权重矩阵将每个token转换为Q(提问者)、K(被索引者)、V(内容本身)。 4. 注入位置信息(Positional Encoding):加入位置编码使模型感知token顺序。 5. 自注意机制(Self-Attention):计算每个token与其他token的相关性,分配权重,重新计算向量。例如"苹果"的Q×"手机"的K=50%,"苹果"的向量会吸收"手机"的特征。 6. 逐层深化:12或24层自注意后,每个token向量包含整句信息。 7. 池化处理(Pooling):Merge各token向量为一个向量——CLS方式(取首token)、Mean Pooling(平均池化,BGE常用)、Max Pooling(最大池化)。 8. 向量归一化(L2 Normalization):使模长等于1,点积=余弦相似度,加速向量数据库搜索。 检索 检索阶段会召回与问题最相关的文本段。通过embedding模型对问题进行文本向量化,并与向量数据库的段落进行语义相似度的比较,找出最相关的段落。 Query改写 核心目标:对用户原始查询进行优化,纠正偏差、模糊或不完整信息。 - 指代消解:处理多轮对话(如"它的价格是多少?"→"华为Mate 60 Pro的价格是多少?") - 纠错与去噪:修正错别字,剔除口语助词 - 术语对齐:口语转专业术语(如"肚子疼"→"腹痛的治疗建议") - 结构转换:长难句拆解/简化,提取核心语义 多查询生成:将单一查询转化为3-5个不同角度的查询,通过"广撒网"提升召回率。例如"如何提高睡眠质量"→"睡前哪些习惯有助于入睡?"+"什么样的卧室环境适合深度睡眠?"+"改善失眠的科学方法有哪些?" HyDE:用假设文档增强检索 HyDE(Hypothetical Document Embeddings)不是用"问题"去搜"答案",而是先让AI生成一个"假答案",再用这个假答案的向量去匹配真实文档。本质是将"问题-文档匹配"转换为"文档-文档匹配"。 工作流程: 1. 接收用户提问 2. LLM生成虚构文档(Hypothetical Document):凭内部知识编一个答案(即使包含错误信息也没关系) 3. 对虚构答案进行向量化 4. 用虚构答案的向量去数据库检索最相似的真实文档 例子:用户问"为什么面团放一会儿会变大?"→ LLM生成伪答案"酵母菌发酵产生CO2气体..."→ 用伪答案向量匹配到论文《真菌代谢对谷物蛋白弹性的影响》→ 最终回答基于真实论文内容。 反向HyDE(Doc2Query) 针对每个chunk生成这块chunk可能的question,然后对这些question建立索引,关联到chunk内容。优势是可离线处理,不影响实时调用RT。 例子:原始文本"根据差旅管理办法第四条...住宿补贴上限350元..."→ LLM生成3个虚构问题①出差二线城市住酒店一天能报销多少钱?②出差回来后最晚什么时候报销?③报销需要什么类型发票?→ 用户"报销上周去西安出差的房费"→ 匹配到虚构问题①②→ 召回原始文本→ AI生成精准回答。 Doc2Query解决了"用户提问方式与文档陈述方式不匹配"的问题——通过"提问vs提问"替代"提问vs陈述"。 提取标签:将非结构化数据转向半结构化数据,在语义向量检索基础上引入标签过滤。例如用户搜"iPhone 15 Pro Max"→ 标签匹配通过"iphone15"精准锚定目标,过滤掉"iPhone 14"等语义相似但事实不符的噪音。 重排序(ReRank) 检索召回的文档虽相关,但可能部分与query关联度不大。ReRank对召回docs做关联度排序,选取top k做上下文补充。 原理:使用交叉编码器(Cross-Encoder),将Query和候选文档拼成一个长句塞进模型(如gte-rerank),通过自注意力机制让Query中每个token直接观察文档中的每个词,捕捉细微匹配关系。例如"推荐2000元以下续航好的华为手机"→ Cross-Encoder检查是否华为、是否低于2000、是否提到续航,缺一项则大幅降分。 优点:精度飞跃、多源融合(统一裁判向量搜索和BM25结果)、降低LLM负担(减少Token成本+解决"中间丢失")。 缺点:增加延时、算力开销、有上下文长度限制、多查询场景计算量×N。 生成答案 RAG应用将问题与文本段通过提示词模板生成最终prompt,由大模型生成回复。 可能遇到的问题及优化: - 没有检索到信息→ LLM捏造答案:通过强约束指令"禁止"使用外部知识,要求强制引用来源 - 知识冲突(文档A说"可以办",B说"禁止办"):模型困惑,需明确引用策略 - 丢失中间信息(LLM对长上下文开头结尾敏感):使用ReRank提升中间位置的可见性 - 模型忽略参考资料:Prompt添加内容分隔标记,明确区分Prompt与检索切片 - 模型调参:相同输出用相同seed;避免重复用presence_penalty;事实查询降低temperature;字数限制用max_tokens - SFT微调:准备"问题-参考资料-标准答案"语料,训练模型"根据参考资料回答"和"资料不足时拒绝回答"的能力 进阶:Graph RAG 通过结合知识图谱和大语言模型,解决传统RAG在多跳推理和全局理解上的局限性。从文本块中提取实体、关系和属性构建知识网(图),检索时可将相连节点一起召回。 解决的问题: 1. 多跳问题:例如"A的导师的导师是谁?"——传统RAG只能找到A的导师=B,找不到B的导师=C。Graph RAG通过图路径(文档1[A,B]↔文档2[B,C])追踪找到答案。 2. 全局理解:例如"这部小说的主旨是什么?"——传统RAG擅长局部搜索但不擅长总结全书。Graph RAG通过社区检测(Community Detection,如Leiden算法)将图谱分层,为每个簇预生成摘要。 工作原理: - 索引构建:文本切分→LLM提取实体与关系(三元组)→构建全局知识图谱→社区检测→社区摘要 - 查询检索: - 局部检索(Local Search):定位实体→提取邻居节点(n跳关联)→LLM生成答案 - 全局检索(Global Search):不找具体实体→检索预生成的社区摘要→汇总各社区结论 代表性框架:Microsoft GraphRAG、LlamaIndex、LightRAG RAG的评估:Ragas评估框架 Ragas(Retrieval Augmented Generation Assessment)是一款RAG效果评估自动化工具,提供上下文维度和答案维度的效果指标计算,核心理念是LLM-as-a-Judge。 评估指标: - 检索维度: - Context Precision(上下文精度):检索出的内容中,相关文本块排在列表顶部的程度。关注"检索到的内容对不对" - Context Recall(上下文召回率):所有相关文档中被成功检索的比例。关注"不遗漏"。通过拆解参考答案为事实点(Claims),判断每个事实点是否能从检索上下文溯源 - 生成维度: - Faithfulness(忠实度):生成回答与检索上下文在事实逻辑上的一致性(0-1)。回答中所有Claims都能被检索上下文支撑则"忠实" - Answer Relevancy(答案相关性):回答与用户输入的匹配程度(0-1)。通过从回答反向生成3个合成问题,计算与原始问题的embedding余弦相似度平均值 - Noise Sensitivity(噪声敏感度):系统因检索文档(相关或不相关)提供错误回答的频率(0-1,越低越好)。分为相关上下文噪声敏感度(文档相关但含冗余信息)和不相关上下文噪声敏感度(文档完全无关) 评测集生成(Testset Generation for RAG) Ragas支持自动生成测试集,通过知识图谱构建和场景生成来完成: 1. 文档切分 2. 信息提取(LLM提取器+NERExtractor等规则提取器) 3. 关系构建(语义相似度、实体共现、层级结构、关键词等四种方式) 4. 场景生成:组合节点(Nodes)、查询长度(Query Length)、查询风格(Query Style)、人设(Persona)等参数 5. 查询分类:Single-Hop/Multi-Hop × Specific/Abstract → 四种查询类型 6. 可通过内置QuerySynthesizer或自定义QuerySynthesizer生成评测集