阿里巴巴提出CODEXGRAPH:打破大模型与代码库的壁垒,引领软件工程新革命 精华
在现代软件工程中,大型语言模型(LLMs)在处理独立的代码任务方面表现出色,例如HumanEval和MBPP,但在处理整个代码库时却遇到了困难。这一挑战促使研究人员探索在代码库规模上增强LLM与代码库的交互。目前的解决方案依赖于基于相似性的检索或手动工具和API,每种方法都有明显的缺点。基于相似性的检索在复杂任务中往往回忆率低,而手动工具和API通常是特定任务的,需要专家知识,降低了它们在多样化代码任务和现实世界应用中的通用性。
为了克服这些限制,我们引入了CODEXGRAPH,一个系统,将LLM代理与从代码库中提取的图数据库接口集成在一起。通过利用图数据库的结构属性和图查询语言的灵活性,CODEXGRAPH使LLM代理能够构建和执行查询,允许进行精确的、代码结构感知的上下文检索和代码导航。我们通过三个基准来评估CODEXGRAPH的性能:CrossCodeEval、SWE-bench和EvoCodeBench。此外,我们开发了五个现实世界的编码应用。通过统一的图数据库模式,CODEXGRAPH在学术和现实世界环境中展示了竞争性能和潜力,展示了其在软件工程中的多功能性和有效性。
论文标题:CODEXGRAPH: Bridging Large Language Models and Code Repositories via Code Graph Databases
机构:
- National University of Singapore
- Alibaba Group
- Xi’an Jiaotong University
论文链接:https://arxiv.org/pdf/2408.03910
项目地址:https://github.com/modelscope/modelscope-agent/tree/master/apps/codexgraph_agent
CODEXGRAPH系统介绍
CODEXGRAPH是一个创新的系统,旨在通过图数据库接口将代码库与大型语言模型(LLM)桥接起来。该系统利用从代码库中提取的代码图,通过静态分析技术,将代码符号和关系索引并存储为图数据库中的节点和边。这些节点和边根据预定义的模式进行组织,节点代表如模块、类和函数等代码符号,边则表示这些符号之间的关系,如包含、继承和使用等。
CODEXGRAPH的核心功能是使LLM代理能够构建和执行图查询,从而实现精确的代码结构感知上下文检索和代码导航。这种结构的利用大大增强了LLM在处理复杂代码库任务时的性能,使其能够有效地扩展到更大的代码库任务中。
详细解析:构建代码图数据库
1. 从代码库中提取代码图
构建代码图数据库的第一步是从目标代码库中提取代码图。这一过程通常涉及静态分析技术,扫描代码库中的每个文件,识别出代码中的符号及其相互关系,并将这些信息作为节点和边加入到图数据库中。例如,一个函数或类会被创建为一个节点,而函数调用或类继承则被视为边。
2. 定义节点和边的类型及其属性
在CODEXGRAPH系统中,节点和边的类型及其属性是根据代码的结构和语义预先定义的。节点类型包括模块、类、方法、函数、字段和全局变量等,每种类型的节点都有相应的属性,如名称、文件路径、代码和签名等。边的类型则表示代码元素之间的不同关系,如包含、继承和使用等。这些定义确保了图数据库能够准确地反映代码库的结构。
3. 索引和存储过程的优化
为了提高查询效率和响应速度,CODEXGRAPH在构建代码图数据库时进行了索引和存储优化。首先,通过浅层索引快速捕捉代码库中的符号和关系,然后使用深度优先搜索(DFS)等方法处理跨文件的复杂关系,确保图中的边完整无误。此外,节点中不直接存储代码片段,而是存储指向代码片段的索引,这样既节省了存储空间,也加快了数据的检索速度。
通过这些精心设计的步骤,CODEXGRAPH能够高效地管理和查询大规模代码库,支持复杂的代码分析任务,为开发人员和研究人员提供了一个强大的工具。
LLM代理与代码图数据库的交互
在CODEXGRAPH系统中,LLM代理与代码图数据库的交互是通过构建和执行图查询来实现的。这一过程充分利用了图数据库的结构特性和图查询语言的灵活性,使得LLM代理能够在代码库中进行精确的、结构感知的上下文检索和代码导航。
1. 代码结构感知搜索
CODEXGRAPH利用图查询语言的灵活性,构建复杂且综合的搜索条件。通过这种方式,LLM代理能够有效地在代码图中导航各种节点和边,执行如“查找某个模块下包含特定方法的类”或“检索定义了某个类及其包含函数的模块”的查询。这种代码结构感知的搜索方式,提供了一种难以通过基于相似性的检索方法或传统的代码特定工具和API实现的代码检索级别。
2. 写后翻译
在CODEXGRAPH中,LLM代理首先基于用户提供的问题理解上下文并生成自然语言查询,这些查询随后被专门的翻译LLM代理转换为形式化的图查询。这种分工使得主LLM代理可以专注于高层次的推理,同时确保图查询的语法正确性和优化。通过这种“写后翻译”的策略,CODEXGRAPH提高了查询的成功率,并改善了系统检索相关代码信息的能力。
3. 迭代管道
CODEXGRAPH采用迭代管道进行LLM代理与代码图数据库的交互,每一轮中,LLM代理根据用户的问题和之前收集的信息制定多个查询。这种迭代方法充分利用了LLM代理的推理能力,从而提高了解决问题的准确性。
实验设置与评估
为了评估CODEXGRAPH的有效性,我们在三个具有代表性的代码库级基准上进行了测试:CrossCodeEval、SWE-bench和EvoCodeBench。通过这些基准,我们可以全面评估CODEXGRAPH在不同的编程任务中的表现。
1. 基准
- CrossCodeEval: 用于评估多语言跨文件代码完成的数据集。
- SWE-bench: 评估模型解决GitHub问题的能力。
- EvoCodeBench: 用于评估代码生成的基准,包含详细的注释和评估指标。
2. 主要结果
我们在CrossCodeEval Lite(Python)和SWE-bench Lite测试集上报告了CODEXGRAPH的主要结果,并在EvoCodeBench的完整测试集上进行了评估。这些测试集的选择旨在展示CODEXGRAPH在处理具有不同复杂度的任务时的性能。
3. 基线比较
我们将CODEXGRAPH与几种基线方法进行了比较,包括BM25和AUTOCODEROVER,这些基线在代码任务中得到了广泛认可。此外,我们还评估了CODEXGRAPH在不同的大型语言模型(如GPT-4o、DeepSeek-Coder-V2和Qwen2-72b-Instruct)上的表现,以测试其在处理长文本、使用工具和生成代码方面的能力。
通过这些实验设置和评估,我们能够全面了解CODEXGRAPH在学术基准和实际软件工程任务中的表现,展示了其在多种编程任务中的通用性和有效性。
CODEXGRAPH的实际应用场景
1. 代码调试和写代码注释
CODEXGRAPH在实际应用中表现出极大的灵活性和有效性,特别是在代码调试和写代码注释这两个方面。例如,在代码调试应用中,CODEXGRAPH能够通过迭代推理和信息检索来诊断和解决错误,提供针对性的修复建议。这一过程涉及使用图查询语言来分析代码库,识别问题原因,并推荐精确的修改措施。
在写代码注释的应用中,CODEXGRAPH利用代码图数据库理解代码的结构和行为,从而生成详尽且准确的代码注释,增强代码的可读性和可维护性。这一功能对于理解复杂的代码库、识别依赖关系以及探索特定类、方法和函数的使用尤为有用。
2. 代码生成和单元测试生成
CODEXGRAPH还扩展到了代码生成和单元测试生成领域。在代码生成应用中,它能够自动创建代码以满足新的需求,扩展现有代码库的功能。而在单元测试生成应用中,CODEXGRAPH能够为指定的类或函数生成单元测试,确保功能的彻底验证。这些功能通过迭代查询和多跳推理,使CODEXGRAPH能够在处理大型代码库时表现出高效和精确。
讨论与总结
CODEXGRAPH通过将大型语言模型(LLMs)与代码图数据库接口结合,克服了现有方法在灵活性和泛化能力上的限制,特别是在处理复杂的代码库和多样化的代码任务时。通过实现结构化的代码信息存储和高效的查询机制,CODEXGRAPH不仅提高了代码任务的性能,还展示了其在学术和实际软件工程任务中的广泛适用性。
此外,CODEXGRAPH的设计允许进行精确且结构化的代码检索,这是传统基于相似性的检索方法和手动工具/API难以实现的。通过这种方式,CODEXGRAPH极大地提升了代码理解和操作的效率,为复杂的代码库任务提供了一种强大且灵活的解决方案。
总之,CODEXGRAPH通过其创新的设计和实现,有效地解决了大型代码库中的多样化代码任务,展示了其在自动化软件开发中提高准确性和可用性的潜力。未来,随着对更多编程语言的支持和数据库构建效率的进一步优化,CODEXGRAPH有望在软件工程领域中发挥更大的影响。
本文转载自 AI论文解读,作者:柏企