思维链(CoT),最具开拓性和影响力的提示工程技术之一,能增强LLM在推理决策中的表现。
那么,如果大模型可以在代码中「思考」,会如何呢?
最近,谷歌DeepMind、斯坦福、UC伯克利团队联手提出了全新技术——「代码链」(CoC)。
论文地址:https://arxiv.org/pdf/2312.04474.pdf
「代码链」是一种将编码逻辑与自然语言理解相结合,简单却非常有效的创新方法,能够提升LLM基于代码的推理能力,让其更智能、更通用。
再通俗点讲,CoC允许LLM生成「伪代码」来分解难题,通过LMulator执行有效代码,模拟无效代码。
研究结果显示,在BIG-Bench Hard基准上,CoC实现了84%的准确率,比CoT提高了12%。
另外,在BIG-Bench Hard的23项任务中,CoC在18项任务中超过了人类的平均表现。
看得出,「代码链」将CoT向前推进了一步,并将生成用于逻辑推理的代码与LLM的语义推理集成在一起。
研究人员称CoC非常适合机器人技术,可以进行语义和算法推理,在现实世界中的表现让人惊艳。
对垃圾和可回收物进行分类。
还可以准备出西红柿炒蛋的配菜。
值得一提的是,李飞飞的学生也是这篇论文的核心作者之一。
「代码链」让大模型用代码思考
除了CoT,先前的工作还有多种方法来提升大模型推理能力。
比如,Program of Thoughts(思维程序)提示编写并执行代码,还有ScratchPad提示通过跟踪程序状态的中间步骤来模拟运行已经写入的代码。
最新工作中,研究人员提出了「代码链」(CoC),其中大模型不仅编写一个程序,还可以改善大模型基于代码的推理能力。
具体来说,大模型不仅编写一个程序,而且还有选择性地「模拟」解释器,通过生成生成某些代码行的预期输出。
关键思路是,鼓励大模型将程序中的语义子任务格式化为灵活的伪代码,在运行时可以明确地捕捉到这些伪代码,并将其交给LLM进行仿真。作者将其称为LMulator。
举个栗子,给定任务「在上面的段落中,数一数这个人讽刺了多少次」。
接下来,可以在在上下文中提示LM一个可以调用辅助函数的程序,例如is_sarcastic(sentence),LM对此进行语言预测,并将结果作为布尔(boolean)结果输出返回,然后与程序的其余部分一起处理。
具体来说,研究人员将LM推理公式化为以下过程,如下图所示:
LM编写代码,解释器逐步执行每行代码(红色) 。或者如果失败,则用LM (紫色)模拟结果,并更新程序状态(绿色)。
CoC 继承了(i)编写可执行代码(将精确的算法计算留给解释器)和(ii)编写语义问题的伪代码,并生成其输出(可视为简单的格式更改,LM对其具有很强的适应性)的优点,使LM能够「用代码思考」。
研究人员还总结了「代码链」的几个特点:
- 将代码的优势与语言模型的强大语义和常识知识结合起来,使得代码能够在全新的体系中使用。
- 利用了语言模型的编码能力,这是近期语言模型的一个特别优势,因为可以获得高质量的数据。
- 继承了推理代码的许多好处,包括代码的形式化表达式结构(例如图灵完备性)和可用于代码的强大计算工具。
- 继承了通过中间步骤进行推理的技术的许多优势,比如CoT。这些技术使得语言模型在必要的时候可以使用更多的计算来解决问题,同时提供更多的可解释性。
语言推理评估
CoC的整体性能如下表1所示。
可以看到,无论是在超过人类基线的任务数量上,还是在超过基线的总体数量上,CoC都优于其他方法。
事实上,CoC在84%任务上取得SoTA。甚至在几项任务中,CoC的表现大大超过了人类基线和其他方法,几乎达到了100%准确率。
一般来说,对于这些任务,结果在语言上很复杂,但在代码上却很简单,比如,多步算术Q任务:((-3+5×8×-4)-(9-8×-7))=)。
研究人员还观察到,CoT在许多任务上都优于人类基线,而直接答案则差强人意。
图3按问题类型将结果分解,任务标签如表a1所示。研究人员将主要是算法或主要是自然语言的问题分离出来。
实验结果显示,在算法任务上,CoC的表现尤为出色,而在自然语言任务上,CoC的表现与CoT相当。
这一结果尤其令人鼓舞,因为人们可能会认为这些面向语言的任务更不适合编码。关键是CoC方法提供了灵活性,使用仿真器来模拟代码执行的输出,同时保留了LM对自然语言问题的语义推理能力。
消融研究
图4和5,以及表2显示了为激发「代码链」提示的各个方面而执行的消融研究。
正如人们所预期的那样,执行Python的方法在多项任务上都实现了100%的性能,如果代码正确,那么模型每次输出结果都会正确。
然而,仅依赖Python的方法(CoC (Python))在应用于非算法任务时表现不佳,几乎全部失败。
CoC(Python)的消融与最近的研究成果相似,这些研究成果表明,如果应用于数值问题,代码推理的效果会很好。
扩展
图6显示了CoC在不同规模的模型中的表现。
研究人员观察到,与「思维链」提示类似,CoC的改进也随着模型的增加而增加。
事实上,在某些算法任务中,「代码链」的表现甚至超过了最优秀的人类评测员。然而,CoT只为最大的模型(d-3)带来性能优势,而CoC在较小的模型(a-1、b-1、c-1)上也优于直接问题解答基线,这表明较小的模型更容易输出结构化代码作为中间步骤,而不是自然语言。
跨任务提示
对于跨任务提示,研究人员用一些来自不同问题的例子来提示语言模型。从上图6和表2中看到了所有方法的性能下降。
尽管有这种下降,CoC在规模上优于CoT和直接提示,几乎达到了人类的平均性能。
指令调优模型
为了与使用聊天界面的指令调优的模型进行比较,研究人员向模型发出指令,以引出所需的推理方法。
对于基线,作者要求模型「直接回答」(Direct)或 「逐步思考」(CoT)。
对于CoC变体,研究人员要求模型「编写python代码来帮助解决问题,如果有帮助的话」。
如果编写了程序,可以使用Python解释器运行代码,然后将结果(或执行失败时的错误信息)反馈给模型以确定最终答案(CoC (Python)),或者要求模型将代码执行的输出模拟为LMulator(CoC (LM))。
如下表显示了每种方法的性能。使用gpt-3.5-turbo,CoT和CoC (Python)都显示出比直接提示更好的性能,尽管它们都被CoC (Interweave) 大大超越。
机器人用上了
此外,研究人员还将CoC的方法用在了机械臂在真实环境中的探索中。
结果发现,「代码链」非常适合解决机器人任务,因为这类任务需要语义和算法推理。
它们还通过代码(控制或感知 API)与其他API交互,以及通过自然语言与用户交互。
就比如开头提到的垃圾分类任务,「代码链」加持的机械臂的「思考过程」如下。
红色突出显示表示解释器正在执行LM生成的代码,紫色突出显示表示LMulator正在模拟代码。
西红柿炒蛋的过程。