增强语言模型[Mialon et al. (2023) ] 对增强语言模型进行的一项调查。涵盖了多类增强推理技能和使用外部工具能力的语言模型。推荐读者可以读一下。检索通常,我们需要在模型预训练时间截止或内部 / 私有知识库之后,完成需要最新知识的任务。在这种情况下,如果不在 prompt 中显式提供上下文,模型将不知道上下文。开放领域问答的许多方法都依赖于首先在知识库上进行检索,然后将检索到的内容作为 prompt 的一部分。这个过程的准确性取决于检索和生成步骤的质量。[Lazaridou et al. (2022) ] 研究了如何使用谷歌搜索进行文档检索以增强 LLM。给定一个问题 q,从谷歌返回的 20 个 URL 中提取文本,得到一组文档。由于这些文档很长,因此每个文档被拆分为 6 个句子的段落,{p}。段落是根据证据段落和查询之间基于 TF-IDF 的余弦相似性进行排序的。在 prompt 中只使用最相关的段落来产生答案 a.对于闭卷问答,每个演示的格式如下,以构建 few-shot prompt。发现将问题与证据交换(问题和答案之间的距离更长)在所有数据集中始终产生较低的结果。
Evidence: ...Question: ...Answer: ...
根据他们在生成和分类任务的实验,在三个答案的重新排序得分中,PoE > 噪声信道推断 > RAG。在所有概率中,pLM (a|q,pi) 和 pLM (q|pi,a) 提供的信息最多。pLM (q|pi,a) 捕捉到 LM 在给定证据段落和答案的情况下对问题的解释有多好,并且可以可靠地用于对候选答案进行重新排序。针对基于不同日期的问题的 SituatedQA 数据集进行的一项观察是,尽管 LM(预训练截止日期为 2020 年)可以通过 Google 搜索访问最新信息,但其在 2020 年后问题上的表现仍然比 2020 年前问题差很多。这表明上下文信息和模型内部知识之间存在一些差异或参数冲突。 有趣的是,即使只有 “内部检索” 也是有益的,即在回答问题之前生成关于某个主题的知识 [Liu et al. 2022]。首先可以使用下面的模板来抽取知识:
Generate some knowledge about the input. Examples: Input: What type of water formation is formed by clouds?Knowledge: Clouds are made of water vapor. Input: {question}Knowledge:
然后用模型生成的知识,进一步给 LM 进行 prompt 得到答案。编程语言既有 PAL(程序辅助语言模型) [ Gao et al. 2022] 和 PoT (Program of Thoughts prompting [Chen et al. 2022] 要求 LLM 生成编程语言语句来解决自然语言推理问题,从而将解决方案步骤转移到运行时,如 Python 解释器。这样的设置解耦了复杂的计算和推理。该方法依赖于具有足够好的编程技能的 LM。图 2. 比较 CoT 和 PoT.(图片源自: Chen et al. 2022)。外部 APITALM(Tool Augmented Language Models [ Parisi et al. 2022])是一种通过文本到文本 API 调用增强的语言模型。LM 被引导生成以任务输入文本为条件的工具调用和工具输入文本,以构建 API 调用请求。当 result 出现时,调用指定的工具 API,并将返回的结果附加到文本序列。最终输出是在 output token 之后生成的。
图 3. TALM 中调用 API 的格式 (图片源自: Parisi et al. 2022)。TALM 采用 self-play 的方法来迭代引导工具使用示例的数据集,并用它来微调 LM。这个迭代的 self-play 模仿了一个 RL 过程,其中 LM 是策略网络,它由带有二元奖励信号的策略梯度训练。
图 4. Self-play 迭代提升模型的性能 (图片源自: Parisi et al. 2022)。Toolformer [Schick et al.
2023] 是一种可以通过简单的 API 使用外部工具的 LM,通过自我监督的方式构建,每个 API 只需要少量的演示。Toolformer 的工具箱包括:
- 计算系统:帮助 LM 缺乏精确的数学技能;
- 问答系统:帮助解决无效内容;
- 搜索引擎:在预训练截止时间后提供最新信息;
- 翻译系统:提高低资源语言性能;
- 日历系统:使 LM 了解时间进程。
图 5. 如何构建 Toolformer.(图片源自: Schick et al. 2023)。Toolformer 的训练过程如下:1.Prompt 注释下的 API 调用。要求预训练的 LM 通过带有 API 调用使用示例的 few-shot 学习来注释数据集。格式化示例:
图 6. 数据集如何在调用 API 的时候注释 (图片源自: Schick et al. 2023)。每个 API 调用都表示为一个元组(API 名称,相应的输入),其对应的结果记为 r。有结果和无结果的 API 调用序列分别标注如下:
基于概率 的 API 调用,如果概率大于某个阈值,则选择前 k 个候选在位置 i 进行 API 调用;然后,从 LM 中采样潜在的 API 调用,其中序列 [prompt (x),x1,…,xi−1,⟨API⟩] 作为前缀,⟨/API⟩ 作为后缀。2. 根据 API 调用是否有助于模型预测未来 token 来过滤注释。使用自监督损失来确定哪些 API 调用产生实际的帮助。执行每个 API 调用 c_i 得到对应的结果 r_i; 计算 LM 在 token 序列 xi,...,xn 上的加权交叉熵损失,当模型以 prompt 为前缀时。计算了两个版本,一个带有 API 结果,另一个带有空序列 ε;
仅保留大于阈值的 API 调用,这表示添加此 API 调用及其结果有助于模型预测未来的 token。3. 在注释数据集上微调 LM。新的训练序列构造为训练数据是原始数据集(例如论文中的 CCNet 子集)及其增强版。在推理时,解码会一直运行,直到模型产生 “→”token,表明它期待接下来来自 API 调用的响应。Toolformer 目前不支持在链中使用工具(即使用一个工具的输出作为另一个工具的输入)或以交互方式(即在人工选择后采用 API 响应)。两者都是未来扩展模型的方向。原文链接:https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/