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