admin管理员组文章数量:1564707
文章目录
- 动机
- 做了什么
- 怎么做的
- 实验设计
- 评价方法
- 基线方法
- LLM选择
- 采样设置
- 讨论
- 未来工作
动机
(思维链在大模型自动生成代码领域的扩展应用)
源代码包含丰富的结构信息,任何代码都可以由三种程序结构(即序列、分支和循环结构)组成。直观地说,结构化的中间推理步骤造就了结构化的源代码。因此,我们要求 LLM 使用程序结构构建 CoT,得到 SCoT。然后,LLMs 根据 SCoT 生成最终代码。与 CoT prompting 相比,SCoT prompting 明确约束 LLMs 从源代码的角度思考如何解决需求,进一步提高了 LLMs 在代码生成中的性能。
做了什么
- 本文提出一种结构化思维链(SCoT),利用程序结构来构建中间推理步骤。
- 提出了一种用于代码生成的SCoT提示技术。它提示大型语言模型首先生成一个SCoT,然后实现代码。
- 在三个基准上进行了广泛的实验。定性和定量实验表明,SCoT prompting明显优于SOTA基线(e.g.,思维链提示)。
- 讨论了不同程序结构的贡献和SCoT prompting的健壮性。
怎么做的
- SCoT提示流程:
- 编写示例二元组–<requirement, SCoT> ,要求这些例子涵盖了三个基本的程序结构和输入输出结构。再提出一个新需求,送入llm。我们希望llm从示例中学习并为新需求生成一个SCoT。
- 生成一个SCoT后,设计第二个用于生成最终代码的prompt:需求和对应的SCoT。提示以三个示例<requirement, SCoT, code>开始,要求LLM从示例中学习,并根据需求和SCoT生成一个新程序。
- 相关工作[25]发现生成模型可能会受到误差累积的负面影响。类似地,在SCoT prompting中,生成的SCoT可能包含噪声(e.g., 错误或遗漏步骤)。这些噪声将进一步对代码实现产生负面影响。本文利用两种方法来缓解误差累积:
- 要求llm再次检查SCoT并修复可能的噪音,允许llm自适应地引用SCoT并滤除噪声。
- 人类开发人员可以首先检查生成的SCoT并修复可能的错误。然后,使用SCoT生成代码。(人机交互)
- 要求llm再次检查SCoT并修复可能的噪音,允许llm自适应地引用SCoT并滤除噪声。
实验设计
评价方法
- 实验数据集:
- HumanEval[7]是一个Python函数级代码生成基准测试,包含164个手写编程问题。每个编程问题由一个英语要求、一个函数签名和几个测试用例组成,平均每个问题有7.7个测试用例。由于HumanEval不包含训练数据,因此在HumanEval中重用了MBPP的示例。
- MBPP[2]是一个Python函数级代码生成基准测试。它包含974个编程问题,涉及简单的数值操作或标准库的基本使用。每个问题包含一个英语要求、一个函数签名和三个用于检查函数的手动编写的测试用例。
- MBCPP[1]是一个c++函数级代码生成基准测试。它由848个通过众包收集的编程问题组成。每个问题包含一个英文描述、一个函数签名和三个用于检查函数正确性的测试用例。
- 评价指标:无偏Pass@k
- Pass@k:给定一个需求,允许代码生成模型生成k个程序。如果生成的程序中任意一个通过了所有测试用例,那么这个需求就得到了解决。我们通过Pass@k计算已解决需求在总需求中的百分比。对于Pass@k,值越高越好。在我们的实验中,k被设置为1、3和5,因为我们认为开发人员在现实场景中主要使用Top-5输出。
- 无偏Pass@k:之前的工作发现标准通过@𝑘具有高方差,并提出了无偏Pass@𝑘。我们遵循之前的工作,并采用无偏Pass@𝑘。具体来说,我们为每个需求生成𝑛 ≥ 𝑘个程序(在本文中,我们使用𝑛 = 20, 𝑘 ∈ [1, 3, 5]),计算解决需求的数量𝑐,并计算无偏通过:
- 之前的代码生成研究使用基于文本相似性的度量(e.g., BLEU)。这些指标最初是为自然语言生成而设计的,在衡量程序的正确性方面很差。因此,我们在实验中省略了这些指标。
基线方法
SCoT prompting是一种新的代码生成提示技术,有三个基线可用于评估比较:
- 零样本提示:直接将需求提供给llm,而没有示例。然后从LLMs的输出中提取生成的程序。
- 小样本提示:随机选择几个<需求,代码>对作为示例。给定一个需求,它将示例和需求连接在一起,形成一个提示。然后,提示被输入到llm中,llm预测一个新程序。
- 思维链(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:
- 我们根据要求从llm中采样20个SCoT,temperature参数设置为0.8,top-p参数设置为0.95,生成的最大长度为300个token。
- 然后对于每个SCoT,用LLM生成相应的程序,temperature参数设置为0,最大生成长度为300 token,每个需求生成20个代码。两步的总生成长度与CoT提示相同,为600个token。
讨论
- SCoT vs. 伪代码:SCoT与伪代码类似,SCoT实现中间步骤是更好的选择,因为SCoT会自然地将代码生成分解为两个步骤。LLMs首先专注于探索不同的解决方案,然后以标准化的方式实现具体代码。
- SCoT prompting vs. Rank Techniques:两种技术侧重点不同,具有互补性。ChatGPT的性能可以通过添加CodeT和SCoT prompting不断提高。
未来工作
源代码可以用树表示(e.g., 抽象语法树),可以设计一种基于树的提示技术,它使用llm来生成树。
本文标签: 代码论文structuredchainGeneration
版权声明:本文标题:【论文精读-代码生成】Structured Chain-of-Thought Prompting for Code Generation 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726875628a1088312.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论