【论文速读】用于代码生成的结构化思维链提示
【论文速读】用于代码生成的结构化思维链提示
2023年09月16日 23:09 上海
Structured Chain-of-Thought Prompting for Code Generation
论文地址:https://arxiv.org/pdf/2305.06599.pdf
本文讨论的是一种名为Structured Chain-of-Thought (SCoT) prompting的新型提示技术,用于代码生成。与标准的CoT提示不同,SCoT提示明确引入了程序结构,并要求LLMs生成带有程序结构的中间推理步骤。作者将CoT提示和SCoT提示进行了比较,并发现SCoT提示在三个基准测试中明显优于CoT提示。文章还介绍了SCoT提示在两个LLMs(ChatGPT和Codex)上的应用,并在三个基准测试(HumanEval、MBPP和MBCPP)上进行了评估。评估结果显示,SCoT提示在Pass@1上的性能比CoT提示提高了多达13.79%。人工评估结果表明,人类开发者更喜欢SCoT提示生成的程序。SCoT提示对示例具有鲁棒性,并取得了显著的改进。
ABSTRACT
大型语言模型在代码生成方面表现出色,但现有的提示技术在代码生成方面准确率较低。Chain-of-Thought提示技术要求先生成中间的自然语言推理步骤,再输出代码。
本文提出了结构化代码树(SCoTs)和一种新的代码生成提示技术SCoT prompting。SCoT prompting明确约束了LLMs从源代码的角度思考如何解决需求,进一步提高了LLMs在代码生成方面的性能。在三个基准测试中,SCoT prompting优于CoT prompting,人类开发者也更喜欢SCoT prompting生成的程序。SCoT prompting对示例具有鲁棒性,并取得了显著的改进。
ACM Reference Format:
本文介绍了一种基于结构化思维链的代码生成方法,通过提示程序员思考过程中的关键点,提高代码生成的效率和质量。该方法在ACM会议上发表,共12页。
1 INTRODUCTION
代码生成旨在自动生成满足自然语言需求的程序。
将结果初始化为-999999。
遍历列表的列表。
将一个和初始化为0。
遍历列表。
添加元素到总和中。
更新结果为总和和结果中的最大值。
将结果除以K。
要点:生成文本摘要,使用超级精简的话,中文提炼。
最近,语言模型在代码生成方面表现出色。LLMs在推理过程中接受一个包含多个示例和一个新需求的提示作为输入,并根据示例生成新的程序。LLMs的性能严重依赖于提示。如何为代码生成创建有效的提示仍然是一个未解决的问题。
CoT Prompting是最先进的提示技术,通过生成CoT来指导代码生成。它在代码生成方面有轻微的改进,但改进幅度较小。
本文提出了一种用于代码生成的结构化CoT。我们的动机是代码生成旨在将自然语言需求转换为源代码。与自然语言不同,源代码包含丰富的结构信息。例如,源代码包含三种基本结构。
本文提出了一种结构化的代码生成方法,利用LLMs的推理能力生成程序结构,以解决标准CoT在代码生成中精度低的问题。通过构建一系列中间推理步骤,使得代码生成更加连贯和可读。
SCoT是一种基于三种基本结构的代码生成工具,包括顺序结构、分支结构和循环结构。SCoT使用循环结构来清晰地描述迭代,而CoT中两个迭代的作用域不明确。此外,每个程序都包含必需的输入输出结构,包括输入输出参数和它们的类型。生成输入输出结构有助于LLMs分析需求并确定代码的入口和出口,从而有利于后续的解决过程。
SCoT prompting是一种新的提示技术,通过引入程序结构来帮助LLMs生成和实现代码,从而提高准确性。
本文研究了SCoT提示对两种常见的LLMs(ChatGPT和Codex)在三个基准测试中的影响,并使用单元测试来评估生成程序的正确性。实验结果表明,SCoT提示显著提高了LLMs在代码生成方面的准确性,并且人类开发者更喜欢使用SCoT提示生成的程序。SCoT提示对不同的LLMs和编程语言都有效,并且不依赖于特定的示例或写作风格。
本文的贡献总结如下:
本文提出了一种基于程序结构的中间推理步骤构建方法——SCoT,并提出了一种名为SCoT Prompting的代码生成提示技术。实验结果表明,SCoT Prompting显著优于SOTA基线。同时,本文还讨论了不同程序结构的贡献和SCoT Prompting的鲁棒性。
我们开源了我们的复制包,包括数据集和SCoT提示的源代码,以便其他研究人员和实践者重复我们的工作并验证他们的研究。
2 METHODOLOGY
本节介绍了一种名为SCoT的结构化思维链条,它由程序结构构建的多个中间推理步骤组成。然后,提出了一种名为SCoT提示的代码生成新技术。SCoT提示首先要求LLMs生成一个SCoT,然后输出最终的代码。在子节中,首先描述了SCoT的设计,然后展示了SCoT提示的详细信息。
2.1 Structured Chain-of-Thought
Chain-of-Thought是一种自然语言推理方法,用于描述解决问题的步骤。它最初用于自然语言生成,但在代码生成方面的应用效果有限。在HumanEval基准测试中,添加Chain-of-Thought只能使ChatGPT的Pass@1得分提高0.82分。
本文提出了一种结构化的代码生成方法,与自然语言生成不同,代码生成的目标是高度结构化的代码。源代码通过特定的结构来解决问题,包括序列结构、分支结构和循环结构。因此,生成代码的中间推理步骤也应该是结构化的。
SCoT相比CoT,明确引入了程序结构,包括序列结构、分支结构和循环结构。现有研究证明,任何简单或复杂的程序都可以由这三种基本结构组成。
•序列结构:中间步骤按顺序排列,所有步骤处于同一级别。•分支结构:以条件开始,并根据条件的不同结果放置不同的中间步骤。
本文介绍了程序中的分支结构和循环结构,分支结构包括if、if...else和if...elif...else三种格式,循环结构包括for循环和while循环两种基本格式。
允许不同程序结构之间的嵌套,使LLMs能够为一些复杂的要求设计更复杂的SCoT。SCoT灵活地使用各种程序结构来构建解决过程。
除了三种基本结构外,我们还添加了输入输出结构,其中包含输入输出参数及其类型。这是因为程序需要一个输入输出结构来指示入口和出口。生成输入输出结构有助于澄清需求并生成解决过程。
2.2 SCoT prompting
基于SCoT,我们提出了一种新的代码生成提示技术,称为SCoT提示。它首先要求LLMs生成一个SCoT,然后输出最终的代码。
为了实现SCoT提示,我们设计了两个特殊的提示。第一个提示用于生成SCoT,示例如图3所示。提示以几个示例(即<需求,SCoTs>)开头。这些示例涵盖了三种基本的程序结构和输入输出结构。接下来,斜体句子是给LLMs的指令,指示LLMs的目标和相关约束。最后,提示以一个新的需求结束,并输入LLMs。我们希望LLMs能够从示例中学习,并为新的需求生成一个SCoT。
生成SCoT后,我们为生成最终代码设计了第二个提示。示例提示如图4所示。
使用SCoT作为软模板,要求LLMs实现一个程序,根据给定的需求和代码生成摘要。
LLMs通过学习示例,根据要求和SCoT生成新的程序。
本文介绍了SCoT提示的两种方法来减轻错误积累的影响。第一种方法是让LLMs检查SCoT并修复可能的噪声。第二种方法是SCoT提示使用两步生成管道,提供了一个调试的机会。人类开发人员可以先检查生成的SCoT并修复可能的错误,然后使用SCoT生成代码。
2.3 Implementation Details
SCoT是一种不依赖于特定LLM的代码生成提示技术。本文以ChatGPT为默认LLM,选择几个真实基准测试数据中的<需求,代码>对作为示例种子,手动编写SCoT并获得<需求,SCoT,代码>三元组,用于生成提示。未来,用户可以灵活地将该方法应用于更强大的LLM中。
3 STUDY DESIGN
本研究旨在评估SCoT提示的有效性,通过进行大规模研究回答四个研究问题。本节介绍了我们的研究细节,包括数据集、评估指标、比较基线和实现细节。
3.1 Research Questions
本研究旨在回答以下研究问题:
本研究旨在验证SCoT提示在代码生成中的准确性是否高于现有的提示技术。研究采用了三种现有的提示技术和SCoT提示技术,并应用于两个LLM模型。通过使用单元测试来衡量不同方法生成的程序的正确性,并报告Pass@k指标。
本研究雇佣了10名开发人员对SCoTprompting和基准生成的程序进行手动评估。评估包括正确性、代码质量和可维护性三个方面。
本研究旨在评估SCoT提示对示例的鲁棒性。通过使用不同的示例种子和写作风格,测量SCoT提示的性能。
本研究旨在分析SCoT提示中不同程序结构的贡献。研究选择LLM作为基础模型,分别移除不同的程序结构并报告性能波动。SCoT提示引入了三种基本结构和输入输出结构。
3.2 Benchmarks
本文介绍了三个代表性的代码生成基准测试,包括Python中的HumanEval和MBPP,以及C++中的MBCPP。这些测试的详细信息在文中有描述。
这段文字介绍了三个编程基准测试:HumanEval、MBPP和MBCPP。它们分别包含手写编程问题、简单数字操作和基本库使用的编程问题,以及对函数正确性的测试。其中,MBCPP是通过众包收集的C++函数级别代码生成基准测试。
本文介绍了三个数据集的统计信息,随机从训练数据中选取样本作为提示,测试数据上评估不同方法的性能。在HumanEval中使用MBPP的示例。
3.3 Evaluation Metrics
本研究使用Pass@𝑘作为评估指标,𝑘的取值为1、3和5。Pass@𝑘表示在给定需求下,生成的程序中有多少能通过所有测试用例。我们认为开发者在实际场景中主要使用前5个输出。
之前的研究发现标准的Pass@k存在高方差,提出了无偏的Pass@k。本文遵循之前的研究。
本文介绍了如何使用无偏的Pass@k方法来评估工作和就业需求。具体来说,我们根据需求生成n个程序(n≥k,本文中n=20,k∈[1, 3, 5]),统计满足需求的数量c,并计算无偏的Pass@k值。
之前的代码生成研究使用了基于文本相似度的度量标准,但这些标准最初是为自然语言生成设计的,对于程序的正确性评估效果较差。因此,在我们的实验中我们不使用这些度量标准。
3.4 Comparison Baselines
本文提出了一种新的代码生成提示技术,并选择了三种主流提示技术作为基准进行评估。
LLMs可以通过零样本提示和少样本提示来生成程序。Chain-of-Thought提示是少样本提示的一种变体,它包含了自然语言推理步骤。
为了公平比较,所有基线和SCoT提示都有相同数量的示例和示例种子。
选择基线的标准有三个:(1) 直接将SCoT提示技术与现有的代码生成提示技术进行比较;(2) 我们的方法是增强LLMs的,可以灵活地应用于不同的LLMs;(3) 我们不考虑一些代码生成排名技术,因为它们与我们的方法是互补的。
3.5 Base Large Language Models
现有的源代码LLM可以分为两类。
本文介绍了两种类型的自然语言处理模型:语言模型和指令调整模型,并选择了代表性的基础模型。
本文介绍了两种语言模型:标准语言模型和指令调整模型。标准语言模型用于代码自动完成,而指令调整模型则是在标准语言模型基础上进行指令训练,用于执行任务。本文选用了Codex和ChatGPT作为基础模型,并使用OpenAI的API进行访问。
我们的方法不依赖于特定的LLMs,可以轻松应用于不同的LLMs。未来,我们将探索在更强大的LLMs上使用它的可能性。
3.6 Sampling Settings
本研究使用核心采样方法从LLMs中解码程序,以确保实验的公平性。所有基准模型和SCoT提示生成器每个需求生成20个程序。采样设置的详细信息如下。
本文介绍了温度、top-p值和生成长度等基础概念,并说明了CoT提示需要更长的生成长度,因为它需要生成中间推理步骤和代码。
SCoT提示:从LLMs中每个要求中抽取20个SCoTs,温度为0.8,top-p为0.95,最大生成长度为300个标记。然后,对于每个SCoT,使用LLMs生成相应的程序,温度为0,最大生成长度为300个标记。最终,每个要求得到20个程序。总生成长度与CoT提示相同。
4 RESULTS AND ANALYSIS
4.1 RQ1: How does SCoT prompting perform interms of accuracy compared to baselines?
本研究使用SCoT提示和基线对三个基准进行测试,并使用单元测试来衡量生成程序的正确性。
本文介绍了在两个LLMs上应用基线和SCoT提示的设置,并使用Pass@k方法在三个代码生成基准测试中测量不同方法的性能。
表2展示了不同方法的Pass@k(k∈[1,3,5])结果。红色数字表示SCoT提示相对于SOTA基线-CoT提示的相对改进。
SCoT prompting在代码生成任务中取得了最好的结果,比其他基准模型更能生成正确的程序。与SOTA基准模型CoT prompting相比,SCoT prompting在三个基准测试中的Pass@1指标上分别提升了13.79%、12.31%和6.63%。SCoT prompting在不同的LLMs和编程语言中都表现出了有效性,并且能够解锁LLMs在代码生成中的推理能力。SCoT prompting通过引入程序结构来生成中间推理步骤,进一步提升了LLMs的推理能力。
4.2 RQ2: Do developers prefer programsgenerated by SCoT prompting?
本研究聘请10名开发人员对SCoT生成的程序进行手动审核,旨在帮助开发人员编写程序。代码生成的最终目标是辅助开发人员编写程序。
为了保证评估的公正性,我们采用了先前研究中人类评估的设置。我们仔细检查了评估设置,并认为我们的设置是可靠的。具体来说,我们手动评估生成的程序在以下方面:...
评估程序的要点包括正确性和代码质量。正确性根据是否满足要求进行评分,代码质量则根据是否存在代码异味进行评分。
该评分标准主要考虑了代码的可读性、性能和可维护性。其中,可读性包括变量命名的语义和代码的重复性;性能包括代码的效率和资源的释放;可维护性包括代码的规范性和可读性。评分标准分为0-2分,分别对应不好、一般和好。
本文介绍了SCoT程序生成模型的评估方法,包括评估指标、评估程序和评估者。通过示例和讨论,将每个评估指标的得分设置为0到2之间的整数。最终,邀请10名开发人员对800个生成的程序进行匿名评估,每组由两名评估者评估,最终得分为两名评估者的平均分。评估者可以在评估过程中搜索互联网。
人类评估结果表明,SCoT提示相对于SOTA基线-CoT提示有显著改进,所有p值都远小于0.05。详见表3。
SCoT提示在所有基线中在三个方面中获得最高分。具体而言,SCoT提示在错误性方面超过了SOTA基线-CoT提示15.27%,在代码质量方面超过了10.66%,在可维护性方面超过了15.90%。
SCoT是一种新的程序结构约束方法,可以帮助LLMs生成更准确、更规范的代码,减少代码异味。SCoT通过三种基本结构来探索多样化的解决方案,提高了代码的正确性。
图5展示了由SCoT提示和few-shot提示生成的两个程序。两个程序都通过了单元测试。但是few-shot提示生成的程序中包含了一个非常复杂的语句。开发人员需要花费大量的精力来理解和维护这个程序。相比之下,SCoT提示生成的程序具有良好的可读性,并且SCoT清楚地解释了代码的行为。开发人员可以将SCoT作为程序的注释,用于未来的维护。
4.3 RQ3: Is SCoT prompting robust to examples?
本研究探讨了SCoT提示对于不同样例的鲁棒性。由于SCoT提示需要手动编写样例,因此不同的样例会影响其性能表现。本研究旨在探究SCoT提示对于样例的鲁棒性。
本研究旨在评估SCoT提示对于种子选择和写作风格的鲁棒性。我们手动编写了一些SCoT示例,用于种子选择和提示。
该研究旨在验证SCoT提示不依赖于特定的种子和写作风格。通过选择不同的种子和聘请不同的注释者来进行实验,以评估SCoT提示的性能。
我们使用ChatGPT作为基准模型,在HumanEval中评估CoT提示的鲁棒性。
结果显示在表5和表6中。
SCoT提示在不同的示例种子或注释者下表现出强大的鲁棒性,远优于CoT提示。这证实了SCoT提示不依赖于特定的种子或写作风格,并显示了SCoT的改进。
程序结构中的提示来自于整体结构,而非具体示例细节。
SCoT提示在不同设置下表现略有差异,但仍然优于CoT提示。这是预期的,因为提示技术使用示例。
4.4 RQ4: What are the contributions of differentprogram structures in SCoT prompting?
本节中提到,SCoT提示引入了基本结构(即序列、分支和循环)和输入输出结构。这个研究问题旨在分析不同程序结构的贡献。
本文研究了ChatGPT模型的基本结构和输入输出结构对模型性能的影响,进行了削减实验。当削减基本结构时,使用CoT模型作为中间步骤;当削减输入输出结构时,SCoT模型只包含基本结构的求解过程。
本文结果见表4,其中“w/o”表示无。
设计可行的解决过程需要三种基本结构。在表格4中,去除基本结构后。
SCoT提示的性能明显下降。LLMs受益于使用基本结构来清晰地编写解决过程。SCoT提示使用三种基本结构来描述解决过程,SCoT清晰且类似于代码,有利于以下代码实现。
IO结构有助于理解需求,删除IO结构后,SCoT提示的性能略有下降。分析失败的案例后发现,IO结构有助于理解需求。添加IO结构后,LLMs首先对输入输出格式进行推理,并正确返回布尔值。
5 DISCUSSION
5.1 SCoT vs. Pseudocode
SCoT与伪代码相似,但SCoT更抽象,使用自然语言概括操作。26%的SCoT与伪代码非常相似,有助于使用和维护;74%的SCoT与伪代码不同,更抽象。
SCoT比伪代码更好,因为它将代码生成分解为两个步骤,先探索多样化的解决方案,然后再以标准化的方式实现程序。我们设计了SCoT的变体来验证这一点。
本文介绍了一种名为SCoT Prompting的新型文本生成模型,它比SCoT-P Prompting更加准确。作者将SCoT Prompting和SCoT-P Prompting应用于ChatGPT,并对其准确性进行了测试。结果表明,SCoT Prompting在三个基准测试中表现优异,证明了其优越性。
5.2 SCoT prompting vs. Rank Techniques
最近的研究提出了一种使用排名技术来提高LLMs在代码生成上的性能的方法。这些研究首先从LLMs中采样许多程序,然后使用测试用例或神经网络对采样的程序进行重新排序。其中一种流行的排名技术是CodeT,它通过大规模采样并在自动生成的测试用例上执行采样的程序,根据执行结果对程序进行重新排序。本文不直接将我们的方法与排名技术进行比较,原因有两个。
本文介绍了SCoT提示和排名技术的不同重点和互补性,旨在设计一种新的提示技术并提高LLMs在代码生成中的准确性。实际应用中,用户可以使用SCoT提示生成多个程序,然后使用排名技术选择最终输出。
本文介绍了一项实验,验证了SCoT提示和排名技术的互补性。通过逐步引入CodeT和SCoT提示,以ChatGPT为基础模型,在MBPP上进行了实验。结果显示,SCoT提示和排名技术的结合可以提高文本摘要生成的效果。
ChatGPT通过添加CodeT和SCoT提示不断提高性能。
排名技术需要在测试用例上执行程序并使用执行结果重新排名程序,但这种方法有限制,无法应用于未完成的项目。SCoT提示方法不使用执行结果,适用于更广泛的场景,因此与排名技术不可直接比较。
5.3 Threats to Validity
我们工作的有效性面临三个主要威胁。
为了减少实验结果的泛化威胁,研究者们精选了三个代表性的代码生成基准测试,并选择了广泛使用的评估指标Pass@k。同时,他们选择了最先进的提示技术作为比较基线,并在第四节进行了全面比较。SCoT提示和基线具有相同的示例种子和最大生成长度。
本文研究了SCoT提示对于代码生成的影响,与CoT提示相比,SCoT提示采用了两步生成代码的方式。但是,实验结果表明,SCoT提示的改进并不是由于两步生成代码的方式,而是由于程序结构的改进。同时,本文还进行了消融实验,结果表明,去除提示结构后,SCoT提示的性能显著下降。因此,SCoT提示的改进主要来自于程序结构的改进。
该研究探讨了语言模型的提示技术,存在数据泄漏的可能性,但不影响实验公正性。研究选择了特定的语言模型作为基础模型,并对其应用不同的提示技术,因此报告的相对改进是可信的。未来将添加最新的基准数据以缓解此威胁。
6 RELATED WORK
大型语言模型(LLMs)用于源代码,是预先训练的神经网络,包含自然语言文本和源代码。现在,LLMs可以分为两类:标准语言模型和指令调整模型。
标准语言模型是在大规模语料库上进行预训练的,其目标是预测下一个标记。它们主要用于完成给定上下文的补全,如代码补全。OpenAI在GPT系列在自然语言处理领域取得成功后,对代码进行微调,产生了闭源的Codex。随后出现了许多开源的复制尝试,如CodeParrot、CodeGen、CodeGeeX、InCoder、StarCoder和CodeT5+。
这段文字介绍了指令调整模型,即通过训练模型理解人类用户的指令并执行任务。ChatGPT、Alpaca、Code Alpaca、WizardCoder和InstructCodeT5+都是基于指令调整的模型。它们在自然语言和编程任务方面表现出色。
Prompting Techniques是一种流行的方法,利用LLMs通过输入特殊提示来生成代码,因为参数太多,直接微调LLMs很困难。
研究者提出了零样本提示和少样本提示。零样本提示将任务说明和需求连接在一起,形成提示。少样本提示在零样本提示的基础上,添加了几个需求和代码对,以便LLMs可以从给定的示例中学习代码生成。
CoT prompting是一种新的提示技术,可以帮助LLMs生成自然语言推理步骤并输出最终代码。它在自然语言生成方面取得了SOTA结果,但在代码生成方面的改进较小。该技术已经引起了许多后续研究。
本文提出了一种新的提示技术,名为结构化思维链(SCoT)提示。与标准的CoT提示不同,SCoT提示明确引入了程序结构,并要求LLMs生成带有程序结构的中间推理步骤。我们在第4节中比较了CoT提示和SCoT提示。结果显示,SCoT提示在三个基准测试中明显优于CoT提示。
7 CONCLUSION AND FUTURE WORK
本文介绍了生成代码的最新方法——使用Chain-of-Thought(CoT)提示的大型语言模型(LLMs)。CoT是多个自然语言推理步骤的中间步骤,但CoT提示在代码生成方面的准确性仍然较低。
本文提出了一种名为SCoT的结构化CoT和一种新的代码生成提示技术SCoT prompting。SCoT prompting要求LLMs使用程序结构(即序列、分支和循环结构)生成SCoT,然后根据SCoT生成代码。在三个基准测试中,SCoT提示在Pass@k和人类评估方面显著优于CoT提示。此外,SCoT提示对示例具有鲁棒性,并获得稳定的改进。
未来,我们将探索新的代码生成提示技术,例如,可以用树(例如抽象语法树)表示源代码。我们可以设计一种基于树的提示技术,使用LLMs生成树。
论文速读340
论文速读 · 目录
上一篇【论文速读】思维链提示引发知识增强下一篇【论文速读】思维树:让大语言模型有意识地解决问题