文章目录

  • 动机
  • 做了什么
  • 怎么做的
  • 实验设计
  • 评价方法
  • 基线方法
  • LLM选择
  • 采样设置
  • 讨论
  • 未来工作


动机

(思维链在大模型自动生成代码领域的扩展应用)
源代码包含丰富的结构信息,任何代码都可以由三种程序结构(即序列、分支和循环结构)组成。直观地说,结构化的中间推理步骤造就了结构化的源代码。因此,我们要求 LLM 使用程序结构构建 CoT,得到 SCoT。然后,LLMs 根据 SCoT 生成最终代码。与 CoT prompting 相比,SCoT prompting 明确约束 LLMs 从源代码的角度思考如何解决需求,进一步提高了 LLMs 在代码生成中的性能。

做了什么

  1. 本文提出一种结构化思维链(SCoT),利用程序结构来构建中间推理步骤。
  2. 提出了一种用于代码生成的SCoT提示技术。它提示大型语言模型首先生成一个SCoT,然后实现代码。
  3. 在三个基准上进行了广泛的实验。定性和定量实验表明,SCoT prompting明显优于SOTA基线(e.g.,思维链提示)。
  4. 讨论了不同程序结构的贡献和SCoT prompting的健壮性。

怎么做的

  1. SCoT提示流程:
  1. 编写示例二元组–<requirement, SCoT> ,要求这些例子涵盖了三个基本的程序结构和输入输出结构。再提出一个新需求,送入llm。我们希望llm从示例中学习并为新需求生成一个SCoT。

【论文精读-代码生成】Structured Chain-of-Thought Prompting for Code Generation_算法

  1. 生成一个SCoT后,设计第二个用于生成最终代码的prompt:需求和对应的SCoT。提示以三个示例<requirement, SCoT, code>开始,要求LLM从示例中学习,并根据需求和SCoT生成一个新程序。
  2. 相关工作[25]发现生成模型可能会受到误差累积的负面影响。类似地,在SCoT prompting中,生成的SCoT可能包含噪声(e.g., 错误或遗漏步骤)。这些噪声将进一步对代码实现产生负面影响。本文利用两种方法来缓解误差累积:
  1. 要求llm再次检查SCoT并修复可能的噪音,允许llm自适应地引用SCoT并滤除噪声。
  2. 人类开发人员可以首先检查生成的SCoT并修复可能的错误。然后,使用SCoT生成代码。(人机交互)

实验设计

评价方法

  1. 实验数据集:

【论文精读-代码生成】Structured Chain-of-Thought Prompting for Code Generation_机器学习_02

  • HumanEval[7]是一个Python函数级代码生成基准测试,包含164个手写编程问题。每个编程问题由一个英语要求、一个函数签名和几个测试用例组成,平均每个问题有7.7个测试用例。由于HumanEval不包含训练数据,因此在HumanEval中重用了MBPP的示例。
  • MBPP[2]是一个Python函数级代码生成基准测试。它包含974个编程问题,涉及简单的数值操作或标准库的基本使用。每个问题包含一个英语要求、一个函数签名和三个用于检查函数的手动编写的测试用例。
  • MBCPP[1]是一个c++函数级代码生成基准测试。它由848个通过众包收集的编程问题组成。每个问题包含一个英文描述、一个函数签名和三个用于检查函数正确性的测试用例。
  1. 评价指标:无偏Pass@k
  1. Pass@k:给定一个需求,允许代码生成模型生成k个程序。如果生成的程序中任意一个通过了所有测试用例,那么这个需求就得到了解决。我们通过Pass@k计算已解决需求在总需求中的百分比。对于Pass@k,值越高越好。在我们的实验中,k被设置为1、3和5,因为我们认为开发人员在现实场景中主要使用Top-5输出。
  2. 无偏Pass@k:之前的工作发现标准通过@𝑘具有高方差,并提出了无偏Pass@𝑘。我们遵循之前的工作,并采用无偏Pass@𝑘。具体来说,我们为每个需求生成𝑛 ≥ 𝑘个程序(在本文中,我们使用𝑛 = 20, 𝑘 ∈ [1, 3, 5]),计算解决需求的数量𝑐,并计算无偏通过:

【论文精读-代码生成】Structured Chain-of-Thought Prompting for Code Generation_算法_03

  1. 之前的代码生成研究使用基于文本相似性的度量(e.g., BLEU)。这些指标最初是为自然语言生成而设计的,在衡量程序的正确性方面很差。因此,我们在实验中省略了这些指标。

基线方法

SCoT prompting是一种新的代码生成提示技术,有三个基线可用于评估比较:

  1. 零样本提示:直接将需求提供给llm,而没有示例。然后从LLMs的输出中提取生成的程序。
  2. 小样本提示:随机选择几个<需求,代码>对作为示例。给定一个需求,它将示例和需求连接在一起,形成一个提示。然后,提示被输入到llm中,llm预测一个新程序。
  3. 思维链(CoT)提示[35]:是少样本提示的变体。CoT提示生成一个由< requirement、CoT、code >三元组组成的特殊提示作为示例。CoT是自然语言推理的几个中间步骤。

LLM选择

现有的llm可以分为两类:standard language models 和 instruction-tuned models。对于每个类别,我们选择一个具有代表性的模型作为base model:Codex 和 ChatGPT。

采样设置

baselines:为每个需求生成20个程序,temperature参数设置为0.8。采样使用nucleus sampling,top-p参数设置为0.95。zeroshot prompting和 few-shot prompting的最大生成长度为300个token;CoT的最大生成长度为600个token,因为是CoT提示需要生成中间的推理步骤和代码。
SCoT prompting:

  1. 我们根据要求从llm中采样20个SCoT,temperature参数设置为0.8,top-p参数设置为0.95,生成的最大长度为300个token。
  2. 然后对于每个SCoT,用LLM生成相应的程序,temperature参数设置为0,最大生成长度为300 token,每个需求生成20个代码。两步的总生成长度与CoT提示相同,为600个token。

讨论

  1. SCoT vs. 伪代码:SCoT与伪代码类似,SCoT实现中间步骤是更好的选择,因为SCoT会自然地将代码生成分解为两个步骤。LLMs首先专注于探索不同的解决方案,然后以标准化的方式实现具体代码。
  2. SCoT prompting vs. Rank Techniques:两种技术侧重点不同,具有互补性。ChatGPT的性能可以通过添加CodeT和SCoT prompting不断提高。

未来工作

源代码可以用树表示(e.g., 抽象语法树),可以设计一种基于树的提示技术,它使用llm来生成树。