../

Table of contents

RAG (Retrieval-Augmented Generation) 是一种结合检索和生成的AI架构,它通过检索外部知识来增强语言模型的输出质量1。本文将介绍RAG的基本概念、实现方法、最佳实践和新兴技术。

什么是RAG

RAG技术本质上是一个知识增强系统,它为大语言模型配备了外部知识检索能力。就像为AI装配了一个智能知识库,使其能在生成回答时实时检索和引用相关信息。这种架构不仅扩展了模型的知识边界,更确保了输出内容的准确性和可溯源性。

这项技术可以类比为AI的“认知增强器“:传统语言模型仅依赖训练时获得的参数化知识,而RAG则让模型获得了类似人类查阅资料的能力。它能实时访问和处理海量结构化知识,远超人类大脑的记忆极限。

通过将检索与生成相结合,RAG不仅提升了AI系统的知识储备,更重要的是增强了其推理能力和答案可靠性。这种技术架构让AI在保持灵活性的同时,也具备了严谨的知识支撑。

RAG的实现方法

RAG系统的实现通常包含两个主要阶段:离线处理阶段和在线服务阶段。

整体架构

离线处理阶段

  1. 知识库准备:收集和整理文档资料
  2. 文档分块:将文档切分成适当大小的片段
  3. 向量化处理:使用嵌入模型将文本块转换为向量
  4. 索引构建:将向量存入向量数据库,建立检索索引

在线服务阶段

  1. 查询处理:处理用户输入的问题
  2. 相关性检索:从向量数据库中检索相关文本
  3. 上下文组装:将检索结果组织成合适的上下文
  4. 生成回答:让大语言模型基于上下文生成回答

下面我们详细介绍每个关键步骤的实现方法和最佳实践。

1. 文档分块(Chunking)

文档分块是RAG系统的基础环节,其质量直接影响检索效果。一个好的分块策略需要在保持语义完整性和检索效率之间取得平衡。

分块策略选择

最常见的分块方式是基于token数量进行切分,通常建议将每个chunk的大小控制在256-1024个token之间。同时,为了避免切分导致的上下文丢失,相邻块之间通常会保留10%-20%的重叠内容。

对于结构化文档(如Markdown),可以结合文档的层级结构进行智能分块。例如使用标题作为分块的边界,这样可以更好地保持文档的语义完整性。

中文文档处理

中文文档的分块需要特别注意,直接使用LangChain的默认分割器效果不佳。建议:

优化建议

为了提高分块质量,可以采取以下措施:

  1. 文档预处理:清理异常字符、规范化格式
  2. 分块质量控制:避免过长或过短的chunk
  3. 保持上下文:在必要时保留标题或文档结构信息
  4. 特殊处理:对表格、代码等特殊内容采用专门的分块策略

好的分块策略为后续的向量化和检索步骤打下基础,直接影响RAG系统的整体效果。

2. 向量嵌入(Embedding)

向量嵌入是将文本转换为数值向量的过程,这个步骤的质量直接影响检索的准确性。实现过程中主要需要考虑两个关键选择:嵌入模型和向量数据库。

嵌入模型选择

对于中文内容,建议使用专门优化的嵌入模型,如’shibing624/text2vec-base-chinese’和 ‘BAAI/bge-base’系列,这些模型对中文语义的理解更为准确,能够生成更优质的向量表示。

检索优化策略

单纯依赖向量检索可能存在局限性。例如,当用户提供简单关键词时,可能因为语义相似度不够而无法检索到相关内容。为了提高检索效果,我们可以采用以下策略:

  1. 混合检索方案

    • 结合向量数据库(如chromadb、qdrant)和传统数据库(如SQLite)
    • 一些向量数据库支持hybrid search功能
    • 采用BM25等词法匹配算法补充向量检索
  2. 数据库选择

    • Chromadb:简单易用,适合快速实现
    • Qdrant:基于Rust开发,性能更优

通过组合使用这些技术,我们可以显著提高检索的准确性和召回率,确保能找到最相关的文本片段。

3. 上下文优化

文档分块虽然便于检索,但也带来了一个明显的问题:文本片段之间失去了原有的上下文关联。这可能导致检索结果被错误理解或使用。例如,假设有一篇《杭州美食文化》的文章,其中一段描述面条的内容被单独分块:

“这种面条宽度适中,口感爽滑,配上鲜美的高汤,是本地最受欢迎的面食之一。”

如果没有保留上下文,这个片段可能会被错误地用于回答关于其他城市面食的问题,因为单独的片段中并没有提到这是杭州特色小吃的信息。

Contextual Retrieval(上下文检索)

为解决上下文丢失的问题,我们可以采用以下策略2

  1. 为每个chunk添加上下文信息

    • 在每个文本片段开头添加文档摘要
    • 保留关键的背景信息
    • 确保语义完整性
  2. 使用AI辅助生成上下文 Claude提供了一个有效的prompt模板:

     
    {{WHOLE_DOCUMENT}} 
     
    Here is the chunk we want to situate within the whole document 
     
    {{CHUNK_CONTENT}} 
     
    Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk.
    

通过这种方式,我们可以在保持文本片段独立性的同时,也保留必要的上下文信息,从而提高检索结果的准确性和可用性。

4. 运行时流程优化

RAG系统在运行时的性能很大度上取决于检索和生成两个关键阶段的优化。根据Anthropic的研究,合理的优化可以将检索失败率降低67%。让我们分别看看这两个阶段的实践。

检索阶段

检索阶段的核心是找到最相关的文本片段。这个过程通常分为两步:

  1. 初始检索

    • 从知识库中检索20-150个相关文本块
    • 检索数量需要在召回率和性能之间取得平衡
    • 可以同时使用向量检索和BM25检索,提高召回率
  2. 重排序筛选

    • 使用重排序模型(Reranker)对检索结果进行相关性排序(这里 ‘BAAI/bge-base’系列模型支持中文内容重排)
    • 根据问题复杂度选取top 5-20个最相关的文本块
    • 按照Anthropic的研究,选用5、10、20个文本块效果较好
    • 注意:重排序会带来额外的延迟和成本,需要在性能和效率间权衡

生成阶段

生成阶段的关键是如何有效地使用检索到的信息。

  1. 上下文组装策略

    • 将检索到的文本块按相关性组织
    • 确保上下文的连贯性和完整性
    • 控制总体token数量在模型处理范围内
  2. 提示词优化建议

    • 将参考信息放在prompt的前半部分
    • 将用户问题放在最后,大模型更加关注最后部分的token
    • 适当添加指令,引导模型使用检索内容

通过精心优化这两个阶段,我们可以显著提升RAG系统的响应质量和效率。

新兴RAG技术

当前RAG技术正在快速发展,出现了一些创新变体:

总结与展望

RAG技术作为一种将检索与生成相结合的创新架构,正在重塑AI系统与知识交互的方式。通过本文的详细探讨,我们可以看到RAG不仅解决了大语言模型知识时效性和可靠性的问题,更开创了一种新的AI应用范式。

从技术实现的角度,RAG系统的成功依赖于文档分块、向量嵌入、上下文优化等关键环节的精心设计。每个环节都需要在效率和效果之间找到最佳平衡点。特别是在中文场景下,这些技术细节的优化显得尤为重要。

展望未来,RAG技术的发展方向主要集中在以下几个方面:

  1. 知识表示的进化:从简单的向量表示向更复杂的知识图谱方向发展,如GraphRAG的探索显示了这一趋势。

  2. 检索机制的智能化:像HippoRAG这样模仿人类认知系统的方案,预示着检索机制将更加智能和自适应。

  3. 效率与成本的优化:LightRAG等解决方案表明,在保持性能的同时降低资源消耗将是一个重要发展方向。

  4. 多模态融合:未来RAG技术很可能扩展到图像、视频等多模态数据的处理,实现更全面的知识增强。

有人会质疑,RAG技术是否真的需要这么复杂?直接使用长文本的大模型不香吗?我拿电脑举例,大模型的上下文更像是电脑的内存,而RAG技术更像是电脑的硬盘,它能够提供更可靠的长期记忆。 RAG技术便宜经济,无需训练就能快速更新知识库同时能够精确控制AI可访问知识范围,这样的优势下,其长期发展是值得期待的。 对于AI时代而言,私有数据正在成为企业或者个人的核心竞争力。RAG技术不仅能够高效组织和利用这些私有数据,更能帮助企业快速构建具有独特竞争优势的AI应用。这种“数据为王“的趋势,将使RAG成为未来AI架构中不可或缺的组成部分。


1

Meta AI在2023年发布的RAG论文:Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

2

Anthropic. (2024). Introducing Contextual Retrieval. https://www.anthropic.com/news/contextual-retrieval

3

GraphRAG:https://github.com/microsoft/graphrag

4

HippoRAG论文:https://arxiv.org/abs/2405.14831

5

LightRAG论文:https://arxiv.org/abs/2410.05779

/AI/ /RAG/