parsel:用语言模型进行算法推理的(去)组合框架
Abstract
尽管最近在大型语言模型(LLM)推理方面取得了成功,但 LLM 在分层多步骤推理任务(如生成复杂程序)方面仍有困难。对于这些任务,人类通常从高级算法设计开始,逐步实现每个部分。我们介绍了 Parsel,这是一个以自然语言中的分层函数描述为输入,通过代码 LLM 自动实现和验证复杂算法的框架。我们证明,Parsel 可用于需要分层推理的各个领域,包括程序合成、机器人规划和定理证明。我们发现,生成 Parsel 的 LLM 在 APPS 数据集中解决了更多竞赛级别的问题,其通过率比之前直接对 AlphaCode 和 Codex 进行采样的结果高出 75% 以上,而且通常使用较少的采样预算。我们还发现,使用 Parsel 作为中间语言的 LLM 生成的机器人计划被认为准确的可能性是直接生成计划的两倍多。最后,我们探讨了 Parsel 如何解决 LLM 的局限性,并讨论了 Parsel 如何对人类程序员有用。
Introduction
对于代码语言模型(就像人类一样)来说,每个新标记都是破坏程序的新机会。Chen 等人(2021 年)在一个玩具实验中强调了这一问题:当被要求用一系列简单的字符串变换生成一个程序时,他们的代码 LLM Codex 的性能会随着步骤数的增加而急剧下降。正如他们所指出的那样,人类只要能实现一些构件,就能以任意长度组成这些构件。
与其他令牌生成器不同,人类程序员(大部分)学会了将复杂的任务分解成易于管理的部分,这些部分既可以单独工作(模块化),也可以协同工作(组合式)。而且,当人类生成的标记破坏函数时,这些函数最好能独立于程序的其他部分进行重写。相比之下,我们天真地期望代码 LLM 生成的标记序列在整体上是正确的。受此启发,我们研究了如何利用 LLM 来分解问题并组合其组合解决方案。
我们提出了 Parsel:Parsel 编译器接收的规范包括:1)自然语言函数描述;2)指定函数实现预期行为的约束条件。对于每个函数,都会提示代码 LLM 根据该函数的描述及其直接依赖关系的描述和函数签名生成实现。然后,编译器会搜索各种实现的组合,直到找到满足所有约束条件(如单元测试)的实现。
因此,生成和实现 Parsel 反映了人类推理中的一种模式--分解抽象计划,直到可以自动求解(Simon & Newell,1971 年)--这种组合结构也有利于语言模型。我们的研究表明,LLMs 只需几个示例就能生成 Parsel,其解决方案优于 APPS 数据集(Hendrycks 等人,2021 年)中有关竞赛级问题的先前研究,包括 AlphaCode(Li 等人,2022 年)和两个版本的 Codex(Chen 等人,2021 年;2022 年)。LLMs 提出的机器人计划也比之前的研究更为精确(Huang 等人,2022 年)。事实上,我们将 Parsel 定义为算法推理的通用框架,并证明它甚至可用于定理证明等任务。
Parsel原理概述
人类或LLM用Parsel语言编写任务分解,将其拆分为其强连通分支( SCC ),然后Parsel编译器使用代码LLM和约束求解器来实现和组成每个SCC。当所有函数都有约束,且不存在递归时,每个函数都是自己的SCC。
用Parsel风格的伪代码描述Parsel如何编译程序。包括自动分解和自动填充的详细版本在附录C的图A.10中。为了清晰,省去了约束- -例如,可以定义一个测试函数,并验证一组参考Parsel程序的可编译性(或缺乏)。