AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


[深度] 如何将大型语言模型 (LLM) 集成到系统和产品中——7种可选的实用模式(上篇)
发布日期:2024-03-31 13:21:39 浏览次数: 2201 来源:AI产品经理研习与实践



欢迎来到AI产品经理从0到1研习之旅。


近日发现一篇名为《Patterns for Building LLM-based Systems & Products》的文章,其作者为为亚马逊的高级应用科学家Eugene Yan。该文以学术研究、行业资源和从业者的专业知识为基础,探讨了构建基于大型语言模型(LLM)的系统与产品时的一系列模式,这些模式包括:评估(Evals)、检索增强生成(RAG)、微调(Fine-tuning)、缓存(Caching)、护栏(Guardrails)、防御性用户体验(Defensive UX)和收集用户反馈(Collect user feedback)。


(原文发表于2023年8月,点击文末左下角的原文链接可直接查看)


对于AI产品经理来说,了解这些模式非常重要,因为它们提供了一系列构建和优化基于LLM的产品的工具和方法。因此,我在原文的基础上进行了翻译,并在不改变大意的前提下结合自己的理解进行了改写、扩充。


在此分享给大家。


有一大堆问题很容易想象并构建演示,但却很难制作出产品,例如自动驾驶。演示一辆自动驾驶汽车绕街区很容易,但将其变成产品需要十年的时间。

Karpathy(现OpenAI团队成员,前 Tesla 人工智能总监)

这篇文章是关于将大型语言模型 (LLM) 集成到系统和产品中的实用模式。我们将以学术研究、行业资源和从业者的专业知识为基础,并将它们提炼成关键的想法和实践。


预警:文章很长长长长长长长长长长长长……


由于文章太长,我们将会分为上下2篇。一开始有些晦涩难懂,但阅读到后面,我就觉得越容易理解,不知身为读者的你又会作何感受。




00


概述


有7种关键的模式可以将大型语言模型 (LLM) 集成到系统和产品中,分别是:

评估(Evals):用于衡量表现,例如自动化的内容审核系统,可以使用评估来确保生成的文本符合特定的质量和标准。

检索增强生成(RAG):可添加新近的/外部的知识,例如利用RAG从知识库中检索相关信息以更准确地回答客户问题的智能客服系统。

微调(Fine-tuning):更好地完成特定任务,例如在线购物平台的虚拟服装试穿功能。通过微调,系统可以学习用户的身体特征(如身高、体重、体型)、风格偏好(如休闲、正式、运动)和购买历史,从而推荐合适的服装搭配给用户。

缓存(Caching):减少延迟、降低成本,例如基于LLM的文档摘要工具,使用缓存机制来存储和重用先前生成的摘要。当用户请求相似的文档摘要时,系统可以快速返回缓存的结果,提高响应速度。

安全护栏(Guardrails):用于确保输出质量,例如金融咨询聊天机器人,使用护栏来确保提供的财务建议是准确和合规的。系统会对生成的建议进行结构性和语义性检查,确保不违反任何金融法规或公司政策。

防御性用户体验(Defensive UX):优雅地预测和管理错误。例如智能家居系统,用户可以通过语音命令控制家中的各种设备,但为了防止误操作,系统设计了防御性UX。例如,当用户说“关闭所有灯光”时,系统会要求用户确认这个操作,以防止用户在不知情的情况下关闭所有灯光。

收集用户反馈(Collect user feedback):用于构建数据飞轮,例如个性化的语言学习应用,可以使用用户反馈来改进其语言练习和纠正功能。用户提供关于练习难度、纠正准确性和整体体验的反馈,帮助应用不断优化其LLM驱动的语言学习工具。

这7种模式按照从数据到用户、从防御到进攻的不同侧重点来看,可以按下图理解:


01


评估模式


评估是指用于评估模型在某个任务上的表现的一组衡量,包括基准数据和指标。

来自 HackerNews 的评论:

评估对于团队而言非常重要,(有没有它是)可以用来区分其是在做非常糟糕的垃圾产品还是在认真构建产品的主要区别。

为什么要评估


评估使我们能够衡量系统或产品的运行情况并检测任何回归。(一个系统或产品可以由多个组件组成,例如 大语言模型、提示词模板、检索到的上下文以及温度等参数。)一组代表性的评估使我们朝着大规模测量系统变化迈出了一步。如果没有评估,我们就会盲目行动,或者必须在每次有变化时都需要(人工)检查LLM的输出。


关于评估的更多信息


语言模型的评估领域有很多基准,例如:

MMLU (Massive Multitask Language Understanding): 一个大规模的多任务语言理解评估集,包含超过15000个问题,覆盖57个不同的学科领域,用于评估大型语言模型在多学科领域的知识掌握和问题解答能力。

EleutherAI Eval: EleutherAI推出的一系列评估工具,用于评估大型语言模型在各种NLP任务上的表现,能帮助研究人员和开发者了解和比较不同模型在不同任务上的性能,如准确性、创造性和逻辑推理能力。

HELM (HumanEval in Logical and Mathematical domains): 一个用于评估大型语言模型在解决需要逻辑推理和数学知识的任务上的能力表现的基准,任务包括问答、信息检索、摘要、文本分类等,不仅关注模型的性能,还考虑了模型的可解释性和健壮性,旨在提供更全面的模型评估,包括对模型在极端情况下的表现、错误分析和透明度的评价。

AlpacaEval: 专注于评估模型在长文本生成和理解上的表现,特别适用于检验模型处理长篇文章、报告或书籍时的连贯性、逻辑性和细节把握能力。

CLUE (Chinese Language Understanding Evaluation): 一个针对中文的综合性语言理解评估基准,覆盖多种不同的NLP任务,如文本分类、阅读理解等,用于评估模型在中文语言处理任务上的表现。

CUGE (Chinese Language Generation Evaluation): 一个针对中文的综合性语言生成评估基准,覆盖多种不同的文本生成任务,如摘要、对话等,用于评估模型在中文文本生成任务上的表现。

GSM8K (Grade School Math 8K): 一组设计用来测试语言模型在解决小学级数学问题上的能力的数据集。它包含约8000个问题,覆盖不同类型的数学题目。

MATH: 一个针对高级数学问题(如高中数学)设计的评估基准。它旨在测试语言模型解决复杂数学问题的能力。

BBH (Big Bench Hard): 一种综合性的评估基准,设计用于测试语言模型在处理一系列复杂任务时的性能,这些任务通常比传统的NLP任务更具挑战性。

我们在各家大语言模型发布会或其技术文档上通常都能看到类似的“跑分”,例如智谱AI最新发布的GLM-4:

上图中的n-shot是指:模型在解决问题之前会接触到n个相关的示例,以帮助模型快速适应并理解任务的要求,从而在没有大量训练数据的情况下改进其表现。


对于相关的评估指标我们可以按以下2种类型划分:

  • 上下文相关的:在这种场景中需要考虑上下文,通常被用于执行特定任务;如果要将其重新用于其他任务,则会需要做一些调整。

  • 上下文无关的:在这种场景中,评估大模型生成的输出时与上下文无关,只需要将输出与已知的基准相比较。由于它们与任务无关,因此更容易应用于各种任务。


为了更好地了解这些指标(及其潜在的不足),我们将探讨一些常用的指标,例如 BLEU、ROUGE、BERTScore 和 MoverScore。

BLEU(Bilingual Evaluation Understudy)是一种基于精度的指标:它计算生成的输出中也出现在参考文献中的 n 元语法的数量,然后将其除以输出中的单词总数。它主要用于机器翻译,并且由于其成本效益较好,目前仍是一个流行的指标。我们可以用一个类比来说明这个概念:

类比说明


想象你是一名餐厅的厨师,你需要根据一个菜谱来烹饪一道菜。BLEU就像是一位美食评委,他会根据你做的菜和菜谱上的描述来打分。评委不会直接品尝你的菜,而是通过比较你的菜和菜谱上的配料列表来评分。如果你的菜里包含了菜谱上列出的所有配料,那么你会得到高分。但是,如果你的菜里有一些不在菜谱上的配料,或者缺少了菜谱上的某些配料,你的分数就会降低。


在这个类比中,菜谱就是“参考文献”,你做的菜就是机器翻译的“输出”,而评委的评分方式就是BLEU指标的计算方法。BLEU会检查翻译的文本中有多少词汇或短语与参考翻译完全匹配,匹配得越多,翻译质量就越高。



(原文中介绍了具体的计算方法和公式,这一部分我们就不展开了)


ROUGE (Recall-Oriented Understudy for Gisting Evaluation):是一种评估文本摘要或机器翻译质量的指标。它通过比较机器生成的摘要或翻译与人工编写的参考摘要之间的重叠(如单词、短语或句子)来进行评分。ROUGE主要关注于召回率,即机器生成的文本覆盖了多少参考文本的内容。

类比说明


想象一下,你要求一个朋友阅读一本小说,并为你做一个摘要。这本小说非常长,但你只需要了解主要情节和关键事件。你的朋友给你提供了一个摘要,现在你想知道这个摘要有多好地覆盖了小说的主要内容。


在这个例子中,小说代表人工编写的参考摘要,你朋友提供的摘要则相当于机器生成的摘要。ROUGE评估的就是你朋友的摘要中包含了多少小说的关键内容。如果摘要中提到了所有重要的情节和角色,那么它的ROUGE得分将会很高,表示它成功地覆盖了参考文本的主要部分。



ROUGE 有多种变体。ROUGE-N 与 BLEU 最相似,因为它也计算输出和参考之间匹配的 n 元语法的数量。

其他变体包括:

  • ROUGE-L:测量输出和参考之间的最长公共子序列 (LCS)。它考虑句子级结构相似性,并归零于最长的一系列同时出现的序列 n 元语法。

  • ROUGE-S:这测量输出和参考之间的跳跃二元组。跳跃二元组是保持句子顺序的单词对,无论中间可能夹着什么单词。


BERTScore是一种基于嵌入的度量,它使用余弦相似度将生成的输出中的每个标记或 n-gram 与参考句子进行比较,这种方法不仅关注于文字的表面相似度,而是深入到语义层面,评估文本的实际意义是否接近。BERTcore 包含三个组成部分:

  • 召回率:参考中的每个标记与其在生成的输出中最接近的匹配之间的平均余弦相似度。

  • 精度:生成输出中的每个标记与其参考中最接近的匹配之间的平均余弦相似度。

  • F1:召回率和精度的调和平均值


BERTScore 很有用,因为它可以解释同义词和释义。BLEU 和 ROUGE 等更简单的指标无法做到这一点,因为它们依赖于精确匹配。BERTScore 已被证明与图像字幕和机器翻译等任务具有更好的相关性。

类比说明


想象一下,你正在学习烹饪,你的朋友给了你一个复杂的食谱,但你只能用自己的话来复述这个食谱。当你完成后,你希望知道你的复述是否忠实地传达了原始食谱的内容和意图。


在这个例子中,原始食谱类似于参考文本,而你用自己的话复述的食谱就像是机器生成的文本。BERTScore在这里的作用类似于一个评判,它不仅评估你的复述是否包含了所有重要的成分和步骤,还会深入理解每个成分和步骤的具体意义和目的,以确定你的复述是否真正地捕捉到了原始食谱的精髓。


MoverScore使用上下文嵌入来计算生成的输出和参考中标记之间的距离。但与基于Tokens一对一匹配(或“硬对齐”)的 BERTScore 不同,MoverScore 允许多对一匹配(或“软对齐”)。


MoverScore不仅仅比较单个词语之间的匹配,而是考虑整个文本的语义上下文,允许多个词语共同对应于另一个文本中的一个词语,这就是所谓的“软对齐”。

↑ BERTScore(左)VS MoverScore(右)的示意图

MoverScore 能够将一个序列中语义相关的单词映射到另一序列中的对应单词。它通过解决一个约束优化问题来实现这一点,该问题找到将一个文本转换为另一个文本的最小努力,测量将一个序列转换为另一个序列所需移动的距离。

类比说明


想象你正在组织一个大型派对,并创建了一个详细的计划清单。现在,你的朋友要根据这个清单来准备派对。但是,你的朋友没有严格按照清单上的每一项来准备,而是灵活地对应和调整。例如,清单上写着“准备水果沙拉”,你的朋友可能会准备一些水果和酸奶,以创造出类似的风味和体验。


在这个例子中,MoverScore的作用类似于评估你朋友的准备工作与原始计划清单之间的相似度。它不是严格比较每一项是否一致,而是更加关注整体的匹配度和语义相似性——即使有些具体的项目被替换或重新解释了,整体上仍然保持了派对的主题和氛围。


然而,使用这些传统的基准和指标存在一些缺陷。

首先,这些指标与人类判断之间的相关性很差。BLEU、ROUGE 等与人类评估流畅性的方式呈负相关。它们还表现出与人类充分性得分的中等到较低的相关性。特别是,BLEU 和 ROUGE与需要创造力和多样性的任务相关性较低。

其次,这些指标通常对更广泛的任务适应性较差。将针对一项任务提出的指标应用于另一项任务并不总是明智的。例如,BLEU 和 ROUGE 等精确匹配指标不太适合抽象摘要或对话等任务。由于它们基于输出和参考之间的 n 元语法重叠,因此对于可能有多种响应的对话任务来说,它们没有意义。输出与参考的 n 元语法重叠可以为零,但仍是良好的响应。

第三,这些指标的可重复性较差。即使对于相同的指标,不同的研究也会报告高方差,这可能是由于人类判断收集或指标参数设置的变化所致。另一项针对 2,000 项研究的ROUGE 分数的研究发现,分数难以重现、难以比较,而且常常不正确,因为评估通常是使用未经测试的、不正确的 ROUGE 实现进行的。

使用 ROUGE 进行模型评估的维度

即便使用最新的基准测试(例如 MMLU),相同的模型也会根据 eval 实现获得显着不同的分数。Huggingface 将原始 MMLU 实现与 HELM 和 EleutherAI 实现进行了比较,发现同一示例在不同的提供者中可能有不同的提示:

此外,三个基准的评估方法也大有不同:

  • 原始 MMLU:仅比较答案的预测概率(A、B、C、D)

  • HELM:使用模型中的下一个标记概率并选择概率最高的标记,即使它不是选项之一

  • EleutherAI:计算每个答案的完整答案序列(即,一个字母后跟答案文本)的概率。然后,选择概率最高的答案

因此,即使对于相同的评估,绝对分数和模型排名也会由于评估实施而大幅波动。这意味着模型指标并不具有真正的可比性(即使对于相同的评估),除非评估的实现在细节(如提示和标记化)方面是相同的。同样,QLoRA 的作者发现 MMLU 过于敏感,并得出结论:“不要使用/报告或信任 MMLU 分数”。

除了上面提到的传统评估之外,一个新的趋势是使用强大的大语言模型作为无参考指标来评估其他大语言模型的版本。这意味着我们可能不需要人类判断或最佳参考来进行评估。

G-Eval是一个应用大语言模型与思维链 (CoT) 和表格填写范式来评估大语言模型输出的框架。首先,他们向大语言模型提供任务介绍和评估标准,并要求其生成评估步骤的 CoT。然后,为了评估新闻摘要的连贯性,他们将提示、CoT、新闻文章和摘要连接起来,并要求 LLM 输出 1 到 5 之间的分数。最后,他们使用 LLM 输出标记的概率来标准化评分并取其加权总和作为最终结果。

上图所示就是G-EVAL的整体框架:首先输入任务介绍和评价标准的LLM,并要求它产生详细评估步骤。然后,我们使用提示词和生成的COT一起,在表单填充范例中评估NLG输出。最后,我们使用输出分数的概率加权求和作为最终得分。

他们发现 GPT-4 作为评估器与人类判断具有很高的 Spearman 相关性 (0.514),优于之前的所有方法。它在连贯性、一致性、流畅性和相关性等方面也优于传统指标。在主题聊天中,它在自然性、连贯性、参与性和接地性等多个标准方面比传统指标(如 ROUGE-L、BLEU-4 和 BERTScore)表现更好。

Vicuna的论文采用了类似的方法。他们首先定义 8 个类别(写作、角色扮演、提取、推理、数学、编码、STEM 和人文/社会科学),然后为每个类别提出 10 个问题。接下来,他们从五个聊天机器人中生成答案:LLaMA、Alpaca、ChatGPT、Bard 和 Vicuna。最后,他们要求 GPT-4 根据有用性、相关性、准确性和细节来评估答案的质量。

总的来说,他们发现 GPT-4 不仅提供了一致的分数,而且还可以对这些分数给出详细的解释。在单一答案评分范式下,GPT-4 与人类的一致性 (85%) 高于人类之间的一致性 (81%)。这表明 GPT-4 的判断与人类评估者的判断非常一致。

QLoRA还使用一个大语言模型来评估另一个大语言模型的输出。他们要求 GPT-4 在 Vicuna 基准测试中针对 gpt-3.5-turbo 评估各种模型的性能。鉴于 gpt-3.5-turbo 和另一个模型的响应,GPT-4 被提示对两者进行评分(满分 10 分)并解释其评级。他们还通过模型之间的直接比较来衡量性能,将任务简化为包含平局的三级评级方案。

为了验证自动评估,他们收集了人类对 Vicuna 基准的判断。使用 Mechanical Turk,他们招募了两个标注员来与 gpt-3.5-turbo 进行比较,并招募了三个标注员来进行成对比较。他们发现人类和 GPT-4 模型的排名基本一致,模型级别的 Spearman 排名相关性为 0.55。这提供了额外的信息,表明基于大语言模型的自动评估可能是人类评估的一种经济有效且合理的替代方案。


如何应用评估


构建可靠的评估应该是任何基于 LLM 的系统或产品(以及传统的机器学习系统)的起点。

不幸的是,BLEU 和 ROUGE 等经典指标对于抽象摘要或对话等更复杂的任务没有意义。此外,我们还发现 MMLU 等基准(以及 ROUGE 等指标)对其实施和衡量方式很敏感。坦白说,除非你的 LLM 系统正在为学校考试而学习,否则使用 MMLU 作为评估不太有意义。

因此,我们可以从收集一组特定于任务的评估(即提示、上下文、预期输出作为参考)开始,而不是使用现成的基准。这些评估将指导及时的工程、模型选择、微调等。当我们更新系统时,我们可以运行这些评估来快速衡量改进或回归,这可以视为评估驱动的开发 (EDD)

除了评估数据集之外,我们还需要有用的指标。它们帮助我们将性能变化提炼成一个可在评估运行中进行比较的单一数字。如果我们可以简化问题,我们就可以选择更容易计算和解释的指标。

最简单的任务可能是分类:如果我们使用大语言模型来执行类似分类的任务(例如,毒性检测、文档分类)或无需对话的提取式 QA,我们可以依赖标准分类指标,例如召回率、精度、PRAUC 等。如果我们的任务没有正确答案,但我们有参考(例如,机器翻译、提取摘要),我们可以依赖基于匹配(BLEU、ROUGE)或语义相似性(BERTScore、MoverScore)的参考指标。

然而,这些指标可能不适用于更多开放式任务,例如抽象总结、对话等。但收集人类的判断可能既缓慢又昂贵。因此,我们可能会选择通过强大的大语言模型进行自动化评估。

相对于通常充满噪音的人类判断(由于标注者之间存在不同的偏见),大语言模型的判断往往噪音较小(因为偏见更加系统化)但更有偏见。尽管如此,由于我们意识到了这些偏见,我们可以相应地减轻它们:

  • 位置偏见:大语言模型倾向于支持第一顺位的回答。为了缓解这种情况,我们可以对同一对响应进行两次评估,同时交换它们的顺序。如果两个订单中首选相同的响应,我们将其标记为胜利;否则,就平局了。

  • 冗长偏见:大语言模型倾向于选择更长、更冗长的回答,而不是更简洁的回答,即使后者更清晰、质量更高。一个可能的解决方案是确保比较响应的长度相似。

  • 自我增强偏见:大语言模型对自己的答案有轻微的偏见。GPT-4 自评的胜率提高了 10%,而 Claude-v1 的则提高了 25%。为了解决这个问题,不要使用相同的大语言模型来执行(对自己的)评估任务。


另外需要提醒的是,不要要求大语言模型进行直接评估(通过给出分数),而是尝试提供参考并要求进行比较。这有助于减少噪音。

最后,有时最好的评估是人工评估(不要与命名不佳评估基准HumanEval混淆,也被称为直觉测试。正如MosaicML 在其播客中所提到的:

基于振动的评估不能被低估。……我们的一项评估就是在模型训练时提供一堆提示并观察答案,看看它们是否发生变化。老实说,我真的不相信这些评估指标能够捕捉到我们关心的内容。我们的提示之一是“建议 3 岁和 7 岁孩子玩的游戏”,这对于了解训练过程中答案的变化更有价值。

Jonathan Frankle

更多信息,可参见原作者的另一篇文章《Evaluation & Hallucination Detection for Abstractive Summaries》,其中探讨了摘要总结的评估,涵盖参考、上下文和基于偏好的指标,还讨论了幻觉检测。


02


检索增强生成(RAG)模式


RAG从基础模型外部获取相关数据(又称知识库),并使用这些数据增强输入,从而提供更丰富的上下文来改进输出。


为什么是RAG?


RAG 通过将模型建立在检索到的上下文基础上来帮助减少幻觉,从而提高真实性。此外,保持检索索引的更新比持续预训练大语言模型更便宜。这种成本效率使得大语言模型可以更轻松地通过 RAG 访问最新数据。最后,如果我们需要更新或删除诸如有偏见或有害文档之类的数据,更新检索索引会更直接(与微调或提示大语言模型不要生成有害输出相比)。


简而言之,RAG应用了信息检索领域成熟且简单的思想来支持LLM的生成。在红杉最近的一项调查中,88% 的受访者认为检索将成为他们堆栈的关键组成部分。

关于RAG的更多信息


在深入研究 RAG 之前,对文本嵌入有一个基本的了解会有所帮助。

(如果你对此很熟悉,可以跳过本部分内容)

文本嵌入是文本数据的压缩、抽象表示,其中任意长度的文本可以表示为固定大小的数字向量。它通常是从文本语料库(例如维基百科)中学习的。将它们视为文本的通用编码,其中相似的项目彼此靠近,而不相似的项目相距较远。

良好的嵌入是在下游任务中表现良好的嵌入,例如检索相似的项目。Huggingface 的大规模文本嵌入基准 (MTEB)对分类、聚类、检索、摘要等不同任务的各种模型进行评分。

提示:虽然我们在这里主要讨论文本嵌入,但嵌入可以采用多种模式。例如,CLIP是多模态的,将图像和文本嵌入到同一空间中,使我们能够找到与输入文本最相似的图像。我们还可以根据用户行为(例如点击、购买)或图形关系来嵌入产品。

RAG 源于开放域问答。一篇早期的Meta 论文表明:

  • 通过 TF-IDF 检索相关文档并将其作为语言模型 (BERT) 的上下文提供,可以提高开放域 QA 任务的性能。他们将每个任务转换为完形填空语句,并在语言模型中查询缺失的标记。

  • 密集段落检索 (DPR)表明,使用密集嵌入(而不是 TF-IDF 等稀疏向量空间)进行文档检索可以优于 Lucene BM25 等强基线(top-5 准确率分别为 65.2% 和 42.9%)。

  • 更高的检索精度可以转化为更高的端到端 QA 准确性,这凸显了上游检索的重要性。


为了研究 DPR 嵌入,他们在现有问答对上微调了两个独立的基于 BERT 的编码器。通道编码器将文本段落嵌入向量中,而查询编码器将问题嵌入向量中。然后使用查询嵌入来检索与问题最相似的段落。

他们训练编码器,使点积相似度成为良好的排名函数,并将损失函数优化为正通道的负对数似然。DPR 嵌入针对问题和相关段落向量之间的最大内积进行了优化。目标是学习向量空间,使问题对及其相关段落靠近在一起。

为了进行推理,他们嵌入了所有段落并在 FAISS 中离线索引它们。然后,在查询时给出一个问题,他们计算问题嵌,通过近似最近邻检索TOP段落,并将其提供给输出问题答案的语言模型 (BERT)。

检索增强生成RAG(该模式由此得名)强调了预训练大语言模型的缺点。这些包括无法扩展或修改记忆、无法深入了解生成的输出以及幻觉。

为了解决这些缺点,他们引入了 RAG(也称为半参数模型)。他们重用 DPR 编码器来初始化检索器并构建文档索引。对于大语言模型,他们使用了 BART,一个 400M 参数的 seq2seq 模型。在这里,非参数部分由密集向量检索(dense vector retrieval)组成,而参数部分由预训练的大型语言模型(如BART)承担,这种组合使得RAG模型既能从数据中直接学习模式,又能利用语言模型的强大能力进行预测和生成。

如上图所示,该方法将预训练的检索器(查询编码器 + 文档索引)与预训练的序列到序列模型(生成器)结合,并进行端到端的微调。对于查询r,我们使用最大内积搜索(MIPS)来找到最相关的K个文档Zj对于最终预测y,我们将z视为一个潜在变量,并在不同文档下给出的序列到序列预测上进行边缘化处理。

检索增强生成的概述


在推理过程中,它们将输入与检索到的文档连接起来。然后,LLM 生成基于原始输入、检索到的文档和之前的Token。对于生成,他们提出了两种方法,这两种方法在如何使用检索到的段落生成输出方面有所不同。


方法(1) RAG-Sequence :该模型的核心是将文档检索和文本生成结合起来,以生成与查询相关且信息丰富的文本。具体来说,该模型首先使用检索器基于给定查询(例如一个问题或一个提示)找到一组相关的文档。然后,它使用一个生成器模型为每个检索到的文档生成一个独立的文本输出。这些输出可能是对查询的不同回答或补充信息。

接下来,模型会评估每个输出序列的概率,并将这些概率相加(这个过程称为边缘化),同时考虑每个文档被检索出来的概率。最终,模型会选择具有最高综合概率的输出序列作为最终答案。

举例说明


假设你是一个AI产品经理,负责一个问答系统。有人问:“咖啡的主要产地有哪些?”为了回答这个问题,你的RAG-Sequence模型首先找到了几篇与咖啡产地相关的文章。针对每篇文章,生成器分别创建了一个回答,比如“巴西和哥伦比亚”、“越南和印尼”等。


然后,模型会评估每个回答的可能性,并考虑每篇文章的相关性。如果“巴西和哥伦比亚”这个回答来自于高度相关的文章,并且生成器认为这是一个高概率的答案,那么这个回答就可能被选为最终输出。



方法(2)RAG-Token:该模型的核心在于它在生成每个单独的标记(即文本中的每个词或字符)时,都会考虑一系列相关文档。与RAG-Sequence不同的是,RAG-Token模型不是针对整个查询生成一个完整的文本响应,而是针对每个生成的令牌(单词或字符)进行单独处理。

具体来说,当模型生成文本时,它首先对给定的输入查询进行文档检索,找到与该查询相关的文档。对于每个检索到的文档,生成器会计算下一个Token的生成概率。这些概率分布被汇总(或聚合)起来,形成一个综合的概率分布,用于预测下一个Token。

这个过程对每个生成的Token都重复进行。这意味着,模型在生成文本的每一步中,都会根据原始输入和之前生成的Token来检索相关文档。每个文档都有自己的检索概率,并以不同的方式对下一个生成的标记作出贡献。

举例说明


想象您正在使用一个智能聊天机器人来讨论关于“环境保护”的话题。当您问一个问题,比如:“环境保护的重要性是什么?”时,RAG-Token模型首先检索与“环境保护”相关的一系列文档。


现在,模型开始逐个生成回答中的词语。首先,它可能选择“环境保护”作为第一个词,然后基于与这个词相关的文档生成下一个词“是”,接着是“维持生态平衡”。值得注意的是,模型在生成每个词时都可能参考不同的文档。例如,在生成“生态平衡”时,它可能检索到一篇关于生态系统的科学论文。


因此,与RAG-Sequence模型一次性考虑整个文档不同,RAG-Token模型在生成每个词时都进行独立的文档检索和参考,使得回答中的每个词都能尽可能地精准和信息丰富。


通过这种方式,RAG-Token模型能够生成既相关又丰富的文本回答,对于需要细粒度信息和高度相关性的场景(如智能问答、聊天机器人等)非常有用。这对AI产品经理来说意味着,可以创建更智能、更适应用户需求的产品。


方法(3)Fusion-in-Decoder (FiD)该模型的核心特点在于它在生成模型的解码器阶段对检索到的文档进行融合,从而生成精确的回答。它支持两种主要的检索方法:

  • BM25:基于关键词的经典检索方法,它使用默认参数的Lucene搜索引擎来找到与用户查询最相关的文档。

  • DPR (Dense Passage Retrieval):基于深度学习的检索方法,特别适合于找到与复杂查询语义上更匹配的文档。

在FiD模型中,当用户提出一个开放域的问题时,模型首先使用BM25或DPR来检索一组相关的文档。然后,在生成模型的解码器阶段,这些检索到的文档被融合在一起,以生成一个统一、连贯的回答。这种融合方法使得FiD能够从多个相关文档中提取和综合信息,从而生成更准确、更全面的回答。

如下图所示,对于每个检索到的段落,标题和段落都与问题连接在一起。这些对在编码器中独立处理。他们还在相应部分之前添加特殊标记,例如“question:” “title:”和“context:”。解码器负责这些检索到的段落的串联。

由于它在编码器中独立处理段落,所以它可以扩展到大量段落,因为它一次只需要对一个上下文进行自我关注。因此,计算量随着检索到的段落数量线性增长(而不是二次增长),使其比 RAG-Token 等替代方案更具可扩展性。然后,在解码过程中,解码器联合处理编码的段落,使其能够更好地聚合多个检索到的段落中的上下文。

因此,FiD模型特别适用于开放域QA,因为它能够处理广泛的问题类型,并从多个来源中汇聚信息来生成回答。这对于处理那些需要广泛背景知识和来自不同文档的信息的复杂查询尤其有用。

举例说明


假设您正在使用一个问答系统,该系统内置了FiD模型。您向系统提出了一个问题:“火星上的温度是多少?”


检索阶段:系统首先使用BM25或DPR方法检索相关信息。假设它找到了一些文章,其中包含火星温度的不同数据和相关的天文知识。


融合和生成阶段:接下来,FiD模型的解码器会对这些检索到的文档进行融合处理。这意味着,它不是从单一文档提取回答,而是综合所有相关文档中的信息。解码器可能会发现一个文档提到了火星白天的温度,另一个文档讨论了夜间的温度。


生成回答:然后,FiD模型会基于这些融合的信息生成一个连贯、全面的回答。例如,它可能会生成这样的回答:“火星的温度变化很大,白天平均温度约为-20°C,而夜间温度可下降至-100°C。”



方法(4)检索增强Transformer (RETRO) 采用了类似的模式,它结合了固定的BERT检索器、可微分编码器和分块交叉注意力机制来生成输出。不同之处在于,RETRO在整个预训练阶段进行检索,而不仅仅在推理阶段。此外,它们根据输入的各个部分(chunks,下文成为块)来获取相关文档。这允许在生成过程中进行更细致、重复的检索,而不是仅针对每个查询检索一次。

对于每个输入块,检索到的块被馈送到编码器中。输出是编码的邻居,其中 .在这里,每个块编码都以(中间激活)和通过交叉注意层的块激活为条件。简而言之,检索到的块的编码取决于输入块的参与激活。然后用于调节下一个块的生成。

在检索过程中,RETRO 将输入序列拆分为大小为64Tokens的块。然后,它找到与前一个块相似的文本,为当前块提供上下文。检索索引由两个连续的标记块组成,N和F。前者是用于计算密钥的邻居块,而后者是原始文档中的延续块。

检索基于 BERT 嵌入上通过距离(欧几里得)的近似最近邻。(有趣的是,与通常的余弦或点积相似度不同。)基于 SCaNN 构建的检索索引可以在 10 毫秒内查询 2T 令牌数据库。

他们还演示了如何复古拟合现有的基线模型。通过冻结预训练的权重并仅训练分块的交叉注意和邻居编码器参数(< 7B 模型权重的 10%),它们可以通过检索增强 Transformer,同时只需要 6M 训练序列(预训练的 3%)序列)。配备 RETRO 的模型能够超越基线模型的性能,并达到接近从头开始训练的 RETRO 的性能。

下图示意了对基线Transformer模型进行RETRO改造。任何Transformer模型都可以通过随机初始化并仅训练分块交叉注意力和检索编码器权重来进行微调,使其成为一个检索增强型Transformer。以这种方式进行微调可以迅速恢复并超越非检索性能,并几乎达到从零开始训练检索模型的同等性能(如每个图的右侧箭头所示)。我们发现,仅使用预训练期间看到的3%的Token数量进行RETRO改造,我们的模型就展现出了良好的性能。

举例说明


假设你负责开发一个企业知识库问答系统,该系统能够回答员工关于公司政策、工作流程等问题。你决定使用RETRO模型来提升问答系统的性能。


检索阶段:当员工输入一个问题,如“我如何申请年假?”时,RETRO模型的检索组件首先会在公司的知识库中查找相关文档,这些文档可能包括人力资源手册、FAQs、以往的申请示例等。


融合和解码阶段:检索到相关文档后,RETRO的解码器不仅考虑整个文档,还会细化到文档中的具体部分(chunks)。它会对每个相关部分进行分析,并结合这些信息来生成回答,确保每个答案不仅与问题直接相关,而且包含了所有必要的细节。


反复检索与微调:与传统模型不同,RETRO在整个预训练阶段不断进行检索和微调。这意味着它可以根据问题的上下文和已生成的答案部分,不断调整并优化检索结果。这样,当员工提问时,RETRO不仅能给出准确的答案,还能确保答案是最新和最相关的。


使用RETRO改造后,问答系统不需要从头开始建立一个庞大的数据库,也不需要对整个系统进行大规模的预训练。您可以在现有的Transformer模型基础上进行微调,迅速提高性能,并使系统更准确地回答复杂的查询,从而提高员工的工作效率和满意度。


方法(5)Internet-augmented LMs:提出了使用一个简单的“现成”搜索引擎来增强大型语言模型。首先,它们通过谷歌搜索检索一组相关文档。由于这些检索到的文档往往很长(平均长度为2,056个单词),它们将它们分块成每块六个句子。最后,它们通过TF-IDF嵌入问题和段落,并应用余弦相似度来对每个查询最相关的段落进行排名。

检索到的段落用于通过几次提示来调整大语言模型。他们采用来自传统闭卷QA(仅提供问答的)的k-shot prompting(k=15),并用证据段落对其进行扩展,使得每个上下文都是证据、问题和答案三元组。

对于生成器,他们使用了 Gopher,这是一个在 300B 令牌上训练的 280B 参数模型。对于每个问题,他们根据检索到的 50 个段落中的每一个生成四个候选答案。最后,他们通过直接推理、RAG、噪声通道推理和专家乘积 (PoE) 等多种方法估计答案概率来选择最佳答案。PoE 始终表现最佳。

举例说明


假设你是一位研究人员,正在准备一篇关于“人工智能在医学诊断中的应用”的综述文章。你需要获取最新的相关研究论文摘要来支持你的文章。


检索阶段:使用Google Search来查找与“人工智能在医学诊断”相关的研究论文。搜索引擎返回了一系列文档链接,每篇论文的长度都超过了两千字。


分块处理:由于论文通常很长,你决定将每篇论文分割成包含六句话的段落。这样做的目的是为了让接下来的处理更加集中和高效。


嵌入与排名:接着,你将查询问题“人工智能在医学诊断中的应用”以及分块后的每个段落进行TF-IDF编码,这是一种衡量词语重要性的统计方法。然后,使用余弦相似度来评估你的查询问题与每个段落的相关性,从而找到最贴近问题的段落。


通过这个过程,你不仅能够快速锁定最相关的研究段落,而且还能确保这些信息是最能反映查询意图的。


RAG还被应用于非QA任务,例如代码生成。虽然CodeT5+可以用作独立的生成器,但与 RAG 结合使用时,它在代码生成方面的性能明显优于类似模型。

为了评估 RAG 对代码生成的影响,他们在三种设置中评估模型:

  • Retrieval-based::获取 top-1 代码示例作为预测

  • Generative-only:仅基于解码器输出代码

  • Retrieval-augmented:在通过解码器生成代码之前,将 top-1 代码样本附加到编码器输入。

作为一个定性的例子,他们表明检索到的代码提供了关键的上下文(例如,用于urllib3HTTP 请求)并指导生成过程做出更正确的预测。相反,仅生成方法返回不正确的输出,仅捕获“下载”和“压缩”的概念。

方法(6) Hypothetical document embeddings (HyDE) :如果我们没有查询-段落对的相关性判断怎么办?如果没有它们,我们将无法训练将查询和文档嵌入到相同嵌入空间中的双编码器,其中相关性由内积表示。HyDE提出了一个解决方案。

HyDE能够生成表示文档内容的高维数学向量,即“嵌入”。这些嵌入能够捕获文档中的语义信息,使得机器学习模型能够理解和比较不同文档的内容。

HyDE通过将文档转化为数学上的向量来表示,这些向量是假设性的因为它们是由模型生成的,而不是直接从实际文档中提取的。这种表示方法使得机器可以基于内容的语义相似性而不是仅仅基于关键词来检索和对比文档。

HyDE的原理建立在将文本数据转换为嵌入向量的过程上。这通常涉及到以下几个步骤:

  • 预处理:将文档中的文本内容进行分词和标准化,以便于处理。

  • 向量化:使用模型(如BERT、Word2Vec等)将文本中的每个词或短语转换为向量。

  • 聚合:将文档中所有词或短语的向量进行聚合,生成代表整个文档的单个向量。

这样生成的文档向量可以用于各种任务,如文档分类、相似性检索、内容推荐等。

在接收到一个查询后,HyDE首先使用一个大型语言模型(如InstructGPT)来生成一个假设性文档。接下来,一个无监督的编码器,例如Contriver,将该文档编码成一个嵌入向量。最后,计算该假设性文档的嵌入向量与语料库中文档的内积,从而检索出最相似的真实文档。

编码器密集的瓶颈层作为一种有损压缩器,排除了嵌入中的不相关、非事实细节。这将相关性建模问题从表示学习任务转变为生成任务。

举例说明


假设我们正负责开发一个高级的学术研究辅助工具,该工具能够帮助用户找到与他们的研究主题最相关的文献。


查询处理:用户输入查询“最新人工智能在药物发现中的应用”。HyDE首先使用InstructGPT生成一个包含相关术语和概念的假设性文档,这个文档是根据用户的查询虚构出来的,旨在反映用户想要检索的信息类型。


文档编码:然后,Contriver编码器将假设性文档转换为一个高维嵌入向量,这个向量捕捉了文档的主要概念和内容。


相似性检索:工具计算这个假设性文档的嵌入向量与数据库中所有文献的嵌入向量的相似度,找出与用户查询最相关的实际文献。


通过这个过程,我们的工具可以忽略那些不必要的细节信息,专注于检索出最相关的文献,使得研究人员能够更高效地获取到他们需要的信息,从而加速学术研究的过程。



如何应用RAG


根据Obsidian-Copilot的经验,我发现混合检索(传统搜索索引 + 基于嵌入的搜索)比单独检索效果更好。在那里,我用语义搜索补充了经典检索(BM25,通过 OpenSearch)e5-small-v2。

为什么不只使用基于嵌入的搜索?虽然它在许多情况下都很好,但在某些情况下它还是有不足,例如:

  • 搜索人或物体的名称(例如 Eugene、Kaptir 2.0)

  • 搜索首字母缩略词或短语(例如 RAG、RLHF)

  • 搜索 ID(例如,gpt-3.5-turbo, titan-xlarge-v1.01)


但关键词搜索也有其局限性。它仅对简单的词频进行建模,不捕获语义或相关性信息。因此,它不能很好地处理同义词或上位词(即代表概括的单词)。这就是将其与语义搜索相结合的互补之处。

此外,通过传统的搜索索引,我们可以使用元数据来优化结果。例如,我们可以使用日期过滤器来优先考虑较新的文档或将搜索范围缩小到特定时间段。如果搜索与电子商务相关,则平均评分或类别的过滤器会很有帮助。最后,拥有元数据对于下游排名来说很方便,例如优先考虑引用更多的文档,或者通过销量来提升产品。

关于嵌入,看似流行的方法是使用text-embedding-ada-002。它的优点包括通过 API 易于使用,并且无需维护我们自己的嵌入基础设施或自托管嵌入模型。尽管如此,个人经验和其他人的轶事表明还有更好的检索选择。

OG 嵌入方法包括 Word2vec 和fastText。FastText 是一个开源的轻量级库,使用户能够利用预先训练的嵌入或训练新的嵌入模型。它配备了 157 种语言的预训练嵌入,即使没有 GPU,速度也非常快。这是我进行早期概念验证的首选。

另一个好的基线是sentence-transformers。它使得计算句子、段落甚至图像的嵌入变得简单。它基于 BERT 和 RoBERTa 等主力转换器,并提供 100 多种语言版本。

最近,Instructor模型显示出 SOTA 性能。在训练期间,这些模型将任务描述添加到文本中。然后,当嵌入新文本时,我们只需描述任务即可获得特定于任务的嵌入。(恕我直言,与嵌入模型的指令调整没有什么不同。)

E5系列模型就是一个例子。对于开放式 QA 和信息检索,我们只需在索引中的文档前面加上passage:,并在查询前面加上query:。如果任务是对称的(例如,语义相似性、释义检索),或者如果我们想使用嵌入作为特征(例如,分类、聚类),我们只需使用前缀query:。

Instructor型更进一步,允许用户自定义前置提示:“代表 task_objective 的 domaintask_type:”例如,“扮演供检索的维基百科文档:” (领域和任务目标是可选的)。这将提示调整的概念引入了文本嵌入领域。

最后,截至 8 月 1 日,MTEB 排行榜上排名第一的嵌入模型是阿里巴巴达摩院的GTE系列模型。表现最好的型号的大小是次佳型号的一半e5-large-v2(0.67GB vs 1.34GB)。位居第二的是gte-base模型大小仅为 0.22GB,嵌入尺寸为 768。  (H/T Nirant.)

为了大规模检索低延迟的文档,我们使用近似最近邻(ANN)。它优化检索速度并返回近似(而不是精确)的最相似的邻居,以一点精度损失换取大幅加速。

ANN 嵌入索引是让我们能够高效地进行 ANN 搜索的数据结构。在较高层次上,他们在嵌入空间上构建分区,以便我们可以快速放大查询向量所在的特定空间。一些流行的技术包括:

  • Locality Sensitive Hashing(LSH):核心思想是创建哈希函数,以便相似的项可能最终出现在同一个哈希桶中。只需要检查相关的存储桶,我们就可以高效地执行 ANN 查询。

  • Facebook AI Similarity Search(FAISS):它采用量化和索引相结合的方式进行高效检索,同时支持CPU和GPU,并且由于其对内存的有效利用,可以处理数十亿个向量。

  • Hierarchical Navigable Small Worlds(HNSW):受“六度分离”的启发,构建了体现小世界现象的分层图结构。在这里,大多数节点可以通过最少的跳数从任何其他节点到达。这种结构允许 HNSW 从更广泛、更粗略的近似值发起查询,并逐步缩小较低级别的搜索范围。

  • Scalable Nearest Neighbors(ScaNN):它有一个两步过程。首先,粗量化减少了搜索空间。然后,在缩减集中进行细粒度搜索。我见过的最好的召回/延迟权衡。


评估 ANN 指数时,需要考虑的一些因素包括:

  • 回想一下:它与精确最近邻相比表现如何?

  • 延迟/吞吐量:每秒可以处理多少个查询?

  • 内存占用:为索引提供服务需要多少 RAM?

  • 轻松添加新项目:是否可以添加新项目而无需重新索引所有文档 (LSH) 或者是否需要重建索引 (ScaNN)?


没有任何一个框架在各方面都比其他框架更好。因此,在基准测试之前首先定义功能和非功能需求。就我个人而言,我发现 ScaNN 在召回延迟权衡方面表现出色(可参见作者的另一篇文章《Real-time Machine Learning For Recommendations》)。

举例说明


假设我们是一家大型企业的AI产品经理,负责开发一个内部知识管理系统,旨在帮助员工快速找到他们在工作中需要的各种信息,比如技术文档、公司政策、行业研究报告等。


混合检索的实践应用:

  • 员工在系统中输入查询:“如何执行数据备份恢复操作?”

  • 系统首先使用传统搜索索引,如OpenSearch中的BM25算法,来找到包含关键词“数据备份恢复”的文档。

  • 同时,系统也使用基于嵌入的搜索,如语义搜索模型e5-small-v2,来理解查询的上下文和语义意图,并检索语义上相关的文档,即使这些文档可能没有直接包含查询的确切词汇。


基于嵌入的搜索的补充:

  • 我们注意到基于嵌入的搜索在处理特定的术语或专有名词时可能不够精准,比如搜索特定的产品名称或技术术语。

  • 因此,我们决定结合两种方法,以确保即使是含有专业术语的查询也能得到精确和全面的检索结果。


使用ANN技术进行高效检索:

  • 为了在海量的企业文档中进行快速检索,系统采用了近似最近邻(ANN)技术。

  • 当员工提出查询时,系统不仅能快速找到相关文档,而且还能通过ANN索引快速定位到文档中最相关的部分,如特定的章节或段落。


通过这样的混合检索方法,知识管理系统能够提供快速且精确的信息检索服务。它结合了基于关键词的检索的精确性和基于嵌入的语义检索的全面性,同时通过ANN技术保证了检索的速度和效率。


<未完待续…>
目前我们只研习了该文所提及到的7种模式中的前2种。。。o(╥﹏╥)o







53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询