CODEXGRAPH:突破代码与AI的壁垒,开启智能编程新时代

CODEXGRAPH:突破代码与AI的壁垒,开启智能编程新时代

  • CODEXGRAPH论文阅读
    • 1. 概述
    • 2. 相关研究
      • 代码库级别的任务
      • 检索增强代码生成(RACG)
    • 3. CODEXGRAPH系统设计
      • 代码图数据库的构建
      • 与图数据库的交互
    • 4. 实验设计与结果
      • CrossCodeEval
      • SWE-bench
      • EvoCodeBench
    • 5. 深入分析
      • 查询策略的优化
      • 翻译LLM代理的作用
      • 高级LLM的增强作用
    • 6. 实验指标
      • 1. Exact Match (EM)
      • 2. Edit Similarity (ES)
      • 3. Identifier Exact Match (ID-EM)
      • 4. Identifier F1 (ID-F1)
      • 5. Pass@1
      • 6. Recall@1
    • 7. 实际应用场景
    • 8. 讨论与未来工作
    • 使用示例
      • 1.代码聊天:
      • 2. 代码调试:
      • 3. 代码添加注释:
      • 4. 代码生成:
      • 5. 代码添加单元测试:

CODEXGRAPH论文阅读

CODEXGRAPH通过结合LLM和图数据库接口,解决了现有RACG方法在处理复杂代码库任务时的灵活性和通用性不足的问题。实验结果表明,CODEXGRAPH在多个学术基准测试和实际应用场景中表现出色,展示了其广泛的适用性和实际价值。

1. 概述

论文首先介绍了大型语言模型(LLMs)在代码生成和理解任务中的重要性,但也指出当前LLMs在处理整个代码库时面临的挑战。这些挑战包括难以处理长上下文输入以及在复杂代码结构中进行推理的能力不足。现有的解决方案,如基于相似性的检索方法和手动工具/API,虽然在特定任务中有效,但在应对复杂的代码库任务时表现出色的效果有限。

为了解决这些问题,作者提出了CODEXGRAPH,一个将LLM与图数据库接口相结合的系统。该系统通过利用代码库的结构化特性,帮助LLM更好地理解和操作大规模代码库,从而提高代码检索和导航的精度和效率。
在这里插入图片描述

2. 相关研究

论文的相关研究部分分为两个主要部分:代码库级别的任务和检索增强代码生成(RACG)。

代码库级别的任务

研究回顾了近年来关于代码库级别任务的工作,这些任务需要模型理解跨文件的代码结构和执行复杂推理。例如,DevBench和SketchEval等基准测试要求模型基于自然语言描述生成完整的代码库,或者在参考代码库的基础上进行代码补全和生成

检索增强代码生成(RACG)

RACG系统旨在通过从外部知识库检索相关内容来增强代码生成的上下文理解。当前的RACG方法主要分为基于相似性的检索、手动设计的工具或API,以及两者结合的方法。虽然这些方法在特定场景下有效,但它们通常依赖于任务特定的设计,缺乏通用性和灵活性
在这里插入图片描述

3. CODEXGRAPH系统设计

论文详细描述了CODEXGRAPH系统的构建和工作流程,分为以下几个关键部分:

代码图数据库的构建

系统通过静态分析将输入的代码库索引为图数据库,其中节点代表代码符号(如模块、类、方法、函数等),边代表这些符号之间的关系(如继承、包含、使用等)。这一过程中,使用了浅层索引和深度索引两阶段策略,以确保准确捕捉代码库的结构信息。

与图数据库的交互

CODEXGRAPH利用图查询语言(如Cypher)构建复杂的查询条件,使得LLM可以在图数据库中高效地导航和检索代码结构信息。系统还采用“写然后翻译”的策略,由主LLM代理生成自然语言查询,再由翻译LLM代理将其转换为可执行的图查询,以减少主LLM代理的推理负担。
在这里插入图片描述

4. 实验设计与结果

论文通过三个基准测试(CrossCodeEval、SWE-bench、EvoCodeBench)评估了CODEXGRAPH的性能,并与其他RACG方法(如BM25和AUTOCODEROVER)进行对比:

CrossCodeEval

该基准测试主要评估代码补全任务。CODEXGRAPH在代码匹配和标识符匹配等多个指标上表现良好,尤其在配备更高级的LLM(如GPT-4o)时表现最佳。

SWE-bench

此基准测试评估模型解决GitHub问题的能力。CODEXGRAPH与AUTOCODEROVER在这一任务上表现接近,但展示了更好的通用性。

EvoCodeBench

此基准测试用于评估代码生成任务。CODEXGRAPH在多个指标上优于其他RACG方法,展示了其在处理复杂代码生成任务中的优势。

此外,论文指出了CODEXGRAPH的代价,即由于使用了更复杂的查询过程,系统的令牌消耗相对较高。
在这里插入图片描述

5. 深入分析

论文还对CODEXGRAPH的性能进行了更深入的分析,包括:

查询策略的优化

实验显示,在不同的基准测试中,选择生成单个查询或多个查询的策略会对性能产生影响。例如,在推理难度较低的任务中,多查询策略更有效,而在推理难度较高的任务中,单查询策略更为合适。
在这里插入图片描述

翻译LLM代理的作用

当取消翻译LLM代理的协助时,主LLM代理必须独立分析编码问题并直接制定用于代码检索的图查询。这增加了主LLM代理上的推理负载,导致图查询的语法准确性下降。实验结果强调了删除LLM翻译代理对CrossCodeEval Lite (Python)基准中所有选定的LLM的CODEXGRAPH性能产生的显著负面影响。即使使用GPT-Χo作为骨干模型,性能指标也会出现显著下降(例如,EM指标从27.90%下降到8.30%),这凸显了翻译LLM代理在减轻主要LLM代理的推理负担方面的关键作用。
在这里插入图片描述

高级LLM的增强作用

实验表明,随着LLM能力的提升,CODEXGRAPH的性能也显著提高,说明了更高级的LLM能够更好地利用代码图数据库提供的灵活接口。如果底层LLM缺乏足够的推理和编码能力,那么CODEXGRAPH中的LLM代理可能很难制定适当的图查询。这可能导致检索预期代码失败,进而阻碍进一步的推理。

6. 实验指标

1. Exact Match (EM)

  • 定义: Exact Match (EM) 指标衡量模型生成的代码与参考代码在字符级别上是否完全一致。
  • 计算方式: 对于每一个测试示例,如果模型生成的代码和参考答案完全相同,EM记为1,否则记为0。最后,将所有测试示例的EM值取平均,得到总体的EM分数。
  • 优点: EM是一个严格的指标,只有当生成的代码完全正确时,才会给予正反馈。
  • 缺点: 由于EM要求完全匹配,即使代码在功能上等价但细节不同,EM也会记为0。

2. Edit Similarity (ES)

  • 定义: Edit Similarity (ES) 是一种衡量模型生成代码与参考代码之间相似度的指标,通常基于编辑距离(edit distance)来计算。

  • 计算方式: ES通常通过归一化的编辑距离来计算。具体而言,它计算的是1减去编辑距离与最大可能的编辑距离的比值,公式如下:
    在这里插入图片描述

  • 优点: ES可以更宽松地评估模型的输出,即使代码不完全匹配,也能根据相似度给予一定的正反馈。

  • 缺点: ES可能会对代码的功能性错误不够敏感。

3. Identifier Exact Match (ID-EM)

  • 定义: Identifier Exact Match (ID-EM) 是一个指标,用于衡量模型生成的代码中的标识符是否与参考代码中的标识符完全一致。
  • 计算方式: 对于每一个测试示例,如果模型生成的代码中的所有标识符都与参考代码中的标识符完全一致,ID-EM记为1,否则记为0。最后,所有测试示例的ID-EM值取平均,得到总体的ID-EM分数。
  • 优点: ID-EM指标专注于标识符的准确性,这在评估模型是否正确理解和生成关键代码元素时非常重要。
  • 缺点: ID-EM可能会忽略生成代码与参考代码在功能上等价但标识符命名不同的情况。

标识符是否与参考代码中的标识符完全一致,指的是模型生成的代码中的变量名、函数名、类名等标识符必须与参考代码中的对应标识符在拼写和格式上完全相同。

#参考代码:
def calculate_area(radius):pi = 3.14159area = pi * radius * radiusreturn area#代码结构不同,但标识符完全一致
def calculate_area(radius):pi = 3.14return pi * radius * radius#代码结构和顺序不同,但标识符完全一致
def calculate_area(radius):area = radius * radius * 3.14159return area#标识符部分不一致
def compute_area(r):pi = 3.14return pi * r * r

4. Identifier F1 (ID-F1)

  • 定义: Identifier F1 (ID-F1) 是基于精确率(Precision)和召回率(Recall)计算的F1得分,专门用于衡量生成代码中标识符的匹配情况。
  • 计算方式:
    • 精确率 (Precision): 指生成代码中正确的标识符占生成标识符总数的比例。
    • 召回率 (Recall): 指生成代码中正确的标识符占参考代码标识符总数的比例。
    • F1得分 (F1 Score): F1得分是精确率和召回率的调和平均数
    • ID-F1通过比较生成代码和参考代码中的标识符,计算出它们的精确率和召回率,然后得出F1得分。
  • 优点: ID-F1能够综合考虑标识符的准确性和覆盖度。
  • 缺点: ID-F1对标识符的部分匹配敏感度较低。

5. Pass@1

  • 定义: Pass@1 指标衡量的是模型在生成一段代码后,是否能够在一次尝试中就通过所有的测试用例或达到特定的标准。
  • 计算方式:
  1. 对于每一个测试示例,模型生成一段代码并进行测试。如果该代码通过了所有测试用例,Pass@1 得分记为1,否则记为0。
  2. 最终,Pass@1 分数是所有测试示例的平均得分,即:
    在这里插入图片描述
  3. 例如,如果100个测试示例中有85个在第一次生成的代码中通过了测试,那么 Pass@1 得分为 0.85。
  • 优点: Pass@1 直接衡量了模型生成代码的实用性。
  • 缺点: 由于Pass@1只记录一次成功的情况,指标具有较高的严格性。
  • Pass@1 指标的应用场景
    代码生成任务: 在生成函数或类时,Pass@1 衡量生成的代码是否在第一次尝试中通过所有单元测试。
    自动化修复: 在自动代码修复任务中,Pass@1 衡量模型生成的修复代码是否在一次应用后就解决了所有问题。
    软件工程中的应用: 在真实的软件开发环境中,Pass@1 可用于评估自动化代码工具的有效性,即该工具生成的代码能否立即在生产环境中运行。

6. Recall@1

  • 定义: Recall@1 衡量的是在模型生成或检索的多个候选答案中,正确答案是否出现在排名第一的位置。
  • 计算方式:
  1. 对于每一个测试示例,模型生成一个排名列表(或输出多个候选代码),并检查正确答案是否出现在第一个位置(即排名第一的候选项)。
  2. 如果正确答案在第一个位置上,Recall@1 得分记为1,否则记为0。
  3. 最终,Recall@1 分数是所有测试示例的平均得分,即:
    在这里插入图片描述
  4. 例如,如果在100个测试示例中有70个示例的正确答案出现在第一个位置上,那么 Recall@1 得分为 0.7。
  • 优点: Recall@1 直接评估了模型在第一次输出中是否找到了正确答案。
  • 缺点: Recall@1 强调输出结果的排名顺序,要求模型将正确答案排在最前面。
  • Recall@1 指标的应用场景
    代码生成和补全: 在代码生成任务中,Recall@1 用于评估模型生成的代码片段是否在第一位置上就达到了预期的功能。
    信息检索: 在检索任务中,Recall@1 衡量模型从候选项列表中检索到正确答案的能力,特别是检索到的第一个候选项的准确性。
    自动化推荐: 在代码推荐系统中,Recall@1 评估系统推荐的第一个代码片段是否满足用户的需求。

7. 实际应用场景

为了展示CODEXGRAPH的实际应用价值,作者开发了五个基于ModelScope-Agent框架的代码代理,包括:

  • Code Chat: 允许用户查询代码存储库,从而深入了解代码结构和函数使用情况。
  • Code Debugger: 通过应用迭代推理和信息检索来诊断和解决错误,并提出有针对性的修复建议。
  • Code Unittestor: 自动生成详细的单元测试代码。
  • Code Generator: 自动生成代码片段。
  • Code Commentor: 自动为代码添加注释。

8. 讨论与未来工作

论文的讨论部分提到CODEXGRAPH目前仅在Python代码库中进行评估,未来的工作计划包括将其扩展到更多的编程语言(如Java和C++),并提高代码图数据库的构建效率和模式的完整性。此外,作者计划探索与现有的高级代理技术更紧密的集成,以进一步优化CODEXGRAPH的工作流程。

使用示例

1.代码聊天:

代码聊天允许用户查询代码存储库,从而深入了解代码结构和函数使用情况。此功能对于理解复杂的代码库、识别依赖关系以及探索特定类、方法和函数的使用情况特别有用。

下面是一个代码聊天的例子。用户的问题是:“总结一下这个CodexGraphAgentChat类,它有哪些方法,以及它们是用来做什么的。收集到必要的信息后,Code Chat会针对用户的问题构建全面的回复。此回复包括类的摘要CodexGraphAgentChat、其方法列表以及每种方法的说明。

在这里插入图片描述

2. 代码调试:

代码调试器通过应用迭代推理和信息检索来诊断和解决错误,并提出有针对性的修复建议。它利用 Cypher 查询来分析代码存储库,找出问题的原因,并推荐精确的修改。

下面是一个Code Debugger的例子。用户的输入是一个实际的问题,其结果与预期的行为不符。Code Debugger首先分析问题,然后使用 Cypher 查询检索相关信息并推断出 bug 的原因。最后,它对 bug 进行了解释并建议修改的位置。确定代码库中错误的精确位置并提供问题的详细解释以及错误的根本原因。
在这里插入图片描述
在这里插入图片描述

3. 代码添加注释:

代码注释器分析代码以提供详细注释,增强代码的可读性和可维护性。它利用代码图数据库来了解代码的结构和行为,确保注释准确且信息丰富。
在这里插入图片描述

4. 代码生成:

用户已请求一个函数来检索 的输入和输出令牌的数量CypherAgent。然而,挑战在于识别其中的相应字段,CypherAgent因为用户输入中未提供此信息。
在这里插入图片描述
首先,Code Generator会思考如何找到相关字段,然后通过 Cypher 查询,发现对应的字段为input_token_num和output_token_num,从而生成正确的代码。
在这里插入图片描述

5. 代码添加单元测试:

下面是一个Code Unittestor的例子,用户的输入是:“为 生成测试用例TaskManager”。Code Unittestor会先检索 中的所有方法和继承关系TaskManager,然后生成详细的测试用例代码。
Code Unittestor将为该类生成详细的单元测试代码TaskManager,涵盖其方法和继承关系。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400115.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构---单链表实现

单链表是什么 我的理解是“特殊的数组”,通过访问地址来连接起来 1怎么创建链表 ----通过结构体(成员有存入数据的data和指向下一个节点的地址的指针(结构体指针)next 初始架构---DataType 对应存入数据类型,此处的N…

数字引领风尚·智能改变生活“青岛电博会”路演活动(济南站)

2024CICE中国国际消费电子博览会路演活动(济南站)成功举行 数字引领风尚,智能改变生活。 8月7日,50余家行业协会、企业嘉宾、展商代表等云集2024中国国际消费电子博览会路演活动(济南站)现场,共…

瑞萨电子并购Altium 引领行业创新与发展

公开资料显示,2023 年 6 月,瑞萨电子曾宣布在 Altium 的 Altium 365 云平台上实现了所有 PCB 设计的标准化开发。瑞萨电子一直与 Altium 合作,将其所有产品的 ECAD 库发布到 Altium Public Vault。借助 Altium365 上的制造商零件搜索等功能&a…

Wireshark分析工具

简单用例 首先打开软件,左上角点文件,选中要分析的文件列表。 导入用tcpdump抓的包后进行分析,这里要输入过滤条件,对网络包进行一定的过滤处理。(这里172网段是阿里云的地址,用自己写的python2脚本对阿里云进行压测。) 这里输入过滤条件 tcp.port == 80 ,语法含义是…

Java虚拟机:类的加载机制

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 034 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

【ARM CoreLink 系列 5.1 -- CI-700 各种 Node 组件详细介绍】

请阅读【ARM CoreLink 文章专栏导读】 文章目录 CI-700 组件(Components)RN-I( I/O-coherent Request Node) 和 RN-D(I/O coherent Request Node with DVM)HN-F(Fully coherent Home Node)IO coherent Home Node (HN-I)IO coherent Home Node with Debug Trace Controller (H…

43.【C语言】指针(重难点)(F)

目录 15.二级指针 *定义 *演示 16.三级以及多级指针 *三级指针的定义 *多级指针的定义 17.指针数组 *定义 *代码 18.指针数组模拟二维数组 往期推荐 15.二级指针 *定义 之前讲的指针全是一级指针 int a 1; int *pa &a;//一级指针 如果写成 int a 1; int *pa &a…

机器学习——线性回归(sklearn)

目录 一、认识线性回归 1. 介绍 2. 多元线性回归的基本原理(LinearRegression) 二、多重共线性 1. 介绍 2. 多重共线性详细解释 三、岭回归(解决多重共线性问题) 1. 模型推导 2. 选取最佳的正则化参数取值 四、Lasso&am…

景联文科技:破解数据标注行业痛点,引领高质量AI数据服务

数据标注行业是人工智能和机器学习领域中一个非常重要的组成部分。随着AI技术的发展,对高质量标注数据的需求也在不断增长。 数据标注市场的痛点 1. 团队管理 在众包和转包模式下,管理大量的标注人员是一项挑战。 需要确保标注人员的专业性、稳定性和…

Pod的调度机制

文章目录 一、Pod调度概述二、Pod调度策略实现方式三、kube-scheduler调度1、kube-scheduler调度的流程2、过滤阶段3、打分阶段4、kube-scheduler 调度示例4.1、创建 Deployment 资源清单4.2、应用Deployment4.3、查看被kube-scheduler自动调度的Pod 四、nodeName调度1、创建Po…

Linux驱动入门实验班——LED驱动(附百问网视频链接)

目录 一、确定引脚编号 二、编写思路 2.1驱动层 2.2应用层 三、源码 四、实现 课程链接 一、确定引脚编号 首先,可以在开发板上执行如下命令查看已经在使用的GPIO状态: cat /sys/kernel/debug/gpio 可以看到每个gpio都有对应的编号,…

火语言RPA--火语言界面应用多窗体详解

多窗体 界面应用建立时默认加载一个窗体,若是程序运行时需要多个窗体配合,在通常情况下,您可将多窗体绑定在UI控件事件中,由界面交互来打开多窗体。 本章将介绍下如何建立多窗体以及在应用中如何运用多窗体完成多种场景的设置。 …

源代码防泄密怎么做?最好用的12款源代码加密软件推荐

源代码是企业的核心资产之一,其安全性直接关系到产品的竞争力和市场地位。防止源代码泄密是企业信息安全中的重中之重,本文将介绍几种有效的源代码防泄密方法,并推荐12款优秀的源代码加密软件。 1. 代码审查与权限管理 通过严格的代码审查流…

【MySQL】用户管理——用户、用户信息、创建用户、删除用户、修改用户密码、数据库的权限、给用户权限、回收权限

文章目录 MySQL1. 用户管理1.1 用户1.1.1 用户信息1.1.2 创建用户1.1.3 删除用户1.1.4 修改用户密码 1.2 数据库的权限1.2.1 给用户权限1.2.2 回收权限 MySQL 1. 用户管理 为什么MySQL要引入用户管理? 如果我们只能使用root用户,这样存在安全隐患。因为r…

[C++][opencv]基于opencv实现photoshop算法可选颜色调整

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 SelectiveColor.hpp #ifndef OPENCV2_PS_SELECTIVECOLOR_HPP_ #define OPENCV2_PS_SELECTIVECOLOR_HPP_#include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "…

Mariadb数据库本机无密码登录的问题解决

Mariadb数据库本机无密码登录的问题解决 安装了mariadb后,发现Mariadb本机无密码才能登录 百度了很多文章,发现很多人是因为root的plugin设置的值不正确导致的,unix_socket可以不需要密码,mysql_native_password 是正常的。 解…

NLP_情感分类_预训练加微调方案

文章目录 项目背景代码导包一些模型以及训练的参数设置定义dataset定义模型读取数据声明训练及测试数据集将定义模型实例化打印模型结构模型训练测试集效果 同类型项目 项目背景 项目的目的,是为了对情感评论数据集进行预测打标。在训练之前,需要对数据…

Datawhale X 魔搭 AI夏令营 第四期魔搭-AIGC文生图方向Task2笔记

了解一下 AI生图技术 的能力&局限 对所有人来说,定期关注AI生图的最新能力情况都十分重要: 对于普通人来说,可以避免被常见的AI生图场景欺骗,偶尔也可以通过相关工具绘图 对于创作者来说,通过AI生图的工具可以快速…

全球 30 万台游戏服务器的 PlayFlow Cloud 如何通过 DigitalOcean 实现动态扩展

“我在 DigitalOcean 上首次接触了 Kubernetes。设置 Kubernetes 集群非常简单,使我能够轻松自动化扩展我们的游戏服务器。”——Haseeb Sheikh,PlayFlow Cloud 创始人兼首席执行官 PlayFlow Cloud 是由 Haseeb Sheikh 创立的,旨在通过简化游…

13 Listbox 组件

13 Listbox 组件 Tkinter 的 Listbox 组件是一个用于显示列表项的控件,用户可以从中选择一个或多个项目。以下是对 Listbox 组件的详细说明和一个使用案例。 Listbox 组件属性 基本属性 width: 控件的宽度,通常以字符数为单位。height: 控件的高度&a…