代码生成和补全任务做不完了?!
不如试试让大语言模型(Large Language Models, LLMs)来帮忙。
不过,如果是处理大规模、多文件的代码库,LLMs就可能犯了难。这时候,往往需要需要Retrieval-Augmented Code Generation (RACG)系统来检索相关的代码信息。
现有解决方案,如基于语义相似度的检索和手动设计的工具与API,虽然在特定任务上有效,但在泛化能力和普适性方面存在局限。
为了缓解现有RACG方法的通用性缺陷,来自新加坡国立大学、阿里巴巴、西安交通大学的研究人员提出了CodexGraph,一个以代码图数据库为媒介,连接了语言模型和代码库的系统。
研究团队在三个有代表性的学术benchmarks对CodexGraph进行了评测,同时也基于ModelScope-Agent,将CodexGraph实现在了五个真实代码应用场景。
实验和现实实践显示出了CodexGraph的有效性和通用性。
研究方法
CodexGraph通过代码图数据库接⼝界⾯ ,创新性地将语⾔模型与代码库连接,以克服现有⽅法的不⾜。
该系统的⼯作流程主要包括以下⼏个步骤 :
首先,构建代码图数据库。
使⽤静态分析技术,根据预定义的Schema,将代码库中的代码符号(如模块、 类、 函数等)和它们之间的关系映射为图数据库中的节点和边。
其次,代码结构感知查询。
利⽤graph query language的灵活性,同时结合图数据库的结构特性,实现对代码图的复杂查询和深度检索。
第三, “Write then translateˮ 策略。
Primary LM agent ⾸先分析代码问题,⽣成⾃然语⾔查询。
然后,专门的translation LM agent将这些查询翻译为为格式化的graph query language。
第四,迭代式pipeline。
通过迭代的⽅式,LM agent根据⽤户问题和已获取的信息,逐步优化查询和检索结果。
实验
实验部分,CodexGraph在CrossCodeEval、 EvoCodeBench和SWE-bench三个具有代表性的代码库级基准测试上进⾏了评估。
这些测试覆盖了跨⽂件代码补全、 代码⽣成和⾃动化GitHub问题解决等多个⽅⾯ 。
实验结果显示,CodexGraph在所有基准测试中均展现出了优异且稳定的性能,验证了代码图数据库作为语⾔模型和代码库之间的接⼝界⾯的有效性。
原论⽂的分析进⼀步指出,CodexGraph在处理不同难度的推理任务时,单⼀查询与多重查询策略的效果存在差异。
在CrossCodeEval中,多重查询策略更有效;⽽在SWE- bench中,单⼀查询策略表现更佳。
此外 ,去除Cypher LM agent会显著增加primary LM agent的推理负担,导致性能下降。
这表明Cypher LM agent在减轻primary LM Agent的推理压⼒中发挥了关键作⽤。
真实应⽤场景⽰例
基于ModelScope-Agent框架 ,CodexGraph的实际应⽤价值在多个场景中得到了体现,如:
- 代码聊天助⼿(Code Chat)
- 代码调试⼯具(Code Debugger)
- 单元测试⽣成器(Code Unit tester)
- 代码⽣成器(Code Generator)
- 代码注释⼯具(Code Commenter)
- ……
这些应⽤展⽰了CodexGraph如何在⽣产环境中帮助开发者解决实际问题 ,提⾼代码开发的效率和质量。
总结
以图数据库作为媒介,CodexGraph为语⾔模型与代码库提供了⼀个新的交互⽅式。
它不仅提升了语⾔模型对复杂代码库的理解能⼒,还增强了整体的代码检索和导航的准确性。
它的出现为⾃动化软件⼯程领域,尤其是在⾯临RACG挑战时,带来了新的解决⽅案 ,展⽰了在多样化代码任务和现实世界应⽤中的⼴泛潜⼒和实际价值。
随着技术的不断发展,CodexGraph有望在未来⽀持更多编程语⾔ ,并进⼀步优化其⼯作流程和索引构建效率。
代码链接 :
https://github.com/modelscope/modelscope-agent/tree/master/apps/codexgraph_agent
arXiv链接 :