检索增强生成 (RAG) 简介

389 阅读18分钟

image.png

尽管越来越多更大、更智能的模型不断被发布,但最先进的生成式大语言模型(LLMs)仍然面临一个大问题:它们在处理需要专业知识的任务时表现不佳。这种专业知识的缺乏可能导致问题,如“幻觉”,即模型生成不准确或虚构的信息。检索增强生成(RAG)通过允许模型从外部来源实时获取特定领域的数据,帮助缓解这一问题,从而增强了模型提供准确且详细响应的能力。

尽管存在这些局限性,生成式模型仍然是具有影响力的工具,它们可以自动化日常流程、协助我们的日常工作,并使我们以全新的方式与数据互动。那么,我们如何在充分利用其广泛知识的同时,让它们适应我们的具体用例呢?答案在于为生成式模型提供特定任务的数据。

在本文中,我们将深入探讨检索增强生成(RAG)这一框架,了解它如何通过让生成模型引用外部数据来增强其能力。我们将探索生成模型的局限性,这些局限性促使了 RAG 的诞生,解释 RAG 的工作原理,并详细分析 RAG 管道的架构。我们还将通过一些实际的案例,概述 RAG 的现实应用,提出实施 RAG 的具体方法,介绍几种高级的 RAG 技术,并讨论 RAG 的评估方法。

注意
LLM 是一个广义术语,指的是在大规模数据集上训练的语言模型,这些模型能够执行多种与文本和语言相关的任务。生成式 LLM 是指那些在接收到用户提示后生成新文本的模型,例如在聊天机器人中使用的模型,我们称之为生成式 LLM 或生成式模型。而将文本数据编码到语义空间的 LLM 则被称为嵌入模型。因此,本文中我们使用生成式模型和嵌入模型这两个术语来区分这两类模型。

生成模型的局限性

生成模型是在大型数据集上训练的,这些数据集包括(但不限于)社交媒体帖子、书籍、学术文章和抓取的网页内容,从而使它们能够掌握一般知识。因此,这些模型能够生成类似人类的文本,回答各种问题,并协助完成诸如回答问题、摘要生成和创意写作等任务。

然而,生成模型的训练数据集不可避免地存在不完整性,因为这些数据集缺乏关于特定领域的内容和在数据集截取日期之后发生的最新进展的信息。生成模型也无法访问来自内部数据库或存储库的专有数据。此外,当这些模型不知道某个问题的答案时,它们往往会进行猜测,而这种猜测有时并不准确。这种在不确定情况下生成错误或虚构信息的倾向被称为“幻觉”,在面向客户的 AI 应用中,幻觉可能会导致实际的声誉损害。

提升生成模型在专业任务中的表现并减少幻觉的关键在于为其提供训练数据中不存在的额外信息。而这正是 RAG 的用武之地。

什么是检索增强生成 (RAG)?

检索增强生成 (RAG) 是一种框架,通过从外部数据源检索与当前任务相关的额外数据,增强生成式大语言模型(LLM)的通用知识。

外部数据源可以包括内部数据库、文件和存储库,以及公开可用的数据,例如新闻文章、网站或其他在线内容。通过访问这些数据,模型能够更具事实性地进行回应,在回答中引用其来源,并在遇到其原始训练数据集中没有的信息时避免“猜测”。

RAG 的常见使用场景包括检索最新信息、获取专业领域知识以及回答复杂的、数据驱动的问题。

RAG 架构

RAG 管道的基本部分可以分为三个组成部分:外部知识源、提示模板和生成模型。这些组件协同工作,使得基于 LLM 的应用能够通过利用特定任务的宝贵数据,生成更为准确的响应。

image.png

外部知识源

如果没有外部知识的支持,生成模型只能基于其参数化知识生成响应,这些知识是在模型训练阶段学习到的。通过 RAG,我们有机会将外部知识源(也称为非参数化知识)引入管道中。

外部数据源通常是特定任务相关的,超出了模型原始训练数据或参数化知识的范围。此外,这些数据通常存储在向量数据库中,且在主题和格式上可能差异很大。

常见的外部数据来源包括公司内部数据库、法律法规和文件、医学和科学文献以及抓取的网页数据。私人数据源也可以用于 RAG,例如像 Microsoft 的 Copilot 这样的个人 AI 助手,它们利用多种个人数据来源,包括电子邮件、文档和即时消息,以提供定制化的响应并更高效地自动化任务。

提示模板

提示是我们与生成模型沟通请求的工具。提示可能包含多个元素,但通常包括一个查询、指令以及引导模型生成相关响应的上下文。

提示模板提供了一种生成标准化提示的结构化方式,其中可以插入不同的查询和上下文。在 RAG 管道中,相关数据从外部数据源检索并插入到提示模板中,从而增强提示。实质上,提示模板充当外部数据与模型之间的桥梁,在推理过程中为模型提供上下文相关的信息,以生成准确的响应。

示例提示模板:

prompt_template = "以下是上下文信息。\n"
                  "---------------------\n"
                  "{context_str}\n"
                  "---------------------\n"
                  "根据上下文信息,而不是先前的知识,回答查询。\n"
                  "查询:{query_str}\n"
                  "回答:"

生成式大语言模型 (LLM)

RAG 的最后一个组成部分是生成式大语言模型(LLM),即生成模型,它用于生成对用户查询的最终响应。增强后的提示(包含来自外部知识库的信息)被发送给模型,模型生成的响应结合了模型的内部知识和新检索到的数据。

现在我们已经介绍了 RAG 架构及其关键组成部分,接下来让我们看看它们如何在 RAG 工作流程中协同工作。

RAG 是如何工作的?

RAG 是一个多步骤框架,分为两个阶段。首先,在数据摄取阶段,外部知识会被预处理并准备好供后续检索使用。接下来,在推理阶段,模型从外部知识库中检索相关数据,将其与用户的提示相结合,并生成响应。现在,让我们详细了解每个阶段。

阶段 1:摄取

首先,需要对外部知识源进行准备。外部数据需要进行清理并转换为模型能够理解的格式,这个过程称为摄取阶段。在摄取过程中,文本或图像数据会通过一个称为向量化的过程从其原始格式转换为嵌入向量。一旦生成嵌入,它们需要以便于后续检索的方式进行存储。通常情况下,这些嵌入存储在向量数据库中,这种方式可以快速、高效地检索信息,以便用于后续任务。

image.png

阶段 2:推理

在外部数据被编码并存储之后,数据就准备好在推理过程中被检索,此时模型会生成响应或回答问题。推理过程分为三个步骤:检索、增强和生成。

image.png

检索

推理阶段从检索开始,即根据用户查询从外部知识源中检索相关数据。检索方法的格式和复杂性各不相同,但在基础的 RAG 模型中,外部知识嵌入并存储在向量数据库中,最简单的检索方式是相似性搜索。

为了执行相似性搜索,首先需要将用户查询嵌入到与外部数据相同的多维空间中,这样就可以直接比较查询和嵌入的外部数据。在相似性搜索过程中,计算查询与外部数据点之间的距离,并返回距离最短的那些数据点,从而完成检索过程。

增强

一旦从外部数据源中检索到最相关的数据点,增强过程会将这些外部信息整合到一个预定义的提示模板中。

生成

当增强后的提示被注入到模型的上下文窗口后,模型开始生成对用户查询的最终响应。在生成阶段,模型结合其内部的语言理解和增强后的外部数据,生成连贯且符合上下文的答案。

这一阶段涉及将丰富的信息以流畅、自然的方式生成出来,确保输出既准确又与用户的查询相关。增强的目的是引入外部事实,而生成的目标则是将这些结合的知识转化为符合具体请求的、有逻辑的、类人化的输出。

RAG 的应用场景

现在我们已经介绍了 RAG 的概念、工作原理和架构,接下来让我们探索一些实际的应用场景,看看该框架如何在现实中应用。通过使用最新的、特定任务的数据来增强生成式大语言模型,RAG 提升了模型的准确性、相关性及处理专业任务的能力。因此,RAG 广泛应用于实时信息检索、内容推荐系统和个人 AI 助手的构建中。

实时信息检索

生成模型单独使用时,只能检索其训练数据集中的信息。然而,在 RAG 框架下,这些模型能够从外部来源检索数据和信息,从而确保提供更准确、更新的数据。例如,ChatGPT-4o 可以直接从网络实时访问并检索信息,这是 RAG 的一个应用实例,它利用的是非嵌入在向量数据库中的外部数据源。这在回答用户关于新闻或其他实时事件(如股价、旅行警告和天气更新)的问题时尤为有用。

内容推荐系统

内容推荐系统通过分析用户数据和偏好,向用户推荐相关的产品或内容。传统上,这类系统需要复杂的集成模型和庞大的用户偏好数据集。RAG 简化了推荐系统,它通过将外部的、上下文相关的用户数据直接与模型的通用知识相结合,使得生成个性化推荐更加简单有效。

个人 AI 助手

我们的个人数据,包括文件、电子邮件、Slack 消息和笔记,是生成模型的重要数据来源。通过在这些个人数据上运行 RAG,可以以对话的方式与数据互动,从而提高效率并实现日常任务的自动化。像 Microsoft 的 Copilot 和 Notion 的 Ask AI 等 AI 助手,通过简单的提示,我们可以搜索相关文件、撰写个性化邮件、总结文件和会议记录、安排会议等。

如何实现 RAG

现在我们已经了解了 RAG 的工作原理,接下来让我们探索如何构建一个功能齐全的 RAG 管道。RAG 可以通过多种不同的框架来实现,这些框架通过提供预构建的工具和模块,简化了构建过程,并集成了 RAG 各个组件以及外部服务,如向量数据库、嵌入生成工具和其他 API。

LangChain、LlamaIndex 和 DSPy 是强大的开源 Python 库,它们拥有活跃的社区,并提供了强大的工具和集成功能,用于构建和优化 RAG 管道以及基于 LLM 的应用程序。

  • LangChain 提供了构建块、组件以及第三方集成,帮助开发基于 LLM 的应用。它可以与 LangGraph 一起用于构建代理型 RAG 管道,并可以使用 LangSmith 进行 RAG 评估。
  • LlamaIndex 是一个框架,提供工具来构建与外部数据源集成的 LLM 应用程序。LlamaIndex 维护着 LlamaHub,一个包含数据加载器、代理工具、数据集及其他组件的丰富存储库,简化了 RAG 管道的创建。
  • DSPy 是一个模块化框架,专门用于优化 LLM 管道。DSPy 中可以配置 LLM 和检索模型(RMs),从而实现 RAG 管道的无缝优化。

注意
Weaviate 为这些框架提供了集成和操作示例。有关具体示例,可以查看我们的笔记本,展示如何使用 Weaviate、LlamaIndex 和 DSPy 构建 RAG 管道。

如果你想快速上手 RAG,可以看看 Verba,这是一个开源的、即开即用的 RAG 应用,配有一个简洁的预构建前端。Verba 使你能够以可视化的方式探索数据集、提取见解,并仅需几个简单步骤就能构建定制化的 RAG 管道,无需学习全新的框架。Verba 是一个多功能工具,不仅可以用作测试和实验 RAG 管道的游乐场,还可以用于个人任务,如协助研究、分析内部文件,以及简化与 RAG 相关的各种任务。

RAG 技术

基础的 RAG 工作流程通常由一个外部数据源组成,该数据源嵌入在向量数据库中,并通过相似性搜索进行检索。然而,有多种方法可以增强 RAG 工作流程,以获得更准确和健壮的结果,这些方法统称为高级 RAG。

通过引入图数据库和代理,可以进一步扩展 RAG 管道的功能,从而实现更高级的推理和动态数据检索。接下来的部分,我们将介绍一些常见的高级 RAG 技术,并概述 Agentic RAGGraph RAG

高级 RAG

高级 RAG 技术可以在管道的不同阶段部署。预检索策略如元数据过滤和文本分块可以通过缩小搜索空间并确保只考虑最相关的数据部分来提高检索效率和相关性。采用更高级的检索技术,如结合相似性搜索和关键词搜索优势的 混合搜索,也可以产生更健壮的检索结果。最后,通过使用排序模型对检索到的结果进行重新排序,并使用在特定领域数据上微调的生成式 LLM,可以显著提高生成结果的质量。

image.png

Agentic RAG

AI 代理是能够自主解读信息、制定计划并做出决策的系统。当将代理添加到 RAG 管道中时,代理可以重新表述用户查询,并在初始结果不准确或不相关时重新检索更相关的信息。Agentic RAG 还可以处理更复杂的查询,这些查询可能需要多步推理,例如比较多个文档中的信息、提出后续问题以及迭代调整检索和生成策略。

如果你想更深入地了解结合代理并利用文本分块和重新排序等高级技术的 RAG 管道,可以查看 LlamaIndex 博客上的这篇文章和相关的笔记本。

Graph RAG

传统的 RAG 在处理通过简单检索即可解决的问答任务方面表现出色,但它无法回答涉及整个外部知识库的复杂问题或从中得出结论。Graph RAG 通过使用生成模型创建一个知识图谱来解决这一问题,该图谱提取并存储关键实体之间的关系,之后可以作为数据源添加到 RAG 管道中。这使得 RAG 系统能够回答涉及多个文档和数据源的比较和总结查询。

有关构建 Graph RAG 管道的更多信息,可以查阅 Microsoft 的 GraphRAG 软件包及相关文档。

如何评估 RAG

RAG 是一个多阶段、多步骤的框架,因此需要进行全面和细致的评估。这种评估方式既确保组件级别的可靠性,也保证整体结果的准确性。在本节中,我们将探讨这两种评估方法,并介绍一个流行的评估框架——RAGAS。

image.png

组件级别的评估

在组件级别,RAG 评估主要集中在检索器和生成器的质量上,因为它们在生成准确且相关的响应中起到了关键作用。

  • 检索器的评估 主要关注准确性和相关性。在这个上下文中,准确性衡量检索器选取直接回答查询信息的精确度,而相关性则评估检索到的数据与查询的具体需求和上下文的匹配程度。
  • 生成器的评估 侧重于忠实性和正确性。忠实性评估模型生成的响应是否准确反映了相关文档中的信息,并检查响应与原始来源的一致性。正确性则衡量生成的响应是否真正符合事实,并与查询上下文中的真实答案或预期答案相一致。

端到端评估

虽然检索器和生成器是两个独立的组件,但它们相互依赖,以生成连贯的用户查询响应。

计算答案语义相似度 是一种简单且高效的评估方法,用于评估检索器和生成器的协作效果。该方法计算生成的响应与真实答案样本之间的语义相似度。生成的响应与真实答案的相似度越高,表明该管道能够检索相关信息并生成符合上下文的适当响应。

注意
RAG 评估框架提供了评估 RAG 管道的结构化方法、工具或平台。RAGAS(检索增强生成评估)是一个特别流行的框架,它提供了一系列指标来评估检索的相关性、生成的质量以及忠实性,而无需依赖人工标注数据。想了解更多关于 RAGAS 的工作原理及优化 RAGAS 评分的高级技术,可以收听 Weaviate 播客中的这一集,直接从 RAGAS 的创建者那里获取信息。

RAG 与微调的对比

RAG 只是扩展生成式大语言模型(LLMs)能力并缓解其局限性的众多方法之一。微调 LLMs 是一种特别流行的技术,通常通过在特定领域的数据上训练模型,使其能够执行高度专业化的任务。虽然微调可能非常适合某些用例,例如训练 LLM 采用特定的语气或写作风格,但 RAG 往往是提高模型准确性、减少幻觉并为特定任务定制 LLM 的最简单方法。

RAG 的优势在于无需更新生成模型的权重,而权重更新可能成本高昂且耗时。通过 RAG,模型可以动态访问外部数据,从而在不需要昂贵再训练的情况下提高准确性。因此,它是那些需要实时信息的应用程序的实用解决方案。接下来,我们将深入探讨 RAG 的架构及其各组件如何协同工作,创建强大的检索增强系统。

总结

在本文中,我们介绍了 RAG 这一框架,它利用特定任务的外部知识来提高生成模型驱动的应用程序的性能。我们了解了 RAG 管道的不同组件,包括外部知识源、提示模板和生成模型,以及它们如何在检索、增强和生成中协同工作。我们还讨论了流行的 RAG 应用场景和实现框架,如 LangChain、LlamaIndex 和 DSPy。最后,我们提到了高级 RAG 技术,包括高级 RAG 方法、Agentic RAG 和 Graph RAG,以及评估 RAG 管道的方法。

事实上,本文中的每个部分至少都值得单独写一篇博客,甚至可以作为书中的一个章节。因此,我们整理了一份资源指南,包含学术论文、博客文章、YouTube 视频、教程、笔记本和操作指南,以帮助你进一步了解本文提到的话题、框架和方法。