原文标题:Improving ChatGPT Prompt for Code Generation
原文作者:Chao Liu, Xuanlin Bao, Hongyu Zhang, Neng Zhang, Haibo Hu, Xiaohong Zhang, Meng Yan
发表状态:preprint
原文链接:https://arxiv.org/abs/2305.08360
主题类型:代码生成
笔记作者:z3verse
主编:黄诚@安全学术圈
使用ChatGPT进行代码生成时候的有效性,可能在很大程度上受到所选择prompt的影响。本文研究了 ChatGPT 在生成代码任务中,使用各种提示工程(prompt engineering)方法对其有效性的影响。具体来说是借助 CodeXGlue 数据集 [1] 评估 ChatGPT 在两项自动化代码生成任务(包括T2C和C2C)中的能力。
prompt engineering 与 对应的 CodeBLEU 分数:
使用ChatGPT进行代码生成的两种生成方式
[1] Codexglue: A machine learning benchmark dataset for code understanding and generation,
如何设计 prompts 才能使 ChatGPT 生成更好的代码?
针对两类代码生成任务:
用于评估的 dataset
评估指标:BLEU 和 CodeBLEU(总体评价指标)
思维链(CoT)提示是一种关键策略,它通过引导 LLM 在给出最终答案之前完成一系列中间步骤,从而使 LLM 能够解决问题。一般来说,为了指导 ChatGPT 完成代码生成任务,我们采用 CoT 策略分两步设计提示:
TABLE I:为两个代码生成任务设计的不同类型的提示。请注意,#{nl}、#{cn}、#{mv}、#{mf} 和 #{code} 分别代表类名、成员变量、成员函数和代码变量。分别代表类名、成员变量、成员函数和代码变量,这些变量将由数据集的实际输入填充。
TABLE II:在每个生成任务的训练数据中随机抽取的 100 个样本上测试表 I 中的不同提示组合。注意,p5(api) 表示我们只使用了提示 p5 的 api 部分。
Prompt Description:”write a Java method that + #{NL}”(TABLE I-P1)
Multi-Step Optimizations:
Prompt Description:”translate C# code into Java code: #{Code}” (Table I-P1).
值得注意的是 C2C 任务在最初就有 39.37 的得分,并且C2C任务不涉及到对相关类等情况的处理。因此后续的优化得分差异不大
Multi-Step Optimizations:
通过组合不同的 Prompts,可以看到BLEU和CodeBLEU分数并不是同时增长的。例如在C2C任务中P5就有着负面的影响。因此作者设计实验来对4个问题进行了探究。
目的:证明 Prompt 设计方法的有效性
测试基线 ChatGPT-task:仅使用 P1 ChatGPT-detail:P1-P4 的组合 ChatGPT-behaviour:在 ChatGPT-detail 基础上加入 P5
结果:ChatGPT-behaviour在T2C任务上有着显著提升。而ChatGPT-detail在C2C任务上的表现更好。
因为ChatGPT生成的代码仍然比ground-truth更为复杂,所以作者在这里探索在生成目标前添加 "concise" 一词,对生成结果的影响。例如将P5 修改为 ”write a concise Java method ...”
结果:简洁性要求对 T2C 生成有用,但对 C2C 生成无用。
默认情况下,我们为每个提示打开一个单独的会话,并与 ChatGPT 进行交流。相比之下,我们可以通过 一个连续的会话来进行交流。这样,ChatGPT 就能从上下文中学习,并为代码生成任务生成更好的反应。因此,本研究问题旨在分析会话设置的影响。
方法:在与 ChatGPT 的通信过程中,我们使用一个会话 为多个提示生成代码。当数量达到上限时,再发出的提示 将不会得到回应。然后,我们开始另一个新的会话。这样 ,我们就能确保每个会话都得到充分利用,而 ChatGPT 也能更好地理解上下文。我们知道,在一个会话中,之前 的提示的上下文信息量会比较低。因此,研究会话设置对 代码生成性能的影响毫无意义。
结果:连续会话有利于 C2C 生成任务,但对 T2C 生成任务没有改善。因此,单个会话更适合使用设计好的提示生成 T2C。
众所周知,ChatGPT 每次生成的结果是随机的,那么文章中的结果是否会存在较大偏差?
结果:由于设计的提示中描述了特定的指令,生成随机性对代码生成任务的影响很小。
在这篇文章中,作者为 ChatGPT 设计并优化了两类代码生成任务的prompts语句,分别是文本转代码和代码间的转换。实验显示,在广受欢迎的 CodeXGlue 数据集上,当请求 ChatGPT 生成代码时,本文的prompts表现出色。作者也深入探讨了影响代码生成任务引导语设计的关键因素,并对比了顶尖提示与最前沿的微调 LLM 的表现。同时,作者还对 ChatGPT 生成的代码的准确性和质量进行了评估。
[1] https://www.promptingguide.ai/applications/coding [2] https://mp.weixin.qq.com/s/STSqHgBIn8782vaL7ldiJg
这篇文章刚好对我在设计prompt时候观察到的几个现象进行了分析,例如:对每个T2C任务使用一个 session 窗口好,还是使用一个 session 窗口处理一系列的T2C任务号。其实在实践和测试中,我也倾向于使用一个session处理一个T2C task,因为这种方式输出的基本都是我想要的结果。但是后者则表现欠佳。
其实在阅读这篇文章的时候我最想Get一个实践中极佳的Prompt,但是读完之后并没有获取到预期的内容。所以我想在本文的最后给出我针对 T2C 任务设计的1个 basic prompt。该prompt在实际中使用起来效果还不错,放在这里供大家参考。
当然,本文中提到的 P2 和 P5 可以在实际中,根据不同的情况和下面的 Prompt 进行组合使用。
You are a world-class Python developer with an eagle eye for unintended bugs and edge cases. And you can teach junior developers how to code. Don't explain the code, just write all of your code in a single block.I wish you could use Python and the `XXX` package, write a code that + #{NL}
一个示例
You are a world-class Python developer with an eagle eye for unintended bugs and edge cases. And you can teach junior developers how to code. Don't explain the code. Just write all of your code in a single block. I wish you could use Python and the `requests` package, to write a code that fetches the content of the website `example.com` and prints the title of the page. Please be careful to handle exceptions such as network timeouts.
刘超: 重庆大学,研究兴趣包括基于深度学习/基于搜索的模型来理解自然/编程语言
安全学术圈招募队友-ing
有兴趣加入学术圈的请联系 secdr#qq.com