Keep the Conversation Going: Fixing 162 out of 337 bugs for $0.42 each using ChatGPT

Info

  • Pub: Arxiv
  • Authors: Chunqiu Steven Xia, Lingming Zhang
  • Institutions: University of Illinois Urbana-Champaign
  • Repo: Not yet

Abstract

  • 自动程序修复技术APR
  • 使用LLM做APR
  • 传统G&V方式从同一prompt生成大量patch逐一测试,效果不好
  • 提出:
    • 对话驱动的APR
    • 提供测试故障信息
    • 收集错误的补丁作为下一轮的prompy
  • 效果:
    • 实现了正确的修复
    • 成本较低

Intro

Traditional works

传统的APR技术

  • 基于模板
  • 基于启发式
  • 基于约束
    基于学习的APR技术
  • 基于神经机器翻译:使用历史补丁修复数据集训练模型
    • 缺陷:包含无效数据、没有推广
  • 基于LLM
    • 填空式给出补丁
    • LLM的APR应用完成单个正确行或者固定函数
    • 缺陷:
      • 忽视了测试失败的信息(e.g. Expect … But was: …)
      • 重复抽样:多轮修复是独立的,LLM可能会重复生成同样错误的补丁
      • 忽略了有价值的patch:部分patch包含了部分合理的信息

Contributions

  • ChatRepair
  • 使用报错信息作为初始prompt,提供更多上下文
  • 对于未通过的patch,结合错误的patch和报错,为LLM构建一个新prompt
  • 对于通过的(似是而非的)patch,要求llm生成替代变体
  • 目标生成更合理的补丁
  • 结果:成本更低

    我们提出ChatRepair——第一个全自动对话驱动的APR工具,它利用新开发的ChatGPT模型来执行修复。ChatRepair从之前不正确和合理的补丁中学习,并利用测试失败信息向模型提供即时和动态的反馈,以生成新的补丁。通过我们的会话修复范例,ChatRepair能够分别在缺陷4j 1.2和2.0上实现114和48个bug的最新性能(比最佳性能基线多15和17个)。

Design

  • 提供了有价值的测试报错信息
  • 基于连续对话,而不是单一prompt反复发送(context包含对话上下文)
  • 使用GPT
  1. You are an Automated Program Repair tool
  2. Construct initial prompt
  3. Conversation
  4. 评估能否通过之前的测试
  5. 如果不能-创建一个响应(包括故障信息)重新生成
  6. 直到产生初步可用的补丁或者token excceed
  7. Plausible
  8. 使用生成似是而非的补丁prompt
  9. 以生成更多的合理补丁,增加正确补丁的机会

OJx0Ug.png

Initial

  • 关注代码行级填空修复
  • 在prompt前添加之前的修复记录(这里能否将成功的patch放在这里用于下一个修复任务)

Conversation

  • 固定的context window-有限的重试次数

Not finished yet