注释作为自然逻辑的中心:通过注释视角改进代码生成
+ +摘要
+代码生成旨在理解问题描述并生成相应的代码片段,现有工作通常通过提示策略(如思维链和其变体)将这些复杂任务分解为中间步骤。虽然这些研究取得了一定的成功,但它们的有效性在很大程度上取决于先进的大型语言模型(LLMs)(如GPT-4),特别是在API调用方面,这显著限制了它们的实际适用性。因此,如何增强小型和中等规模代码LLMs的代码生成能力而不显著增加培训成本是一个吸引人的挑战。在本文中,我们建议代码注释是自然语言和代码语言之间的逻辑枢纽,并提出使用注释来增强代码LLMs的代码生成能力。具体而言,我们提出了MANGO(作为自然逻辑枢纽的注释),包括注释对比训练策略和相应的逻辑注释解码策略。在HumanEval和MBPP上进行了实验,利用StarCoder和WizardCoder作为骨干模型,涵盖了3B到7B之间的模型参数大小。结果表明,MANGO显著提高了基于强基线的代码通过率。与此同时,逻辑注释解码策略的鲁棒性明显高于思维链提示。该代码可在https://github.com/pppa2019/Mango上公开获取。
+注释作为自然逻辑的中心:通过注释视角改善代码生成
++
+ + + +陈一杰<PLACEHOLDER_0/>, 刘一津<PLACEHOLDER_1/>, 孟凡东<PLACEHOLDER_2/>, 陈宇峰<PLACEHOLDER_3/>, 徐济南<PLACEHOLDER_4/>, 周杰<PLACEHOLDER_5/> + +<PLACEHOLDER_6/>中国北京交通大学 + +<PLACEHOLDER_7/>腾讯公司微信人工智能模式识别中心 + +{22120354, chenyf, jaxu}@bjtu.edu.cn + +{yijinliu, fandongmeng, withtomzhou}@tencent.com + +
+1 介绍
+最近,针对预训练的大型语言模型(Code LLMs)的技术正在迅速发展Zhao et al. (2023)并在各种与代码相关的任务上表现良好Roziere et al. (2023); Chen et al. (2021)。代码生成是通过提示方法为给定的自然语言描述和可选的额外信息(例如,数据类型、函数名称和单元测试示例)生成代码片段。此外,自然语言描述通常包含复杂逻辑,使得直接提示难以解决困难问题。通过“思维链”提示策略将复杂问题分解为更容易的中间步骤在一般复杂任务中表现出有希望的性能。对于代码生成,后续工作将规划和代码合成过程分为两个阶段,使用单任务少样本提示Jiang et al. (2023)或使用树结构的中间步骤Zelikman et al. (2023)。此外,使用代码结构信息约束中间步骤也可以进一步提高编码能力Li et al. (2023a)。然而,任务分解和规划是高级和复杂的任务,这取决于LLMs的最先进能力Zelikman et al. (2023)。因此,有效增强小到中型LLMs的代码生成提出了一个引人注目且具有挑战性的问题。
+为了解决上述问题,我们首次提出代码注释作为自然语言和编程语言之间固有逻辑枢纽的想法。通常,代码中的注释通常是代码语料库的一部分。因此,在预训练阶段,在代码语料库上的训练赋予了预训练的代码模型理解和生成代码注释的相应能力。如图1所示,代码注释可以使用自然语言分解问题描述,每个注释行与相邻的代码行建立了对齐。因此,我们假设鼓励模型生成注释可以轻松有效地连接代码和复杂的问题描述。为了测试我们的假设,我们讨论了中间步骤的可能插入位置,并使用交叉熵损失来评估各种插入样式代码的难度。根据统计结果,我们发现注释样式的代码对于各种代码模型来说是最容易的,这为假设提供了证据。基于上述假设,我们提出了用于通过注释分解问题描述进行代码生成的注释作为自然逻辑枢纽(MANGO)。MANGO包括逻辑注释解码策略和注释对比学习损失。具体来说,在训练阶段,我们使用开源数据集中带有注释的代码数据生成没有注释的负样本,以加强模型对带有注释的代码的偏好。在解码阶段,采用逻辑注释解码策略来引导模型通过内联注释解释代码逻辑。
+我们使用来自3B到7B的三个主干模型在HumanEval和MBPP测试集上进行实验。实验结果表明,MANGO持续提高了通过率,例如,在HumanEval上StarCoder-7B的pass@10最高达到7.52,在MBPP上WizardCoder-7B的pass@10最高达到4.17。我们的消融研究表明,该方法的每个组成部分都对模型的性能有积极贡献,并且该方法对超参数和各种逻辑注释提示样式具有鲁棒性。此外,MANGO在小型模型上保持一致的有效性(例如,在3B和7B上pass@10的改进最高分别为3.87和4.07),而CoT提示可能会导致严重下降,特别是在3B模型中。还提供了错误分布和代码特征数据统计,以进行细粒度分析。
+总之,我们的贡献如下:111我们上传了代码作为审阅的支持材料,并将在出版后在Github上发布。
+-
+
-
+•
+++
我们首先提出注释是连接自然语言和编程语言的枢纽,并对比不同插入分解步骤位置的复杂问题描述的难度进行分析。据我们所知,这是第一项全面探索代码注释在编程问题分解中显著优势的工作。
+
+ -
+•
+++
我们提出了MANGO,其中包括对比训练方法和注释提示策略。 MANGO通过加强对带有注释的代码的偏好并鼓励模型使用注释来提高模型的代码生成能力。
+
+ -
+•
+++
CoT提示策略与我们的方法之间的比较表明,在小型和中型模型尺寸上,代码注释的有效性。我们分别对CoT和逻辑注释提示策略进行了鲁棒性评估,发现与CoT提示相比,LCP在标准偏差较小的情况下表现更好。
+
+
2 初步分析:注释相关代码风格的令牌级损失
+将困难问题分解为更容易的中间步骤有利于LLM的代码生成能力,在许多现有作品中,尤其是基于API的闭源模型。然而,大多数任务分解方法只能在像GPT-4这样的最先进模型上运行,并且它们对于小型或中型开源模型的适用性有限。因此,我们假设降低分解方法的困难度可以有利于降低模型能力的要求,使用注释是可能的方法之一。我们定义了带有注释解释的代码的可能样式,并量化了它们在零热启动设置中对模型的困难程度。首先,我们利用WizardCoder-3B和WizardCoder-7B作为骨干模型,以及开源代码生成指令调整数据集CodeM作为评估数据集。我们筛选了带有注释的数据,提取了注释行,并将其转换为思维链。然后,给定一个任务分解步骤为,相应的代码块为(其中和是代码块编号),我们构建了三种类型的代码,包括具有前导思维链的代码(CoT-pre,可以表示为),后续思维链(CoT-post,可以表示为),以及内联注释(Comment,可以表示为)。转换后的CoT样式数据集包含与原始注释样式数据集相当的信息。使用标记级交叉熵损失,我们计算了不同大小模型中三个数据集的平均损失,包括3B和7B。如图2所示,注释包含与最低难度等价的信息。我们分析了输出代码,并发现自然语言标记的损失分数通常高于编程语言标记的损失分数,这也在Zhu et al. (2023)中提到。然而,当自然语言的中间步骤被插入代码行作为注释时,它们的损失分数显然会降低。在表1中,我们观察到注释损失明显低于不同的CoT数据,且在模型尺寸较小时,cot样式和注释样式之间的差距更大。上述观察结果支持我们的假设,即包含逻辑步骤的代码作为注释降低了模型的分解任务难度(尤其是对于较小的模型)。
+Code Type | +Wizardcoder 3b | +Wizardcoder 7b | +
---|---|---|
CoT-pre | +0.5318 | +0.4784 | +
CoT-post | +0.5606 | +0.5241 | +
Comment | +0.3384 | +0.3086 | +
3 芒果
+我们提出了一种简单而有效的方法MANGO,包括注释对比学习损失和逻辑注释提示。
+3.1 背景:在代码生成任务上进行监督微调
+代码生成任务的输入通常包括自然语言描述和可选的编程上下文。我们将这样的输入表示为一个标记列表。给定,期望通过代码LLM生成相应的代码片段。在标准监督微调中,代码LLM被训练以基于交叉熵损失来预测下一个标记,如方程1所示。
++ | + | + | (1) | +
3.2 注释对比学习
+在代碼片段中,代碼注釋自然地扮演著使用自然語言文本解釋本地代碼行的角色,其中邏輯的分解也作為注釋的功能。然而,直接微調損失函數將所有標記視為等效,而不對注釋進行額外的區分。為了適應引導模型生成注釋的任務,我們採用對比學習方法來鼓勵模型在微調過程中更加強調代碼注釋。
+我们的方法包括以下步骤。首先,为了准备用于注释对比学习的数据,我们从训练数据中筛选出包含注释的示例。以开源数据集 Code-Python 为例,该数据集包含一半带有注释的示例。对于包含注释的代码片段 ,我们使用开源代码解析工具 222https://github.com/pygments/pygments 来移除注释,并获得非首选的对比样本 。然后,我们通过设置标签可能性的边际 ,为带有注释 和不带注释 的标签添加对比损失 。
++ | + | + | (2) | +
最终的损失是标准交叉熵损失和对比损失的加法。
++ | + | + | (3) | +
Prompt Type | +Content | +|||||
---|---|---|---|---|---|---|
Standard | +
+
|
+|||||
+\hdashlineLCP | +
+
|
+
3.3 LCP: 逻辑注释提示
+为了使模型能够有意地将注释作为中间步骤使用,向提示中添加相应的说明是成本最低的方法。我们使用逻辑注释提示策略来指导模型在解码阶段生成解释代码逻辑的注释。在包括特定编程语言中生成代码的问题描述和指令的标准提示后,逻辑注释提示显示在表2中,其中添加了用注释解释逻辑:或类似的文本。
+setting | +HumanEval | +MBPP | +||||
Pass@1 | +Pass@5 | +Pass@10 | +Pass@1 | +Pass@5 | +Pass@10 | +|
StarCoder-7B | +||||||
SFT | +35.93 | +55.69 | +63.01 | +42.79 | +56.41 | +61.13 | +
\wCoT | +22.40 | +49.39 | +58.95 | +26.45 | +52.27 | +59.87 | +
\wLCP | +39.17 | +61.91 | +70.12 | +41.11 | +57.68 | +63.27 | +
MANGO | +39.73 | +62.81 | +70.53 | +40.92 | +57.68 | +63.53 | +
WizardCoder-3B | +||||||
SFT | +33.37 | +51.43 | +58.12 | +35.98 | +51.51 | +56.80 | +
\wCoT | +17.28 | +41.09 | +51.83 | +21.38 | +44.89 | +52.20 | +
\wLCP | +34.17 | +56.07 | +63.82 | +34.79 | +51.23 | +57.47 | +
MANGO | +34.47 | +54.55 | +61.99 | +35.53 | +52.04 | +58.27 | +
WizardCoder-7B | +||||||
SFT | +52.80 | +69.74 | +74.59 | +42.73 | +56.77 | +62.33 | +
\wCOT | +42.50 | +68.68 | +75.20 | +31.25 | +52.65 | +59.67 | +
\wLCP | +52.95 | +70.70 | +75.81 | +41.96 | +57.82 | +63.27 | +
MANGO | +54.59 | +72.76 | +78.66 | +46.91 | +62.26 | +67.87 | +
4 实验和结果
+在这一部分,我们对不同的基准和骨干模型进行了我们方法的实验,接下来的部分描述了实验的细节。
+4.1 训练设置
+我们从3B到7B选择了最先进的开源骨干WizardCoder和StarCoder。 +我们使用codem-python Zan et al. (2023) 作为训练数据,其中包括从GPT-4中提炼出的9600个Python示例,使用Evol-instruct Xu et al. (2023)。 +我们的训练脚本主要遵循WizardCoder Luo et al. (2023),并使用批大小为256进行3个epoch(111步)的训练;热身步骤为15。对于我们注释对比训练损失中的超参数边界 ,我们在实验中为所有模型设置了 。 +我们使用DeepSpeed333https://github.com/microsoft/DeepSpeed阶段1进行分布式训练。我们标准的监督微调实现结果与CodeM-Python Zan et al. (2023) 的贪婪搜索策略中的Pass@1结果的误差范围在1%之内,这表明我们的实验设置与现有工作相比能够产生一致的结果。
+SFT(监督微调)
+我们在WizardCoder Luo et al. (2023)中构建了CodeM-Python数据集的标准指令模板,训练目标是交叉熵。
+CoT (思维链)
+ +LCP(逻辑注释提示)
+这个设置使用LCP策略来指导标准微调模型,生成带有注释的代码。在实验中使用的详细提示显示在表2中。
+MANGO
+ +解码设置
+我们遵循CodeLLaMA中的设置Roziere et al. (2023),使用温度和核取样。我们生成n = 10个样本并计算Pass@k,其中k = 1, 5, 10。
+4.2 评估设置
+评估指标
+Pass@k Chen et al. (2021) 目前是代码生成中最广泛使用的度量标准。它意味着在采样 个样本的情况下,任何代码正确的可能性在 个样本中。
++ | + | + | (4) | +
+HumanEval HumanEval
HumanEval is a tool for evaluating human performance.
Source: HumanEval Documentation +HumanEval Chen et al. (2021) 目前是最广泛使用的用于代码生成的数据集。它包含了164个用Python编写的问题,用于评估编程语言理解、算法和基本数学。对于每个问题,平均包含7.7个单元测试。
+MBPP
+MBPP Austin et al. (2021) 测试集包含500个Python问题。这些问题涵盖了基本的编程概念和标准库功能。每个问题包括一个任务描述、代码解决方案和3个自动化测试案例。
+4.3 主要结果
+在评估MANGO的有效性时,我们利用HumanEval和MBPP的通过率作为我们主要的评估指标。主要结果见表3。总体上,我们观察到三个主要方面。第一,将SFT基线与MANGO进行比较,我们在各种规模和骨干上都展示了一致的增强。值得注意的是,StarCoder-7B在Pass@10的HumanEval中显著增加了7.52个百分点。在WizardCoder-7B的情况下,MBPP测试集的Pass@10结果增加了4.17个百分点。其次,在CoT设置中比较骨干的通过率,我们观察到所有情况下模型表现均有所下降,较小的3B模型中表现出更明显的差距。相比之下,LCP提示始终有助于提高模型性能,展示其稳定性和有效性。第三,在对LCP和MANGO进行消融时,我们观察到在HumanEval和MBPP测试集上,经过标准微调的StarCoder-7B仅通过LCP提示就能达到显著更高的分数。这一观察强调了低成本提示方法的巨大潜力。
+考虑到在零射击设置下提供可比较的结果的便利性,我们还提供了Pass@1的贪婪搜索结果,以便与现有作品的结果进行比较。由于Pass@1是最严格的指标,因此比Pass@10更难改进。根据表4中的结果,零射击CoT提示持续导致模型性能下降;然而,当使用LCP提示时,Pass@1的改善是可观的。
+Model | +Pass@1 | +Pass@5 | +Pass@10 | +
---|---|---|---|
GPT-4 | +67.00* | +– | +– | +
CodeLLaMA-7B | +38.40* | +– | +– | +
StarCoder-7B | +26.83* | +– | +– | +
WizardCoder-7B | +55.50* | +76.03 | +82.31 | +
WizardCoder-3B | +34.80* | +51.72 | +59.75 | +
w/ CoT | +25.61 | +40.05 | +48.78 | +
w/ LCP | +36.59 | +51.57 | +59.15 | +
4.4 对训练方法的消融研究
+我们通过对WizardCoder-7B进行的消融研究来评估MANGO的两个组成部分的有效性。所使用的测试集是HumanEval,并且我们遵循主要的实验设置,其中T=0.8,p=0.95。根据表5和表3所呈现的结果,注释提示和对比训练损失都有助于提高Pass@10的通过率。此外,集成这两个组成部分可以进一步增加通过率的性能。
+Setting | +Pass@1 | +Pass@5 | +Pass@10 | +
---|---|---|---|
SFT | +52.80 | +69.74 | +74.59 | +
w/ LCP | +52.95 | +70.70 | +75.81 | +
w/ + | +55.47 | +71.75 | +76.02 | +
MANGO | +54.59 | +72.76 | +78.66 | +
4.5 边距的影响
+我们通过LLMs对没有注释的代码表示进行边缘化,并使用超参数边缘来控制负边缘化的程度。我们在HumanEval上对WizardCoder-7B进行了各种边缘设置的检查,并遵循解码设置T=0.8。表6中的结果表明,MANGO在大于0.05的边缘下可以胜过基线。然而,当边缘为0.03时,模型的性能在Pass@5和Pass@10上显著下降,这表明模型对边缘值敏感。
+Margin | +Pass@1 | +Pass@5 | +Pass@10 | +
---|---|---|---|
0.03 | +53.11 | +70.42 | +75.20 | +
0.05 | +53.66 | +72.98 | +78.66 | +
0.10 | +54.59 | +72.76 | +78.66 | +
0.15 | +53.13 | +73.00 | +79.88 | +
5 分析
+5.1 针对LCP和CoT的稳健性研究
+我们重新表述了提示,以减轻模型对不同提示样式的响应的随机性。最初,我们手动为LCP和CoT创建了三个提示,这些提示作为种子提示。随后,我们使用GPT-4为每个提示生成了四个额外的变体。此外,为了进行更细致的分析,我们将CoT分为两类:第一类涉及在生成最终代码之前指定思维链文本,代表了最典型和普遍的形式;第二类是无位置约束指导的自由风格CoT。最终,我们为每个类别提供了15个提示。完整的提示在附录中提供。
+表中的结果表明,LCP提示策略的平均性能要高得多,标准偏差要低得多。值得注意的是,没有位置约束的CoT平均性能比典型的CoT要高,并且偏差更大。
+除了最常用的独立自然语言计划之外,在实际编码之前,该模型还可以将CoT解释为代码的解释性注释。LCP方法建议将中间步骤作为注释并入,从而稳定模型行为,并提高其性能,与直接生成代码问题相比。
+Setting | +Pass@1 | +Pass@5 | +Pass@10 | +
---|---|---|---|
CoT-Pre | +|||
Avg | +33.24 | +61.88 | +71.38 | +
StDEV | +9.21 | +6.45 | +5.43 | +
+\hdashline LCP | ++ | + | |
Avg | +48.65 | +68.85 | +74.76 | +
StDEV | +1.37 | +1.74 | +2.45 | +
+\hdashline CoT-No-Position | ++ | + | |
Avg | +40.69 | +65.05 | +72.03 | +
StDEV | +10.64 | +7.19 | +5.46 | +
5.2 生成代码的统计特征
+我们统计了不同指导策略和训练方法之间的样式转换,包括有效的代码行数和注释行数。如表8,CoT提示引导模型在生成代码之前生成中间步骤,导致比没有指导的提示少一些注释行。LCP提示与原始提示相比引起更多的代码注释。最后,对比训练损失并没有改变代码和注释行数特性。
+setting | +#avg. code line | +#avg. comment line | +
---|---|---|
origin | +15.56 | +1.36 | +
\wCoT | +11.68 | +0.38 | +
\wLCP | +20.92 | +3.29 | +
MANGO | +20.80 | +3.33 | +
5.3 CoT与对比注释损失之间的关系
+调查比较学习注释是否能直接推广到CoT的能力增强。考虑到CoT提示生成的代码存在实质性波动,我们选择三个典型提示作为研究对象。通过对生成代码中行数的统计分析,这三个提示分别代表了在WizardCoder-7B上具有三个不同平均值的代码风格,分别为0、2和3,并且详细提示将列在附录中(CoT1:CoT-No-Position1,CoT2:CoT-pre1,CoT3:CoT-pre2)。我们在SFT设置和对比训练设置中测试模型。结果显示在表格中。9。比较注释行数的平均值和最终通过率,我们可以发现,CoT提示能够引导的注释越多,性能就越高。
+在相同的设置下比较SFT和,可以观察到,对于通过代码注释本身执行CoT的提示(即“CoT1”),对比学习后的模型一直改进了代码通过率。然而,对于通过其他方式执行CoT的提示,比较学习后观察到性能下降。这一现象表明,仅通过少量对比学习来微调注释并不容易转移到其他形式的任务分解。
+setting | +pass@1 | +pass@5 | +pass@10 | +MCL | +|
---|---|---|---|---|---|
WizardCoder-3B | +|||||
CoT1 | +SFT | +28.80 | +52.22 | +61.38 | +2.83 | +
+ | 30.10 | +52.85 | +60.77 | +2.64 | +|
CoT2 | +SFT | +17.91 | +44.05 | +53.86 | +1.35 | +
+ | 15.65 | +40.84 | +52.03 | +1.06 | +|
CoT3 | +SFT | +17.28 | +41.09 | +51.83 | +0.95 | +
+ | 12.85 | +34.97 | +45.33 | +1.03 | +|
WizardCoder-7B | +|||||
CoT1 | +SFT | +47.64 | +70.89 | +77.64 | +2.70 | +
+ | 50.43 | +71.68 | +77.64 | +3.03 | +|
CoT2 | +SFT | +47.70 | +67.94 | +73.78 | +1.86 | +
+ | 44.80 | +70.28 | +76.42 | +1.89 | +|
CoT3 | +SFT | +42.30 | +67.76 | +74.19 | +0.38 | +
+ | 41.02 | +68.31 | +75.81 | +0.26 | +
5.4 错误分布
+为了分析MANGO的通过率改善,我们使用HumanEval测试集对问题描述理解错误类型进行分类。MANGO通过利用代码注释来改善模型输出,这并不针对特定类型的代码错误,而是通过分解复杂的编码逻辑来改善对问题描述的整体理解。同时,在代码生成任务中,测试用例可以有效地反映对输出结果的理解程度。我们为评估问题理解建立了两个阈值:编译器是否能成功编译代码以及代码是否能通过至少一个测试用例。基于此,我们粗略地将理解水平分为三种类型,从低到高。
+我们将失败的情况分为三类:验证错误(VE) 包括运行时错误、语法错误以及除了错误答案之外的其他情况;全部错误答案(AWA) 包括无法通过脚本的第一个测试用例的情况,表明生成的代码对问题描述的理解不够;部分错误答案(PWA) 包括至少可以通过第一个单元测试但最终失败的情况。
+Setting | +VE | +AWA | +PWA | +overall | +
---|---|---|---|---|
SFT | +4.31 | +10.24 | +11.87 | +26.42 | +
w/ LCP | +3.84 | +8.88 | +11.46 | +24.19 | +
w/ + | +2.81 | +10.69 | +10.49 | +23.99 | +
MANGO | +2.84 | +8.49 | +10.00 | +21.33 | +
如表所示10,与SFT中的错误率相比,MANGO减少了所有三种类型的错误率。此外,消融组件在三种类型中也显示出更低的错误率,表明MANGO已经减少了各种理解错误的代码错误率。
+6 相关工作
+6.1 代码LLMs和逻辑推理
+预训练语言模型的快速发展带来了代码LLMs的蓬勃发展。最先进的开源代码LLMs是通过大量自然语言语料库和代码语料库进行预训练的Roziere et al. (2023)。基于这些基础,WizardCoderLuo et al. (2023)和OctoPackMuennighoff et al. (2023)提出了指令调整数据构建方法,显著提高了代码LLMs的遵循指令能力。此外,Fu et al. (2022)提出代码语料库可以成为CoT能力的来源。同时Fu et al. (2022)和Ma et al. (2023)观察到,在代码数据上训练小型代码LLMs可以进一步增强模型的逻辑推理能力。
+6.2 基于提示的代码生成策略
+规划策略是将因果语言模型转化为逻辑文本生成的主流技术。现有作品包括CoT(Chain of Thought)的变体Jiang et al. (2023); Li et al. (2023a),ReflexionShinn et al. (2023)等。大多数提示策略利用最先进模型的出色逻辑和理解能力。然而,即使在大小超过10B的大型开源模型上,这些策略也不会起作用Jiang et al. (2023); Shinn et al. (2023)。另一种主流方法是编制反馈以训练代码模型Chen et al. (2023, 2022)。我们的方法利用注释,这是程序员广泛接受的规则,以增强代码的可读性并同时解释代码逻辑。Li et al. (2023c)提出,头脑风暴步骤可以提高代码生成性能。在训练代码语料库中常见的注释使模型能够轻松捕捉不同大小的主干模型中代码和自然语言描述逻辑之间的关系。
+7 结论
+在本文中,我们首先强调了代码注释在桥接自然语言和编程语言方面的重要性,然后我们假设更多的注释来解释代码逻辑可以增强代码生成的性能。我们提出了一个简单有效的方法MANGO,其中包含对比注释损失和逻辑注释提示。主要的实验证明和消融研究表明,MANGO有效地增强了模型生成的代码通过率。在进一步的分析中,我们也比较了LCP和CoT提示策略,发现LCP在特别是对于较小的模型而言比CoT具有明显更好和更稳定的性能。注释对比训练也可以在某些条件下提升CoT的性能。
+总之,我们的工作将注释中心引入为一种新颖的视角,并指导模型使用注释可以稳定增强代码生成能力。将来,我们将进一步探索注释在更广泛复杂场景中的应用潜力,如工具使用和LLM代理。
+参考资料
+-
+
- +Achiam et al. (2023) + +Josh Achiam, Steven Adler, Sandhini Agarwal, Lama Ahmad, Ilge Akkaya, +Florencia Leoni Aleman, Diogo Almeida, Janko Altenschmidt, Sam Altman, +Shyamal Anadkat, et al. 2023. + + +Gpt-4 technical report. + + +arXiv preprint arXiv:2303.08774. + + + +
- +Austin et al. (2021) + +Jacob Austin, Augustus Odena, Maxwell Nye, Maarten Bosma, Henryk Michalewski, +David Dohan, Ellen Jiang, Carrie Cai, Michael Terry, Quoc Le, et al. 2021. + + +Program synthesis with large language models. + + +arXiv preprint arXiv:2108.07732. + + + +
- +Chen et al. (2023) + +Angelica Chen, Jérémy Scheurer, Tomasz Korbak, Jon Ander Campos, +Jun Shern Chan, Samuel R Bowman, Kyunghyun Cho, and Ethan Perez. 2023. + + +Improving code generation by training with natural language feedback. + + +arXiv preprint arXiv:2303.16749. + + + +
- +Chen et al. (2022) + +Bei Chen, Fengji Zhang, Anh Nguyen, Daoguang Zan, Zeqi Lin, Jian-Guang Lou, and +Weizhu Chen. 2022. + + +Codet: Code generation with generated tests. + + +In The Eleventh International Conference on Learning +Representations. + + + +
- +Chen et al. (2021) + +Mark Chen, Jerry Tworek, Heewoo Jun, Qiming Yuan, Henrique Ponde de Oliveira +Pinto, Jared Kaplan, Harri Edwards, Yuri Burda, Nicholas Joseph, Greg +Brockman, et al. 2021. + + +Evaluating large language models trained on code. + + +arXiv preprint arXiv:2107.03374. + + + +
- +Fu et al. (2022) + +Yao Fu, Hao Peng, and Tushar Khot. 2022. + + +How does gpt obtain its ability? tracing emergent abilities of +language models to their sources. + + +Yao Fu’s Notion. + + + +
- +Jiang et al. (2023) + +Xue Jiang, Yihong Dong, Lecheng Wang, Qiwei Shang, and Ge Li. 2023. + + +Self-planning code generation with large language model. + + +arXiv preprint arXiv:2303.06689. + + + +
- +Kojima et al. (2022) + +Takeshi Kojima, Shixiang Shane Gu, Machel Reid, Yutaka Matsuo, and Yusuke +Iwasawa. 2022. + + +Large language models are zero-shot reasoners. + + +Advances in neural information processing systems, +35:22199–22213. + + + +
- +Li et al. (2023a) + +Jia Li, Ge Li, Yongmin Li, and Zhi Jin. 2023a. + + +Structured chain-of-thought prompting for code generation. + + +arXiv preprint arXiv:2305.06599. + + + +
- +Li et al. (2023b) + +Raymond Li, Loubna Ben Allal, Yangtian Zi, Niklas Muennighoff, Denis Kocetkov, +Chenghao Mou, Marc Marone, Christopher Akiki, Jia Li, Jenny Chim, et al. +2023b. + + +Starcoder: may the source be with you! + + +arXiv preprint arXiv:2305.06161. + + + +
- +Li et al. (2023c) + +Xin-Ye Li, Jiang-Tian Xue, Zheng Xie, and Ming Li. 2023c. + + +Think outside the code: Brainstorming boosts large language models in +code generation. + + +arXiv preprint arXiv:2305.10679. + + + +
- +Luo et al. (2023) + +Ziyang Luo, Can Xu, Pu Zhao, Qingfeng Sun, Xiubo Geng, Wenxiang Hu, Chongyang +Tao, Jing Ma, Qingwei Lin, and Daxin Jiang. 2023. + + +Wizardcoder: Empowering code large language models with +evol-instruct. + + +arXiv preprint arXiv:2306.08568. + + + +
- +Ma et al. (2023) + +Yingwei Ma, Yue Liu, Yue Yu, Yuanliang Zhang, Yu Jiang, Changjian Wang, and +Shanshan Li. 2023. + + +At which training stage does code data help llms reasoning? + + +arXiv preprint arXiv:2309.16298. + + + +
- +Muennighoff et al. (2023) + +Niklas Muennighoff, Qian Liu, Armel Zebaze, Qinkai Zheng, Binyuan Hui, +Terry Yue Zhuo, Swayam Singh, Xiangru Tang, Leandro von Werra, and Shayne +Longpre. 2023. + + +Octopack: Instruction tuning code large language models. + + +arXiv preprint arXiv:2308.07124. + + + +
- +Roziere et al. (2023) + +Baptiste Roziere, Jonas Gehring, Fabian Gloeckle, Sten Sootla, Itai Gat, +Xiaoqing Ellen Tan, Yossi Adi, Jingyu Liu, Tal Remez, Jérémy Rapin, +et al. 2023. + + +Code llama: Open foundation models for code. + + +arXiv preprint arXiv:2308.12950. + + + +
- +Shinn et al. (2023) + +Noah Shinn, Federico Cassano, Ashwin Gopinath, Karthik R Narasimhan, and Shunyu +Yao. 2023. + + +Reflexion: Language agents with verbal reinforcement learning. + + +In Thirty-seventh Conference on Neural Information Processing +Systems. + + + +
- +Wei et al. (2022) + +Jason Wei, Xuezhi Wang, Dale Schuurmans, Maarten Bosma, Fei Xia, Ed Chi, Quoc V +Le, Denny Zhou, et al. 2022. + + +Chain-of-thought prompting elicits reasoning in large language +models. + + +Advances in Neural Information Processing Systems, +35:24824–24837. + + + +
- +Xu et al. (2023) + +Can Xu, Qingfeng Sun, Kai Zheng, Xiubo Geng, Pu Zhao, Jiazhan Feng, Chongyang +Tao, and Daxin Jiang. 2023. + + +Wizardlm: Empowering large language models to follow complex +instructions. + + +arXiv preprint arXiv:2304.12244. + + + +
- +Zan et al. (2023) + +Daoguang Zan, Ailun Yu, Bo Shen, Jiaxin Zhang, Taihong Chen, Bing Geng, Bei +Chen, Jichuan Ji, Yafen Yao, Yongji Wang, et al. 2023. + + +Can programming languages boost each other via instruction tuning? + + +arXiv preprint arXiv:2308.16824. + + + +
- +Zelikman et al. (2023) + +Eric Zelikman, Qian Huang, Gabriel Poesia, Noah Goodman, and Nick Haber. 2023. + + +Parsel: Algorithmic reasoning with language models by composing +decompositions. + + +In Thirty-seventh Conference on Neural Information Processing +Systems. + + + +
- +Zhao et al. (2023) + +Wayne Xin Zhao, Kun Zhou, Junyi Li, Tianyi Tang, Xiaolei Wang, Yupeng Hou, +Yingqian Min, Beichen Zhang, Junjie Zhang, Zican Dong, et al. 2023. + + +A survey of large language models. + + +arXiv preprint arXiv:2303.18223. + + + +
- +Zhu et al. (2023) + +Yuqi Zhu, Jia Allen Li, Ge Li, YunFei Zhao, Jia Li, Zhi Jin, and Hong Mei. +2023. + + +Improving code generation by dynamic temperature sampling. + + +arXiv preprint arXiv:2309.02772. + + + +
附录 A 变体提示的细节
+我们使用三种类型的提示来生成具有不同风格的代码。 CoT-pre表示提示要求模型在生成代码之前生成一系列思维步骤,而CoT-No-Position表示只要求模型生成一系列思维步骤。 +三种类型的具体提示如下所示: +我们在表11中显示了每种类型的三个种子提示的具体提示,其余提示由GPT-4改写。
+prompt name | +
+
|
+
---|---|
CoT-pre1 | +
+ 首先,逐步考虑过程,然后呈现Python脚本: + |
+
CoT-pre2 | +
+ 开始时,先创建一个逐步编码计划,然后按照提供的问题编写Python脚本: + |
+
CoT-pre3 | +
+ 以下的Python脚本解决了指定的问题,并在开头包含了详细的解释: + |
+
+\hdashlineComment1 | +
+ 这是解决指定问题的有注释的Python脚本: + |
+
Comment2 | +
+ 为了澄清逻辑,最好在脚本中包含注释。以下是针对给定问题的Python代码: + |
+
Comment3 | +
+ 以下的Python脚本解决了给定的问题,使用简单的注释来分解复杂的逻辑: + |
+
+\hdashlineCoT-No-Position1 | +
+ 这是指定问题的Python代码,分解为逻辑步骤: + |
+
CoT-No-Position6 | +
+ 上述问题的Python程序在这里呈现,并附有逐步解释: + |
+
CoT-No-Position11 | +
+ 这是一个解决给定问题的Python脚本,并附有全面的分解: + |
+
附录B Case Study
+我们使用一个简单的编码任务来说明原始提示、LCP提示和CoT提示之间的区别。问题描述如下。
+原始提示结果 [失败]
+原始提示没有额外的说明,生成的代码未能通过所有单元测试,因为它只能解决提供的示例案例。
+CoT 结果 [Failed]
+在CoT提示设置中生成的代码包含了一个逐步解释,简单地将问题描述分解成了两个要点。最终生成的代码由于生成的模棱两可的重新解释的要点而失败,并且代码实现与问题描述之间存在较大的差距。
+LCP 结果 [Passed]
+在LCP提示设置中生成的代码包含清晰的注释来解释代码逻辑,并且所有单元测试都成功通过。
+