分享自:

ClarifyGPT:一个通过需求澄清增强基于大语言模型的代码生成的框架

期刊:Proc. ACM Softw. Eng.DOI:10.1145/3660810

ClarifyGPT: 一项通过需求澄清增强LLM代码生成能力的新框架

一、 作者、机构与发表信息

本研究由来自中国和加拿大多个研究机构的学者共同完成。主要作者包括 Fangwen Mu(中国科学院软件研究所智能博弈基础理论与关键技术全国重点实验室)、Lin Shi(北京航空航天大学)、Song Wang(加拿大约克大学)、Zhuohao Yu(中国科学院软件研究所智能博弈基础理论与关键技术全国重点实验室)、Binquan Zhang(北京航空航天大学)、Chenxue Wang(中国科学院软件研究所智能博弈基础实验室)、Shichao Liu(华为中央软件研究院软件IDE创新实验室)以及 Qing Wang(中国科学院软件研究所智能博弈基础理论与关键技术全国重点实验室,通讯作者)。该研究以题为“ClarifyGPT: A Framework for Enhancing LLM-Based Code Generation via Requirements Clarification”的论文形式,于2024年7月发表在《Proceedings of the ACM on Software Engineering》期刊的FSE(Foundations of Software Engineering)专刊上。

二、 学术背景与研究动机

本研究属于软件工程与人工智能的交叉领域,具体聚焦于利用大型语言模型(Large Language Models, LLMs)进行自动代码生成。以ChatGPT、GPT-4为代表的LLMs在根据自然语言需求自动生成代码方面已展现出令人印象深刻的能力。然而,在实际开发场景中,用户编写的需求描述常常存在模糊不清或信息不足的问题。现有的LLM代码生成方法缺乏与用户交互澄清的机制,会直接根据这些不明确的需求生成程序,这很可能导致生成的代码偏离用户的真实意图。相比之下,人类开发者在遇到模糊需求时,会通过交互式提问来获取额外信息以澄清需求。

基于这一观察,研究者们认为,赋予LLMs自动识别模糊需求并提出针对性澄清问题的能力,对于提升代码生成的质量和效率至关重要。然而,实现这一目标面临两大挑战:1) 何时提问? 并非所有需求都模糊,若不加区分地对所有需求提问,会因不必要的交互降低效率和用户体验。2) 提问什么? 问题的质量直接影响澄清效率和最终代码质量。模糊或宽泛的问题可能得到无关的回复,反而阻碍LLMs理解用户意图。为解决这些挑战,本研究提出了ClarifyGPT框架,旨在通过需求澄清来增强基于LLM的代码生成。

三、 研究流程与方法详述

ClarifyGPT是一个包含四个主要阶段的系统性框架,其工作流程旨在模拟人类开发者澄清需求的过程。

第一阶段:测试输入生成 (Test Input Generation) 本阶段的目标是为后续的代码一致性检查生成高质量的测试输入。其核心假设是:对于清晰的需求,LLM生成的多个代码片段在功能上应表现一致(即对相同输入产生相同输出);而对于模糊需求,生成的代码则可能行为各异。因此,需要能有效区分不同功能代码的测试用例。 * 研究对象与方法:该阶段采用两步法。首先,进行种子输入初始化。研究者设计了一个提示(Prompt),引导LLM为给定的需求生成一组复杂、困难或边界情况的测试输入。提示包含任务指令、少量人工编写的示例(需求-测试输入对)以及待处理的查询需求。其次,进行类型感知的输入变异。由于直接使用LLM大量生成测试用例成本高、速度慢,研究采用了基于启发式变异的方法来加速生成。该方法从LLM生成的种子池中随机选择输入,根据其数据类型(如整型、浮点型、列表、字典、字符串等)应用预定义的变异操作(如对整型进行±1操作,对列表进行增删元素操作等),生成大量新的测试用例,从而确保生成的测试集既多样又可靠。

第二阶段:代码一致性检查 (Code Consistency Check) 本阶段的目标是自动检测给定的用户需求是否模糊。 * 研究对象与方法:对于每个需求,ClarifyGPT首先使用LLM采样生成N个(研究中设定为25个)代码解决方案。然后,使用第一阶段生成的高质量测试输入,执行这N个代码。接着,比较这些代码在相同测试输入下的输出结果。如果所有输出完全一致,则认为LLM对该需求的理解是一致的,该需求被判定为明确的,并随机选择一个生成的代码作为最终解决方案输出。如果输出存在不一致,则表明LLM对该需求产生了不同的解读,该需求被判定为模糊的。对于模糊需求,框架会根据测试输出将代码聚类成不同行为模式的组,并随机从每组中选择一个代表性代码,输入到下一阶段用于生成澄清问题。

第三阶段:基于推理的问题生成 (Reasoning-Based Question Generation) 本阶段的目标是为已识别的模糊需求生成精准、有针对性的澄清问题。 * 研究对象与方法:研究者设计了一种基于推理的提示方法。该提示引导LLM分析导致需求模糊的因素。具体做法是,将模糊需求及其在第二阶段识别出的、功能不一致的代码示例提供给LLM。提示要求LLM首先通过比较这些代码实现之间的差异,来分析需求中存在的模糊点(例如,排序顺序未指定、边界条件不明确等)。然后,基于此分析结果,生成针对性的澄清问题。这种方法类似于思维链(Chain-of-Thought, CoT) 提示,通过让LLM先进行中间推理(分析模糊因素),再生成最终结果(澄清问题),从而提升所生成问题的质量。

第四阶段:增强的代码生成 (Enhanced Code Generation) 本阶段的目标是在获得用户对澄清问题的反馈后,生成最终符合用户意图的代码。 * 研究对象与方法:在接收到用户对澄清问题的回答后,ClarifyGPT将每个“问题-答案”对整合为一个澄清说明,并将其附加到原始需求文档字符串的末尾,从而形成一个精炼后的需求。这种方式既保留了原始需求的结构,又补充了关键的澄清信息。最后,使用这个精炼后的需求构造提示,输入给LLM,生成最终的代码解决方案。

四、 主要研究结果与分析

研究通过三个研究问题(RQs)系统地评估了ClarifyGPT的有效性。

RQ1:接收真实用户反馈时,ClarifyGPT的性能如何? * 实验设置:在MBPP-Sanitized和MBPP-ET两个基准测试集上,以GPT-4为基础模型,招募10名参与者(包括研究人员和开发人员)手动回答ClarifyGPT生成的澄清问题,模拟真实交互场景。 * 结果与数据:ClarifyGPT(接收人类反馈)在两个数据集上的Pass@1指标分别达到80.80%和60.19%。相较于直接使用GPT-4的基线方法(70.96%, 51.52%),性能分别显著提升了13.87%16.83%。与同样能提问的基线方法GPT-Engineer相比,ClarifyGPT也分别有9.53%9.52% 的提升。这证明了ClarifyGPT在真实人机交互场景下,通过澄清需求能有效提升代码生成准确率。

RQ2:接收模拟用户反馈时,ClarifyGPT的性能如何? * 实验设置:为了进行大规模、可复现的自动化评估,研究者提出了一种高保真用户模拟方法。该方法利用LLM(提供真实测试用例作为先验知识)来模拟用户对澄清问题的回答。他们在五个广泛使用的基准测试集(HumanEval, HumanEval-ET, MBPP-Sanitized, MBPP-ET, CodeREval)上,对两个LLM(GPT-4和ChatGPT)进行了全面评估。 * 结果与数据: * 对于GPT-4,ClarifyGPT(模拟反馈)在五个数据集上的平均Pass@1从基线62.43%提升至69.60%,相对提升11.66%。 * 对于ChatGPT,平均Pass@1从基线54.32%提升至62.37%,相对提升15.00%。 * 与GPT-Engineer相比,ClarifyGPT在所有数据集和模型上均表现出更优的性能。这归功于其代码一致性检查机制能有效筛选出真正需要澄清的模糊需求,避免了不必要的交互,且其基于推理的问题生成能产生更精准的问题。 * 模拟反馈的结果与人类反馈的结果趋势一致且数值接近,验证了模拟方法的可靠性,为大规模自动化评估提供了可行方案。

RQ3:提示中示例数量对ClarifyGPT性能的影响? * 实验设置:考察提示中示例数量从0-shot到3-shot变化时,ClarifyGPT的性能变化。 * 结果与数据:ClarifyGPT对示例数量表现出鲁棒性。性能随着示例数量的增加而提升(例如,GPT-4上平均性能从63.09%提升至69.60%)。即使在只有1个示例的情况下,性能也相比零示例有显著提升,并接近3示例的效果,这表明ClarifyGPT具有良好的泛化能力,在实际应用中可以在效果和效率(提示长度)之间取得良好平衡。

补充:人工评估结果 为了深入理解ClarifyGPT性能提升的原因,研究者进行了额外的人工评估: 1. 模糊需求检测有效性:在MBPP-Sanitized数据集上,以人工标注为基准,ClarifyGPT(使用GPT-4)检测模糊需求的精确率(Precision)、召回率(Recall)和F1分数分别达到88.57%87.94%88.25%,证明了其检测机制的有效性。 2. 澄清问题质量:参与者从相关性、全面性和有用性三个维度对生成的问题进行评分(0-2分)。平均得分分别为1.85、1.75和1.80,表明生成的问题质量较高。 3. 对不同类型需求的代码生成效果:将数据集分为“模糊”和“明确”子集进行分析。结果显示,ClarifyGPT的性能提升主要来源于对模糊需求的处理。在模糊子集上,其性能相比基线有超过80% 的巨大提升;在明确子集上也有小幅提升。这直接证明了ClarifyGPT的核心价值在于有效识别并澄清模糊需求。

五、 研究结论与价值

本研究得出结论:ClarifyGPT框架能够有效增强基于LLM的代码生成。它通过创新的代码一致性检查机制,使LLM具备了识别模糊需求的能力;并通过基于推理的提示方法,引导LLM生成高质量的针对性澄清问题。在获得用户反馈后,它能精炼原始需求,从而生成更符合用户意图的正确代码。

科学价值:本研究为交互式代码生成领域提供了一个系统性的新框架。它突破了现有LLM代码生成方法“单向生成、缺乏澄清”的局限,将人机协作的澄清对话机制引入自动化流程。提出的代码一致性检查方法和基于推理的问题生成方法,为解决“何时提问”和“提问什么”两大挑战提供了新颖且有效的技术路径。高保真用户模拟方法也为交互式系统的自动化评估提供了有价值的参考。

应用价值:ClarifyGPT具有直接的实际应用潜力。它可以作为插件或增强模块集成到现有的AI编程助手(如GitHub Copilot)中,帮助开发者在编写模糊需求时,通过简单的问答交互即可获得更准确的代码,从而提升开发效率和代码质量,改善用户体验。它降低了开发者精确描述需求的负担,使LLM在真实复杂开发环境中的应用更加可靠。

六、 研究亮点

  1. 问题导向的创新性:敏锐地抓住了LLM代码生成在实际应用中的核心痛点——模糊需求,并提出了一个完整的“检测-澄清-精炼-生成”解决方案框架。
  2. 方法的新颖性
    • 代码一致性检查:利用LLM自身生成代码的行为一致性作为模糊需求的判断依据,无需额外训练数据,方法巧妙且有效。
    • 基于推理的问题生成:通过让LLM分析不一致的代码来推理模糊点,再生成问题,提升了问题的针对性和质量,超越了简单的模板式提问。
    • 高保真用户模拟:为交互式系统的自动化评估提供了经济可行的方案,解决了该领域评估成本高的难题。
  3. 验证的全面性:研究设计严谨,不仅进行了大规模自动化实验,还结合了真实用户参与的人工评估,从性能提升、组件有效性(检测、提问)、影响因素(示例数量)等多个维度全面验证了框架的有效性和鲁棒性。实验覆盖了多个主流基准测试和SOTA模型,结论具有说服力。
  4. 成果的实用性:研究开源了框架代码和数据集,便于社区复现和进一步研究。框架设计相对通用,可适配于不同的指令调优后的LLM,具有良好的可扩展性。

七、 其他有价值内容

研究在讨论部分也坦诚地指出了ClarifyGPT的局限性和未来方向:1) 框架依赖于具备指令理解和对话能力的LLM(如ChatGPT、GPT-4),不适用于未经指令微调的纯代码生成模型。2) 由于依赖代码执行和输出比较,对于输入复杂(如图像、文件)或无返回值的代码生成任务可能存在限制。3) 框架会引入额外的计算开销(主要来自代码一致性检查中的多次采样生成),成本高于基线方法,但随着LLM技术的进步和API成本下降,此差距有望缩小。这些讨论为后续研究和应用提供了重要的参考。

上述解读依据用户上传的学术文献,如有不准确或可能侵权之处请联系本站站长:admin@fmread.com