当前位置:首页 > 游戏资讯 > 正文

如果LLM是巫师,那么代码就是魔杖

如果LLM是巫师,那么代码就是魔杖-第1张-游戏资讯-龙启网络

因为工作需要,这两天对LLM Agent及大模型编码进行技术预研。看到一篇伊利诺伊大学研究者编写的关于关于代码如何赋予大型语言模型作为智能代理的能力的综述《If LLM Is the Wizard, Then Code Is the Wand: A Survey on How Code Empowers Large Language Models to Serve as Intelligent Agents 》。感觉总结的很好,就翻译了一下。

原文地址:If LLM Is the Wizard, Then Code Is the Wand: A Survey on How Code Empowers Large Language Models to Serve as Intelligent Agents

翻译过程中有小调整。


添加图片注释,不超过 140 字(可选)

Abstract 当今引人注目的大型语言模型(LLMs)与过去的语言模型不仅在规模上有所不同,而且它们在训练时使用了自然语言和形式语言(代码)的组合。作为人类和计算机之间的媒介,代码将高层次目标转化为可执行步骤,具有标准语法、逻辑一致性、抽象性和模块化特征。在这份调查中,我们概述了将代码整合到LLMs的训练数据中所带来的各种好处。具体来说,除了增强LLMs的代码生成能力外,我们观察到代码的这些独特属性有助于:i)释放LLMs的推理能力,使它们能够应用于更复杂的自然语言任务范围;ii)引导LLMs生成结构化和精确的中间步骤,这些步骤可以通过函数调用连接到外部执行端点;iii)利用代码编译和执行环境,这也为模型改进提供了多样化的反馈。此外,我们追踪了这些由代码带来的LLMs的深层能力是如何导致它们在需要理解指令、分解目标、规划和执行操作以及从反馈中改进的下游任务中取得成功的智能代理(IAs)的出现。最后,我们提出了赋能LLMs使用代码的一些关键挑战和未来方向。

1 引言 Introduction


Figure 1: An illustration of how code empowers large language models (LLMs) and enhances their downstreamapplications as intelligent agents (IAs). While traditional LLMs excel in conventional natural language tasks likedocument classification and question answering, further pre-t

代码已成为大型语言模型(LLM)训练数据的不可或缺的组成部分,包括著名的模型如Llama2、GPT-3.5系列和GPT-4。LLM在代码上的训练不仅因为所获取的编程技能能够应用于商业应用(如Github Copilot2),而且还能改善模型之前缺乏的推理能力,所以这一方法备受欢迎。结果,基于LLM的智能代理(IA)迅速崛起,并在代码训练和工具学习的推动下实现了能力的指数级增长。这些基于LLM的IA在处理更复杂的任务方面具有广泛应用前景,包括多智能体环境模拟的下游应用和科学人工智能。

正如图 1所示,本综述旨在解释代码特定训练在一般LLM训练范式中的广泛应用,以及代码如何使LLM能够充当IA的作用。与之前关注评估和比较代码生成能力的代码-LLM综述或列举IA任务的综述不同,我们旨在基于相关论文的分类法全面了解代码如何辅助LLM以及代码在LLM作为IA方面的优势(见图2)。

添加图片注释,不超过 140 字(可选)

我们首先给出了代码的定义,并介绍了LLM代码训练的典型方法(§2节)。相比于自然语言(参见附录 9.1中的案例研究),代码更具结构化特征,具有逻辑上的、逐步可执行的过程,这些过程源自于过程式编程,以及显式定义的模块化函数,这些函数构成了图形化可表示的抽象。此外,代码通常伴随着一个独立的编译和执行环境。通过对这些代码特征的洞察,我们的综合文献综述揭示了将代码整合到LLM训练中的优势: i)增强了它们的编程和推理能力(§3节); ii)使模型能够在决策过程中直接生成可执行的、细粒度的步骤,从而通过函数调用促进各种工具模块的扩展性(§4节);和 iii)将LLM置于代码执行环境中,使其能够接收来自集成评估模块的自动化反馈并改进自身(§5节)。

此外,由于LLM在复杂的现实世界任务中成为IA的关键决策者,我们的综述还探讨了这些优势如何在这种能力下促进它们的功能(§6节),包括: i)增强IA在感知和规划技能上的决策能力(§6.1节); ii)通过直接的动作原语接口和模块化记忆组织来促进执行过程(§6.2节);和 iii)为自我纠正和自我改进提供互动环境(§6.3节)。最后,我们讨论了几个开放的挑战和有前景的未来方向(§7节)。

2 预备知识 Preliminaries2.1 我们对代码的定义 Our Definition of Code

我们将代码视为包含机器可执行和人可解释的任何形式语言。例如,具有人可读性的编程语言属于我们讨论范围内,而低级语言,如基于二进制指令的机器语言,由于其缺乏人可解释性而被排除在外。此外,预定义的形式语言,例如WebGPT中使用的功能集,也被纳入考虑范围,因为它们可以按照基于规则的方式进行解析和执行。

在定义了一组符号和规则(例如预定义的函数集、数学推导公式等)的表达式中训练的LLM(Language Model)具有类似使用编程语言训练的优势。因此,我们扩展了对代码的定义,将这些具有同质化训练语料库的内容纳入考虑范围,以提高本综述的全面性,以适应当前的研究需求。

2.2 LLM代码训练方法 LLM Code Training Methods

LLM通过遵循标准语言建模目标,在应用于代码语料库时接受代码训练。 由于代码具有类似自然语言的顺序可读性,这与指导LLM理解和生成自由形式自然语言的方法相似。 具体而言,对于具有参数Θ的LLM MΘ 和代码语料库T = {t1, ..., tn}, 优化的语言建模损失为:

添加图片注释,不超过 140 字(可选)

当使用编程语言(例如Python、C等)作为语料库时,训练数据通常来自于公开可访问的代码存储库,比如GitHub。这个过程产生的语料库的规模与自然语言预训练相当,因此我们称使用如此丰富的代码进行训练为代码预训练。训练策略有两种,一种是在预训练的自然语言LLM上训练代码,例如Codex ;另一种是用自然语言和代码语料库的混合训练数据从头训练一个LLM,例如CodeLLM 。

相反,当使用其他预定义的形式语言进行训练时,目标转为使模型熟悉特定函数的应用、数学证明公式、SQL等结构。由于这个数据集与预训练的自然语言语料库相比较小,我们将这个训练过程称为代码微调。在这个过程中,研究者们也应用了语言建模损失来优化LLMs。

3 代码预训练提高了LLM的表现 Code Pre-Training Boosts LLMs’ Performance

LLM的预训练,在代码方面的应用,例如OpenAI的GPT Codex ,拓宽了LLM在任务领域上超越自然语言的范围。这样的模型使得各种应用成为可能,包括数学理论代码的生成 ,一般编程任务 ,以及数据检索 。代码需要产生逻辑连贯、有序的步骤序列,以确保有效执行。此外,代码中每一步的可执行性使得逐步逻辑验证成为可能。在预训练中利用并嵌入代码的这两个特性,已经在许多传统的自然语言下游任务中提高了LLM的思维链(CoT)性能 ,表明了复杂推理能力的提升。通过隐式学习代码的结构化格式,代码LLM在与标记、HTML以及图表理解相关的常识性结构化推理任务上表现出更好的性能 。

在接下来的章节中,我们的目标是阐明为什么将LLMs训练成代码,并采用基于代码的提示可以提高它们在复杂下游任务中的性能。具体来说,我们强调了三个关键领域在预训练代码上使LLMs受益的地方:i) 在§3.1中增强编程能力,ii) 在§3.2中赋予复杂的推理能力,以及iii) 在§3.3中促进对结构化常识知识的捕捉,如图3所示。

添加图片注释,不超过 140 字(可选)

3.1 Strengthen LLMs’ Programming Skills

LLM作为强大的编码器。早期的语言模型仅能生成特定领域的程序(Ellis等人,2019),或者限制于特定的通用编程语言,比如Java或C#(Alon等人,2020)。近期基于LLM的代码生成模型(例如AlphaCode(Li等人,2022),CodeGen(Nijkamp等人,2022),SantaCoder(Allal等人,2023),PolyCoder(Xu等人,2022))在参数数量和计算资源不断增加的支持下,能够在同一模型内掌握超过10种语言,并展现前所未有的成功。其中一个知名作品是CodeX(Chen等人,2021),拥有120亿参数,能够阅读整个GitHub数据库,并解决72.31%由人类创建的具有挑战性的Python编程问题。近期的研究(Zan等人,2023;Xu等人,2022;Du等人,2023;Vaithilingam等人,2022;Wong等人,2023;Fan等人,2023)提供了对现有代码-LLM的系统调查和评估。

凭借其强大的代码生成能力,LLM在依赖代码的各种应用中受益,例如数据库管理(Zhou等人,2023b),嵌入式控制(Liang等人,2023a),游戏设计(Roberts等人),电子表格数据分析(Liu等人,2023c),以及网站生成(Calò和De Russis,2023)。

LLM作为最先进的代码评估器。另一方面,LLM本身也可以成为最先进的评估器(即分析和评分)用于人类或机器生成的代码。Kang等人(2023a)利用基于LLM的模型进行代码故障定位,而Zhuo(2023)使用GPT-3.5来评估代码生成的功能正确性和人类偏好。此外,Deng等人(2023a)设计了一个基于LLM的渗透测试工具,并发现LLM在使用测试工具、解释输出并提出后续行动方面表现出熟练技能。两项最近的工作(Li等人,2023a;Mohajer等人,2023)还利用LLM来检查和分析源代码而无需执行它。此外,LLM被用于Kang等人(2023b)的自动漏洞再现以及Noever(2023)的易受攻击软件评估。

多个LLM合作解决复杂编码问题。虽然像GitHub Copilot这样的代码LLM展现了前所未有的成功,但是单独一个LLM代理在需要多个步骤的复杂场景中可能会失败。幸运的是,几个特定角色的LLM代理之间的协作编码表现出更准确和更稳健的性能,特别是对于复杂任务。Hong等人(2023)将人类编程工作流程作为指南来协调不同代理。Dong等人(2023b)为三个不同的“GPT-3.5”分配了三个角色:分析员、编码员和测试员,其代码生成能力超过了GPT-4。同时,Qian等人(2023a)设计了一个由多个角色的LLM代理参与的基于聊天的软件开发流程。其他类似的方法(Liu等人,2023g;Talebirad和Nadiri,2023;Wu等人,2023b;Jiang等人,2023)都利用多个代码-LLM代理或同一代理的不同阶段来生成代码,进行软件开发或利用生成的中间代码来完成其他通用任务。

3.2 赋能LLM的复杂推理 Empower LLMs’ Complex Reasoning

代码预训练提升了思维链表现(Code pre-training improves chain-of-thought performance. )。从逻辑上讲,许多复杂任务可以分解为更小、更易解决的子任务。通过思维链(CoT)提示,即设计具有推理链的提示输入,使LLM能够根据进一步的推理步骤生成结果,提供了一种任务分解的直接方法(Wei等人,2023)。CoT在许多任务的分解中取得了成功,例如规划(Huang等人,2022b)和基于证据的问答(Dua等人,2022;Ye等人,2023b)。虽然最初认为LLM的CoT能力主要归因于模型规模的大幅增加(Wei等人,2022b),但Fu和Khot(2022)汇编的最新证据表明,CoT的性能改进很大程度上来自于其在代码上的预训练。例如,比较不同版本的GPT-3(即v1与v5),未经代码预训练的LLM,如GPT-3的text-davinci-001,在数学推理任务GSM8k(Cobbe等人,2021)中看到了小但显著的准确性提高,从6.4%到12.4%。相比之下,经过代码预训练的LLM,如GPT-3的text-davinci-002和Codex(Chen等人,2021),在CoT方面表现出戏剧性的性能提升,分别将准确性提高了15.6%到46.9%和19.7%到63.1%。支持Fu和Khot(2022)提出的假设的Ma等人(2023a)展示了在小型LLM(2.6B)(Zeng等人,2021)中的代码预训练提高了CoT的性能,更显著的是,较小的经过代码预训练的LLM在许多不同任务中表现优于其较大的非代码对应物。此外,他们的研究表明,在LLM训练的初期阶段,纳入更多的代码显著增强了其在推理任务中的效果。然而,需要注意的是,随着模型规模的缩小,LLM在具有和没有代码预训练的CoT性能差距可能会减小,因为Ma等人(2023a)中小型LLM的准确性差距不到3%。值得注意的是,无论是Fu和Khot(2022)还是Ma等人(2023a)都表明,代码预训练提高了LLM在标准和CoT提示场景下在后续任务中的表现。

思维程序胜过思维链。(Program-of-thought outperforms chain-of thought. )此外,与普通的CoT方法相比,首先将自然语言任务翻译并分解为代码的LLM(Chen等人,2023b;Gao等人,2023),通常称为思维程序(PoT)提示或程序辅助语言模型,在需要消除语言和明确的纵向结构歧义的任务中取得了可观的收益。这种方法在理论数学(Polu和Sutskever,2020)、大学数学(Drori等人,2022)以及带有数据检索的问题回答(Sun等人,2023b;Cheng等人,2023)等复杂领域尤其有效。

PoT通过代码作为可执行语言的精确性和可验证性提升了性能。在任务分解中,LLM有时会通过CoT产生错误的子任务和问题(Ji等人,2023)。Chen等人(2023b)、Gao等人(2023)和Ye等人(2023b)的PoT实现表明,通过LLM直接执行代码并在翻译后验证结果,可以有效减轻CoT中不正确推理的影响。这是因为推理过程必须遵循程序明确指定的逻辑和约束条件,从而确保更准确可靠的结果。

然而,代码的使用所带来的这种改进并不局限于纯粹可执行的编码语言,如Python或SQL,也不仅限于特定结构严格的任务,比如数学(Drori等人,2022)和数据检索(Rajkumar等人,2022)。这些改进也扩展到将任务转化为伪代码以分解任务的领域,这可以提高零-shot性能(Lei和Deng,2023),尤其是在包含数字的单词问题以及像StrategyQA(Geva等人,2021)这样的一般推理任务中。

3.3 使LLM能够获取结构化知识 Enable LLMs to Capture Structured Knowledge

代码生成揭示了卓越的结构常识推理能力Code Generation Unveils Superior Structural Commonsense Reasoning)。考虑到代码具有符号表示的图结构,将文本图形、表格和图像转化为代码,使得基于代码的LLM能够根据代码推理和生成原则对这些信息进行逻辑处理。

因此,先前的研究 表明,经过代码的额外预训练后,LLM在涉及结构常识推理的任务中可能能够与或甚至超过其经过精细调整的自然语言对应物,即使是在有限或无训练数据的情况下。

COCOGEN 首次将常识推理图补全任务重新定义为代码生成任务,并展示了在推理图、表格实体状态追踪和解释图生成方面的改进少样本效果。

基于这一视角,CODE4STRUCT 将代码LLM应用于语义结构,重点关注事件参数提取任务。通过利用代码的特征,如注释和类型注解,它在最小训练实例上实现了竞争性的性能。此外,它在零样本情境中超过了基线,受益于继承特性和兄弟事件类型样本。 ViStruct 进一步将这种方法扩展到多模态任务,利用编程语言来表示视觉结构信息,并利用课程学习来增强模型对视觉结构的理解。

标记代码精通推进视觉定位自然语言理解(Markup Code Mastery Evolves Visually Situated Natural Language Understanding)。另一方面,一些研究专注于利用标记代码,如HTML和CSS,来描述和解析图形用户界面(GUI)或文档中的图表和图形化信息。这种标记代码不仅指定内容,还规定了网页的布局,帮助大型视觉-语言模型(LVLMs)捕获视觉定位自然语言(VSNL)信息。

对于LVLMs的标记代码理解,WebGUM(Furuta等人,2023)展示了自主网络导航。它采用了一种预训练方法,使用网页截图作为输入,并将相应的HTML作为输出的导航动作。胜过了SOTA、人类和其他基于LLM的代理,WebGUM展示了使用标记代码增强预训练模型在网页理解方面的有效性。

对于标记代码生成,pix2code(Beltramelli,2017)和sketch2code(Robinson,2019)开创了在LLM时代之前为GUI或网站模型生成渲染代码的机器学习方法。Pix2Struct(Lee等人,2023)通过在遮蔽的网站截图上预训练图像到文本模型,并进一步进行OCR、语言建模和图像字幕目标的训练,在VSNL理解方面达到了当时的SOTA。MATCHA(Liu等人,2023a)在此基础上引入了基于图表解析、布局理解和数学推理的额外预训练目标,在VSNL理解任务上超越了SOTA。

4 代码将 LLM 连接到其他功能端 Code Connects LLMs to Other Function Ends

图4:基于代码为中心的工具调用范式作为LLM(语言模型)和大量功能端之间的统一接口,从而实现了许多跨模态和跨领域任务。


Table 1: Representative work connecting LLMs to different function ends for performing non-trivial tasks. Initialefforts embed tool calls rigidly within the LLMs’ inference mechanism (indicated by “∗”), resulting in diminishedflexibility and constrained tool accessibility. More r

最近的研究表明,连接LLMs到其他功能端点(即,用外部工具和执行模块增强LLMs)有助于LLMs更准确、更可靠地执行任务(Mialon等人,2023;Parisi等人,2022b;彭等人,2023;郭等人,2023)。这些功能端点赋能LLMs访问外部知识,参与多种形式,有效地与各种环境互动。正如表1所示,我们观察到一种普遍的趋势,即LLMs生成编程语言或利用预定义函数与其他功能端点建立连接——这是我们所谓的以代码为中心的范式。

与严格将工具调用硬编码在LLMs推理机制内的刚性做法相比,以代码为中心的范式允许LLMs动态生成调用可调参数的执行模块的标记。这一范式使得LLMs以简单明了的方式与其他功能端点进行交互,增强了其应用的灵活性和可扩展性。重要的是,正如图4所示,它使LLMs能够参与涵盖多种形式和领域的众多功能端点。通过扩展可访问的功能端点的数量和种类,LLMs可以处理更加复杂的任务。

在§4.1中,我们审视(数字)文本和多模态工具与LLMs的关系,而§4.2则关注与物理世界功能端点的关系,包括机器人和自动驾驶,展示了LLMs在解决跨越多种形式和领域的问题中的多才多艺。

4.1 将LLMs与数字端点关联 Relate LLMs to Digital Ends

基于文本的工具。以代码为中心的框架提高了LLMs对工具调用的精确性和清晰度,最初推动了基于文本的工具的进展。在这种以代码为中心的范式流行之前,将LMs与单个工具(如信息检索器(Guu等人,2020;Lewis等人,2020;Izacard等人,2022;Borgeaud等人,2022;Yasunaga等人,2022))相结合的研究需要在推理机制中硬编码(例如,在生成开始之前始终调用检索器),这种方法不够灵活,难以扩展。TALM(Parisi等人,2022a)首次通过调用带有预定义分隔符的API调用,将多个基于文本的工具整合在一起,使得可以在生成的任何位置清晰地调用任何基于文本的工具。在他们的工作之后,Toolformer(Schick等人,2023)使用“<API> </API>”标记API调用及其包含的内容。随后,引入了多种工具学习方法,以便跨越各种基础模型整合众多基于文本的工具(Song等人,2023;Hao等人,2023;Tang等人,2023)。

以代码为中心的框架方便调用各种外部文本模块。这些模块包括计算器、日历、机器翻译系统、网页导航工具,以及来自HuggingFace和TorchHub的API(Thoppilan等人,2022;Yao等人,2022c;Shuster等人,2022;Jin等人,2023;Yao等人,2022b;Liu等人,2023e;Jin等人,2023;Patil等人,2023)。

多模态工具。以代码为中心的LLM范式的高度可扩展性使得工具学习能够扩展到除文本以外的其他形式。早期的工作(Gupta和Kembhavi,2023;Surís等人,2023;Subramanian等人,2023)利用代码为中心的范式来解决视觉问答任务。例如,VISPROG(Gupta和Kembhavi,2023)搜集了各种预训练的计算机视觉模型和现有图像处理库(如Pillow和OpenCV)的功能作为一组API。然后,可以将API调用链接在一起作为针对问题的图像理解程序,其中程序是通过LLMs的上下文学习生成的。API代码语言中包含了算术,因此程序能够执行简单的算术任务,从而使VISPROG能够回答诸如物体计数之类的具体问题。类似的工作包括ViperGPT(Surís等人,2023)和CodeVQA(Subramanian等人,2023)。与VISPROG相比,它们使用Codex直接生成更灵活的Python代码。这使得它们有可能利用Codex嵌入的预训练知识来生成具有更复杂控制流的程序。

类似的工作还包括ViperGPT 和CodeVQA 。 与VISPROG相比,它们直接使用Codex生成更灵活的Python代码。 这使它们有可能使用Codex中嵌入的预训练知识生成更复杂的控制流程序。 除了视觉推理,代码还被用于将LLM与以图像生成任务为主的多模态生成工具连接在一起 ,其中代码的明确性可以帮助生成更符合文本提示的图像。

除了基于图像的工具,最近的工作还以协作方式考虑和使用其他模态 。 例如,MM-REACT 在其API中考虑了视频识别模型,而Chameleon 包括视觉文本检测器或网页搜索等工具。 在HuggingGPT 中,作者将LLMs连接到各种Hugging Face模型,并将每个模型视为可用的API调用。 因此,HuggingGPT能够执行更广泛的任务,包括先前未被探索的音频相关任务。 进一步推动API的多样性,TaskMatrix.AI 使用了数量级更多的API,从视觉和图形API到音乐和游戏API。 代码的灵活性使得LLMs可以同时使用不同的多模态工具。 这使得LLMs更加灵活,能够作为通用的多模态问题求解器,并能够适应多种任务的扩展。

4.2 Relate LLMs to Physical Ends

尽管与数字领域相比,物理世界提供了更具沉浸感、上下文丰富和引人入胜的交互环境,但直到代码为中心的范式的出现之前,LLM与物理世界之间的连接一直受到限制。这种范式允许可适应性地调用物理世界的工具和执行模块,首次引发了探索LLM与机器人和自动驾驶集成的研究热潮。

在利用LLM生成真实世界机器人任务代码的过程中,最成功的方法之一是PaLM-SayCan ,其中LLM理解高级指令,然后调用相应的API进行机器人控制。在SayCan之后,最新的研究进展已经表明,通过其强大的代码生成能力,LLM可以作为机器人规划和控制的大脑。例如,ProgPrompt 为机器人任务规划开创了类似于程序的规范,而其他研究人员,如、和将此方法推广到了其他任务领域,包括人机交互和无人机控制。

通过代码生成和工具学习,LLM在诸如人车交互和自动驾驶等更复杂的任务中也表现出巨大潜力 。行业中一个典型的工具学习示例是Wayve的LINGO-1 ,它使用开环视觉、语言和动作LLM来提高驾驶模型的可解释性。通过指导调优,LLM已经发展到了可以理解复杂的驾驶、导航和娱乐指令的程度 ,生成可执行的代码 ,并通过调用底层车辆规划和控制API来执行这些代码 。

总的来说,尽管存在延迟、准确性问题以及缺乏适当的仿真环境、数据集和基准测试等挑战 ,LLM在理解高级指令和执行与代码相关的API方面在机器人和自动驾驶等复杂领域显示出了潜力。展望未来,LLM在弥合物理世界和人工智能之间的差距方面有着巨大的潜力,并将影响交通运输和智能制造等领域 。

5 代码为LLM提供自动反馈的可执行环境 Code Provides LLM with an Executable Environment for Automated Feedback

图5:LLM(语言模型)可以嵌入到代码执行环境中,在那里它们收集忠实、自动化和可定制的反馈,用于自我改进。

LLM在超出其训练参数的性能上表现出色,部分原因在于其能够接受反馈,特别是在现实世界的应用中,环境很少是静态的。 然而,反馈必须谨慎选择,因为噪声提示会阻碍LLM在下游任务上的性能。此外,由于人力成本昂贵,关键是反馈应该能够自动收集,并保持忠实。 将LLM嵌入代码执行环境可以实现满足所有这些标准的自动反馈,如图2所示。 由于代码执行在很大程度上是确定性的,LLM从执行代码的结果中接收反馈可以保持对任务的忠诚。此外,代码解释器为LLM提供了查询内部反馈的自动路径,消除了在利用LLM调试或优化故障代码时昂贵的人工注释的需求。 此外,代码环境使LLM能够整合多种形式的外部反馈,例如对二进制正确性的批评,对结果的自然语言解释和带有奖励值的排名,从而实现了高度可定制的方法来增强性能。

我们在§5.1中介绍了从代码执行中产生的各种类型的反馈,可以共同用于提升LLM的效益,并在§5.2中讨论了利用此反馈改进LLM的常见方法。

5.1 Various Feedback from Code Execution

代码执行过程可以使用从确定性执行结果派生出的更全面的评估指标来评估LLM生成的内容,而不仅仅依赖于常常模糊的基于序列的指标,如BLEU和Rouge。

用于评估程序执行结果和生成反馈的直接方法包括创建单元测试和应用准确结果匹配技术。通过这些方法,可以提供两种主要形式的反馈:简单的正确性反馈和文本反馈。可以通过评论模型或基于规则的方法生成简单的反馈,指示程序是否正确。对于更详细的文本反馈,可以使用语言模型来生成有关程序本身的解释,或者对程序和其执行的评论进行总结。执行结果还可以使用预定义规则将其转化为奖励函数,规则根据不同错误类型的严重程度将执行结果映射为标量值,因此反馈格式适用于增强学习方法。此外,还可以通过使用软件工程工具进行静态分析来提取附加的反馈。例如,和从执行跟踪中获取附加信息,包括变量或状态跟踪。演示了一种利用函数调用的表面形式约束提取附加反馈的有效方法。

5.2 Methods for Enhancing LLM’s Performance with Feedback

从代码执行和外部评估模块获得的反馈可以通过三种主要方法增强LLM的性能。

基于选择的方法。

选择性方法,如多数投票和重新排序方案,在增强LLM在代码生成等任务中的性能方面被证明是有效的。这些方法最初是为简单的程序合成开发的,利用代码执行结果(如通过的单元测试数)来选择性能最佳的代码片段。Chen等人的研究证明了多数投票的有效性,而Zhang等人展示了重新排序方案的优势。在此成功基础上,类似的方法已经被调整应用于更具挑战性的任务中,其中代码-LLM被集成到交互环境中,如Shi等人的工作中相似的投票方法,以及Ni等人的工作中的重新排序策略。然而,尽管简单有效,这些方法导致了低效率,因为它们需要多次生成和使用额外的重新排序模型来识别最优解。

基于提示的方法。

现代LLM能够在上下文中进行推理,并直接将任务描述的反馈集成到提示中,至少在某种程度上。改进LLM的“自我调试”通常需要以自然语言解释或从执行结果中得出的错误消息的形式呈现的反馈,因为这些格式对LLM更易理解。由于其自动化性质、计算效率和无需额外微调的要求,大部分基于LLM的代理(见§[agent])更加偏爱这种方法。然而,此方法的有效性在很大程度上取决于LLM的上下文学习能力。

微调方法。

在前面的方法中,无论是基于选择的方法还是基于提示的方法,都不能保证在任务中稳定改进,因为LLM的参数保持不变。它们在面临相似问题时需要重复调整过程。另一方面,微调方法通过更新参数化的知识,从根本上改善了LLM。典型的微调策略包括直接优化、利用外部模型进行优化以及在强化学习范式下训练模型。Wang等人的研究以直接优化的方法为例,其中原始语言模型通过基于反馈的目标函数进行微调。Haluptzok等人提出了一种独特的方法,其中语言模型生成合成的单元测试来识别和保留仅仅是正确生成的示例,然后将这些示例组合成正确的问题-答案对,并用于进一步微调模型。CodeScore 根据可执行性和单元测试的通过率设计其损失函数。Self-edit 首先将执行结果封装为文本注释,然后训练一个编辑器通过接受问题程序和注释来进一步改进程序。Chen等人训练了一个“改进模型”,该模型首先接受反馈和生成的程序,然后使用改进后的生成示例对生成模型进行微调,展示了一种分层微调的方法。CodeRL 和Wang等人应用强化学习来改进原始语言模型。Wang等人的研究旨在利用编译器的反馈获得错误代码,而CodeRL 根据单元测试结果类型基于经验定义了固定的奖励值。尽管具有上述优点,通过微调来改进LLM通常涉及消耗大量资源的数据收集过程。此外,如CodeRL 的例子所示,评估预定义的奖励值也面临一定的挑战。

6 应用:代码授权的LLM促进智能代理 Application: Code-empowered LLMs Facilitate Intelligent Agents


添加图片注释,不超过 140 字(可选)

在前面的章节中,我们的讨论突出了代码集成增强LLMs的各种方式。在此基础上,我们发现,代码强化LLMs在一个关键领域尤其显著:IA的开发。在本节中,我们强调代码强化LLMs赋予这些代理人的独特能力。

图 6有助于说明一个IA的标准操作流程,特别是作为一个具体身份的、日常通用助手。我们观察到,代码训练在LLMs中带来的改进牢固地根植在它们作为IA时的实际操作步骤中。这些步骤包括(i)在环境感知和规划方面增强IA的决策能力(§6.1),(ii)通过将行动基于模块化和明确的行动原语,并有效组织内存来简化执行(§6.2),以及(iii)通过从代码执行环境中自动衍生的反馈来优化性能(§6.3)。每个方面的详细说明将在后续的章节中给出。

6.1 Decision Making环境感知

如图 6所示,在步骤(0-10)中,智能体不断感知世界,与人类和环境进行交互,对相关刺激作出响应(例如,人类关于饭菜准备的指令),并基于观察到的环境条件(例如,厨房布局)进行规划和执行动作。将LLM作为智能体的决策中心需要将环境观察结果转化为文本,例如基于虚拟家庭或Minecraft的任务 。感知到的信息需要以高度结构化的形式组织,确保发生在同一时刻的刺激(例如同时存在的多模态刺激)在没有时间差异的情况下同时影响智能体的感知和决策,这一要求与自由格式文本的顺序性质相反。通过对代码进行预训练,LLM能够更好地理解和生成类似代码中类定义的结构化表示。这种结构化形式中,类属性和函数是置换不变的,有助于智能体在任务执行过程中感知结构化的环境观察结果。

一个直观的例子是基于网页的环境,这些环境在HTML代码的基础上具有高度结构化。在像网购 、网页浏览 和基于网络的问答 这样的智能体任务中,将基于网络的环境直接转化为HTML代码而不是自然语言更可取,直接包含其结构化信息,从而提高LLM智能体的整体感知能力。 此外,在和的机器人研究中,智能体被用编程样式的规范来提示环境中的物体,使LLM能够根据其感知到的虚拟对象生成具有位置的任务计划。

规划

如图 [fig:agent_figure] 所示,在步骤(2)中,智能体必须将复杂任务分解为更细致、可管理的步骤。利用代码-LLM的协同规划能力,智能体可以使用模块化和明确的代码以及表达力强的自然语言生成组织良好的推理步骤。正如在第2.2节中讨论的,当将代码-LLM用于规划智能体任务时,它们展示了增强的推理能力。此外,它们在必要时生成可执行程序的子任务,产生更强大的中间结果,智能体会对这些结果进行条件调整并以更高的精度进行规划。此外,智能体还可以无缝集成高性能工具API到规划中,克服了普通LLM在规划过程中数学推理能力差和信息更新滞后的限制。

利用代码进行规划的典型例子主要分为两个主要类别。Progprompt 和代码作为策略(Code as Policies) 代表了利用代码实现更好机器人控制的工作。这两个工作突出了基于代码的规划带来的好处,它们不仅可以直接表达反馈循环、函数和基本API,而且能够直接访问第三方库。另一个工作流是关注于智能体的编程和数学推理能力至关重要的场景,如解决与数学相关的问题 或在科学领域进行实验 。

6.2 Execution行动基础

如图6所示,在步骤(3)中,当IA根据计划与外部函数端接口时,必须从预定义的动作集(即函数)中调用动作原语。鉴于现代LLM在形式语言中进行了训练并且能够生成高度形式化的原语,IA的生成可以直接解析和执行,从而消除了额外的动作原语调用模块的必要性。

将IA与其他函数端连接起来需要将动作基础(actions)与形式化的函数式原语相结合。例如,在评估LLM作为真实场景中的代理的基准测试中 ,八个场景中有七个涉及代码作为动作空间。

以前的工作生成纯自然语言的代理计划需要额外的从步骤到原语的模块来将这些规划步骤转化为代码 。相比之下,使用代码-LLM进行计划的IA生成原子动作程序 ,其生成结果可以快速解析并执行。

记忆组织

如图 6 所示,在步骤(3)和标有“更新状态的函数端”的组件中,IA通常需要一个外部记忆组织模块来管理公开的信息 ,包括原始规划、任务进展、执行历史、可用工具集、已获得的技能和用户的早期反馈。在这个背景下,代码-LLM通过采用高度抽象和模块化的代码来记录、组织和访问内存,特别是用于扩展可用工具集和管理已获得的技能,从而有助于IA的记忆组织。

通常,代理编写的代码片段可以作为工具集的一部分,集成到代理的记忆组织中。这个研究方向称为工具创建方法。TALM 提出利用更强大的代理(如基于GPT-4的代理)编写代码作为较弱代理(如基于GPT-3.5的代理)的记忆的一部分。在Creator 中,代理不仅被强调为工具的使用者,还是它们的创造者。他们提出了一个四阶段的工具创建框架,使代理能够编写代码作为可执行工具集的一部分。更进一步,Craft 着重确保所创建的工具确实可以执行,使框架更加健壮。另一个分享这个思想的工作是Voyager ,其中代理以代码格式存储学到的技能,并在面对类似任务时在未来执行这些技能。

6.3 Self-improvement

如图6 所示,在步骤(5)中,当IA的决策中心,即LLM,在代码执行环境下运行时,环境可以整合各种评估模块来提供自动化反馈(例如正确性、排名、详细评论)。这在很大程度上增强了IA的早期错误纠正,促进了自我改进。

Voyager 是使用模拟环境反馈的代理的一个好例子。该代理从失败的任务案例中学习,并在Minecraft中进一步磨练其技能。Chameleon 通过程序验证器接收反馈,以决定是否重新生成适当的程序。Mint 可以从代理服务器接收反馈,从而使代理在多轮交互设置中自我改进。重要的是,从执行反馈中实现自我改进的能力对于代理成功解决科学问题至关重要,例如 、和 的研究中所观察到的情况。

7 挑战 Challenges

在我们的调查过程中,我们发现了一些有趣且具有潜力的未来研究方向,如下所述。

7.1 The Causality between Code Pre-training and LLMs’ Reasoning Enhancement

虽然我们已经将3.2节中最相关的工作进行了分类,但明显存在一个问题,就是没有提供明确的实验证据直接证明特定代码属性的习得能够增强LLMs的推理能力。

虽然我们直觉上承认某些代码属性可能对LLMs的推理能力有所贡献,但它们对于增强推理技能的影响程度仍然不明确。在未来的研究中,重要的是要调查在训练数据中强化这些代码属性是否确实可以增强已训练的LLMs的推理能力。如果确实如此,即预先训练代码的特定属性可以直接改善LLMs的推理能力,了解这一现象将对进一步改进当前模型的复杂推理能力至关重要。

7.2 Acquisition of Reasoning Beyond Code

尽管通过在代码上进行预训练可以提高推理能力,基础模型仍然缺乏真正广义人工智能所期望的类人推理能力。除了代码,还有大量其他文本数据源具有增强LLM推理能力的潜力,代码的固有特性(如缺乏歧义性、可执行性和逻辑顺序结构)为收集或创建这些数据集提供了指导原则。 然而,如果我们坚持在大型语料库上训练语言模型的范例,很难想象一个比形式语言更抽象、高度结构化且与符号语言紧密对齐的可按顺序阅读的语言,在大量数字化环境中,形式语言(以代码为例)是普遍存在的。 我们设想勘探替代数据模态、多样化的训练目标和新颖的架构将为进一步增强这些模型的推理能力提供额外的机会。

7.3 Challenges of Applying Code-centric Paradigm

LLM(Language Model)在使用代码与不同的功能端点进行连接时面临的主要挑战是学习正确调用多个函数,包括选择正确的函数端点并在适当的时间传递正确的参数。即使对于简单任务,例如使用有限的动作原语(例如鼠标移动、点击和页面滚动)进行简化网络导航,LLM通常也需要使用有限的示例以及强大的基础LLM,才能准确把握这些原语的使用方式。对于在化学、生物学和天文学等数据密集领域的更复杂任务,这些任务涉及到具有各种功能和复杂调用的领域特定Python库,增强LLM对学习正确调用这些函数的能力是一个有前景的方向,在精细领域中使LLM能够作为执行专家级任务的IA(智能助理)。

7.4 Learning from multi-turn interactions and feedback

LLM常常需要与用户和环境进行多次交互,不断纠正自己以提高复杂任务的完成度。虽然代码执行提供了可靠和可定制的反馈,但尚未建立起一种完善的方法来充分利用这种反馈。正如在§ 5.2中讨论的那样,我们观察到基于选择的方法虽然有用,但并不能保证性能的提升,并且可能效率低下。基于提示的方法严重依赖于LLM的上下文学习能力,这可能限制了它们的适用性。微调方法显示出持续改进,但数据收集和微调是资源密集型的,因此具有禁止性。 我们提出假设,强化学习可能是利用反馈和改进LLM的更有效的方法。这种方法通过精心设计的奖励函数提供了一种动态的方式来适应反馈,从而潜在地解决了当前技术的限制。然而,仍然需要进行重要的研究,以了解奖励函数如何设计,以及如何最优地将强化学习与复杂任务的LLM集成。

8 总结 Conclusion

在这项综述中,我们汇编了阐明了代码如何赋予LLMs强大能力以及代码如何协助LLMs作为IAs的文献。首先,代码具备自然语言的顺序可读性,同时体现了符号表示的抽象和图结构,使其成为知识感知和推理的媒介,是仅基于语言建模目标的LLMs训练语料库的一部分。通过综合文献回顾,我们观察到,在经过代码训练之后,LLMs i) 改善了他们的编程技能和推理能力, ii) 可以生成高度形式化的函数,实现与不同领域和模态的各种功能目标之间的灵活连接,而且 iii) 可以与集成在代码执行环境中的评估模块进行交互,实现自动化的自我改进。此外,我们发现,代码训练带来的LLMs的能力提升有益于它们作为智能代理的下游应用,体现在智能代理工作流程中的具体操作步骤,包括决策、执行和自我改进。除了回顾先前的研究,我们提出了该领域的一些挑战,作为潜在未来发展方向的指导因素。