通过检索增强生成和微调来扩充大型语言模型
本系列文章讨论 LLM 用于生成响应的知识检索模型。 默认情况下,大型语言模型(LLM)仅有权访问其训练数据。 但是,可以扩充模型以包括实时数据或专用数据。 本文讨论用于增强模型的两种机制之一。
第一种机制是检索扩充生成(RAG),它是一种预处理形式,将语义搜索与上下文启动相结合(另一篇文章中讨论)。
第二种机制是 微调,它是指在初始、广泛的训练后进一步训练特定数据集上的模型的过程,目的是调整模型以更好地执行任务或了解与该数据集相关的概念。 此过程可帮助模型专门或提高其处理特定类型输入或域的准确性和效率。
以下部分更详细地介绍了这两种机制。
了解 RAG
RAG 通常用于启用“通过我的数据聊天”方案,其中,具有大量文本内容(内部文档、文档等)的公司,并希望将此语料库用作用户提示答案的基础。
概括而言,为每个文档(或称为“区块”的文档的一部分)创建数据库条目。 区块在嵌入时编制索引,它是表示文档分面的数字的向量(数组)。 当用户提交查询时,可以搜索数据库查找类似的文档,然后将查询和文档提交到 LLM 以撰写答案。
注意
术语“检索扩充生成”(RAG)可以容纳。 无论是希望使用支持性容量(RAG)还是用作响应中心(RCG)的外部数据,都可以应用本文中概述的基于 RAG 的聊天系统的过程。 在与 RAG 相关的大多数阅读中,没有解决这种细微差别。
创建矢量化文档的索引
创建基于 RAG 的聊天系统的第一步是创建包含文档嵌入的矢量数据存储(或文档的一部分)。 请考虑下图,其中概述了创建文档矢量化索引的基本步骤。
此关系图表示一个 数据管道,负责引入、处理和管理系统使用的数据。 这包括预处理要存储在矢量数据库中的数据,并确保馈送到 LLM 中的数据格式正确。
整个过程由嵌入的概念驱动,该概念是数据(通常是单词、短语、句子甚至整个文档)的数字表示形式,以机器学习模型可以处理的方式捕获输入的语义属性。
若要创建嵌入,请将内容块(句子、段落或整个文档)发送到 Azure OpenAI 嵌入 API。 从嵌入 API 返回的内容是向量。 矢量中的每个值都表示内容的一些特征(维度)。 维度可能包括主题、语义含义、语法和语法、字词和短语用法、上下文关系、样式和语气等。矢量的所有值一起表示内容的 维空间。 换句话说,如果可以想到具有三个值的矢量的 3D 表示形式,则给定向量位于 x、y、z 平面的某些区域中。 如果为 1000(或更多)值,该怎么办? 虽然人类不可能在一张纸上绘制一张 1000 维图形,使其更易于理解,但计算机对维空间程度没有问题。
下图的下一步描述了将矢量与内容本身(或指向内容位置的指针)和其他元数据一起存储在向量数据库中。 矢量数据库与任何类型的数据库类似,有两种差异:
- 矢量数据库使用向量作为索引来搜索数据。
- 矢量数据库实现一种称为余弦相似搜索(也称为 最近的邻居)的算法,该算法使用最接近搜索条件的矢量。
借助存储在向量数据库中的文档的库,开发人员可以生成检索 器组件,该组件 从数据库中检索与用户查询匹配的文档,以便向 LLM 提供响应用户查询所需的内容。
使用文档回答查询
RAG 系统首先使用语义搜索来查找撰写答案时对 LLM 有用的文章。 下一步是将匹配的文章以及用户的原始提示发送到 LLM 以撰写答案。
将下图视为简单的 RAG 实现(有时称为“天真 RAG”)。
在关系图中,用户提交查询。 第一步是为用户的提示创建嵌入以返回向量。 下一步是搜索那些与“最接近相邻”匹配的文档(或文档部分)的向量数据库。
余弦相似性 是用于确定两个向量相似程度的措施,实质上是评估两个向量之间的余弦值。 接近 1 的余弦相似性表示高度相似性(小角度),而接近 -1 的相似性表示不同(角度接近 180 度)。 此指标对于文档相似性等任务至关重要,目标是查找内容或含义相似的文档。
“最接近的邻居”算法 通过将最接近的向量(邻居)查找到向量空间中的给定点来工作。 在 最接近的邻居 (KNN) 算法中,“k”是指要考虑的最接近的邻居数。 此方法在分类和回归中广泛使用,其中算法根据训练集中“k”最接近邻居的大多数标签预测新数据点的标签。 KNN 和余弦相似性通常用于建议引擎等系统中,目标是查找与用户首选项最相似的项,这些项表示为嵌入空间中的矢量。
从该搜索中获取最佳结果,并发送匹配内容以及用户的提示,以生成一个响应(希望通过匹配内容通知)。
挑战和注意事项
实现 RAG 系统会带来一系列挑战。 数据隐私至关重要,因为系统必须负责处理用户数据,尤其是在从外部源检索和处理信息时。 计算要求也很重要,因为检索和生成过程都是资源密集型的。 确保响应的准确性和相关性,同时管理数据或模型中存在的偏见是另一个关键考虑因素。 开发人员必须仔细应对这些挑战,以创建高效、道德和有价值的 RAG 系统。
本系列中的下一篇文章, 构建高级检索扩充生成系统 提供了有关生成数据和推理管道的更多详细信息,以启用生产就绪的 RAG 系统。
如果想要立即开始尝试生成生成 AI 解决方案,建议使用自己的 Python 数据示例来了解聊天入门。 .NET、Java 和 JavaScript 中还提供了本教程的版本。
微调模型
在 LLM 的上下文中,微调是指在最初在大型、多样化的数据集上训练后,在特定于域的数据集上调整模型参数的过程。
LLM 在广泛的数据集上训练(预先训练),掌握语言结构、上下文和广泛的知识。 此阶段涉及学习常规语言模式。 微调正在基于较小的特定数据集向预先训练的模型添加更多训练。 此辅助训练阶段旨在调整模型,以便更好地执行特定任务或了解特定域,提高这些专用应用程序的准确度和相关性。 在微调期间,调整模型的权重以更好地预测或了解此较小数据集的细微差别。
几个注意事项:
- 专用化:微调根据特定任务(如法律文档分析、医疗文本解释或客户服务交互)定制模型。 这使得模型在这些领域更加有效。
- 效率:为特定任务微调预先训练的模型比从头开始训练模型更有效,因为微调需要更少的数据和计算资源。
- 适应性:微调允许适应不属于原始训练数据的新任务或域,使 LLM 适用于各种应用程序的通用工具。
- 改进了性能:对于最初训练模型的数据不同的任务,微调可能会导致更好的性能,因为它调整模型以了解新域中使用的特定语言、样式或术语。
- 个性化:在某些应用程序中,微调有助于个性化模型的响应或预测,以满足用户或组织的特定需求或首选项。 但是,微调也存在某些缺点和限制。 了解这些内容有助于决定何时选择微调而不是检索扩充生成(RAG)等替代项。
- 数据要求:微调需要特定于目标任务或域的足够大且高质量的数据集。 收集和策展此数据集可能具有挑战性和资源密集型。
- 过度拟合风险:存在过度拟合的风险,尤其是使用小型数据集。 过度拟合会使模型对训练数据表现良好,但对新的、看不见的数据表现不佳,从而降低了其通用性。
- 成本和资源:虽然比从头开始训练的资源密集型要少,但微调仍需要计算资源,尤其是对于大型模型和数据集而言,这可能对某些用户或项目来说是令人禁止的。
- 维护和更新:经过微调的模型可能需要定期更新才能在域特定信息随时间变化时保持有效。 这种持续维护需要额外的资源和数据。
- 模型偏移:由于模型针对特定任务进行了微调,因此它可能会失去一些常规语言理解和多功能性,从而导致一种称为模型偏移的现象。
使用微调 自定义模型说明了如何微调模型。 概括而言,提供一组潜在的问题和首选答案的 JSON 数据集。 该文档建议通过提供 50 到 100 个问答对来显著改进,但正确的数字因用例而异。
微调与检索扩充生成
表面上看来,微调和检索扩充生成之间存在相当多的重叠。 在微调和检索扩充生成之间进行选择取决于任务的特定要求,包括性能预期、资源可用性以及域特定性与通用性的需求。
何时首选微调而不是检索扩充生成:
- 特定于任务的性能 - 当特定任务的高性能至关重要时,最好进行微调,并且存在足够的特定于域的数据来有效训练模型,而不会造成重大过度拟合风险。
- 控制数据 - 如果你有与基础模型训练的数据明显不同的专有或高度专用的数据,则微调允许你将这种独特的知识合并到模型中。
- 实时更新 的有限需求 - 如果任务不需要使用最新信息不断更新模型,则微调可能更高效,因为 RAG 模型通常需要访问最新的外部数据库或 Internet 来拉取最近的数据。
何时首选检索扩充生成而不是微调:
- 动态或不断发展的内容 - RAG 更适用于具有最新信息至关重要的任务。 由于 RAG 模型可以实时从外部源拉取数据,因此它们更适用于新闻生成或回答有关最近事件的问题等应用程序。
- 对专用化的通用化 - 如果目标是在各种主题中保持强大的性能,而不是在狭窄的域中表现突出,则 RAG 可能更可取。 它使用外部知识库,允许它跨不同的域生成响应,而不会过度拟合到特定数据集的风险。
- 资源约束 - 对于使用有限资源进行数据收集和模型训练的组织,使用 RAG 方法可能会提供一种经济高效的替代方法进行微调,尤其是在基本模型已对所需任务执行相当好的情况下。
可能影响应用程序设计决策的最终注意事项
下面是本文中要考虑的事项和其他要点的简短列表,这些内容会影响应用程序设计决策:
- 根据应用程序的特定需求,在微调和检索扩充生成之间做出决定。 微调可为专用任务提供更好的性能,而 RAG 可以为动态应用程序提供灵活性和最新内容。