论文
从自然语言问题生成复杂的代码分析器
Generating Complex Code Analyzers from Natural Language Questions
摘要
许多软件开发任务(例如实现功能和修复错误)都是从开发人员提出有关代码库的问题开始的。然而,回答有关跨越数千个文件的数百万行代码的代码库的问题并非易事。 grep 等标准工具无法回答需要语义或过程间推理的问题,并且 大语言模型 (LLM) 由于资源和上下文限制而难以处理大型代码库。在本文中,我们介绍了 Merlin,这是一个用于回答需要对代码进行分析推理的自由形式问题的新系统。 Merlin 将 LLM 与 CodeQL 集成,CodeQL 是一个程序分析框架,支持对大型代码库进行表达查询。在设计此类系统时,我们面临两个主要挑战:首先,程序分析查询多种多样且语义复杂;因此,即使语法良好的查询也经常会产生退化/空结果。此外,在线可用的 CodeQL 查询相对较少,限制了 LLM 作为 CodeQL 查询生成器的开箱即用的有效性。我们通过开发基于 RAG 的迭代查询生成方法和新颖的自测试技术来应对这些挑战。我们的查询调试技术建立在辅助查询的理念之上,它生成具体的证据来暴露和解释候选查询中的语义缺陷。我们通过实验和用户研究来评估 Merlin。通过一系列源自常见错误查找任务的自然语言问题,Merlin 不仅发现了其他方法报告的大多数软件问题,还发现了原本无法检测到的问题。通过一项受试者内用户研究,我们发现使用 Merlin 可以将任务准确性平均提高 3.8*,同时将程序员完成所有任务的时间减少 31%。