Parsel:基于大语言模型的代码生成框架
Parsel是由斯坦福大学研究人员开发的一种AI框架,利用大语言模型(LLM)的推理能力,将自然语言中的层次化函数描述转换为代码实现。此外,Parsel还可用于机器人规划和定理证明。
现有LLM代码生成工具
目前已有多种LLM工具能够将程序文本描述转换为代码,例如:
- OpenAI Codex
- 开源工具PolyCoder
- GitHub Copilot
- 基于GPT-3的模型
Parsel的独特之处
Parsel尝试超越现有代码LLM的能力,模仿人类程序员生成复杂程序的模式,即“将抽象计划分解,直到可以自动解决”。其核心思想是:
- 人类或LLM使用Parsel语言描述如何将任务分解为子任务(称为强连通组件,SCC)。
- Parsel编译器使用代码LLM和约束求解器实现每个SCC。
- 将实现的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已证明能够实现鲁棒的算法推理,但仍有许多问题待解决,框架也有许多扩展和改进的机会。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。