做网站切图是什么意思,wordpress 输出豆瓣,餐饮公司网站制作,wordpress nextgen摘要 检索增强式上下文学习已经成为一种强大的方法#xff0c;利用冻结语言模型 (LM) 和检索模型 (RM) 来解决知识密集型任务。现有工作将这些模型结合在简单的“检索-读取”流程中#xff0c;其中 RM 检索到的段落被插入到 LM 提示中。 为了充分发挥冻结 LM 和 RM 的…
摘要 检索增强式上下文学习已经成为一种强大的方法利用冻结语言模型 (LM) 和检索模型 (RM) 来解决知识密集型任务。现有工作将这些模型结合在简单的“检索-读取”流程中其中 RM 检索到的段落被插入到 LM 提示中。 为了充分发挥冻结 LM 和 RM 的潜力我们提出了 DEMONSTRATE-SEARCH-PREDICT (DSP) 框架该框架依赖于在 LM 和 RM 之间通过复杂的流程传递自然语言文本。DSP 可以表达高级程序这些程序可以引导流程感知的演示、搜索相关段落并生成有根据的预测系统地分解问题使其成为 LM 和 RM 可以更可靠地处理的小型转换。 我们为开放域、多跳和对话场景下的问答任务编写了新的 DSP 程序并在早期评估中取得了新的上下文学习最先进成果分别比基线 LM (GPT-3.5)、标准检索-读取流程和同期自问流程取得了 37-120%、8-39% 和 80-290% 的相对提升。我们将在 https://github.com/stanfordnlp/dsp 发布 DSP。
1 引言 上下文学习通过在文本提示中包含任务指令和几个演示示例来调整冻结语言模型LM使其适应各种任务。对于问答、事实核查和信息寻求对话等知识密集型任务检索模型RM越来越多地用于增强提示从大型语料库中检索相关信息。 最近的研究表明这种检索增强式上下文学习在简单的“检索-读取”流程中非常有效将查询输入到 RM 中并将检索到的段落作为提供 LM 响应上下文的一部分。在这项工作中我们认为 LM 和 RM 都消耗并生成或检索自然语言文本这为它们之间更复杂的交互提供了机会。充分实现这一点将具有变革性冻结的 LM 和 RM 可以作为跨任务的通用基础设施使机器学习和领域专家能够以更高的抽象级别快速构建有根据的 AI 系统并降低部署开销和标注成本。 图 1 开始说明了检索增强式上下文学习的强大之处但也突出了“检索-读取”方法的局限性。我们的查询是“大卫·格雷戈里继承的城堡有多少层”。当被提示回答这个问题时GPT-3.5text-davinci-002Ouyang 等人2022 年编造了一个虚构的城堡其属性不正确这突出了 LM 参数中存储的知识通常不可靠的常见现象Shuster 等人2021 年Ishii 等人2022 年。引入 RM 组件有所帮助因为 LM 可以将其响应建立在检索到的段落上但冻结的检索-读取策略会失败因为 RM 无法找到直接回答问题的段落。 图1所示。基于GPT3.5 (text-davinci-002)的三个系统的比较。LM本身经常做出错误的断言。当简单的搜索无法找到答案时越来越流行的检索-读取管道就会失败。相比之下任务感知DSP程序成功地分解了问题并产生了正确的响应。为演示而编辑的文本 我们引入了 DEMONSTRATE-SEARCH-PREDICT (DSP) 框架用于上下文学习该框架完全依赖于在冻结的检索模型 (RM) 和语言模型 (LM) 之间传递自然语言文本和分数。DSP 引入了一系列可组合的功能用于引导训练示例 (DEMONSTRATE)、从知识语料库中收集信息 (SEARCH) 和生成有根据的输出 (PREDICT)从而系统地统一检索增强式 NLP 和上下文学习文献中的技术 (Lee 等人2019 年Khattab 等人2021aAnantha 等人2020 年Gao 等人2022 年Izacard 等人2022 年Dohan 等人2022 年Zelikman 等人2022 年Zhang 等人2022 年)。 我们使用 DSP 来建议强大的知识密集型任务策略这些策略由上述技术的组合构成。这揭示了上下文学习的一般性新概念可能性第 2 节并使我们能够展示丰富的程序这些程序为上下文学习设置了新的最先进成果第 3 节。 图 1 展示了 DSP 程序可能采取的路径来得出答案而图 2 则说明了如何通过精心设计的程序实现这一点。程序并没有直接要求 LM 回答这个复杂的问题而是 SEARCH 阶段使用 LM 生成了一个查询“大卫·格雷戈里继承了哪座城堡” RM 检索到一条段落说格雷戈里继承了 Kinnairdy Castle。在第二次搜索“跳转”找到城堡的层数后PREDICT 阶段使用这些段落来查询 LM以回答原始问题。 尽管这个程序实现了查询生成等行为但它不需要手动标注这些中间转换的示例即检索跳转中生成的查询和段落。相反DEMONSTRATE 阶段使用标记的问答对来实现一种弱监督形式该形式可以自动标注 SEARCH 和 PREDICT 中调用的转换。 图 2. 多跳问答 DSP 程序的一个示例。给定一个输入问题和 2-shot 训练集DEMONSTRATE 阶段使用一种弱监督形式自动对训练示例中的中间转换进行注释。SEARCH 阶段从演示中学习分解复杂的输入问题并在两次检索跳转中检索支持信息。最后PREDICT 阶段使用演示和检索到的段落来回答问题。 我们在开放域、多跳和对话场景下对多个 DSP 程序进行了问答评估。在这些程序中我们实现了新颖且可重用的转换例如使用弱监督对所有流程引导注释第 2.3 节、可靠地重写问题以解决对话依赖关系并使用中间跳转的摘要迭代分解复杂查询第 2.4 节以及使用自洽性从多个段落生成有根据的响应第 2.5 节。我们使用冻结的 LM GPT-3.5 和 RM ColBERTv2Khattab Zaharia2020 年Santhanam 等人2022b 年在 Open-SQuAD、HotPotQA 和 QReCC 上报告了初步结果无需微调。我们的 DSP 程序分别比相应的基线 LM、标准检索-读取流程和同期自问流程Press 等人2022 年取得了 37-120%、8-39% 和 80-290% 的相对提升。 本报告的后续版本将包括额外的测试任务和 LM 选择。 总之本工作做出了以下贡献。首先我们主张简单的、与任务无关的上下文学习流程应该让位于深思熟虑的、任务感知的策略。其次我们展示了这种转变不必成为负担使用 DSP这样的策略可以轻松地表示为使用可组合运算符的简短程序。第三这种组合性催生了强大的能力例如能够自动标注复杂流程的演示仅从最终任务的标签中。第四对于三个知识密集型任务我们实现了丰富的程序为上下文学习建立了最先进的结果。
2 展示-搜索-预测 现在我们引入了 DSP 框架并通过提出一系列策略来展示其表达力这些策略使 LM 和 RM 能够有效地共同解决复杂问题。我们在第 3 节展示了这些策略优于现有的上下文学习方法。我们首先讨论了 DSP 所基于的 LM 和 RM 基础模块第 2.1 节然后讨论了 DSP 内部的数据类型和控制流程第 2.2 节。随后我们讨论了每个推理阶段DEMONSTRATE第 2.3 节、SEARCH第 2.4 节和 PREDICT第 2.5 节。
2.1 预训练模块:LM和RM 一个DSP程序定义了语言模型LM和检索模型RM之间的通信。 语言模型我们调用一个冻结的语言模型 LM 来有条件地生成或评分文本。对于每次调用程序都会准备一个提示使 LM 适应一个特定的功能例如回答问题或生成查询。一个提示通常包括指令、一些所需行为的演示以及一个要回答的输入查询。 如图 2 所示LM 不仅生成 (i) 对输入问题的最终答案在 PREDICT 阶段而且还生成 (ii) 中间的“跳转”查询以找到对输入问题有用的信息SEARCH以及 (iii) 示例查询展示如何为训练集中的问题生成查询DEMONSTRATE。这种对 LM 的系统使用是 DSP 程序的一个特点。 检索模型 DSP 程序还调用一个冻结的检索模型 RM以检索对于给定查询最“相关”的 top-k 文本序列。RM 可以索引大量预定义的段落以实现可扩展的搜索并且可以在不改变检索参数的情况下更新这些段落。RM 接受自由形式的文本输入并专门用于估计文本序列与查询的相关性或相似性。 如图 2 所示RM 负责检索iLM 生成的每个查询的段落在 SEARCH 阶段以及ii用于演示中的段落DEMONSTRATE。在后一种情况下RM 的贡献较少在于直接为输入问题提供相关信息而更多在于帮助 LM 适应领域和任务。 尽管在此示例中未使用但 RM 在 DSP 中还用于诸如从任务训练数据检索“最近邻”演示DEMONSTRATE和从 LM 选择基于事实生成的序列PREDICT等功能。
2.2 数据类型和控制流 我们使用 Python 实现了 DSP 框架。本节介绍了框架提供的基本数据类型和可组合函数。我们使用示例代码片段来说明这些例子并传达了能够在简单程序中表达 LM 和 RM 之间复杂交互的力量。 示例数据类型为了执行任务DSP 程序操作一个或多个 Example 数据类型的实例。一个 Example 类似于具有多个字段的 Python 字典。程序通常会被提供几个训练示例。下面的代码片段展示了这对于多跳问答的情况。 这段代码包含两个标记的示例每个示例都有一个多跳问题例如“Akeem Ellis 在 2017 年在哪个城市打球”及其简短答案“Ellesmere Port”。在 Example 中允许任意键和值尽管典型的值是字符串或字符串列表。 在此任务中我们不太可能找到一个单独的段落能提供任何问题的答案。例如第一个训练示例可能只能通过首先回答谁发现了帕洛马“埃德温·哈勃”的问题然后使用不同的证据段落来解答哈勃的出生日期问题。我们通常假设人类标记的训练数据不包括对中间转换例如单个跳转的查询的标签这些转换对于执行这些步骤会有用因此 DSP 程序的任务是通过上下文学习发现这些策略。 DSP 程序以下代码片段是一个完整的程序用于解决类似于图 1 中的多跳问题并得到上述训练示例的帮助。 程序接受输入此处为一个问题并输出系统输出其简短答案。它首先为输入问题创建一个 Example并将训练字段分配给之前的代码片段中的训练集。程序调用和组合 DSP 基本操作即内置函数来构建定义程序的 DEMONSTRATE、SEARCH 和 PREDICT 转换。 转换 转换是一个函数它接受一个 Example 作为输入并返回一个 Example在其中填充新的字段或修改现有字段。这个程序调用了三个由开发者定义的转换即multihop_demonstrate、multihop_search 和 multihop_predict。转换本身也可以调用其他转换它们与标准深度神经网络DNN编程框架如 PyTorch中的层类似不同的是它们在彼此之间传递文本数据而不是张量并不涉及反向传播。 我们将转换根据它们在 DEMONSTRATE、SEARCH 和 PREDICT 阶段的行为或目的进行分类。尽管如此DSP 并不强制执行这种分类允许我们定义可能融合这些阶段的函数。我们将在下一节讨论这三个阶段。
2.3 展示 已知在 LM 的提示中包含所需行为的示例通常会导致更好的性能Brown 等人2020 年。在 DSP 中演示是一个经过准备的训练示例用于展示 LM 的特定所需行为。DEMONSTRATE 转换接受类型为 Example 的输入 x并为 x.demos 准备一个演示列表通常通过从 x.train 中的训练示例中选择子集并引导新的字段来实现。 引导演示 训练集中的示例通常包含任务的输入文本和目标输出。DEMONSTRATE 阶段可以通过编程方式引导注释来增强训练示例。在我们的“多跳”示例中演示展示了三个基于 LM 的转换 i如何分解输入问题以收集回答它的信息即第一跳检索 ii如何使用之前“跳”中收集的信息来提出后续问题 iii如何使用收集到的信息来回答复杂问题。 类似于一个专业的地图annotate 原始函数接受一个用户定义的转换函数 fn 并将其应用于一个训练示例列表。每当 fn 返回一个示例而不是 None时annotate 会缓存中间预测即生成的查询和检索到的段落。这些预测作为管道转换的成功演示。在简单使用中fn 可能尝试一次或多次回答示例的“零样本”问题。这通常是通过调用程序的 SEARCH 和 PREDICT 阶段来实现的。当产生一个答案时如果 fn 认为它是正确的它会返回一个填充好的示例其中包含中间预测。 案例学习 下面的代码片段定义了multihop_demo函数(在multihop_program的第3行中调用)并演示了annotate的用法。 在第 10 行multihop_demonstrate 调用了 annotate它通过缓存 attempt_example 的注释来引导训练示例中缺失的字段。转换 attempt_example 接收一个训练示例 d 并尝试以零样本的方式回答它它创建了一个 d 的副本其中没有演示第 4 行即零样本并调用多跳搜索和预测管道第 5 和 6 行。每个转换都会返回一个带有额外字段填充的 d 的更新版本。如果管道回答正确第 7 行则返回更新后的 d。 图 2 展示了这种行为。DEMONSTRATE 转换一个训练问题-答案对到一个完全填充的演示中包括 hop1 和 hop2即多跳搜索的查询以及 psg1 和 psg2 字段。当 LM 后来被调用以执行某个转换例如在 SEARCH 阶段生成一个“第二次跳转”查询时psg1 字段作为上下文而 hop2 字段则作为这个特定训练示例的标签。 讨论 这个简单的案例研究展示了 DSP 抽象中组合的力量。因为管道是一个定义良好的程序其中转换通过附加在示例上的文本进行通信一个简单的映射和过滤策略可以利用 LM 和 RM 从最终任务的标签来引导注释整个管道。这是一个可扩展的策略但即使在它的最简单形式中它也推广了 Zelikman 等人2022 年、Wei 等人2022 年、Zhang 等人2022 年和 Huang 等人2022 年最近探索的方法在这些方法中LM 为单个提示自我生成思维链的理性。 通过引导管道DEMONSTRATE 使得在 SEARCH 和 PREDICT 中探索复杂策略变得容易而不必为每个转换编写示例。这包括在传统检索增强 NLP 中难以探索的策略因为需要自定义注释。例如Khattab 等人2021a介绍了一个用于多跳推理的管道它使用弱监督进行训练扩展了 Lee 等人2019 年和 Khattab 等人2021b的工作。在其中需要检索的目标 3 或 4 个段落必须被标记但系统自动发现最佳的“跳转”顺序。 相比之下DSP 允许我们构建复杂管道而无需中间步骤的标签因为我们能够将小转换组合成程序。如果 LM 和 RM 能够“零样本”即无需演示准确处理这些转换至少在一个或两个示例上这些示例可以使用最终任务的标签发现并用作演示。 用我们之前与 PyTorch 等深度神经网络框架的类比来说DEMONSTRATE 旨在以可扩展的方式替换反向传播的功能通过模拟程序的行为对应于“前向”传递并从错误中程序化学习。这样做时DEMONSTRATE 在冻结模型和仅使用最终任务标签的情况下引入了高度的模块性。特别是无需手动标注中间转换开发者可以更换训练领域、更新训练示例或修改程序的策略并使用 annotate 来自动填充演示的所有中间字段。 选择演示 示例并非总是可以将所有训练示例放入 LM 的上下文窗口中。DSP 提供三个用于选择训练示例子集的原语即 sample、knn 和 crossval。 作为基线选择可以使用 sample 原始函数随机从 train 中抽取 k 个演示示例这是 Brown 等人2020 年以及后续许多工作的做法。我们还可以利用 RM 的表示从训练集中选择与输入文本最接近的 k 个最近邻这是 Liu 等人2021 年探索的策略。另一种策略是对多个抽样示例集应用交叉验证以选择表现最佳的示例集Perez 等人2021 年。例如给定 jtrainj 100 个训练示例crossval 会选择 n 个包含 k 5 个示例的子集并返回与剩余 95 个示例上转换evaluate 表现最佳的子集。 组合与扩展 通过操纵演示和更高阶的转换这些简单的选择和引导原始函数可以组合成更大的新策略。如果训练集非常大例如jtrainj 100; 000我们可以使用 knn 找到最接近的 k 16 个示例并只对这些示例进行注释从而实现一个实时增量学习的系统。如果训练集适中例如jtrainj 1000我们可以进行交叉验证并在每个训练示例上缓存它评估的所有提示的性能。在测试时我们可以使用 knn 找到与测试输入最相似的 k 50 个示例并选择在这些 k 个示例上表现最佳的提示产生一个适应性系统该系统根据其管道在不同类型示例上的质量进行调整。
2.4 搜索 SEARCH 阶段收集段落来支持由 LM 执行的转换。我们假设有一个大型知识语料库——例如网页、维基百科或 arXiv 的片段——被划分为文本段落。向 LM 提供段落有助于提供事实性响应允许在不重新训练的情况下更新知识库并提出了一个透明度契约当有疑问时用户可以检查系统是否忠实地使用了一个可靠来源来做出预测。 在最简单的场景中SEARCH 可以直接查询 RM请求与输入问题匹配的前 k 个段落来自预定义的索引。这种 SEARCH 的基本实现模拟了大多数开放域问答系统中检索的实现它们实现了一个“检索-然后-阅读”的流水线如 Lee 等人2019 年、Khattab 等人2021b 年、Lazaridou 等人2022 年以及许多其他人。 SEARCH 策略 在许多场景中任务的复杂性要求更复杂的 SEARCH 策略以使检索模型RM能够找到相关的段落。我们正在运行的示例图 2就是这样一个场景我们怀疑示例很可能需要特定的多跳推理。其他设置例如提出对话挑战在这种情况下用户表达的信息需求只能通过考虑对话中的前几轮来解决或者需要更广泛的规划Zhong 等人2022 年。 在检索增强 NLP 的文献中多跳搜索Xiong 等人2020 年Khattab 等人2021a 年和对话搜索Del Tredici 等人2021 年Raposo 等人2022 年流水线受到了广泛关注。这些系统通常需要经过许多手工标记的查询“重写”Anantha 等人2020 年、“分解”Geva 等人2021 年Min 等人2019 年或目标跳转Yang 等人2018 年Jiang 等人2020 年的微调。在 DEMONSTRATE 提供的自动注释的支持下SEARCH 阶段允许我们模拟许多这样的策略以及许多其他策略这些策略涉及到在 RM 和 LM 之间传递查询、段落和演示。更重要的是SEARCH 促进了我们对于高级策略的愿景即 LM 和 RM 合作逐步规划研究路径其中 RM 收集信息而 LM 确定下一步。 案例研究 让我们在我们的多跳示例基础上进行更深入的研究。我们可以定义 multihop_search_v2在我们的核心程序中的第 4 行这是图 2 中 SEARCH 转换的一个略微更高级的版本。这个转换模拟了像 IRRRQi 等人2020 年这样的微调检索增强系统的迭代检索组件后者在每次跳转时阅读检索到的段落并生成一个搜索查询或一个停止跳转的条件以及像 BaleenKhattab 等人2021a 年这样的系统后者在每次跳转时总结许多段落的信息以包括在后续跳转中。 在 multihop_search_v2 中第 7 行调用了 generate 原始函数该函数调用了 LM 生成每个检索跳转的查询。LM 基于一个使用 hop_template 模板准备的提示进行条件化。我们将在第 2.5 节讨论提示模板和 generate 原始函数。在这里这个模板可能被设计为生成一个具有以下格式的提示例如对于第二次跳转。 如图所示LM 被指示阅读早期跳转中检索到的上下文和一个复杂的问题。然后它被提示编写i提供的上下文的摘要ii一个搜索查询用于收集回答那个问题的信息。生成的文本将被提取并分配给 multihop_search_v2 中的 summary 和 query 变量第 7 行。在第 10 行如果查询是“N/A”则终止跳转。否则在第 12 行使用查询检索 k 5 个段落并在第 13 行将后续跳转或 PREDICT的上下文分配给变量该变量包括所有先前跳转的摘要以及到目前为止检索到的最终跳转中的段落。 与自问技术的比较 这可能很有启发性我们将这种多跳 DSP 程序与最近的“自问”Press 等人2022 年提示技术进行对比这在第 3 节中进行了比较。自问可以被看作是 DSP 的 SEARCH 阶段的简单实例。在其中LM 提出一个或多个“后续问题”这些问题被拦截并发送到搜索引擎。搜索引擎的答案被连接到提示中并用于回答问题。这本质上是对 IRRRQi 等人2020 年的简化模拟。 作为一般框架DSP 可以表达自问等想法以及我们在本节中讨论的许多其他更复杂的管道。更重要的是DSP 提供了一系列固有优势这些优势导致显著的实证收益比自问高出 80%–290%。例如DSP 程序具有深刻的模块性这意味着 DSP 程序将注释并构建自己的演示。因此它们可以在不标注任何中间转换例如生成的查询的情况下开发。此外DSP 构建的 LM 提示会自动更新以与提供的训练数据和检索语料库保持一致。相比之下像自问这样的方法依赖于手工编写且硬编码示例的提示。 此外DSP 将控制流分配给一个显式的程序并促进了调用 LM或 RM进行小转换的设计模式。这使我们能够构建专门用于生成一个或多个检索查询、每个跳转总结多个段落和回答问题的步骤。这些步骤比自问提示的步骤更简单但我们的多跳 DSP 程序故意组合它们来构建更丰富的管道因此更加可靠。相比之下自问将控制流委派给 LM 完成在提示本身内保持状态并拦截后续问题以执行搜索。我们发现这种范式导致了“自我分散”问题第 3.5 节而 DSP 程序可以避免。 融合检索结果 为了提高召回率和健壮性我们还可以融合多个生成查询的检索结果。融合在信息检索领域有悠久的历史Fox Shaw, 1994; Xue Croft, 2013; Kurland Culpepper, 2018并且最近 Gao 等人2022 年探索了使用多个查询按顺序处理以追溯归因于 LM 生成的文本。受这些工作的启发我们在 DSP 中包含了一个 fused_retrieval 原始函数以提供一个与冻结检索器交互的通用机制。它接受一个可选的融合函数该函数将多个检索列表映射为一个。默认情况下DSP 使用 CombSUMFox Shaw, 1994的一个变体为每个段落分配其在检索列表中的概率之和。 为了说明这一点下面的修改为转换multihop_search_v2生成n 10个查询。 组合与扩展 为了说明一个简单的组合我们可以通过将一个查询重写步骤与多跳转换结合起来为聊天机器人装备进行对话多跳搜索的能力如下所示。 类似的方法也可以用于纠正拼写错误或实现伪相关反馈Cao 等人2008 年Wang 等人2022a 年其中检索到的段落用于告知一个更好的搜索查询尽管据我们所知这还没有尝试过与预训练的 LM 结合使用。
2.5 预测 PREDICT 阶段使用演示例如在 x.demos和段落例如在 x.context来生成系统输出。PREDICT 挑战可靠地解决下游任务这整合了上下文学习领域的许多工作。在 DSP 中它还具有更专业的功能即系统地汇总大量演示、段落和候选预测的信息。 生成候选项 通常PREDICT 需要为最终任务生成一个或多个候选预测。为此PREDICT 的基本原始函数是 generate它接受一个模板和一个示例并通过封装currying查询 LM 以产生一个或多个完成项如第 2.4 节中之前所探索的。与此阶段使用 RM 相对应的原始函数是 rank它接受一个查询和多个段落并返回它们的关联性评分。 模板是一个可以产生提示的对象也就是说将一个示例映射到一个字符串并从补全中提取字段。例如我们可以将包含问题和检索段落的示例x映射到以下提示符: 如上图所示LM将被要求生成思想链原理(CoT;Wei et al . 2022;小岛等人2022)和答案生成的文本将被提取回每个完成的基本原理和答案键。 对LM的每次调用都可以对多个候选预测进行采样。选择“最佳”预测是解码工作的主题(Wiher等人2022;Li et al, 2022)但冻结的通用LM可能不支持自定义解码修改。在这些限制条件下我们提出了几种高级策略用于通过LM和RM在DSP中选择预测和聚合信息。 在多个候选项中我们可以简单地提取最受欢迎的预测。当使用 CoT 到达答案时这就是 Wang 等人2022c的自一致性方法它寻求识别多个不同的推理到达的预测。 DSP 在两个方面推广了这一点。首先我们可以在整个程序中采样多个“转换管道”PoT而不是在一个转换中本地使用“思维链”CoT。这些链甚至可以调用程序中的不同路径如下所示。 在上面的代码片段中第 10 行调用了 branch 原始函数该函数以高温度例如t 0:7采样 n 个不同的 PoT并积累它们的中间和最终预测。在这个例子中我们的管道调用了 multihop_search_v2第 2.4 节它根据生成的问题应用一个可变的检索跳数然后再进行 PREDICT。也就是说PoT_program 可能会在分支中调用程序中的多个不同路径即每个路径具有不同的多跳查询和跳数。然后它选择多数答案。 DSP 以另一种方式推广了自一致性。当我们采样我们的 CoTs 或 PoTs 提供多个候选项时我们可以选择前 k 个例如前 4 个预测然后直接比较它们。例如我们可以提示 LM 比较这些选择作为多项选择题MCQ的候选项这是一个 DEMONSTRATE 可以自动准备的转换。这实际上模拟了 Levine 等人2022 年的 LM 递归尽管与他们的方法不同它不需要大量训练数据或更新任何提示调优权重。一个这样的实现可以在下面的 openqa_predict 中看到。 作为另一种比较方法我们可以通过 rank 调用 RM 来找到最基于检索上下文的预测即与检索到的段落的串联最相似或者如果 RM 能够为完成项评分Krishna 等人2022 年那么可以直接选择给定提示下评分最高的预测。 汇总信息当只选择少数演示或段落时我们可以简单地将它们全部连接到提示中。例如GPT-3.5 text-davinci-002 有一个 4097 个令牌的上下文窗口我们发现这个窗口对于容纳几个例如3-5 个演示来说相当大每个演示都包含自己的段落和推理。 处理更多演示或段落时我们可以并行分支来处理单个子集的段落或演示然后使用前面介绍的评分方法之一汇总单个答案。事实上Lewis 等人2020 年和 Lazaridou 等人2022 年探索了边缘化作为跨段落组合得分的方法Le 等人2022 年则将提示跨演示进行集成这可以用这种方式表达。 另一种汇总策略是依次在段落之间累积信息而不是独立地。这就是我们的多跳方法第 2.4 节实际工作的方式。这种策略也被 Gao 等人2022 年最近用于追溯归因于 LM 生成的文本到引证。他们生成许多查询但不是融合第 2.4 节而是对每个查询运行其管道并使用其输出来修改后续查询的输入。
3 评估 我们现在考虑如何为三个不同的知识密集型 NLP 任务实现 DSP 程序开放域问答QA、多跳问答和对话问答。所有这些任务都是“开放域”的这意味着系统被给予一个简短的问题或参与多轮对话而没有被授予访问回答这些问题的上下文。 我们为每个任务构建并评估了在第 2 节中探索的函数的直观组合。我们展示出尽管开发努力较低但生成的 DSP 程序展现出强大的质量并且在上下文学习中超过了基线和带有上下文学习的标准检索-阅读流水线。
3.1 评估方法 在本报告中我们为每个考虑的任务考虑了一个开发数据集即开放域版本的 SQuADRajpurkar 等人2016 年Lee 等人2019 年、多跳 HotPotQAYang 等人2018 年数据集在开放域“fullwiki”设置中以及用于开发 DSP 抽象的对话问答 QReCCAnantha 等人2020 年Vakulenko 等人2022 年数据集。我们在所有三个数据集上报告验证集的准确率并在第 3.5 节中详细讨论。 除非另有说明系统可以访问 16-shot 训练示例即每个 DSP 程序可以使用最多16 个问题——或者对话如果适用——从各自的训练集中随机抽取。我们将验证集和测试集下采样到 1000 个问题或者在适用的情况下 400 个对话并在五个种子中报告平均质量每个种子固定一个单一的 k-shot 训练集示例。为了控制语言模型 API 的支出预算每个种子处理评估示例的五分之一例如每个种子 200 个问题总共 1000 个唯一问题。 我们还预留了测试数据集例如OpenNaturalQuestionsKwiatkowski 等人2019 年和测试任务例如FEVER 中的主张验证Thorne 等人2018 年我们只用这些数据集和任务来评估预定义的 DSP 程序而不是用于开发。我们将在报告的下一个版本中包括这些结果。
3.2 预训练模块 RM 我们使用 ColBERTv2Santhanam 等人2022b这是一个基于晚期交互的先进检索器Khattab Zaharia2020 年。我们选择 ColBERTv2 是因为它的零样本搜索质量和高效的搜索Santhanam 等人2022a。然而我们的 DSP 程序对于检索器如何表示示例或评分段落是无关紧要的所以基本上可以使用任何检索器。 此外通过将检索作为一个一等构造DSP 允许我们随着时间的推移改变或更新搜索索引。我们在实验中通过将每个数据集与 Chen 等人2017 年的 2016 年 12 月维基百科数据、Yang 等人2018 年的 2017 年 11 月维基百科“摘要”数据以及 Karpukhin 等人2020 年的 2018 年 12 月维基百科数据进行对齐来模拟这一点。 LM 我们使用 GPT-3.5text-davinci-002Brown 等人2020 年Ouyang 等人2022 年语言模型。除非另有说明我们在生成 n 1 的预测时使用贪婪解码。当 n 1 时我们使用温度 t 0:7 进行采样就像相关工作Wang 等人2022c 年一样。
3.3 基线 基线 LM 这些基线代表了 Brown 等人2020 年使用的少量示例上下文学习范式。开放域 QA 和多跳 QA 的基线从训练集中随机采样 16 个演示即每个程序在评估中可用的所有示例并不对这些演示进行增强。同样对话 QA 的基线也采样了四个对话。基线 LM 不会搜索与输入查询相关的段落。 检索-阅读 “检索-阅读”基线使用 RM 在提交提示给 LM 之前为每个示例提供可能相关的段落支持。这模仿了用于最新开放域问答系统的流水线Khattab 等人2021bIzacard Grave2020Hofstätter 等人2022。在对话 QA 中我们将第一轮和最终问题连接起来我们发现这种方法比简单地使用最终问题要好得多。对于多跳 QA我们为每个问题检索并连接两个段落。 自问 我们也与自问Press 等人2022 年进行了比较这是一种同时期的流水线可以被视为 DSP 的 SEARCH 阶段的特定实例后面跟着一个简单的 PREDICT 步骤。为了与我们的方法直接比较我们修改了自问的控制流使其查询我们 DSP 实验中使用的相同 ColBERTv2 索引而不是 Google 搜索。我们评估了两种自问配置。第一种使用原始自问提示模板其中包含四个手工写的演示。在第二种配置中我们修改了提示模板应用了我们发现对 HotPotQA 有用的几个变化。
3.4 提出的 DSP 程序 我们基于第 2 节中提出的转换。我们为所有三个任务构建的程序具有以下结构以开放域 QA 为例进行说明。 例外的是对话 QA 程序 convqa_program 接受轮次即一系列字符串代表对话历史而不是单个问题。除非另有说明我们的程序在 DEMONSTRATE 阶段默认使用贪婪解码。 对于 SEARCH我们的开放域 QA 程序直接使用问题来检索 k 7 个段落并将这些段落与 CoT 连接到我们的 QA 提示中。对于 PREDICT它生成 n 20 个推理链并使用自一致性SCWang 等人2022c来选择其最终预测。对于 DEMONSTRATE我们的开放域 QA 程序使用以下方法为了演示而略有简化。在这个方法中向 annotate 请求传递的参数 k 3只注释三个演示这些演示将然后用于提示中。 我们的多跳程序在 DEMONSTRATE 和 PREDICT 方面采用了非常相似的方法。对于 SEARCH它使用了第 2.4 节中描述的方法并进行以下调整。它使用跨 n 10 个查询每跳的结果融合并在 n 个预测中使用对应于最大平均对数概率的摘要。对于 HotPotQA它使用固定的跳数即两跳。在每个提示即每个跳和 QA中它将所有前跳即从 hop 1 开始的摘要连接起来并总共使用 k 5 个段落这些段落分布在跳之间即从第一个跳使用五个段落或从第一个跳使用两个段落从第二个跳使用三个段落。 对于对话 QA我们使用一个简单的 PREDICT它使用贪婪解码生成一个响应该响应取决于所有先前对话的轮次和五个检索到的段落。对于 SEARCH我们的对话 QA 流水线生成 n 10 个重写的查询并也使用简单的查询作为检索和阅读基线第 3.3 节并将它们融合就像在第 2.4 节中描述的那样。我们实现 DEMONSTRATE 与 openqa_demonstrate 类似但只采样四个示例即四个对话轮次而不是开放域 QA 中的 16 个问题来演示任务以用于更高阶的转换 convqa_attempt该转换传递给 annotate由于简洁未在此处展示。 3.5 开发的数据集和结果 Open-SQuAD 我们在 Chen 等人2017 年处理的维基百科 2016 语料库上进行开放域版本的 SQuAD如 Khattab 等人2021b 年所处理。我们使用与 Karpukhin 等人2020 年和 Khattab 等人2021b 年相同的训练/验证/测试划分。 表 1 报告了答案的 EM 和 F1。任务感知的 DSP 程序实现了 36.6% 的 EM比基线 LM 提高了 126% 的 EM 相对收益。这表明将 LM 的预测建立在检索上非常重要并且表明像 ColBERTv2 这样的最新检索器具有实现这一目标的能力。提出的 DSP 程序在 EM 中相对收益提高了 8%在 F1 中相对收益提高了 6%超过了检索-然后-阅读流水线这突出了通过我们使用自一致性方式聚合多个检索到的段落信息可以获得非平凡的收益。 表 1. 开发结果比较包括一个任务感知的 DSP 程序与基线 LM、检索-然后-阅读 LM 以及近期和同时代的上下文学习方法带检索和不带检索。我们所有的运行都使用了 GPT-3.5检索基础的行使用了 ColBERTv2。标记为 { } 的结果收集自截至 2022 年 12 月中旬的相关工作并在正文中归因于各自的来源。正如我们在正文中所讨论的标记的结果通常不是直接的比较因为它们跨越了各种评估设置。尽管如此我们在这里报告它们作为定性参考点。 这些上下文学习结果与许多流行的微调系统相竞争。例如在 Open-SQuAD 测试集上DPR 实现了 29.8% 的 EM远低于我们的 16-shot DSP 程序。在 Open-SQuAD 开发集上当调用五个检索到的段落时强大的 Fusion-in-DecoderIzacard Grave2020“基础”方法实现了大约 36%即与我们的系统质量非常相似。尽管如此他们的系统在默认设置下阅读 100 个段落时在这个评估中达到了 48% 的 EM。这可能表明如果 PREDICT 阶段被调整为聚合更多信息我们的 DSP 程序也可能实现类似的收益。 为了比较我们还评估了自问流水线其实现了 9.3% 的 EM这表明其固定的流水线在其默认的多跳设置之外是无效的。研究其几个错误示例揭示了它经常以不相关的方式分解问题并回答这些问题。我们将 LM 的这种行为称为“自我分散”并认为这增加了对我们 DSP 中设计决策的支持。为了说明自我分散当自问被提示“The Kidnapping of Edgardo Mortara 何时发生”时它问道“The Kidnapping of Edgardo Mortara 是什么”然后问它何时出版这是一个不相关的问题。因此自问回答“1997”而不是 The Kidnapping of Edgardo Mortara 发生的时间1858。 作为参考表 1 还报告了 Si 等人2022 年使用 code-davinci-002 的同时上下文学习结果No-retrieval LM SoTA他们在不检索的情况下实现了 20.2% 的 EM在检索的情况下实现了 34.0% 的 EM尽管是在 SQuAD 数据的另一个样本和划分上。总体而言他们的方法与我们实现的基线基线 LM 和检索-然后-阅读非常相似尽管他们的检索增强方法检索并将 10 个段落拼接到提示中了维基百科的数据。 HotPotQA 我们使用 HotPotQA 的开放域“fullwiki”设置使用其官方的 2017 年“摘要”语料库。HotPotQA 测试集是隐藏的所以我们保留官方的验证集用于我们的测试。我们将训练集划分为 90%/10% 的训练/验证划分。在训练以及因此的验证划分中我们只保留原始数据集中标记为“hard”的示例这与官方验证和测试集的指定相匹配。 我们在表 1 中报告了最终答案的 EM 和 F1。在 HotPotQA 上任务感知的 DSP 程序在所有基线和现有工作中表现最佳EM 分别比基线 LM、检索-然后-阅读基线和自问流水线高出 82%、39% 和 80%。这突出了构建更复杂的程序以协调 LM 和 RM 的 SEARCH 步骤的有效性。 这些结果可以与同期论文中对 HotPotQA 的评估进行比较。我们首先与非检索方法进行比较尽管我们的比较必须保持谨慎因为评估方法存在差异。Si 等人2022 年使用 CoT 提示实现了 25.2% 的 EM。使用 PaLM-62B 的“背诵-然后-回答”技术Sun 等人2022 年实现了26.5% 的 EM。当为 PaLM-540B 应用自一致性提示时Wang 等人2022b 年实现了 33.8% 的 EM 和 44.6 F1。接下来我们与同时代的基于检索的方法进行比较Yao 等人2022 年使用能够使用 Wikipedia API 进行搜索的系统实现了 35.1% 的 EM。所有这些方法都远远落后于我们的任务感知的 DSP 程序该程序实现了 51.4% 的 EM。 QReCC 我们在 Wikipedia 2018 的开放域设置中使用 QReCCAnantha 等人2020 年。QReCC 没有官方的开发集所以我们从训练集中划分为 90%/10% 的训练/验证划分。对于每个对话中的第一个问题我们使用重写的查询作为原始查询因为原始查询通常假设访问了真实文档。我们还从 QReCC 中过滤低质量的示例。 我们以自回归方式进行 QReCC 对话。对于特定对话的第 t 1 轮系统看到它对之前对话轮次的响应即不是真实响应。我们报告新颖-F1 指标nF1Paranjape 等人2022 年该指标计算系统响应与真实响应之间的 F1 重叠同时折扣常见停用词和问题或之前的问题中出现的术语。结果在表 1 中显示并遵循与 SQuAD 和 HotPotQA 相同的一般模式。
4 结论 长期以来AI 中构建模型的主导范式一直围绕着张量表示的乘积在深度学习时代这导致了高度模块化逐层的设计这使得快速开发和广泛探索成为可能。然而这些设计范式需要广泛的领域专业知识即使是专家在将不同的预训练组件组合成更大的系统时也面临重大挑战。上下文学习的承诺是我们可以仅使用自然语言作为向系统提供指令的媒介来构建复杂的系统并且正如我们所论证的允许组件之间相互通信。在这种新范式中构建块是预训练模型核心操作是自然语言指令和操作自然语言文本。如果我们能够实现这一潜力那么我们就可以扩大参与 AI 系统开发的人数快速为新的领域原型系统并最大化专业预训练组件的价值。 在本论文中我们介绍了用于检索增强式上下文学习的 DEMONSTRATE–SEARCH–PREDICT (DSP) 框架。DSP 包含了一系列简单、可组合的函数用于实现上下文学习系统作为深思熟虑的程序——而不是端任务提示——以解决知识密集型任务。我们以 Python 库的形式实现了 DSP 并使用它来编写 Open-SQuAD、HotPotQA 和 QReCC 的程序。这些程序相对于以前的上下文学习方法取得了显著的进步。然而超越任何特定的性能数字我们主张 DSP 的核心贡献在于帮助揭示上下文学习在一般概念上的广阔可能性空间。