斯坦福大学研究人员提出AI框架以实施和验证复杂算法

Parsel:基于大语言模型的代码生成框架

Parsel是由斯坦福大学研究人员开发的一种AI框架,利用大语言模型(LLM)的推理能力,将自然语言中的层次化函数描述转换为代码实现。此外,Parsel还可用于机器人规划和定理证明。

现有LLM代码生成工具

目前已有多种LLM工具能够将程序文本描述转换为代码,例如:

  • OpenAI Codex
  • 开源工具PolyCoder
  • GitHub Copilot
  • 基于GPT-3的模型

Parsel的独特之处

Parsel尝试超越现有代码LLM的能力,模仿人类程序员生成复杂程序的模式,即“将抽象计划分解,直到可以自动解决”。其核心思想是:

  1. 人类或LLM使用Parsel语言描述如何将任务分解为子任务(称为强连通组件,SCC)。
  2. Parsel编译器使用代码LLM和约束求解器实现每个SCC。
  3. 将实现的SCC组合成一个程序,完成原始任务。

性能与优势

研究表明,LLM只需少量示例即可生成Parsel,其解决方案在APPS数据集上的竞赛级问题中表现优于AlphaCode和Codex的各个版本。

工作流程

Parsel编译器接收自然语言描述的函数和一组必须满足的约束(例如单元测试),然后提示代码LLM生成每个函数的实现,并组合它们,直到找到满足约束的解决方案。

示例:康威生命游戏

以下是一个描述康威生命游戏部分的示例,包括一个约束条件:

count_living_neighbors(grid, i, j): 计算位于索引(i, j)的细胞的活邻居数

type_fn_output(fn, args): 返回函数fn在参数args下的输出类型
count_living_neighbors, ([[1, 0], [0, 1]], 0, 0) -> int

简单与复杂情况

  • 简单情况:所有函数都有约束且无递归。此时,可以从叶函数开始实现,逐步向上直到程序完成。
  • 复杂情况:递归和没有约束的函数会增加复杂性,SCC的重组复杂度随着最大SCC的规模呈指数增长。Parsel通过假设状态性不干扰依赖断言来处理这些情况。

关键步骤:分解

如果函数描述过于复杂,代码LLM可能无法正确翻译。解决方案是进一步将复杂函数分解为更简单的函数。此外,代码LLM生成的代码质量可能因输出语言而异,训练数据中代表性不足的语言表现较差。

未来展望

尽管Parsel已证明能够实现鲁棒的算法推理,但仍有许多问题待解决,框架也有许多扩展和改进的机会。

阅读 20
0 条评论