大模型检索增强生成(RAG)技术综述
检索增强生成(RAG)通过集成外部知识库解决大模型幻觉及知识滞后问题。综述了 RAG 的核心框架,包括 Naive、Advanced 及 Modular RAG 架构,详细分析了索引优化、检索源选择、Query 处理及 Embedding 改进等关键技术。此外,介绍了 Milvus、Pinecone 等主流向量数据库及 LangChain、LlamaIndex 等开发框架,并提供了 RAG 系统的评估维度与基准工具,为构建高效的大模型应用提供全面参考。

检索增强生成(RAG)通过集成外部知识库解决大模型幻觉及知识滞后问题。综述了 RAG 的核心框架,包括 Naive、Advanced 及 Modular RAG 架构,详细分析了索引优化、检索源选择、Query 处理及 Embedding 改进等关键技术。此外,介绍了 Milvus、Pinecone 等主流向量数据库及 LangChain、LlamaIndex 等开发框架,并提供了 RAG 系统的评估维度与基准工具,为构建高效的大模型应用提供全面参考。

最近一年,LLM 展示了强大的能力,但是面对幻觉、最新的知识以及复杂任务时往往略显不足。RAG(Retrieval Augmented Generation,检索增强生成)通过集成外部知识库来解决类似问题,取得了很不错的效果。
这里,我们参考 [2312.10997] Retrieval-Augmented Generation for Large Language Models: A Survey 整理 RAG 相关的方案、优化手段、评估指标等内容,以便对 RAG 有更全面的了解。此外,我们也介绍了最常用的一些向量数据库和 RAG 框架。
是什么:RAG 是一种通过检索外部知识库来获得额外语料,并使用 ICL(In-Context-Learning,上下文学习)来改进 LLM 生成效果的范式。
为什么:LLM 受训练语料的限制,无法感知最新的内容,比如 LLM 训练后的新闻;此外,LLM 也容易产生幻觉,生成不正确的内容。
如何做:当用户发起一个生成请求时,首先基于用户的 prompt 来检索相关信息,然后这些信息会被组合到 prompt 中,为生成过程提供额外的上下文,最后将组合后的 prompt 输入 LLM 生成结果。
怎么样:RAG 的主要优势在于可以避免针对特定任务再次进行训练;用户可以额外附加外部知识库,丰富输入,从而优化模型的输出效果。RAG 因其高可用性和低门槛而成为 LLM 系统中最受欢迎的方案之一,许多 LLM 应用都会基于 RAG 构建。
Naive RAG 是最简单、最原始的 RAG 方案,也被称为 "Retrieve-Read" 框架,其包含几个关键阶段:
Indexing(离线处理):
Retrieval(在线处理):
Generation(在线处理):
![图:Naive RAG 流程示意图]
在 Naive RAG 中也有一些不足,会带来比较大的挑战:
Advanced RAG 相比 Naive RAG 进一步增加了 Pre-Retrieval 和 Post-Retrieval 模块。
![图:Advanced RAG 架构示意图]
首先是检索前的阶段,可以分为离线优化、在线优化和混合检索:
检索到的内容比较多,重要性也各不相同,如果一味地和 query 合并可能会超过 LLM 上下文限制,同时增加计算开销,也可能引入噪声,导致生成质量不佳。此时,通常需要对检索到的内容进一步处理:
模块化 RAG 源于传统的 RAG 框架,其集成不同功能的子模块,提供了很大的灵活性。其主要是增加了一些新的模块,并构建了一些新的范式。
如下所示为常见的新增模块:
![图:Modular RAG 新增模块示意图]
Naive RAG 和 Advanced RAG 也可以理解为模块化 RAG 的某种范式,当前的研究集中在两个方面:
![图:Modular RAG 新范式示意图]
在构建离线索引时通常会将文档分为不同的 Chunk,然后提取 embedding。而 Chunk 的大小有多方面影响,比如,如果 Chunk 过大,则可能超过后续 LLM 的上下文窗口大小;如果 Chunk 过小,则可能导致相关信息被分割开来,影响检索质量。
常见的 Chunk 优化手段有:
为索引添加时间、类型、文档标题以及页面等信息,可以用于后续的过滤,增强检索效率,也可以帮助增强生成质量。
多级检索也是检索系统中非常常用的手段,比如百亿级的图像检索,如果全量比对其代价非常高,此时可以考虑对索引进行聚类,比如分为 1K 个聚类中心,检索时先与聚类中心比对,取 Top5 后在每个聚类中比对,计算量可以降低为 1/200。同时也可以按照垂类进行划分,比如划分为服饰、箱包、植物、动物等,然后检索时先识别意图,然后在对应的垂类检索。
类似地,可以先对整个文档进行总结归纳,基于总结构建一级索引,文档的 Chunk 构建二级索引,检索时先从总结索引中检索;此外也可以将文档中的不同元素分别建立对应类别的索引,比如对图表索引。
![图:结构化语料索引示意图]
RAG 的关键是通过额外的语料库来增强 LLM 的生成质量,数据源可以分为非结构化数据、结构化数据和 LLM 生成的内容,它们也往往需要不同的处理手段。
![图:检索源优化示意图]
Query 优化是检索系统中提升检索结果准确性非常有必要的阶段,通过这些手段,系统可以更好的理解用户意图并提供更准确的结果。通常包含如下手段:
Embedding 优化主要包括:
![图:Embedding 优化示意图]
RAG 中的标准做法是通过一次检索、生成获得最终结果,然而这种方式在复杂任务上可能表现不佳,比如需要多步推理的场景。研究者也提出了相应的改进方案:迭代检索、递归检索和自适应检索。
迭代检索允许模型参与多个检索周期,从而增强获得信息的深度和相关性,为 LLM 生成提供更全面的知识库。
在 [2305.15294] Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy 中迭代检索的示例,其结合了'检索增强生成'和'生成增强检索'。
![图:迭代检索示意图]
递归检索是指可以将之前的检索输出作为后续的检索输入。递归检索通常用于需要渐进式收敛到最终答案的场景,比如学术研究、法律案例分析等。针对多级索引(比如摘要索引,Chunk 索引),可以使用递归检索;此外,针对具有图结构的数据源,使用递归检索也可以检索更全面的信息。
在 [2212.10509] Interleaving Retrieval with Chain-of-Thought Reasoning for Knowledge-Intensive Multi-Step Questions 中递归检索的示例,其结合思维链(COT)来指导检索过程,并根据获得的检索结果对 CoT 进行细化。
![图:递归检索示意图]
自适应检索提供了一种动态调整机制,根据不同任务和上下文的特定需求定制检索过程。
在 [2310.11511] Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection 中自适应检索的过程,其引入了 'Reflection' Token,允许模型内省其输出,该模型可自主决定何时激活检索,提高了模型在生成准确结果方面的自主判断能力。
![图:自适应检索示意图]
在了解到 RAG 是什么,为什么需要 RAG,以及 RAG 怎么做之后,我们进一步需要评估 RAG 的效果。
不管 RAG 系统怎么变,其核心离不开两个关键部分:检索和生成。因此也就可以针对这两个部分进行评估。
RAG 的评估通常强调 3 个主要的质量分数和 4 个基本的能力,它们为 RAG 模型的两个主要目标提供了相应信息:
质量分数:
基本能力:
常见的评估基准和评估工具包括多种开源项目和评测集,用于量化 RAG 系统的各项性能指标。
![图:评估基准和工具示意图]
最近一年多模态大模型(LMM)大量涌现,出现一系列高质量的文本 - 图像多模态大模型,文本 - 语音和文本 - 视频大模型,而在 RAG 中应用 LMM 也将对 RAG 非常有帮助,比如对论文中图表的理解。
![图:模态扩展示意图]
向量数据库在 RAG 中扮演着至关重要的角色,随着 RAG 的火热,向量数据库也得到了快速发展。与传统按行或按列组织的数据库不同,向量数据集使用数据的 embedding 作为表示,并基于 embedding 相似性进行检索,能够提供快速、低延时的查询,非常适合 RAG 应用。
Milvus 创建于 2019 年,是一个用于对万亿级 embedding 进行索引、查询的开源的、高度可扩展的数据库。与现有的关系型数据库主要按照预定义的模式处理结构化数据不同,Milvus 是自下而上设计的,用于处理从非结构化数据转换而来的嵌入矢量。Milvus 能够通过计算两个 embedding 的相似距离来分析它们之间的相关性,如果两个 embedding 矢量非常相似,则意味着原始数据源也相似。
Milvus 的使用很简单,并且具有高可用、云原生等特性,还提供了大量索引类型,比如 FLAT, IVF_FLAT, IVF_PQ, HNSW, RHNSW_FLAT, RHNSW_PQ, RHNSW_SQ, and, ANNOY。
Pinecone 也是一个非常流行的云原生向量数据库,其基于 Kubernetes 部署,对外提供 API Gateway,并将这些请求路由到用户索引。基于 Pinecone,用户可以在短短 30s 内创建索引,并为搜索、推荐等应用执行超快速检索,它支持数十亿规模的 embedding,也可以通过 Metadata 进行过滤以及实时更新。然而,Pinecone 是闭源的,也就意味着无法私有化部署。
Chroma 也是一个开源的向量数据库,可以用于存储和检索 embedding 以及相应的 Metadata,其使用非常简单,也很轻量化,很适合做本地化部署和用于快速验证。
Elasticsearch 是一个开源的分布式搜索和分析引擎,它是基于 Apache Lucene 搜索引擎构建的。它提供了强大的全文搜索能力,支持实时数据分析,并能够处理大规模数据。Elasticsearch 专注于混合检索,将文本和矢量搜索功能无缝结合,以实现卓越的相关性和准确性。其支持各种检索类型、机器学习模型架构和强大的搜索体验构建工具。
除了向量数据库外,也出现了一系列的应用层框架,帮助用户集成 LLM、向量数据库等,以实现快速开发 AI 应用。当然,基于这些框架开发 RAG 系统也变得非常简单。
LlamaIndex 以前称为 GPT Index,是一个新的数据框架,专门用于支持基于 LLM 的应用开发。它提供了一个高级框架,使开发人员能够将各种数据源与 LLM 集成,包括各种文档格式,例如 PDF、PowerPoint,以及 Notion 和 Slack 等应用,甚至 Postgres 和 MongoDB 等数据库。它包含一系列连接器,可协助数据获取,促进与 LLM 的无缝交互。此外,LlamaIndex 拥有高效的数据检索和查询界面,也支持不同类型的索引,例如矢量、树、列表、关键字和知识图谱索引。
Haystack 是 deepset 开源的端到端的 LLM 应用框架,用户能基于此使用 LLM 和向量数据库快速构建自定义应用。无论是想执行 RAG、文档搜索、问答还是答案生成,都可以将最先进的 embedding 模型和 LLM 与 Haystack 一起使用,以构建端到端的 AI 应用。
Haystack 使用一些简单但有效的概念来帮助用户构建自定义的 NLP 应用:
LangChain 是一个最流行的以 LLM 为驱动的用于开发 AI 应用的框架。由于其非常流行,这里就不再赘述。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online