麻省理工学院研究人员推出了LILO:用于学习可解释的程序合成库的神经符号框架

麻省理工学院研究人员推出LILO:一种用于学习可解释的程序合成库的神经符号框架

大语言模型(LLM)在各种情境中越来越擅长编写代码,如完成部分编写的代码、与人类程序员互动,甚至解决竞赛级别的具有挑战性的编程谜题。然而,相较于完成手头的工作,软件开发人员更感兴趣的是创建可以用来解决整个问题领域的库。为了实现这个目标,重构的技能——找到使代码库更易读(对其他程序员直观)、更可重用(推广到新工作)和更紧凑(巩固共享结构)的抽象——是软件开发的一个关键组成部分。为了解决这个多目标优化问题,需要扩展当前代码完成工具的功能——这些工具目前已被数百万程序员使用——以解决库学习的问题。

在本研究中,他们将语言模型与编程语言(PL)文献中的自动重构的当前算法发展相结合,以学习可重用函数抽象的库。麻省理工学院CSAIL、麻省理工学院脑与认知科学系和哈维穆德学院的研究人员提出了一个名为LILO的神经符号框架,它由三个相互关联的模块(图1)组成,用于从语言观察中归纳库:

• 一个双系统综合模块,利用两种不同的方法来寻找编程问题的答案:LLM引导的搜索引入了强领域通用的先验知识,而枚举搜索可以找到领域特定的表达式

• 一个压缩模块,使用高性能符号压缩系统STITCH,从当前解决方案集中找到相关抽象

• 一个自动文档(AutoDoc)模块,生成可读的文档字符串和函数名称,提高解释性并方便后续LLM引导搜索。

他们的设计基于迭代的“唤醒-睡眠”算法DREAMCODER,该算法在寻找编程挑战的解决方案之间交替进行(唤醒阶段),并将常见的抽象重写为库(睡眠阶段),从而有助于引导搜索。与传统的深度学习技术相比,DreamCoder可以从少量样本中进行重要的泛化,学到的库符号性地表示了模型的概念知识。但DreamCoder的搜索过程计算需求非常高,学习一个领域需要超过两个CPU月的时间。

图1:LILO学习循环概述。 (Al)使用双系统搜索方法,LILO根据纯文本编写的任务描述创建程序。 LILO将LLM生成的自动文档(C)与称为STITCH(B)的压缩方法结合起来,以重构一组程序解决方案并创建一个可解释的λ-抽象库。这种搜索-压缩-文档循环简化了程序解决方案的结构(A与D),有助于解决后续回合中越来越困难的工作。

这次搜索中的很大一部分时间都用于“起步”——寻找一组基础抽象,程序员对其已经很熟悉,或者可以由于先前领域特定的问题解决经验而迅速掌握。此外,DreamCoder的库并非始终可解释;解读它们需要领域知识和对λ演算的理解。为了解决这些问题,LILO以两种创新的方式使用LLM:(1)在搜索过程中更快地找到程序解决方案,(2)增强学习的库的文档,使其更易理解。在三个困难的程序合成领域——使用正则表达式的字符串编辑、在CLEVR数据集上的场景推理以及在二维Logo图形语言中的图形合成——他们将LILO与基于语言的DreamCoder进行比较。

与DreamCoder相比,LILO在所有三个领域中完成了更多的任务,并学到了更丰富的经验性库,其中包含了当前技术无法找到的抽象。例如,作为字符串编辑领域的关键第一步,LILO学会了元音的概念,从而消除了查找超过265个潜在字符原语的需要。LILO将这些信息压缩为符号抽象,对传统搜索技术和LLM引导的综合都有帮助,而仅基于LLM的基准方法则可以完成类似的任务。他们的AutoDoc模块对于这种神经符号整合至关重要,因为它提高了解释性,并促进LLM合成器更好地利用库。作为归纳程序合成工作的一个新发展,LILO展示了编程语言社区的概念和资源如何与语言模型的当前进展相结合。