人工智能(AI)领域正在迅速发展。在这一切的中心是生成式人工智能。而生成式人工智能的核心则是检索增强生成(RAG)。RAG作为生成式AI工具包中的重要组成部分,正在崭露头角,它将大型语言模型(LLMs)的智能和文本生成能力与公司内部数据结合,提供了一种显著增强组织运营的方法。本书聚焦于RAG的多个方面,探讨其在增强LLM能力以及利用企业内部数据为战略优势提供支持中的作用。
随着本书的展开,我们将阐述RAG在企业中的潜力,建议它如何使AI应用更具响应性和智能化,并使其与组织目标对齐。RAG有望成为定制化、高效、深刻洞察AI解决方案的关键推动者,弥合生成式AI潜力与企业具体需求之间的鸿沟。我们对RAG的探索将促使您充分挖掘公司数据的潜力,为进入AI驱动创新的时代铺平道路。
在本章中,我们将讨论以下主题:
- RAG的基本概念及其如何将LLM与公司内部数据相结合
- RAG的关键优势,如提高准确性、定制性和灵活性
- RAG的挑战和局限性,包括数据质量和计算复杂性
- 重要的RAG词汇术语,重点讲解向量和嵌入
- RAG在不同行业中的实际应用示例
- RAG与传统生成式AI及模型微调的区别
- 从用户和技术角度看RAG系统的整体架构和各个阶段
通过本章的学习,您将掌握RAG的核心概念,并理解它为组织提供的巨大潜力,帮助组织从数据中提取更多价值,并增强LLM的能力。让我们开始吧!
理解RAG——基础和原理
现代LLM令人印象深刻,但它们从未见过贵公司内部的数据(希望如此!)。这意味着LLM帮助公司充分利用其数据的能力是非常有限的。这个巨大的障碍催生了RAG的概念,通过将LLM的能力与公司内部数据存储库中的知识和数据结合起来。使用RAG的主要动机是:将新的数据提供给LLM,从而显著增加从这些数据中提取的价值。
除了内部数据,RAG还在LLM未曾训练过的数据场景中发挥作用,即使是公开数据,如最新的研究论文或有关贵公司战略性话题的文章。在这两种情况下,我们讨论的是训练LLM时未包含的数据。即使是最新的LLM,训练时包含了最多的标记数据,但如果这些数据在训练中没有出现,那么LLM在帮助您达到最大生产力时仍然会处于劣势。
最终,这突显了一个事实:对于大多数组织来说,连接新的数据和LLM是一个核心需求。RAG是实现这一目标的最流行范式。本书重点向您展示如何使用您的数据设置RAG应用,并在不同场景中充分发挥其作用。我们旨在为您提供深入的RAG理解,以及在公司特定或私有数据需求背景下,如何利用LLM的重要性。
现在,您已经理解了实施RAG的基本动机,让我们来回顾一下使用RAG的优势。
RAG的优势
使用RAG的一些潜在优势包括提高准确性和相关性、定制化、灵活性,以及扩展模型知识超越训练数据。让我们详细看一下:
- 提高准确性和相关性:RAG可以显著增强LLM生成的响应的准确性和相关性。RAG从数据库或数据集中提取并整合特定信息,通常是实时进行的,并确保输出不仅基于模型的预先知识,还基于您直接提供的最新和最相关的数据。
- 定制化:RAG允许您将模型的知识定制并适应您的特定领域或使用场景。通过将RAG指向与您的应用直接相关的数据库或数据集,您可以定制模型的输出,使其与您的具体需求中最重要的信息和风格密切对齐。这种定制使得模型能够提供更具针对性和实用性的响应。
- 灵活性:RAG在模型可以访问的数据源方面提供了灵活性。您可以将RAG应用于各种结构化和非结构化数据,包括数据库、网页、文档等。这种灵活性使得您能够利用多样的信息来源,并以创新的方式将它们结合,提升模型的能力。此外,您还可以根据需要更新或替换数据源,使模型能够适应变化的信息环境。
- 扩展模型知识超越训练数据:LLM的能力受限于其训练数据的范围。RAG通过使模型能够访问并利用训练集外的信息,克服了这一限制。这有效地扩展了模型的知识库,无需重新训练,令LLM在新领域或迅速变化的主题上变得更加多样和适应性强。
- 去除幻觉:LLM是RAG系统中的关键组件。LLM有时可能提供错误的信息,也就是所谓的幻觉。这些幻觉可能表现为虚构的事实、错误的事实,甚至是无意义的文字。幻觉往往措辞巧妙,非常具有说服力,导致很难识别。一个设计良好的RAG应用可以比直接使用LLM更容易去除幻觉。
我们已经介绍了在组织中实施RAG的关键优势,接下来,我们来探讨一些可能面临的挑战。
RAG的挑战
使用RAG也面临一些挑战,其中包括对内部数据质量的依赖、数据处理和清洗的需求、计算开销、更复杂的集成以及信息过载的可能性。让我们详细了解这些挑战,并更好地理解它们如何影响RAG管道,以及如何应对这些挑战:
- 对数据质量的依赖:在谈论数据如何影响AI模型时,数据科学界常说“垃圾进,垃圾出”。这意味着,如果您给模型提供了错误的数据,它就会给您错误的结果。RAG也不例外。RAG的效果与它提取的数据质量直接相关。如果底层数据库或数据集包含过时、偏见或不准确的信息,那么RAG生成的输出很可能会受到相同问题的影响。
- 数据处理和清洗的需求:公司内部的数据往往有很大的价值,但通常并不以良好的、易于访问的形式存在。例如,来自PDF格式的客户账单数据需要大量处理才能转化为RAG管道可以使用的格式。
- 计算开销:RAG管道将许多新的计算步骤引入响应生成过程中,包括数据检索、处理和集成。尽管LLM每天都在变得更快,但即使是最快的响应也可能需要超过一秒钟,有些甚至需要几秒钟。如果加上其他数据处理步骤,甚至可能涉及多个LLM调用,那么响应时间就会显著增加。这会导致计算开销增加,影响整个系统的效率和可扩展性。与其他IT项目一样,组织必须在增强准确性和定制化的好处与这些附加过程可能带来的资源需求和潜在延迟之间找到平衡。
- 数据存储爆炸;集成和维护的复杂性:传统上,您的数据存储在一个数据源中,可以通过各种方式查询,以便提供给内部和外部系统。但在RAG中,数据存储在多种形式和位置,例如向量数据库中的向量,它们代表相同的数据,但格式不同。再加上将这些各种数据源连接到LLM以及相关技术机制(如向量搜索)的复杂性,就会大幅增加复杂度。这种增加的复杂性可能需要大量的资源。在时间的推移中,维护这些集成,尤其是当数据源不断发展或扩展时,会增加更多的复杂性和成本。组织需要投资技术专长和基础设施,以有效利用RAG功能,同时应对这些系统带来的迅速增加的复杂性。
- 信息过载的可能性:基于RAG的系统可能会获取过多信息。解决这个问题的机制与处理无法找到足够相关信息时的机制一样重要。确定检索到的信息在最终输出中应包括的相关性和重要性,需要复杂的过滤和排名机制。如果没有这些机制,生成的内容可能会因为过多无关或边缘相关的细节而受到影响。
- 幻觉问题:尽管我们将去除幻觉列为使用RAG的优势之一,但如果处理不当,幻觉也可能成为RAG管道面临的最大挑战之一。一个设计良好的RAG应用必须采取措施识别并去除幻觉,并在最终输出文本提供给终端用户之前进行充分的测试。
- RAG组件的高复杂性:典型的RAG应用往往具有较高的复杂性,包含许多需要优化的组件,以确保整体应用的正常运行。这些组件可以以多种方式相互作用,通常比您开始时的基本RAG管道步骤多得多。管道中的每个组件都需要大量的试验和测试,包括您的提示设计与工程、使用的LLM及其使用方式、检索的各种算法和参数、访问RAG应用的接口,以及您在开发过程中需要添加的众多其他方面。
在这一部分中,我们探讨了在组织中实施RAG的关键优势,包括提高准确性和相关性、定制化、灵活性以及扩展模型知识超越其初始训练数据的能力。我们还讨论了部署RAG时可能面临的一些挑战,如对数据质量的依赖、数据处理和清洗的需求、计算开销、集成和维护的复杂性,以及信息过载的潜力。理解这些优势和挑战为我们深入探讨RAG系统中的核心概念和术语奠定了基础。
为了理解我们将介绍的各种方法,您需要对讨论这些方法时使用的术语有充分的了解。在接下来的部分中,我们将熟悉一些基础概念,以帮助您更好地理解构建有效RAG管道中涉及的各种组件和技术。
RAG 相关术语
现在是时候回顾一些词汇了,这些词汇将帮助你更好地理解 RAG 中的各种概念。在接下来的小节中,我们将熟悉一些与 RAG 相关的词汇,包括 LLM、提示词概念、推理、上下文窗口、微调方法、向量数据库以及向量/嵌入等。这不是一个详尽的列表,但理解这些核心概念应该能帮助你更有效地理解我们接下来将讲解的 RAG 内容。
LLM
本书的大部分内容将集中讨论 LLM。LLM 是一种生成型 AI 技术,专注于生成文本。为了简化,我们将专注于大多数 RAG 管道使用的模型类型:LLM。然而,我们想要澄清的是,尽管我们主要聚焦于 LLM,但 RAG 也可以应用于其他类型的生成模型,例如图像、音频和视频。我们将在第 14 章讨论这些其他类型的模型以及它们在 RAG 中的应用。
一些流行的 LLM 示例包括 OpenAI 的 ChatGPT 模型、Meta 的 Llama 模型、Google 的 Gemini 模型和 Anthropic 的 Claude 模型。
提示词、提示设计和提示工程
这些术语有时可以互换使用,但从技术上讲,尽管它们都涉及到提示词,它们有不同的含义:
- 提示词 (Prompting) 是指向 LLM 发送查询或提示的行为。
- 提示设计 (Prompt Design) 是指设计你将发送给 LLM 的提示词的策略。不同的提示设计策略适用于不同的场景。我们将在第 13 章回顾这些策略。
- 提示工程 (Prompt Engineering) 更侧重于提示词的技术方面,以改善 LLM 输出的质量。例如,你可能将一个复杂的查询分解为两个或三个不同的 LLM 交互,通过工程优化达到更好的效果。我们将在第 13 章也会讨论提示工程。
LangChain 和 LlamaIndex
本书将重点介绍使用 LangChain 作为构建 RAG 管道的框架。LangChain 是一个开源框架,不仅支持 RAG,还支持任何想要在管道中使用 LLM 的开发。LangChain 每月下载量超过 1500 万,是最流行的生成型 AI 开发框架。它特别适合 RAG,提供了一套模块化且灵活的工具,使得 RAG 开发比没有框架时更为高效。
尽管 LangChain 目前是开发 RAG 管道最流行的框架,LlamaIndex 是 LangChain 的一个领先替代方案,具有类似的功能。LlamaIndex 以专注于搜索和检索任务而闻名,如果你需要处理复杂的搜索或大数据集,它可能是一个不错的选择。
许多其他选项专注于不同的细分领域。熟悉构建 RAG 管道后,别忘了查看其他框架,看看是否有更适合你特定项目的选择。
推理 (Inference)
我们将时不时使用“推理”这个术语。一般而言,推理指的是 LLM 使用预训练的语言模型,基于给定的输入生成输出或预测的过程。例如,当你向 ChatGPT 提问时,它为你提供回答的步骤就叫做推理。
上下文窗口 (Context Window)
在 LLM 中,上下文窗口指的是模型在单次推理过程中能够处理的最大令牌数(包括单词、子词或字符)。它决定了模型在做出预测或生成响应时可以“看到”或“关注”的文本量。
上下文窗口大小是模型架构的一个关键参数,通常在模型训练期间就已经固定。它与模型的输入大小直接相关,因为它设置了每次可以输入模型的令牌数上限。
例如,如果一个模型的上下文窗口大小为 4,096 个令牌,意味着该模型能够处理并生成最多 4,096 个令牌的序列。处理更长的文本时,比如文档或对话,输入通常需要分成多个适合上下文窗口的小段。这通常使用滑动窗口或截断等技术完成。
上下文窗口的大小对模型理解和维持长范围依赖性及上下文的能力有重要影响。具有较大上下文窗口的模型在生成响应时可以捕捉并利用更多的上下文信息,从而产生更连贯且具有上下文相关性的输出。然而,增大上下文窗口的大小也意味着训练和运行模型所需的计算资源增加。
在 RAG 中,上下文窗口的大小尤为重要,因为它决定了从检索到的文档中,模型能有效利用多少信息来生成最终的响应。最近语言模型的进展使得拥有更大上下文窗口的模型得以发展,从而能够处理和保留从检索源中获得的更多信息。请参见表 1.1,了解许多流行 LLM 的上下文窗口大小(包括闭源和开源):
LLM | 上下文窗口(令牌) |
---|---|
ChatGPT-3.5 Turbo 0613 (OpenAI) | 4,096 |
Llama 2 (Meta) | 4,096 |
Llama 3 (Meta) | 8,000 |
ChatGPT-4 (OpenAI) | 8,192 |
ChatGPT-3.5 Turbo 0125 (OpenAI) | 16,385 |
ChatGPT-4.0-32k (OpenAI) | 32,000 |
Mistral (Mistral AI) | 32,000 |
Mixtral (Mistral AI) | 32,000 |
DBRX (Databricks) | 32,000 |
Gemini 1.0 Pro (Google) | 32,000 |
ChatGPT-4.0 Turbo (OpenAI) | 128,000 |
ChatGPT-4o (OpenAI) | 128,000 |
Claude 2.1 (Anthropic) | 200,000 |
Claude 3 (Anthropic) | 200,000 |
Gemini 1.5 Pro (Google) | 1,000,000 |
表 1.1 – 不同 LLM 的上下文窗口
图 1.1(基于表 1.1)显示,Gemini 1.5 Pro 的上下文窗口远大于其他模型。
请注意,图 1.1 显示的模型通常是从右到左按年代排序的,这意味着较旧的模型通常具有较小的上下文窗口,而最新的模型则拥有更大的上下文窗口。这个趋势可能会继续下去,随着时间的推移,典型的上下文窗口将会越来越大。
微调 —— 全模型微调 (FMFT) 和参数高效微调 (PEFT)
FMFT(全模型微调) 是指你采用一个基础模型并进一步训练它,以获得新的能力。你可以为它提供某个特定领域的知识,或者教它某项技能,比如成为一个对话型聊天机器人。FMFT 会更新模型中的所有参数和偏差。
PEFT(参数高效微调) 则是另一种微调方法,它只聚焦于模型中特定部分的参数或偏差进行微调,目标与普通的微调相似。最新的研究表明,PEFT 可以以更低的成本、时间投入和数据需求,获得与 FMFT 相似的效果。
尽管本书并不专注于微调,但使用通过你的数据微调的模型,给它增加你领域的知识或让它更符合你领域的语气,仍然是一个非常有效的策略。例如,如果你在科学领域工作,你可以训练模型使其表现得更像科学家,而不是像通用的基础模型。或者,如果你在法律领域工作,你可能希望模型的语气更像律师。
微调还有助于 LLM 更好地理解你公司的数据,使其在 RAG 过程中生成更有效的响应。例如,如果你有一家科学公司,你可以通过科学信息对模型进行微调,并将其用于总结研究的 RAG 应用。这可能改善你的 RAG 应用输出(例如,研究总结),因为微调后的模型更好地理解你的数据,从而提供更有效的总结。
向量存储还是向量数据库?
两者都有!所有的向量数据库都是向量存储,但并非所有的向量存储都是向量数据库。好吧,在你拿出黑板准备画一个维恩图的时候,我将继续解释这个观点。
有一些方式可以存储向量,但它们并不是完整的数据库。它们仅仅是存储向量的设备。因此,为了涵盖所有可能存储向量的方式,LangChain 将所有存储向量的方式称作向量存储。我们也这样做!只需要知道,LangChain 连接的并非所有向量存储都被正式视为向量数据库,但一般来说,大多数是,并且很多人会将所有这些存储都称为向量数据库,即使它们在功能上并不完全是数据库。呼,终于搞清楚了!
向量、向量、向量!
向量是数据的数学表示。在谈到自然语言处理(NLP)和 LLM 时,它们通常被称为嵌入(embeddings)。向量是理解 RAG 管道中最重要的概念之一,而且 RAG 管道的许多不同部分都利用了向量。
我们刚刚回顾了许多你理解本书其余部分所需的关键词汇。许多这些概念将在后续章节中进一步展开。在下一部分中,我们将继续深入讨论向量。除此之外,我们将在第 7 章和第 8 章详细介绍向量及其如何用于查找相似内容。
向量
可以说,理解向量及其在 RAG 中的使用方式是本书中最重要的部分之一。如前所述,向量只是外部数据的数学表示,通常被称为嵌入(embeddings)。这些表示方式捕捉了语义信息,以一种能够被算法处理的格式,促进了诸如相似性搜索等任务,这对于 RAG 过程至关重要。
向量通常有一个特定的维度,这取决于它们表示的数字的数量。例如,这是一个四维向量:
[0.123, 0.321, 0.312, 0.231]
如果你不知道我们在讨论向量,而看到这段 Python 代码,你可能会认为这是一组四个浮动点数,实际上你理解得差不多。然而,在 Python 中处理向量时,你希望将其识别为一个 NumPy 数组,而不是列表。NumPy 数组通常更适合机器学习,因为它们经过优化,能比 Python 列表更快速和高效地进行处理,并且在各类机器学习包(如 SciPy、pandas、scikit-learn、TensorFlow、Keras、PyTorch 等)中,NumPy 数组广泛被认为是嵌入的事实标准表示形式。NumPy 还允许你直接对 NumPy 数组执行向量化数学操作,如元素级运算,而不需要编写循环等在使用其他类型序列时可能需要的代码。
在向量化处理中,向量的维度通常有数百或数千个,这指的是向量中浮动点的数量。更高的维度可以捕捉更多的语义信息,这对于准确地将查询输入与相关文档或数据进行匹配是至关重要的,尤其是在 RAG 应用中。
在第 7 章中,我们将讨论向量和向量数据库在 RAG 实现中的关键作用。接下来,在第 8 章中,我们将深入探讨相似性搜索的概念,利用向量来实现更快速、更高效的搜索。这些是帮助你深入理解如何更好地实现 RAG 管道的关键概念。
理解向量是理解如何实现 RAG 的一个重要基础概念,但 RAG 在企业中的实际应用是怎样的呢?我们将在接下来的部分讨论 RAG 在实际 AI 应用中的应用。
在 AI 应用中实现 RAG
RAG 正迅速成为企业中生成型 AI 平台的基石。RAG 结合了获取内部或新数据的能力与生成型语言模型的力量,提升了生成文本的质量和相关性。这一技术对于各行业的公司来说,尤其有助于提升产品、服务和运营效率。以下是一些 RAG 的应用示例:
- 客户支持和聊天机器人:这些可以在没有 RAG 的情况下存在,但当与 RAG 集成时,它可以将聊天机器人与过去的客户互动、常见问题解答(FAQ)、支持文档以及任何与该客户相关的内容相连接。
- 技术支持:通过更好地访问客户历史和信息,RAG 增强的聊天机器人可以显著改善当前的技术支持聊天机器人。
- 自动报告:RAG 可以帮助创建初步草稿或总结现有的文章、研究论文及其他类型的非结构化数据,转化为更易于消化的格式。
- 电子商务支持:对于电子商务公司,RAG 可以帮助生成动态的产品描述和用户内容,并且做出更好的产品推荐。
- 利用知识库:RAG 通过生成摘要、提供直接的查询答案和检索相关信息,提升了内部和通用知识库的可搜索性和实用性,适用于法律、合规、研究、医学、学术、专利和技术文档等多个领域。
- 创新侦察:这类似于搜索通用知识库,但侧重于创新。在这一过程中,公司可以利用 RAG 扫描并总结来自优质来源的信息,以识别与公司专业领域相关的趋势和潜在创新领域。
- 培训与教育:教育机构和企业培训项目可以使用 RAG,根据学习者的特定需求和知识水平,生成或定制学习材料。通过 RAG,组织内部的知识可以非常定制化地融入教育课程,面向个人或角色的需求。
这些只是公司目前正在使用 RAG 来改善运营的几种方式。在第 3 章中,我们将深入探讨这些领域,帮助你了解如何在公司多个地方实现这些改变游戏规则的举措。
你可能会想:“如果我在公司使用像 ChatGPT 这样的 LLM 来回答我的问题,这是否意味着我的公司已经在使用 RAG 了?” 答案是:“不。”
如果你只是登录 ChatGPT 并提问,那并不等于实现了 RAG。ChatGPT 和 RAG 都是生成型 AI 的形式,它们有时可以一起使用,但它们是两个不同的概念。在接下来的部分,我们将讨论生成型 AI 和 RAG 之间的区别。
比较 RAG 与传统生成型 AI
传统生成型 AI 已经被证明是企业的一项革命性变化,帮助员工达到新的生产力水平。像 ChatGPT 这样的 LLM 正在帮助用户处理一系列快速增长的应用场景,包括编写商业计划、编写和改进代码、撰写营销文案,甚至为特定饮食提供更健康的食谱。归根结底,用户做的很多事情都变得更快。
然而,传统生成型 AI 并不知道它不知道什么。这包括你公司大多数内部数据。你能想象如果把之前提到的所有好处与公司内部的所有数据结合在一起——关于公司曾经做过的所有事情、关于客户及其所有互动的信息,或者关于所有产品和服务的知识,并结合特定客户的需求——你能做出什么样的创新?你不必想象——这正是 RAG 所做的!
在 RAG 出现之前,大多数连接客户或员工与公司数据资源的服务,仅仅是触及了可能性的一小部分,而如果它们能够访问公司中的所有数据,将会有更多的可能性。随着 RAG 和生成型 AI 的出现,企业正站在一个真正巨大的变革前沿。
另一个可能让你混淆的概念是微调模型。我们来讨论一下这些方法之间的区别。
比较RAG与模型微调
LLM(大语言模型)可以通过两种方式适应您的数据:
- 微调(Fine-tuning) :通过微调,您根据新的训练数据调整模型的权重和/或偏差。这会直接影响模型,永久性地改变其如何与新的输入交互。
- 输入/提示(Input/prompts) :在这种方式下,您使用提示/输入将新知识引入模型,让LLM基于这些输入进行处理。
那么,为什么在所有情况下都不使用微调呢?一旦您引入了新的知识,LLM将永久地拥有这些知识!这也是模型创建的方式——通过训练数据来进行训练,对吗?理论上这听起来没错,但实际上,微调在教授模型专门任务(比如教模型如何以某种方式进行对话)时更为可靠,而在事实回忆方面的可靠性较差。
原因较为复杂,但通常来说,模型对事实的记忆就像人类的长期记忆。如果您背诵了一段长篇演讲或书籍,并试图在几个月后回忆,您可能仍然能够理解信息的上下文,但可能会忘记具体的细节。另一方面,通过模型输入新增知识就像我们的人类短期记忆,事实、细节甚至词语的顺序都非常新鲜,随时可以回忆。这种后者的情况更适用于您想要成功回忆事实的场景。考虑到微调的成本可能非常高,这使得考虑RAG变得更加重要。
不过,这里存在一个权衡。虽然通常可以将所有数据输入模型进行微调,但输入受限于模型的上下文窗口。这是一个正在积极解决的问题。例如,早期版本的ChatGPT 3.5的上下文窗口为4,096个标记(大约五页文本)。当ChatGPT 4发布时,上下文窗口扩展至8,192个标记(10页),并且有一个Chat 4-32k版本,具有32,768个标记的上下文窗口(40页)。这个问题非常重要,以至于它们将上下文窗口大小纳入了模型名称中。这强烈表明上下文窗口的重要性!
有趣的事实! 那么,最新的Gemini 1.5模型呢?它的上下文窗口达到了100万个标记,或者超过1,000页!
随着上下文窗口的扩大,另一个问题随之而来。扩展上下文窗口的早期模型显示,在文本的中间部分会丧失大量细节。这个问题也正在解决中。带有100万个标记上下文窗口的Gemini 1.5模型在“针在干草堆中”测试中表现良好,能够很好地记住输入文本中的所有细节。不幸的是,在“多个针在干草堆中”测试中,模型的表现不如预期。随着这些上下文窗口变得更大,预计在这一领域会有更多的努力。如果您需要处理大量文本时,记得要考虑这一点。
注意 需要指出的是,标记计数与词汇计数是不同的,因为标记包括标点符号、符号、数字和其他文本表示。像“ice cream”这样的复合词如何在标记上处理,取决于标记化方案,且在不同的LLM中可能会有所不同。大多数知名的LLM(如ChatGPT和Gemini)会将“ice cream”视为两个标记。在某些自然语言处理(NLP)的情况下,您可以争辩说,应该将它视为一个标记,因为标记应该代表一个有用的语义单位用于处理,但对于这些模型来说情况并非如此。
微调也可能相当昂贵,具体取决于您可用的环境和资源。近年来,由于代表性微调、LoRA相关技术和量化等新技术的出现,微调的成本已大大降低。但在许多RAG开发中,微调通常被视为对已经昂贵的RAG工作的一种额外成本,因此它被认为是一个更为昂贵的补充。
最终,在决定选择RAG还是微调时,您需要考虑您的特定用例和需求。RAG通常更适合检索LLM训练数据中未包含或是私有的事实信息。它使您能够动态地集成外部知识,而不需要修改模型的权重。而微调则更适用于教模型专门的任务,或者将其调整到特定领域。考虑到上下文窗口大小的限制以及在特定数据集上可能出现的过拟合问题,微调时需要格外注意。
现在我们已经定义了RAG是什么,特别是与其他使用生成式AI的方法进行比较之后,让我们回顾一下RAG系统的整体架构。
RAG系统的架构
以下是从用户角度来看,RAG过程的各个阶段:
- 用户输入查询/问题。
- 应用程序会稍微思考一会儿,然后检查它可以访问的数据,以便查看哪些数据最相关。
- 应用程序提供一个响应,重点是回答用户的问题,但使用通过RAG流程提供给它的数据。
从技术角度来看,这涵盖了您将要编写的两个阶段:检索(retrieval)和生成(generation)阶段。但还有一个阶段,叫做索引(indexing) ,它通常在用户输入查询之前执行。通过索引,您将支持数据转换为向量,存储在向量数据库中,并可能优化搜索功能,以确保检索步骤尽可能快速有效。
一旦用户提交查询,以下步骤会发生:
- 用户查询被向量化。
- 向量化后的查询被传递到向量搜索,以检索在向量数据库中最相关的数据,这些数据代表您的外部数据。
- 向量搜索返回最相关的结果和引用这些向量所代表的原始内容的唯一键。
- 使用这些唯一键提取与这些向量关联的原始数据,通常是多个文档的批次。
- 原始数据可能会被过滤或后处理,但通常会传递给LLM,基于您期望RAG流程执行的内容。
- LLM会根据提供的提示进行处理,通常提示如下:“您是一个帮助问答任务的助手。请根据以下问题(用户查询)和这些有用的信息(相似搜索中检索到的数据)进行回答。如果您无法基于提供的信息找到答案,请直接说‘不知道’。”
- LLM处理该提示,并基于您提供的外部数据给出响应。
根据RAG系统的范围,这些步骤可以实时完成,或者像索引等步骤可以在查询之前完成,以便在需要时快速进行搜索。
如前所述,我们可以将这些方面分解为三个主要阶段(见图1.2):
- 索引(Indexing)
- 检索(Retrieval)
- 生成(Generation)
如前所述,这三个阶段构成了一个典型RAG系统的整体用户模式和设计。在第四章中,我们将更深入地理解这些阶段。这将帮助你将这一编码范式的概念与实际实现联系起来。
总结
在本章中,我们探讨了RAG(检索增强生成)及其通过将LLM与组织的内部数据集成来增强LLM能力的方式。我们了解到,RAG将LLM的强大功能与公司的私有数据相结合,使模型能够利用它原本没有经过训练的信息,从而使LLM的输出更具相关性和价值,特别是针对特定的组织需求。我们还讨论了RAG的优势,例如提高准确性和相关性、定制化公司领域、对数据源的灵活支持,以及扩展模型知识库,超越原始训练数据的限制。此外,我们还探讨了RAG的挑战和局限性,包括对数据质量的依赖、需要进行数据清洗、增加的计算开销和复杂性,以及如果没有正确过滤,可能导致的信息过载。
在本章中段,我们定义了关键的词汇术语,并强调了理解向量的关键重要性。我们通过举例说明RAG在各个行业的应用,以及将RAG与传统的生成式AI和模型微调进行了比较。
最后,我们从用户角度和技术角度概述了典型RAG管道的架构和各个阶段,涵盖了RAG管道的索引(Indexing)、检索(Retrieval)和生成(Generation)阶段。在下一章中,我们将通过一个实际的编码示例来讲解这些阶段。