【论文精读-代码生成】结构化思维链提示在代码生成中的应用
创作时间:
作者:
@小白创作中心
【论文精读-代码生成】结构化思维链提示在代码生成中的应用
引用
CSDN
1.
https://blog.csdn.net/qq_43510916/article/details/136977357
动机
源代码包含丰富的结构信息,任何代码都可以由三种程序结构(即序列、分支和循环结构)组成。直观地说,结构化的中间推理步骤造就了结构化的源代码。因此,我们要求 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生成一个新程序。
- 编写示例二元组<requirement, SCoT>,要求这些例子涵盖了三个基本的程序结构和输入输出结构。再提出一个新需求,送入llm。我们希望llm从示例中学习并为新需求生成一个SCoT。
- 相关工作[25]发现生成模型可能会受到误差累积的负面影响。类似地,在SCoT prompting中,生成的SCoT可能包含噪声(e.g., 错误或遗漏步骤)。这些噪声将进一步对代码实现产生负面影响。本文利用两种方法来缓解误差累积:
- 要求llm再次检查SCoT并修复可能的噪音,允许llm自适应地引用SCoT并滤除噪声。
- 人类开发人员可以首先检查生成的SCoT并修复可能的错误。然后,使用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来生成树。
热门推荐
如何制定有效的互联网营销战略规划?
离职后公司多发工资如何处理
伤口为什么会化脓 伤口化脓怎么处理
如何通过法律手段保护原创文章版权
阳明心学主要内容及其对后世的影响
白松露的价值:营养、好处与药用
头疼急诊挂什么科室
超级产业链|东莞打造世界级智能移动终端产业集群,滨海湾何以成主力军
如何调整供油提前角?这种调整过程有哪些需要注意的关键点和技巧?
大腿一阵一阵神经痛怎么缓解呢
道路事故救助基金怎么申请?交通事故责任认定书多久能出来?
交通事故同等责任医药费谁垫付,法律上有什么规定?
吃豆类胀气怎么处理
宿醉后第二天怎么缓解头晕恶心
燕窝执行标准全解析:从原料到成品的品质保障体系
分布式存储技术:原理、策略与应用
不懂就问,户外爬山要注意什么?
运力管理团队如何管理
静宁果农王恩科:土豆和玉米套种技术的操作方法
工伤赔偿金计算方式详解
华彩算力2024之产业活动
百家姓之3——孙姓,起源·迁徙·家训·名人故事
心理学家荣格:不要试图去改变你的爱人,否则就是在自讨苦吃
INTP逻辑学家的恋爱指南:如何在感性与理性间找到平衡
【小案事不小·小案不小办】房贷断供起纠纷,调解协商解难题
离婚了房子贷款谁还
便携式EL检测仪:基于电致发光原理,实现无损检测
Spring Boot 3配置优先级详解:从默认属性到命令行参数
一碗拉面的热量是多少 减肥怎么降低吃拉面的热量
喝了感冒灵可以喝咖啡吗?专家解析药物与咖啡的相互作用