推荐语
RAG技术虽强大却仍有痛点,一文详解检索增强生成的核心问题与优化方案。
核心内容:
1. RAG系统三大环节(检索/增强/生成)的典型问题分析
2. 高级RAG技术解决方案与开源工具盘点
3. 评估体系构建与问题定位方法论
杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家
RAG(检索增强生成)虽然极大地提升了大型模型(LLM)回答问题的准确性和时效性,但在实际落地过程中,它远非一个完美的解决方案。
下面,我们将详细梳理当前 RAG 系统遇到的主要问题,以及业界为解决这些问题而探索出的先进解决实践和涌现出的优秀开源产品。
一、 当前 RAG 系统面临的核心问题
RAG 的问题可以归结为一句话:“垃圾进,垃圾出”(Garbage In, Garbage Out)。这个“垃圾”可能产生在流程的任何一个环节。
1. 检索端 (Retrieval) 的问题——“没找到”或“找错了”
这是最常见、最致命的问题来源。
- 低质量的数据源: 知识库本身就充满了过时、重复、矛盾甚至错误的信息。RAG 无法检索到不存在或错误的信息。
- 糟糕的文本切分 (Chunking):
- 上下文割裂: 简单的按固定长度切分,很容易把一个完整的语义段落(如一个问题的答案)从中间切断,导致检索到的文本块信息不完整。
- 丢失结构信息: 将复杂的文档(如带有表格、标题、列表的PDF)粗暴地转为纯文本,会丢失宝贵的结构化信息。
- 低效的嵌入模型 (Embeddings): 用于将文本转换为向量的嵌入模型,可能无法很好地理解特定领域的专业术语,导致语义相似性搜索出现偏差。
- 检索不精准: 用户的提问通常是模糊的,而简单的向量搜索可能只召回了包含相同关键词、但实际并不回答问题的文档片段。
2. 增强端 (Augmentation) 的问题——“上下文没用好”
即使检索到了正确的信息,如何有效地呈现给LLM也是一个挑战。
- “大海捞针”问题: 为了提高召回率,系统可能一次性检索出过多(例如Top-K=10)的文档块。当这些文档块塞满上下文窗口时,LLM 可能会被大量无关信息干扰,无法精准定位到其中真正有用的那一句关键信息。
- 上下文长度限制: 检索到的信息总量超过了模型的上下文窗口长度,导致关键信息被截断或丢失。
3. 生成端 (Generation) 的问题——“看到了但说不好”
这是最后一步的问题。
- “幻觉”与不忠实: 即使提供了正确的上下文,LLM 仍有可能忽略上下文,基于其内部的参数化知识进行“自由发挥”,或者错误地综合、曲解上下文的内容。
- 无法综合复杂答案: 当问题的答案散落在多个不同的检索文档块中时,LLM 可能无法有效地将它们串联起来,形成一个有逻辑、有条理的完整答案。
4. 评估 (Evaluation) 的问题——“不知道哪里出了问题”
- 缺乏有效的评估体系: 很多团队不知道如何科学地、自动化地评估一个RAG系统的好坏。当用户反馈“答案不对”时,很难定位问题究竟出在检索环节还是生成环节。
二、 解决实践与先进技术
针对以上问题,业界已经发展出一系列被称为“高级RAG”(Advanced RAG)的技术来应对。
1. 优化检索质量
- 智能切分 (Intelligent Chunking):
- 实践: 不再使用固定长度切分,而是基于语义或句子边界进行切分,确保每个文本块都是一个完整的语义单元。对于复杂文档,可以先进行结构化解析(如提取表格、标题),再进行切分。
- 查询重写与转换 (Query Rewriting & Transformation):
- 实践: 在检索前,先用LLM对用户的原始问题进行“预处理”,将其改写得更清晰、更适合机器检索。例如,将一个复杂问题分解成多个子问题分别进行检索,或者将口语化的表达转化为更正式的查询语句。
- 混合搜索 (Hybrid Search):
- 实践: 结合关键词搜索(如BM25)和向量语义搜索。关键词搜索能保证精准匹配,而向量搜索能处理同义词和语义相关性,两者互补,能显著提升召回率和精准度。
- 重排 (Re-ranking):
- 实践: 这是提升检索质量性价比最高的方法之一。在初步检索(召回)出较多(如Top-50)的候选文档后,使用一个更轻量、但更精准的交叉编码器(Cross-encoder)模型对这些候选文档与问题的相关性进行二次打分排序,只将最终得分最高的Top-3或Top-5文档块送入LLM。
2. 优化上下文构建
- 上下文压缩: 对于检索到的、可能包含大量冗余信息的长文本块,可以先用一个小的LLM对其进行总结和压缩,只将最核心的信息提供给最终的生成模型。
- 图 RAG (Graph RAG): 将知识库构建成知识图谱。检索时,不仅查找单个信息节点,还会检索其周边的关联节点,为LLM提供一个包含丰富关系和实体信息的、更结构化的上下文。
3. 优化生成过程
- 指令微调 (Instruction Fine-tuning): 对生成答案的LLM进行微调,专门训练它“严格依据所提供的上下文来回答问题”的能力,以减少“幻觉”。
4. 建立科学的评估体系
- “检索-生成”分离评估: 分别建立评估指标来衡量 检索器(Retriever)和生成器(Generator)的性能。
- 检索评估指标:
Context Precision
(检索到的上下文有多少是真正相关的)、Context Recall
(相关的上下文有多少被成功检索出来了)。 - 生成评估指标:
Faithfulness
(回答是否忠实于上下文)、Answer Relevance
(回答是否切中用户问题)。
三、 主流开源产品与框架
围绕上述的解决实践,涌现出了一批优秀的开源工具和框架。
1. RAG 应用构建框架
- LangChain (Python/JS):
- 定位: 最知名、最全面的LLM应用开发框架。它提供了构建RAG所需的所有组件(数据加载、切分、嵌入、向量存储、检索、生成),并将它们像“乐高积木”一样串联起来。非常适合快速原型设计和构建复杂的、包含多步链条或Agent的RAG应用。
- 官网:
https://www.langchain.com/
- LlamaIndex (Python):
- 定位:专注于RAG的数据框架。相比LangChain的“大而全”,LlamaIndex在数据索引和检索方面做得更深入、更专业。它内置了大量高级的索引结构(如树索引、知识图谱索引)和检索策略,是构建高性能、专业级RAG系统的首选。
- 官网:
https://www.llamaindex.ai/
- Haystack (Python):
- 定位: 面向生产环境的NLP和RAG管道构建框架。它非常模块化,与Elasticsearch等企业级搜索引擎集成良好,适合构建企业级的智能搜索和问答系统。
- 官网:
https://haystack.deepset.ai/
2. 检索器与重排器
- RAGatouille (Python):
- 定位: 一个专注于后期交互(Late Interaction)检索模型的库,特别是对 ColBERT 模型的易用封装。ColBERT是一种比传统向量搜索更精细、效果更好的检索模型,RAGatouille让普通开发者也能轻松用上这种先进技术。
- GitHub:
https://github.com/bclavie/RAGatouille
3. RAG 评估框架
- RAGAs (Python):
- 定位:专门用于评估RAG管道的开源框架。它提供了上面提到的
Faithfulness
, Context Precision
, Context Recall
等核心评估指标的实现,可以帮助你自动化地、量化地评估你的RAG系统性能。 - 官网:
https://docs.ragas.io/
- DeepEval (Python):
- 定位: 一个更全面的LLM评估框架,集成了单元测试的思想。它不仅能评估RAG,还能评估幻觉、偏见、毒性等多个维度,并且可以与
pytest
等测试框架无缝集成。 - GitHub:
https://github.com/confident-ai/deepeval
这些开源产品的组合使用,可以极大地帮助开发者和企业构建、优化和评估自己的RAG系统,从而在实际应用中取得更好的落地效果。