三种prompt方法
zero-shot零样本
传统机器学习中,利用训练集数据训练模型,使得模型能够对测试集的对象进行分类,但是训练集类别和测试集类别之间没有交集;期间需要借助类别的描述,来建立训练集和测试集之间的联系,从而使得模型有效。希望我们的模型能够对其从没见过的类别进行分类,让机器具有推理能力,实现真正的智能。其中零次(Zero-shot)是指对于要分类的类别对象,一次也不学习。
在上下文学习的推理中,不允许提供样本,只给出描述任务的自然语言指令。该方法提供了最大的方便性、稳健性以及避免虚假相关的可能性,但也是最具挑战性的设置。在某些情况下,即使是人类,在没有例子的情况下,也可能难以理解任务的格式。但是在某些情况下,是最接近人类执行任务的方法,人类可能仅凭文本指令就知道该做什么。
few-shot
传统机器学习中,训练集不同类别的样本只有少量,给模型待预测类别的少量样本,然后让模型通过查看该类别的其他样本来预测该类别。
在上下文学习的推理中,模型在推理时给予少量样本,但不允许进行权重更新。对于一个典型数据集,Few-shot 有上下文和样例(例如英语句子和它的法语翻译)。Few-shot 的工作方式是提供 K 个样本,然后期望模型生成对应的结果。通常将 K 设置在 10 到 100 的范围内,因为这是可以适应模型上下文窗口的示例数量。
Few-shot 的主要优点是大幅度降低了对特定任务数据的需求,并减少了从微调数据集中学习过度狭窄分布。主要缺点是该方法的结果迄今为止远不如最先进的微调模型。此外,仍需要一小部分特定任务的数据。
one-shot
传统机器学习中,如果训练集中,不同类别的样本只有一个,则成为One-shot learning,属于few-shot的特殊情况。
在上下文学习的推理中,与few-shot类似,只允许一个样本(除了任务的自然语言描述外),是最接近某些任务与人类沟通的方式,如果没有示例,有时很难传达任务的内容或格式。
CoT原理
Chain-of-Thought(CoT)是一种改进的Prompt技术,来提升大模型LLMs在复杂推理任务上的表现。主要基于两个思想:算术推理技术可以从生成最终答案的自然语言解释中受益;大型语言模型通过提示提供了在上下文中进行少样本学习的激动人心前景。但这两种思想,创建大量高质量理由的成本很高,使用的传统少样本提示方法,在需要推理能力的任务上表现不佳,并且通常随着语言模型规模的增加而没有明显改进。
CoT通过要求模型在输出最终答案之前,显式输出中间逐步的推理步骤,来增强大模型的算数、常识和推理能力。思维链就是一系列中间的推理步骤,让大模型逐步参与将一个复杂问题分解为一步一步的子问题,并依次进行求解的过程,来提升大模型的性能。其输出的中间步骤,可以让使用者了解模型的思考过程,提高了大模型推理的可解释性。
传统的 Prompt采用从输入直接到输出的映射 <input——>output>,CoT 完成了从输入到思维链再到输出的映射,即 <input——>reasoning chain——>output>。
一个完整的包含 CoT 的 Prompt 由指令(Instruction),逻辑依据(Rationale),示例(Exemplars)三部分组成。指令用于提示大模型LLM 生成所需格式的答案,指导大模型在推理过程中逐步思考,通常是描述问题并且告知大模型的输出格式。逻辑依据指 CoT 的中间推理过程,可以包含问题的解决方案、中间推理步骤以及与问题相关的任何外部知识。示例则指以少样本的方式为大模型提供输入输出对的基本格式,每一个示例都包含:问题,推理过程与答案。示例以小样本提示方法中作为所需的输入-输出对呈现,每个方法都包含问题、基本原理和答案,用作输入-输出关系的上下文演示,通常在输入问题之前连接。
优点
- 常识推理能力赶超人类。采用思维链提示的大语言模型,在 Bench Hard(BBH) 评测基准的 23 个任务中,有 17 个任务的表现都优于人类基线。
- 数学逻辑推理大幅提升。一般来说,语言模型在算术推理任务上的表现不太好,而应用了思维链之后,大语言模型的逻辑推理能力突飞猛进。在测试语言模型解决数学问题能力的数据集MultiArith 和 GSM8K 上的表现提升巨大,甚至超过了有监督学习的最优表现。这意味着,大语言模型也可以解决那些需要精确的、分步骤计算的复杂数学问题了。
- 大语言模型更具可解释性,更加可信。超大规模的无监督深度学习是一个黑盒,推理决策链不可知,使得模型结果不够可信。而思维链将一个逻辑推理问题,分解成了多个步骤,来一步步进行,这样生成的结果就有着更加清晰的逻辑链路,提供了一定的可解释性。
现象
- 模型规模小会导致 CoT 失效->大模型需要具备一些方面的基础知识
- 简单的任务 CoT 不会对模型性能带来提升->CoT可以为理解到的基础知识之间搭建桥梁
- 训练数据内部彼此相互联结程度的增加可以提升 CoT 的性能->CoT可以使已知信息形成链条,不会中途跑偏
- 示例中的错误,或者无效的推理步骤不会导致 CoT 性能的下降->CoT的作用是强迫模型进行推理,而非教会模型如何完成推理,模型推理能力在预训练后已经具备,CoT只是指定输出格式,规范答案生成。
适用场景
使用大模型进行复杂的推理任务,且参数量的增加无法使得模型性能显著提升的情况下,使用CoT。
CoT 更加适合复杂的推理任务,比如计算或编程,不太适用于简单的单项选择、序列标记等任务之中,并且 CoT 并不适用于参数量较小的模型(20B以下),在小模型中使用 CoT 非常有可能会造成机器幻觉等等问题。
当大模型的训练数据有变量的局部簇结构(Local Clusters of Variables)时,CoT 将会展现极好的效果。变量的局部簇主要指训练数据中变量之间有着强的相互作用,相互影响的关系。
当给予大模型的示例之间彼此之间互相区分并不相同时,也有助于提升 CoT 的性能。同时,逻辑依据是否与问题相关,逻辑推理步骤的顺序也会显著影响 CoT 的性能。
发展方向
https://arxiv.org/pdf/2311.11797
https://zhuanlan.zhihu.com/p/668914454
CoT 的发展方向有三条主要的路径,分别是Prompt 模式(指令生成和示例生成)、推理结构(CoT 公式、推理聚合和 CoT 验证)以及应用场景(多语言、多模态和通用任务)。
Prompt模型
以是否包含示例为区分,可以将 CoT 分为 Zero-Shot-CoT 与 Few-Shot-CoT。Zero-Shot-CoT 不添加示例,仅在指令中添加“Let's think step by step”,就可以唤醒大模型的推理能力。 Few-Shot-Cot 则在示例中详细描述了“解题步骤”,让模型得到推理能力。
Prompt主要分为指令生成和示例生成两部分。指令生成侧重于找到提示的最佳指令,使模型能够进行逐步推理,而不是直接回答问题,旨在最大限度地提高模型的零样本能力。示例生成侧重于为 Few-Shot-CoT 寻找最佳的输入-输出演示示例对,用于提示模型和测试输入,使模型能够预测相应的输出。
zero-shot-CoT
参考论文:Large Language Models are Zero-Shot Reasoners
零样本思维链提示过程,引入了一种非常简单的零样本提示。
通过在问题的结尾附加“Let's think step by step”这几个词,大语言模型能够生成一个回答问题的思维链。从这个思维链中,他们能够提取更准确的答案。
通过这个 prompt 让LLM 尽可能生成一些思考过程,然后再将生成的 rationale(理由) 和 question 拼在一起,重新配合一个answer 指向的 prompt 如“The answer is ”来激励模型生成答案。完整的零样本思维链(Zero-shot-CoT)过程涉及两个单独的提示/补全结果。在下图中,左侧生成一个思维链,而右侧接收来自第一个提示(包括第一个提示本身)的输出,并从思维链中提取答案。这个第二个提示是一个自我增强的提示。
Plan-and-Solve Prompting模型
参考论文:Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models
先列计划再推理的Zero-shot-CoT,解决 ZeroShot-CoT 推理中的缺失步骤错误。制定一个计划,将任务划分为更小的子任务,并根据计划执行子任务。包括两个阶段。第一阶段,使用作者建议的提示模板“Let’s first understand the problem and devise a plan to solve the problem. Then, let’s carry out the plan and solve the problem step by step“,以生成推理过程和答案。第二阶段使用答案提示提取答案。
automatic prompt engineering
APE
论文地址:Larger Language models are human-level prompt engineers
核心流程:从训练集中生成候选prompt;评估这些候选prompt,选出得分最高的prompt;使用大模型生成语义相近的prompt(2中得分最高的prompt),然后再进行评估,最终得到prompt
生成候选prompt有三种:
1.forward mode。写一段指令,提供训练集的输入输出,直接让大模型自动生成prompt。
2.reverse mode。forward模型只能从左到右生成文本,要求指令必须在提示词末尾被预测。希望使得指令可以出现在文本的任意位置,提出reverse mode,利用有填充能力的大模型来推断缺失的指令。将待生成的prompt放到examples前面,让LLM用填空的方式写prompt。
3.Customized Prompts定制提示词说明,根据所使用的评分函数,可能存在比上述示例更合适的提示词。
评估候选prompt:使用执行准确率(execution accuracy)指标,直接验证模型的执行结果是否符合标准答案或预期逻辑,强调功能正确性,来评估指令质量。大多数情况下定义为0-1损失函数,答案一致取1,否则为0,某些情况考虑任务特异性不变性因素,可能采用对顺序不敏感的集合匹配损失函数。
Log probability:给定指令和问题后所得到的所需答案的对数概率
APO
论文地址:https://arxiv.org/abs/2305.03495
代码地址:LMOps/prompt_optimization at main · microsoft/LMOps · GitHub
整体思路图如下所示,在文本空间实现梯度下降过程:
方法:利用数值梯度下降自动优化提示,同时结合beam search和bandit selection procedure提高算法效率。
优势:无需调整超参数或模型训练,ProTeGi可以显著提高提示的性能,并具有可解释性。
第一步:得到当前prompt的“gradient”
给定一批当前prompt无法预测正确的error samples,让LLM给出当前prompt预测错误的原因,这一原因即文本形式的“gradient”。
生成gradient的prompt如下:
第二步:应用“gradient”,得到new prompt
1:使用LLM来编辑原来的prompt,目标是修复“gradient”。给到LLM的prompt如下:
I'm trying to write a zero - shot classifier.
My current prompt is:"
{prompt}"
But it gets the following examples wrong:
{error_str}
Based on these examples the problem with this prompt is that {gradient}
Based on the above information, I wrote{steps_per_gradient} different improved prompts. Each prompt is wrapped with <START> and <END>.
The {steps_per_gradient} new prompts are:
2:和APE一样进行resample,扩充相似语义的prompt。
第三步:挑选出好的prompt,进入下一轮迭代
这里面临的问题是在全量训练集上评估各个prompt花销太大。因此,作者试验了3种bandit selection技术:UCB、UCB-E和Successive Rejects。实验表明,UCB和UCB-E的效果比较好。
OPPO
论文地址:https://arxiv.org/abs/2309.03409
代码地址:GitHub - google-deepmind/opro: official code for "Large Language Models as Optimizers"
OPRO的核心思路是让LLM基于过往的迭代记录、优化目标,自己总结规律,逐步迭代prompt,整个过程在文本空间上完成,本质也是构建optimizer。整体框架:
使用meta-prompt,让LLM成为Optimizer LLM。meta-prompt包含两个核心部分:solution-score pairs,即以往的迭代路径,包括solution/prompt + 分数(任务表现),按照分数大小,从低到高排列top20的结果;task description,包含一些任务的examples、优化的目标等。GSM8K任务上的meta-prompt如下。
蓝色的是大模型打分得到的 prompt + score,橙色是指令 meta-instructions, 紫色是task description,包含一些任务的examples、优化的目标等
基于对过往迭代规律的理解,Optimizer LLM生成新的solution。即将meta-prompt给到Optimizer LLM,生成的内容即为新的solution。在实践中,为了提升优化的稳定性,这一步重复了8次。在Scorer LLM上应用prompt(即新的solution),评估效果并记录到meta-prompt中,然后继续下一轮迭代。注意,这里的Scorer LLM是实际使用prompt的LLM,与Optimizer LLM可以是不同的。当效果无法再提升、或者到达预先给定的step上限,整个迭代过程停止。返回得分最高的prompt作为优化结果。
Auto-CoT
论文地址:https://arxiv.org/pdf/2210.03493
范例生成也可以分为手动范例生成与自动范例生成,传统的 Few-Shot-CoT 就是一种典型的手动范例生成方法,在 Few-Shot-CoT 的基础上,ActivePrompt 方法让大模型使用手动生成的范例多次回答问题,再从其中依据如熵、方差等的不确定性度量选择“最不确定”的问题,通过手动注释来加强范例生成的,是一种介于手动范例生成与自动范例生成之间的范例生成方法。Auto-CoT 方法自动构建包含问题和推理链的说明样例信息,将范例生成完全自动化,分为两个阶段:;从每个聚类中心中选择一个代表性问题使用 Zero-Shot-CoT 生成思维链作为示例。
(1)问题聚类:对任务数据集进行聚类。将给定的数据集中的questions划分至几个簇中;首先使用Sentence-BERT方法计算每个question的向量表示,k-means方法将questions划分至k个簇中,对每个簇的questions根据距中心点距离进行升序排列。
(2)示例采样:从每个簇中选择一个代表性的question,并采用具有简单启发的Zero-Shot-CoT方法生成推理链。对任意簇i,选择满足筛选标注的question q[j]_i,组成prompted input [Q: q[j]_i. A: [P]],[P]="Let’s think step to step", 将该input输入给一个LLM,使用Zero-Shot-CoT生成推理链,其包含推理过程r[j]_i和抽取答案a[j]_i,将这些信息组合成簇i的说明信息d[j]_i,格式为[Q: q[j]_i, A: r[j]_i ◦ a[j]_i]。
选择标准为:question q[j]_i不超过60个tokens,并且推理过程r[j]_i不超过5个推理步骤。
示例过程:
推理结构
关注于 CoT 本身的结构问题,主要的研究思路包含 “CoT 构造”、“推理聚合”以及 “CoT 验证”。
CoT构造
CoT 构造主要将传统线形,链式的 CoT 转化为如表格、树状、图状格式,代表工作有PoT,Tab-CoT,ToT 以及 GoT-Rationale,下面这张图非展示了这四种方法的异同:
PoT,其中 P 指 Programm 即程序。PoT 的思想也非常简单,对思维链中大模型有可能出错的一些计算问题,让大模型生成出编程语言在解释器中运行,以将复杂计算与模型的文本生成解耦。
Tab-CoT,其中 Tab 指 Tabular 表格。研究者迫使大模型在每一步的推理中记录一个“∣步数∣子问题∣过程∣结果∣”的推理表格,并让大模型在推理时从生成的表格中提取答案,从而增强大模型的推理能力。
ToT,其中 T 指 Tree 即思维树。将 CoT 的链式结构扩展为树形结构,ToT 让大模型在解决子问题时生成多个不同的答案选择,通过此建立的树形结构让大模型可以展望未来确定下一步的决策并且通过追溯来纠正历史决策。
基于 ToT 的思想,将 Tree 拓展为 Graph,就形成了 GoT。GoT 系统的核心在于一个“控制器”,控制器处理对图的操作(GoO)以及图状态推理(GRS),其中 GoO 用于将一个给定的任务进行图分解,将一个任务分解为相互连接的节点-边关系,而 GRS 则负责维护大模型在 GoO 生成的图上的推理过程,记录当前步的状态,决策历史等等信息。
推理聚合
推理聚合的代表性工作是 Self-consistency CoT。Self-consistency CoT 使用手动设计的 Prompt 生成采样一组不同的推理路径,再通过“多数投票”找到推理步骤中“最一致”的路径,使用这条解码路径驱动原始的贪心解码方式来提示 CoT 性能。简单来说,即让 LLM 在解决复杂推理问题时,尝试多个推理路径,每个推理路径就是一次 CoT 的解决过程,每个可以得到一个答案,最终的答案就是其中出现次数最多的答案。
普通的 CoT 与使用了 self-consistency 解码策略的对比如下:
CoT验证
CoT 验证最开始侧重于通过多轮提问,让大模型进行“自我验证”,在前向后向的反复问答中让大模型可以验证自己的回答,目前也有工作开始引入“外部工具”对 CoT 中的信息进行验证,例如信息检索、计算器、计算机程序等等。最经典的是自我验证(Self-Verification),有两个步骤:(1)对多个候选的推理路径进行采样;(2)给定问题结论让大模型验证条件是否满足结论,并根据验证分数对候选结论进行排序。
引入外部工具的 CoT 验证的代表性工作譬如 CRITIC 框架,CRITIC 使得大模型可以交互式的引入外部工具来验证与修改自己的答案输出,经过大模型输出,外部工具验证,验证结果反馈,反馈修改四个循环的步骤加强 CoT 输出的可靠性。而将 CRITIC 的思想进一步推向机制,即出现了任务自适应与流程自动化的 AuRoRA,AuRoRA 从多个来源提取相关知识,将不同来源的知识进行组合、检查与提炼来修改初始 CoT,以提示 CoT 的准确性与逻辑性。
CRITIC
论文地址:https://arxiv.org/abs/2305.11738
代码地址:https://github.com/microsoft/ProphetNet/blob/master/CRITIC
1.IN-CONTEXT LEARNING FOR LLMS上下文学习
- 上下文学习:利用了LLMs的链式推理和少量示例上下文学习的能力,在测试时通过一组输入-输出示例来解决任务。
- 示例组合:少量示例被组合成一个提示,该提示将输入和输出对串联起来,形成连续的序列,以便模型生成输出。
2. INTERACTION WITH EXTERNAL TOOLS外部工具使用
- 工具交互:CRITIC将外部工具(如搜索引擎、代码解释器等)构建为文本到文本的函数,并将这些工具的使用与LLMs的生成过程交错进行。
- 输入和输出:对于搜索引擎,输入是LLMs生成的查询,返回解析后的搜索结果;对于代码解释器,输入是程序,返回执行信息和最终执行结果。在初步 CoT 推理后,标记出其中的关键步骤(例如:数学运算、代码逻辑、事实陈述),判断哪些部分不确定或可能出错,作为验证对象,提取出来,自动转化为外部工具可执行的格式
3. VERIFICATION WITH TOOL-INTERACTION工具验证
- 验证过程:使用模型和输入生成初始答案后,LLMs与外部工具交互,产生运行结果作为反馈批评(critiques),这些批评用于详细说明期望评估的输出属性,如真实性、可行性或安全性。
- 工具选择:可以根据不同输入使用任务依赖的、启发式选择的或自动选择的适当工具进行验证。
4. CORRECTION WITH CRITIQUES答案修正
- 修正过程:LLMs根据输入、先前输出和验证步骤产生的批评生成改进的答案。批评在修正过程中起着至关重要的作用,它们通过与外部工具的交互识别错误、提供可操作的建议或提供可信的基础。
- 迭代修正:可以迭代“验证-修正-验证”的过程,直到满足特定停止条件,例如验证的批评满意、达到最大迭代次数,或接收到环境反馈。
外部工具常被集成为:API、插件、代码执行沙盒、自定义函数模块由一个控制代理(Controller Agent)管理整个过程,判断何时调用工具、调用哪个工具,并将反馈组织好再传回给模型。
应用场景
除了对 CoT 本身的改变,还有许多工作将 CoT 部署于不同的应用场景之下,以提升各种场景下大模型的能力,譬如从单语言 CoT 扩展到多语言 CoT、从单模态到多模态以及从复杂推理任务到通用推理任务的扩展。其中,多模态 CoT 具有很大的应用前景,在 CoT 中,多模态可以分为两类:输入多模态与输出多模态。
输入多模态
MM-CoT 侧重使用微调方法嵌入 CoT,通过将语言和图像合并在一个包含推理生成与答案推理的两阶段的框架中,使用微调大模型赋予输入多模态 CoT 的能力。基于 MM-CoT,GoT-Input 方法通过对 CoT 生成的思维图进行抽取构建三元组,并使用 GNN 将文本、图像与 CoT 统一,从而生成包含 CoT 信息的最终答案。而区别于输入多模型,VCoT 解决了一个输出多模态的问题,VCoT 通过以生成图片的“标题”以及识别核心关注点作为图像生成的启动过程,通过递归的方式填充图像信息,从而实现输出多模态。
MM-CoT
论文地址:[2302.00923] Multimodal Chain-of-Thought Reasoning in Language Models
MM-CoT将语言(文本)和视觉(图像)模态融合到一个两阶段框架中,该框架将理由生成(Rationale Generation)和答案推理(Answer Inference)分开为两个步骤。答案推理可以利用基于多模态信息生成的更好的理由。
多模态有两种解决方案:一个是将不同模态的输入换为一个模态,然后提示大型语言模型(LLMs)执行CoT。例如,可以通过一个Caption生成模型提取图像的Caption,然后将Caption与原始语言输入连接起来,输入到LLMs中,然而在Caption生成过程中存在严重的信息丢失,使用Caption可能会在不同模态的表示空间中缺乏相互协同;另一个潜在的解决方案是通过融合多模态特征来Finetune较小的语言模型(LMs),这种方法允许在调整模型架构以包含多模态特征方面具有灵活性,然而参数少于 1000亿的语言模型往往在生成rationale时会产生幻觉,进而误导答案生成。为了缓解幻觉,提出了两阶段的框架,该框架将理由生成(Rationale Generation)和答案推理(Answer Inference)分开为两个步骤。实验表明了该框架的有效性,在ScienceQA中取得了大幅的提升。
特征提取中,Text Feature利用LLM Encoder直接提取;Vision Feature:利用DTER提取,然后经过一个MLP的projection。把上面两个Features concat到一起作为输入送给一个Attention模块,其中Q是Text Feature,K、V是Vision Feature,再经过一个类似残差模块的gated fusion模块,后面就是正常transformer处理。
其中DTER 指的是 DEtection TRansformer,一种基于transformer架构的目标检测算法,主要进行定位6识别,返回图像中对象的类别和位置针对视觉任务定制的特征提取器,作用是从视觉输入(如图像)中提取有效的视觉特征(Vision Feature),整个DETR架构主要包含三个部分:提取图像特征表示的CNN主干网络;基于self-attention的transformer;进行最终检测预测的简单前馈网络(FFN)。
CLIP
论文链接:https://arxiv.org/abs/2103.00020
代码链接:https://zhuanlan.zhihu.com/p/668914454
CLIP采用对比学习方法,直接利用图文对的相似度来学习图文encoders的表征能力。在一批数据中,让原本是一对的图文特征的相似度尽量高,让不为一对图文的特征相似度尽量低,不需要对图文对的数据一一标注。
理解对比学习:对比学习旨在通过比较相似和不相似的样本来学习数据的低维表示,尝试使相似的样本在表示空间中彼此靠近,并使用欧氏距离将不相似的样本推得远离。
CLIP 是双塔结构:其中一个分支是图像分,另外一个分支是文本分支。
- Image Encoder:文章中分别采用了ViT和ResNet网络提取特征做对比,结果是ViT更好
使用ResNet50 作为基础架构,并在此基础上根据ResNetD的改进和抗锯齿rect-2模糊池对原始版本进行了修改,将全局平均池化层替换为注意力池化机制。注意力池化机制通过一个单层的transformer多头QKV注意力,其中查询query是基于图像的全局平均池表示。
Vision Transformer(ViT)只进行了小修改,即 在transformer之前对 combined patch 和 position embeddings添加了额外的层归一化,并使用稍微不同的初始化方案。
- Text Encoder:原文基于GPT-2的Transformer网络的进行修改,采用BERT网络提取特征。
训练过程主要包括以下步骤:
- 分别使用Image Encoder和Text encoder对图文数据提取特征,后采用linear projection映射到多模态embedding空间。
- 计算图像和文本embeddings之间两两的相似度,由此构建一个相似度矩阵。相似度计算方法:cosine的变种:np.dot(I_e, T_e.T) * np.exp(t)
- 采用symmetric loss function交叉熵更新ViT和BERT的weights。
用相似度矩阵行维度计算loss;用相似度矩阵列维度计算loss;将上述两个loss计算均值。选取[N, N]矩阵中的第一行,代表第1个图片与N个文本的相似程度,其中第1个文本是正样本,将这一行的标签设置为1,那么就可以使用交叉熵进行训练,尽量把第1个图片和第一个文本的内积变得更大,那么它们就越相似。
CoT和agent
上图中大模型智能体主要由三部分组成,分别是 Agent 主体,工具与环境。当人类指令输入 Agent 主体后,Agent 主体通过一系列计划、决策与控制,使用工具与外部环境互动。作为 Agent 主体的大模型是模拟人类智能决策流程的核心,在许多 Agent 需要处理的任务中,Agent 的“先天知识”并不包含解决任务的直接答案,因此 Agent 需要在一系列与外部环境的交互循环中,制定计划,做出决策,执行行动,收到反馈……在一整个计划、决策与控制的循环中,大模型需要具备“感知”,“记忆”与“推理”的能力,如下图所示, CoT 恰恰可以从这三个方面来“赋能” Agent。
开发通用智能智体一直是人工智能研究的长期目标。在早期阶段,对智体的研究主要是RL技术,RL智体通过与环境的迭代交互来做出决策,接收奖励或惩罚形式的反馈,正确的动作会得到奖励,错误的动作会受到惩罚。这个迭代过程旨在最大限度地减少错误并最大限度地做出准确的决策,通过与环境的持续相互作用进行自我进化的能力。然而RL智体严重依赖专家数据,并为特定任务设计具体的奖励函数,有效性往往局限于单个任务,阻碍了对新任务或领域的泛化能力。并且RL智体的内部工作往往缺乏透明度和可解释性。
语言智体利用LLM中嵌入的常识先验与RL智体区分开来。这些先验减少了对人工注释和试错学习的依赖,使其能够轻松适应新的任务或环境,并允许更好地利用CoT进行解释。然而,语言智体主要通过提示或微调LLM来适应环境,具有高额成本,在响应环境变化而进化其参数方面面临挑战。最近对语言智体的研究,如Retroformer已经结合了类似RL的策略来增强语言智体的能力,但重点仍然主要局限于语言推理任务。目前的发展是,如何弥合RL代理和语言代理之间的差距,以促进未来的体系结构在复杂环境中以强大的性能和高可解释性工作。
感知CoT
无论是环境的反馈,还是人类的指令,Agent 都需要完成一个对接收到的信息进行“理解”,并依据得到的理解进行意图识别,转化为下一步任务的过程。使用 CoT 可以大大帮助模型对现有输入进行“感知”,譬如,通过使用“Answer: Let’s think step by step. I see , I need to ...”的 Prompt,可以让模型逐步关注接收到的信息,对信息进行更好的理解;在机器人控制的场景下,Agent 的决策不可避免的会出现错误,而接受到错误信息的反馈让 Agent 理解错误的原因调整自己的行动也是 Agent 应用于动态场景下的多轮决策任务中的关键能力,感知 CoT 也将加强模型自我纠错的能力。
与外部环境的互动需要 Agent 具有处理多模态信息的能力,这种能力要么需要 Agent 本身是一个多模态的大模型,要么需要 Agent 可以将其他模态信息转化为语言进行理解。其中一个问题是“是否大模型 Agent 只能存在以语言为中心的感知?”,事实上有许多工作不仅在以语言为中心的感知中拓展大模型编码其他模态信息的能力,并且也发展出了譬如以图像为中心的感知方法,与将文本与图像进行统一的真正以多模态为中心的感知方法。
记忆CoT
大模型智能体通常同时拥有短期记忆与长期记忆的能力。短期记忆一般作为一种时间信息,可以在 Agent 的多轮交互中灵活的改变,为大模型提供更加直接的上下文信息支持,因此很自然的可以被建模为一条历史动作链。长期记忆更多的提供历史事件中的静态信息的记录,是对历史知识更加宏观与抽象的理解,长期记忆可以依赖于大模型中的可训练参数进行构建,也可以通过外部维护的记忆库进行构建。
而当序列长度变长,线性链条式的记忆链效率出现下降时,为了实现针对“记忆”高效的增删改查,一些工作探索了树搜索与矢量检索的方法。
树搜索将记忆信息以树结构进行存储,让智能体通过迭代访问文本记忆信息,譬如反思树 Reflection Tree,当智能体面对与环境的多轮交互时,反思树可以让智能体定期抽取历史信息进行“反思”,将反思抽象得到的结果搭建构成一颗反思树,树的叶子节点代表大模型每轮的基本观察,而非叶子节点则代表反思树的抽象程度,越靠近根节点抽象程度越高。另一种方法则是矢量检索,通过将复杂数据类型建模为矢量数据库来实现长期记忆的高效存储与检索,当智能体遇到新问题需要“回忆”过往记忆时,基于矢量数据库的长期记忆系统则会快速检索相关信息,确保智能体行为一致性。
推理 CoT
借鉴 CoT 的思路让智能体分解任务逐步进行计划与决策以增强智能体解决问题的可靠性。在 Agent 中,CoT 主要的功能在于将计划、行动与观察相互结合,弥合推理与行动之间的差距,推理可以帮助模型制定行动计划处理异常情况,而行动则允许大模型在与外部环境进行交互的同时,收集附加信息支持模型的推理。
AgentBench 强迫大模型智能体通过“思考”+“行动”步骤完成任务,而行动链技术通过一系列行动历史与未来行动计划帮助智能体进行决策,从而将决策问题转化为 CoT 推理问题。
通过使用工具,大模型不再局限于“预测”下一步的动作,而获得了“实际执行”动作的能力。譬如输出代码操作机器,调用 API 获得数据,使用各种软件、计算工具等等,使用浏览器获取“实时更新”的“新知识”作为大模型的检索增强也有效的扩展了大模型的知识边界,也为大模型“自我验证”提供了知识库。除了使用工具以外,类似编写“教科书”,现在还有一些研究关注在“专门针对 Agent 任务场景”的数据集上对大模型进行微调以获得更强的 Agent。