
RAG系统深度解析RAG 的具体流程 | 为什么你的RAG效果不好 | 怎么评估一个RAG系统的好坏1. RAG是什么RAGRetrieval-Augmented Generation检索增强生成是一种结合信息检索和大语言模型的架构。它的核心思想是在模型生成答案之前先从外部知识库中检索相关文档将这些文档作为上下文提供给模型最后生成基于事实的答案。简单来说RAG 检索器Retriever 生成器Generator的协同工作。它不是让模型凭空想象而是让模型带着资料回答。2. RAG有什么用RAG的出现解决了大语言模型的几个核心痛点痛点RAG的解决方案知识截止日期模型只知道训练数据截止前的知识RAG可以接入最新数据幻觉问题模型可能编造事实RAG提供真实资料作为依据私有数据接入模型没训练过你的企业数据RAG可以检索内部文档长文本处理成本把所有文档塞进prompt成本太高RAG只检索相关片段知识更新成本重新训练模型成本极高RAG只需要更新知识库适用场景智能客服、企业知识库问答、法律文书辅助、医疗诊断支持、教育辅导等。3. RAG的具体流程一个完整的RAG流程包含5个核心模块下图展示了完整的工作流3.1 分片Chunking目的将长文档切成适合检索的小块避免上下文超限同时保证每个块包含完整的语义信息。常见方式分片策略方法优点缺点固定长度切分按300字/500token硬切实现简单长度可控可能切断句子语义不完整自然结构切分按段落、小标题、句号切语义完整性强长度不均可能超长滑动窗口带重叠的切分避免在关键处切断数据冗余存储成本高递归切分先切段落再切句子层次化语义保留实现复杂3.2 向量化Embedding过程通过embedding模型将每个chunk转换为向量。以BERT base Chinese为例词表大小21128输出维度768处理流程chunk经词向量查找 → Transformer自注意机制 → 池化取[CLS]向量或平均 → 得到一维向量这个向量的神奇之处在于语义相近的文本在向量空间中的距离也相近。3.3 检索3.3.1 相似度计算常见计算方式方法公式特点点积( \text{similarity} q \cdot v \sum_{i1}^{n} q_i v_i )值越大越相似受向量长度影响欧式距离( \text{distance} \sqrt{\sum_{i1}^{n} (q_i - v_i)^2} )值越小越相似对尺度敏感余弦相似度( \cos\theta \frac{q \cdot v}{|q| \cdot |v|} )值越接近1越相似不受向量长度影响最常用3.3.2 高效检索当知识库达到百万甚至亿级规模时暴力计算所有向量相似度不可行需要ANNApproximate Nearest Neighbor近似最近邻搜索常见ANN算法HNSW基于图的导航式搜索IVF倒排索引聚类PQ乘积量化压缩向量3.3.3 Rerank重排ANN检索后可能返回几十个候选需要用更精确的模型重新排序特点精度高但速度慢作用将最相关的3-5个排在前面常用模型Cross-encoder类如bge-reranker-base3.3.4 向量数据库专门为向量检索优化的数据库核心功能存储向量原始文本建立ANN索引支持top-k检索支持元数据过滤解决普通数据库不擅长高维近邻搜索的问题常见选择Milvus、Qdrant、Weaviate、Chroma、Pinecone3.4 增强Augmented模块将检索到的top-k相关chunk与用户问题拼接成新的prompt请基于以下资料回答问题 [资料1]xxxxxx [资料2]xxxxxx [资料3]xxxxxx 用户问题xxxxxx 回答这一步的关键是prompt工程如何告诉模型优先使用资料不要自己编造。3.5 生成Generation模块增强后的prompt输入大模型模型基于上下文生成答案。与普通生成过程一致但因为有了相关资料的支撑幻觉大大减少。4. 联合概率解释为什么RAG会失效用数学语言理解RAG的局限性普通大模型生成概率 P(y|x)x为用户问题y为输出RAG生成概率 P(y|x) \sum_{z \in Z} P(z|x) \cdot P(y|x,z)其中(P(z|x)) 为检索到证据z的概率(P(y|x,z)) 为基于问题x和证据z生成答案y的概率关键洞察RAG是一条完整的链路整个过程的联合概率是各环节概率的乘积P_{RAG} P_{chunk} \cdot P_{embed} \cdot P_{retrieve} \cdot P_{rerank} \cdot P_{generate}只要中间任何一步出错最终结果就可能失败。这解释了为什么RAG系统调优如此复杂。5. RAG常见失败点及解决方案问题1分片问题表现chunk过大一个块包含多个主题检索时引入噪声chunk过小完整语义被切断单个块信息不足关键信息正好在切分边界上解决方案多层级分片策略层级结构 ├── 文档级 (Document)整个文档适合总结全文类问题 ├── 章节级 (Section)按标题/章节划分适合概念理解 ├── 段落级 (Paragraph)默认检索层级平衡长度和语义 └── 句子级 (Sentence)细粒度检索适合精确事实查询参数配置建议# 英文配置token为单位 chunk_sizes_en [2048, 1024, 512, 128] # 中文配置中文字符为单位 chunk_sizes_zh [3000, 1500, 600, 150] # 中文信息密度更高注意这里的大小是近似值实际切分时会保持语义边界完整不会硬切。问题2向量表示问题表现语义相近的文本在向量空间中距离很远导致相似度计算不准。原因embedding模型选型不当领域术语不在模型预训练范围内未针对业务数据进行微调解决方案A/B测试对比常用embedding模型对比模型维度特点适用场景BGE系列768/1024中文效果好中文通用text-embedding-31536OpenAI出品多语言m3e768开源中英双语通用bce-embedding768中文商用高精度需求问题3召回问题 - 未召回关键文本片段这是RAG系统最常见也最难调试的问题。我们把它细分为两类3.1 查询问题表现用户查询表述模糊或者查询意图需要不同粒度的信息。解决方案智能查询路由def query_router(query): 根据查询特征选择检索层级 # 规则1精确关键词触发句子级检索 if any(keyword in query for keyword in [table, figure, 第X章, 定义]): return sentence # 规则2长查询(15词)可能是复杂概念问题用章节级 if len(query.split()) 15: return section # 规则3查询很短(1-2词)可能是主题检索用文档级 if len(query.split()) 2: return document # 默认段落级 return paragraph层级存储在metadata中{ text: xxxxxx, metadata: { layer: paragraph, // document/section/paragraph/sentence doc_id: doc_001, title: xxx } }检索时过滤# 只在指定层级搜索 results vector_store.search( query_vector, filter{layer: {$eq: paragraph}} )实际使用技巧80%的场景用paragraph层就够了可以在paragraph层检索如果置信度低如top1得分阈值自动下钻到sentence层二次检索document层主要用于总结全文类问题3.2 语义问题表现用户查询中的关键词在知识库中存在但因为语义匹配问题没被召回。案例用户问题美国总统住在哪里 知识库中有白宫是美国总统的官邸和主要办公场所embedding可能因为住和官邸的语义差异没匹配上但如果有关键词匹配关键词美国总统住 → 匹配白宫就能召回解决方案混合检索架构Elasticsearch配置示例{ mappings: { properties: { content: { type: text, analyzer: ik_max_word, // 中文分词 search_analyzer: ik_smart } } } }查询改写解决多轮对话中的指代问题用户John是谁 助手John是公司的技术总监... 用户他喜欢看什么书 问题第二个问题只有他无法关键词匹配 解决方案多轮对话查询改写 输入[John是谁, 他喜欢看什么书] 输出John喜欢看什么书问题4重排问题表现rerank模型将本应排在前面的证据排到了后面。原因rerank模型本身精度不足跨语言问题查询中文文档英文查询和文档长度差异过大解决方案rerank模型选型bge-reranker-base中文cross-encoder/ms-marco-MiniLM英文多语言xlm-roberta-based两阶段rerank# 第一阶段轻量级rerank筛出top50 candidates light_rerank(initial_results[:200]) # 第二阶段重量级rerank精排top20 final_results heavy_rerank(candidates[:50])融合分数final_score 0.3 * vector_score 0.3 * keyword_score 0.4 * rerank_score问题5生成问题表现即使检索到了正确资料模型还是回答错误。原因prompt设计不合理模型被资料中的噪声干扰模型不擅长多文档推理指令微调不足解决方案Prompt工程prompt_template 请严格基于以下资料回答问题。如果资料中没有相关信息请直接说资料中未提及。 资料 {context} 问题{question} 回答要求 1. 只使用资料中的信息 2. 如果资料矛盾请指出并说明不同来源的差异 3. 简明扼要不要添加额外信息 回答 上下文压缩去除检索结果中的冗余信息# 只保留与问题最相关的2-3句 compressed_context extract_relevant_sentences(context, question)多文档推理优化让模型先逐条分析每个文档再综合给出答案标注每个信息点的来源6. 如何评估RAG系统的好坏6.1 核心指标详解检索质量指标指标公式含义理想值Hit Ratek有相关文档在topk中的查询比例召回能力0.8MRR(\frac{1}{Q}\sum_{i1}^{Q}\frac{1}{rank_i})第一个正确答案的位置0.7NDCGk考虑排序位置的加权指标排序质量0.75生成质量指标指标评估方法含义忠实度答案中的每个陈述都能在资料中找到依据防止幻觉相关度答案直接回答了问题没有偏题用户体验完整性答案覆盖了问题的所有方面信息全面自动化评估方法# 使用LLM评估答案质量 eval_prompt 请评估AI助手的回答质量 问题{question} 标准答案{ground_truth} AI回答{ai_answer} 检索到的资料{context} 请从以下维度评分1-5分 1. 忠实度回答是否严格基于资料 2. 准确性与标准答案的匹配程度 3. 完整性是否遗漏重要信息 输出格式 {{ faithfulness: x, accuracy: x, completeness: x, explanation: 简要说明 }} 6.2 离线测试集构建好的评估需要高质量测试集# 测试集格式示例 test_cases [ { question: 美国总统住在哪里, ground_truth: 白宫, relevant_docs: [doc_001_chunk_3, doc_002_chunk_5], difficulty: easy, # easy/medium/hard category: factual # factual/reasoning/summary } ]构建方法人工标注成本高但质量最好LLM生成人工校验效率高用户日志回放真实场景7. 未来展望RAG技术正在快速演进值得关注的方向方向核心思想优势Self-RAG模型自己决定何时检索、检索什么更智能减少无用检索模型更清楚自己需要什么信息Corrective RAG验证检索结果必要时重检索提高可靠性Graph RAG利用知识图谱结构增强检索更好处理多跳问题Agentic RAG多轮检索、推理、工具调用解决复杂任务结语RAG不是银弹但它是当前落地大模型最实用的架构。理解每个环节的原理和可能的失败点建立完善的评估体系持续迭代优化才能构建出真正好用的RAG系统。记住没有最好的RAG只有最适合你业务的RAG。