尽管越来越大的、更智能的模型不断发布,最先进的生成式大语言模型(LLM)仍然存在一个重大问题:它们在处理需要专业知识的任务时表现不佳。这种缺乏专业知识可能导致一些问题,例如幻觉现象,即模型生成不准确或捏造的信息。检索增强生成(RAG)通过让模型从外部来源中实时获取特定领域的数据来缓解这一问题,从而增强其提供准确、详细回答的能力。
尽管存在这些局限性,生成式模型依然是非常有影响力的工具,能够自动化处理日常事务、辅助我们的日常工作,并帮助我们以新的方式与数据互动。那么,我们如何在利用它们广泛知识的同时,使它们服务于我们的具体使用场景呢?答案在于为生成式模型提供任务相关的数据。
在本文中,我们将深入探讨检索增强生成(RAG),这是一个通过允许模型参考外部数据来增强其能力的框架。我们将探讨生成式模型的局限性,这些局限性促成了 RAG 的诞生,解释 RAG 的工作原理,并详细分析 RAG 流水线的架构。此外,我们还将提供一些实际的 RAG 使用案例,提出具体的 RAG 实现方法,介绍一些高级的 RAG 技术,并讨论 RAG 的评估方法。
LLM 是一个广泛的术语,指的是在大型数据集上训练的语言模型,这些模型能够执行各种与文本和语言相关的任务。生成式 LLM 是指能够根据用户提示生成新文本的模型,如聊天机器人中使用的模型,通常称为生成式模型。将文本数据编码到语义空间中的 LLM 则称为嵌入模型。因此,在本文中我们使用生成式模型和嵌入模型这两个术语来区分这两类模型。
生成模型的局限性
生成模型通过训练大量的数据集,包括(但不限于)社交媒体帖子、书籍、学术文章和抓取的网页,从而获得一定的通识知识。因此,这些模型可以生成类似人类的文本,回答各种问题,并协助完成如回答、总结和创意写作等任务。
然而,生成模型的训练数据集不可避免地是不完整的,因为它们缺乏关于小众话题和数据集截止日期之后新发展的信息。生成模型也无法访问内部数据库或存储库中的专有数据。此外,当这些模型不知道问题的答案时,它们往往会猜测,有时这种猜测并不准确。这种生成错误或虚构信息的现象被称为幻觉,在面向客户的 AI 应用中可能会导致实际的声誉损害。
提高生成模型在专门任务上的表现并减少幻觉的关键是提供训练数据中不存在的额外信息。这就是 RAG 的用武之地。
什么是检索增强生成(RAG)?
检索增强生成(RAG) 是一种通过从外部数据源检索与当前任务相关的额外数据来增强生成式大语言模型的通识知识的框架。
外部数据源可以包括内部数据库、文件和存储库,以及公开可用的数据,例如新闻文章、网站或其他在线内容。访问这些数据使模型能够提供更加基于事实的回答,并在其回答中引用来源,避免在模型原始训练数据集中找不到信息时进行「猜测」。
RAG 的常见用例包括检索最新信息、访问专业领域知识和回答复杂的、数据驱动的问题。
RAG 架构
RAG 管道的基本组成部分可以分为三个组件:外部知识源、提示模板和生成模型。通过这些组件,大语言模型驱动的应用可以利用有价值的特定任务数据生成更加准确的回答。
外部知识源
没有外部知识的支持,生成模型只能基于其参数化知识生成回答,这些知识是在模型训练阶段学习的。通过 RAG,我们可以在管道中整合外部知识源,也称为非参数化知识。
外部数据源通常是任务特定的,往往超出模型原始训练数据或其参数化知识的范围。此外,它们通常存储在向量数据库中,主题和格式可能各不相同。
常见的外部数据来源包括内部公司数据库、法律法规和文档、医学和科学文献,以及抓取的网页。私人数据源也可以用于 RAG。个人 AI 助手,如 Microsoft 的 Copilot,利用包括电子邮件、文档和即时消息在内的多种个人数据源,提供定制化的回答并更高效地自动化任务。
提示模板
提示是我们与生成模型沟通请求的工具。提示可以包含多个元素,但通常包括查询、指令和上下文,用于引导模型生成相关的回复。
提示模板 提供了一种生成标准化提示的结构化方式,在这种方式中可以插入各种查询和上下文。在 RAG(检索增强生成)流程中,相关数据从外部数据源中检索并插入到提示模板中,从而增强提示。基本上,提示模板充当了外部数据和模型之间的桥梁,为模型在推理时提供与上下文相关的信息,以生成准确的回答。
prompt_template = "上下文信息如下。\n"
"---------------------\n"
"{context_str}\n"
"---------------------\n"
"根据上下文信息而不是先前的知识,回答问题。\n"
"问题: {query_str}\n"
"回答: "
生成式大语言模型(LLM)
RAG 中的最后一个组件是生成式大语言模型(LLM),也称为生成模型,用于生成对用户查询的最终回答。增强后的提示,通过外部知识库提供的信息丰富了提示,然后发送给模型,模型会生成结合内部知识和新检索到数据的回答。
现在我们已经讨论了 RAG 的架构及其关键组件,接下来我们看看它们如何在 RAG 工作流中结合在一起。
RAG 是如何工作的?
RAG 是一个多步骤框架,分为两个阶段。首先,在摄取阶段,外部知识被预处理并准备好用于检索。接下来,在推理阶段,模型从外部知识库中检索相关数据,将其与用户的提示进行增强,并生成回复。现在,让我们更详细地看看每个阶段。
阶段 1:摄取
首先,需要准备外部知识源。简单来说,外部数据需要被清洗并转化为模型能够理解的格式。这称为 摄取阶段。在摄取过程中,文本或图像数据通过称为 向量化 的过程从其原始格式转换为 嵌入。一旦生成了嵌入,就需要以一种便于日后检索的方式进行存储。最常见的是,这些嵌入存储在向量数据库中,这样可以快速、高效地为下游任务检索信息。
阶段 2:推理
当外部数据被编码并存储后,就可以在 推理 阶段进行检索,模型在此阶段生成回复或回答问题。推理分为三个步骤:检索、增强和生成。
检索
推理阶段始于检索,在此过程中,数据从外部知识源中根据用户查询被检索。检索方法在格式和复杂性上各有不同,然而在简单的 RAG 模式中,外部知识嵌入并存储在向量数据库中,相似性搜索 是最简单的检索形式。
要执行相似性搜索,首先需要将用户查询嵌入到与外部数据相同的多维空间中,这样可以直接比较查询与嵌入的外部数据。在 相似性搜索 中,计算查询与外部数据点之间的距离,返回距离最短的点,从而完成检索过程。
增强(Augmentation)
一旦从外部数据源中检索到最相关的数据点,增强过程会通过将这些外部信息插入到预定义的提示模板中来进行整合。
生成(Generation)
在增强的提示被注入模型的上下文窗口后,模型会继续生成对用户输入的最终响应。在生成阶段,模型结合其内部的语言理解和增强后的外部数据,生成连贯且符合上下文的答案。
这一步骤涉及以流畅、自然的方式生成回复,同时利用丰富的信息确保输出既准确又与用户的查询相关。增强的目的是整合外部事实,而生成则是将这些组合的知识转化为针对特定请求的结构良好、类人化的输出。
RAG 应用案例
现在我们已经介绍了 RAG 的定义、工作原理及其架构,接下来我们将探讨一些实际应用场景,看看这个框架如何在现实世界中得到应用。通过使用最新的、针对特定任务的数据来增强生成式大语言模型,可以提高它们的准确性、相关性和处理专门任务的能力。因此,RAG 广泛应用于实时信息检索、内容推荐系统以及个人 AI 助手的构建。
实时信息检索
单独使用生成模型时,它们只能检索到其训练数据集中存在的信息。而在 RAG 的框架下,模型能够从外部来源检索数据和信息,从而确保更加准确和最新的响应。一个这样的例子是 ChatGPT-4o 能够实时从网页直接访问和检索信息。这是一个 RAG 应用案例,它利用了未嵌入向量数据库的外部数据源,对于回答用户关于新闻或其他时效性事件(如股票价格、旅行建议和天气更新)的查询特别有用。
内容推荐系统
内容推荐系统分析用户数据和偏好,向用户推荐相关的产品或内容。传统上,这些系统需要复杂的集成模型和大量用户偏好数据集。RAG 通过将外部、与上下文相关的用户数据与模型的通用知识直接整合,简化了推荐系统的构建,使其能够生成个性化的推荐。
个人 AI 助手
我们的个人数据,包括文件、电子邮件、Slack 消息和笔记,都是生成模型的重要数据源。通过对个人数据运行 RAG,我们可以以对话的方式与其互动,提高效率并实现琐碎任务的自动化。借助 AI 助手(例如 Microsoft 的 Copilot 和 Notion 的 Ask 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 和 RM (检索模型),从而实现 RAG 管道的无缝优化。
Weaviate 提供了 集成 和 配方 ,可用于上述每个框架。有关具体示例,请查看我们的笔记本,展示如何使用 Weaviate 与 LlamaIndex 和 DSPy 构建 RAG 管道。
如果你想快速启动并运行 RAG,请查看 Verba,这是一款开箱即用的开源 RAG 应用,具有一个闪亮的预构建前端。Verba 使你能够可视化地探索数据集、提取洞见,并在几个简单的步骤中构建可定制的 RAG 管道,而无需学习全新的框架。Verba 是一个多功能工具,既可以用作测试和实验 RAG 管道的游乐场,也可以用于个人任务,如辅助研究、分析内部文档和简化各种与 RAG 相关的任务。
使用 Verba 实现开箱即用的 RAG
RAG 技术
传统的 RAG 工作流程通常由一个外部数据源组成,该数据源嵌入到向量数据库中,通过相似性搜索进行检索。然而,有几种方法可以增强 RAG 工作流程,以获得更精确和健壮的结果,这些方法统称为高级 RAG。
RAG 管道的功能可以通过引入图数据库和代理进行进一步扩展,这些代理能够实现更高级的推理和动态数据检索。在接下来的部分中,我们将介绍一些常见的高级 RAG 技术,并概述代理式 RAG 和图形 RAG。
高级 RAG
高级 RAG 技术可以部署在管道的各个阶段。预检索策略如 元数据过滤 和文本 分块 可以通过缩小搜索范围并确保仅考虑最相关的数据部分来提高检索效率和相关性。采用更高级的检索技术,如 混合搜索,它结合了相似性搜索和关键词搜索的优势,也可以产生更为健壮的检索结果。最后,通过使用排序模型对检索结果进行 重新排序 并使用基于领域特定数据微调的大语言模型(LLM)生成,可以提高生成结果的质量。
如果你想更深入地探索这个主题,请查看我们关于 高级 RAG 技术 的博客文章。
代理式 RAG
AI 代理 是可以解释信息、制定计划并做出决策的自主系统。当将代理添加到 RAG 管道时,代理可以重新制定用户查询,并在初始结果不准确或不相关时重新检索更相关的信息。代理式 RAG 还可以处理更复杂的查询,这些查询需要多步推理,如跨多个文档比较信息、提出后续问题,以及迭代调整检索和生成策略。
如果你想更深入了解一个包含代理并利用高级技术(如文本分块和重新排序)的 RAG 管道,请查看 LlamaIndex 博客上的这篇 文章 和配套的 笔记本。
图形 RAG
传统的 RAG 在通过简单检索解决问答任务方面表现出色,但它无法回答需要从整个外部知识库中推导出结论的问题。图形 RAG 旨在通过使用生成模型创建一个知识图谱来解决这个问题,该图谱可以提取并存储关键实体之间的关系,然后作为数据源添加到 RAG 流程中。这使得 RAG 系统能够响应需要比较和总结多个文档和数据源的查询。
有关构建图形 RAG 流程的更多信息,请查看 Microsoft 的 GraphRAG 软件包和文档。
如何评估 RAG
RAG 是一个多阶段、多步骤的框架,需要进行全局和细粒度的评估。这种评估方法确保了组件级别的可靠性和整体准确性。在本节中,我们将探讨这两种评估方法,并介绍 RAGAS,这是一个广受欢迎的评估框架。
组件级别评估
在组件级别,RAG 评估通常侧重于评估检索器和生成器的质量,因为它们在生成准确且相关的响应中起着至关重要的作用。
检索器的评估主要集中在准确性和相关性。在这个背景下,准确性 衡量检索器选择直接解决查询的信息的精确度,而 相关性 则评估所检索的数据与查询的具体需求和上下文的吻合程度。
另一方面,生成器的评估则关注真实性和正确性。真实性 评估模型生成的响应是否准确反映了相关文档中的信息,并检查响应与原始来源的一致性。正确性 则评估生成的响应是否是真实的,并与查询上下文中的真实情况或预期答案相一致。
端到端评估
尽管检索器和生成器是两个独立的组件,但它们依赖彼此来生成一致的用户查询响应。
计算答案语义相似度是一种简单且高效的方法,用于评估检索器和生成器的协同工作效果。答案语义相似度 计算生成的响应与真实答案样本之间的语义相似度。生成的响应与真实答案样本相似度高,表明该流程能够检索相关信息并生成上下文适当的响应。
RAG 评估框架提供了结构化的方法、工具或平台来评估 RAG 流程。RAGAS(检索增强生成评估)是一个特别受欢迎的框架,它提供了一套评估检索相关性、生成质量和真实性的指标,无需人工标注数据。收听 Weaviate 播客的这一 ,直接了解来自 RAGAS 创作者的 RAGAS 工作原理和优化 RAGAS 分数的高级技术。
RAG 与微调的对比
RAG 是扩展生成式大语言模型能力并减轻其局限性的方法之一。微调大语言模型是一种特别流行的技术,通过在特定领域的数据上进行训练,使模型执行高度专业化的任务。尽管微调可能非常适合某些特定用例,比如训练大语言模型采用特定的语气或写作风格,RAG 通常是提高模型准确性、减少幻觉并为特定任务定制大语言模型的最直接方法。
RAG 的优势在于它无需更新底层生成模型的权重,而这种更新过程通常既昂贵又耗时。RAG 允许模型动态访问外部数据,从而在无需昂贵的再训练的情况下提高准确性。这使其成为需要实时信息的应用程序的实用解决方案。在下一节中,我们将深入探讨 RAG 的架构以及其组件如何协同工作,创建一个强大的检索增强系统。
总结
在本文中,我们向你介绍了 RAG 这一框架,它利用特定任务的外部知识来提高生成模型驱动的应用程序的性能。我们了解了 RAG 流程中的不同组件,包括外部知识源、提示模板和生成模型,以及它们如何协同工作以实现检索、增强和生成。我们还讨论了 RAG 的一些流行用例和实现框架,如 LangChain、LlamaIndex 和 DSPy。最后,我们还提到了 RAG 的一些专门技术,包括高级 RAG 方法、代理式 RAG 和图形 RAG,以及评估 RAG 流程的方法。
至少,本文中的每个部分都可以单独成为一篇博客文章,甚至是一本书中的一个章节。因此,我们整理了一份资源指南,包含学术论文、博客文章、YouTube 视频、教程、笔记本和配方,帮助你进一步了解本文中介绍的话题、框架和方法。
资源指南
📄 知识密集型 NLP 任务的检索增强生成 (原始 RAG 论文)
👩🍳 DSPy 中的 RAG 入门(配方)
👩🍳 LlamaIndex 中的简单 RAG(配方)
📝 高级 RAG 技术(博客文章)
📒 多文档代理的代理式 RAG(笔记本)
📝 RAG 评估概览(博客文章)
📄 检索增强生成的评估:综述(学术论文)