CodePlan

news2025/7/10 20:50:35

CodePlan论文解读

最近在看老师给的LLM-Agent论文,在这记录一下

CodePlan: Repository-level Coding using LLMs and Planning【论文】

  • 旨在解决储存库级别的coding task,提出一个框架called CodePlan
  • 综合多步骤的编辑链,其中每个步骤都导致对代码位置的LLM调用,该代码位置具有来自整个存储库的上下文
  • Codeplan基于增量依赖性分析(用于识别和分析软件系统中的增量变化对其他部分的影响和依赖关系)
Intro
  • 给定一个自然语言意图或者周围代码的上下文来进行补全or编辑通常针对小范围内的代码

  • 但是软件工程的“Outer loop”涉及到整个代码库,可能存在外部api的调用和依赖(牵一发而动全身)be like:

    1697459700052.png&pos_id=img-td3FSH9L-1697515283228)

  • 因此,为了达到这样的效果, 我们需要一个系统来自动生成编辑的派生规范

  • codeplan综合了一个多步骤计划来解决储存库级别的编码任务

    在这里插入图片描述

  • 如图,codeplan的输入是一个储存库a task with seed specifications(确定任务的起点和任务需求) expressed through a natural language instruction or a set of initial code edits, a correctness oracle and an LLM.

  • CodePlan构建了一个平面图,每个节点表示LLM需要执行的代码编辑任务,CodePlan监视代码编辑,并且自适应的扩展计划图,merge模块把LLM生成的代码合并到储存库当中

  • Oracle对储存库分析,没错的话标记为完成任务,否则生成错误报告,用于执行下一轮计划生成和执行的种子规范

    在软件工程中,"Oracle" 是一个术语,指的是用于验证软件系统行为是否正确的标准或机制。它作为一个参考点或期望结果,用于判断软件的输出是否符合预期。
    
  • codeplan优于Oracle引导的修复技术

Design
  • 算法维护的核心数据结构是一个规划图G,这是一个多个根节点的有向无环图

  • 算法也维护一个依赖图,结构如下
    在这里插入图片描述

  • 规划图里每个节点是一个元组 <code, edit_instruction, stuatus(pending or completed)>

  • AdaptivePlanAndExecute函数:主要的work-horse:迭代的掉选每个待决策节点并进行处理,workflow如下:

    • line-19:提取要编辑的代码片段
    • l-21: 收集编辑的上下文
      • 空间上下文:区块B中调用的方法等相关代码
      • 时间上下文:之前相关编辑
    • 根据提取的片段构造prompt,调用LLM获取编辑后的代码片段
    • merge到储存库
    • 自适应规划,将当前编辑的影响传播到依赖的代码块上
  • 静态分析组件:

    • DependencyGraph:依存分析,分析代码元素之间的各种依赖关系
    • ClassifyChanges:pattern-matching更改前后代码,标注出哪里改了,改了什么
    • UpdateDependencyGraph:根据ClassifyChanges更新计算图
    • GetAffecttedBlocks:识别收到更改后模块影响的模块
  • 适应性规划和计划执行

    • PlanGraph

    • ExtractCodeFragment

    • GetSpatialContext

    • GetTemporalContext

      -----以上都是基于之前的静态分析(不用LLM),然后基于此去make prompt-----

    • MakePrompt

    1. 自适应规划(Adaptive Planning):在确定受影响的代码块后,CodePlan 通过创建变更义务(change obligations)来保持依赖代码与变更的一致性。这是一个迭代的过程。
    
    2. 计划图(PlanGraph):计划图 P = (𝑂,𝐶) 是一个有向无环图,其中𝑂是一组义务(obligations),每个义务是一个三元组 ⟨𝐵, 𝐼, 𝑠𝑡𝑎𝑡𝑢𝑠⟩,其中 B 是一个代码块,I 是一条指令,status 表示待处理或已完成。𝐶中的边记录了源义务和目标义务之间的原因和依赖关系。换句话说,边标签标识了在表1中的变更可能影响规则(change may-impact rule)中的哪个 Rel 子句导致创建目标义务。
    
    3. 提取代码片段(ExtractCodeFragment):提取代码块 B 的代码时,简单地提取代码是次优的,因为它会丢失上下文信息。ExtractCodeFragment 函数接受代码块所属的整个类,保留 B 的完整代码,并只保留类的声明和其他类成员的声明。这样做是有用的,因为类和其他成员的名称和类型为 LLM 提供了额外的上下文信息。LLM 经常需要进行多个同时变更。例如,在一些案例研究中,LLM 需要添加字段声明,将参数传递给构造函数,并在构造函数中使用它来初始化字段。将周围代码的草图作为代码片段提供给 LLM 可以让 LLM 在正确的位置进行这些变更。代码片段提取逻辑通过遍历 AST 并“折叠”掉草图的子树(例如方法体)来实现。正如在第1节中所述,即使存在多个同时变更,这种草图表示也允许我们将 LLM 生成的代码放回 AST 中而不产生歧义。
    
    4. 获取空间上下文(GetSpatialContext):CodePlan 中的空间上下文指的是代码块在代码库中的排列和关系,有助于理解类、函数、变量和模块的结构和交互。它对于进行准确的代码更改至关重要。CodePlan 利用依赖图提取空间上下文,将代码表示为节点,将它们之间的关系表示为边。这个图使得 CodePlan 能够遍历代码库,识别相关的代码块,并保持对它们的空间上下文的意识。因此,在生成代码编辑时,依赖图使得 CodePlan 能够进行与代码的空间组织一致的、具有上下文意识的代码修改,提高了代码编辑能力的准确性和可靠性。
    
    5. 获取时间上下文(GetTemporalContext):计划图记录了所有变更义务及其相互依赖关系。提取时间上下文是通过线性化从计划图的根节点到目标节点的所有路径来实现的。每个变更是一对变更前和变更后的代码片段。时间上下文还说明了连接目标节点与其前置节点的“原因”(记录为边标签)。例如,如果节点 A 与 B 通过一个 CalledBy 边相连,则 B 的时间上下文是 A 的变更前/后代码片段和一条说明“B 调用 A”的语句,这有助于 LLM 理解最新的时间变更(对 A 的变更)与当前义务(对 B 的变更)之间的因果关系。
    
    6. 计划执行(Plan Execution):CodePlan 迭代地选择计划图中的一个待处理节点,并调用一个 LLM 来完成变更义务。
    
    7. 构建提示(MakePrompt):在提取要编辑的代码片段以及相关的空间和时间上下文后,我们构建一个提示(prompt)传递给 LLM,其结构如下所示。首先是任务特定的说明(Task Instructions),然后是到目前为止在代码库中进行的与要编辑的片段相关的编辑(Earlier Code Changes),接下来是说明每个出现在 Earlier Code Changes 中片段与要编辑的片段的关系(Causes for Change),然后是相关代码块(Related Code)和要编辑的代码片段(Code to be Changed Next)。通过编辑“Code to be Changed Next”并生成“Changed Code”,根据“Task Instructions”对“Code to be Changed Next”进行编辑,使其与“Earlier Code Changes”、“Causes for Change”和“Related Code”一致。如果不需要进行任何更改,则输出“No changes.”。
    
    8. Oracle 和计划迭代(Oracle and Plan Iterations):当计划图中的所有节点都被标记为完成且不再添加新节点时,一个存储库级别的代码编辑迭代就完成了。如图2所示,在存储库上调用 Oracle。如果 Oracle 标记出任何错误(例如构建错误),则将错误位置和诊断信息作为下一次迭代的种子变更添加,并且自适应规划再次开始。如果 Oracle 没有标记出任何错误,CodePlan 终止执行。
    
Future work
  • 扩展适用性到更多编程语言
  • 处理动态依赖的挑战

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为---PPP协议简介及示例配置

PPP协议简介 PPP是Point-to-Point Protocol的简称&#xff0c;中文翻译为点到点协议。与以太网协议一样,PPP也是一个数据链路层协议。以太网协议定义了以太帧的格式&#xff0c;PPP协议也定义了自己的帧格式&#xff0c;这种格式的帧称为PPP帧。 利用PPP协议建立的二层网络称为…

云耀服务器L实例部署Typecho开源博客系统|华为云云耀云服务器L实例评测使用体验

云耀服务器L实例部署Typecho开源博客系统 文章目录 云耀服务器L实例部署Typecho开源博客系统1. 华为云云耀服务器L实例介绍2. Typecho2.1 Typecho 3. 部署华为云云耀服务器L实例3.1 云耀服务器L实例购买3.1.1 云耀服务器L实例初始化配置3.1.2 远程登录云耀服务器L实例 4. Typec…

基于MATLAB的图像条形码识别系统(matlab毕毕业设计2)

摘要 &#xff1a; 本论文旨在介绍一种基于MATLAB的图像条形码识别系统。该系统利用计算机视觉技术和图像处理算法&#xff0c;实现对不同类型的条形码进行准确识别。本文将详细介绍系统学习的流程&#xff0c;并提供详细教案&#xff0c;以帮助读者理解和实施该系统。 引言…

Git构建分布式版本控制系统

一、版本控制 1、概念&#xff1a; 版本控制&#xff08;Version Control&#xff09;&#xff0c;也被称为版本管理、源代码管理或代码控制&#xff0c;是一种系统和工具&#xff0c;用于跟踪和管理文件、数据或源代码的不同版本和历史记录&#xff0c;在软件开发、文档管理…

深入理解Huffman编码:原理、代码示例与应用

目录 ​编辑 介绍 Huffman编码的原理 信息理论背景 频率统计 Huffman树 Huffman编码的代码示例 数据结构 权重选择 Huffman编码生成 完整示例 完整代码 测试截图 Huffman编码的应用 总结 介绍 在这个数字时代&#xff0c;数据的有效压缩和传输变得至关重要。Hu…

【Linux】Ubunt20.04在vscode中使用Fira Code字体【教程】

【Linux】Ubunt20.04在vscode中使用Fira Code字体【教程】 文章目录 【Linux】Ubunt20.04在vscode中使用Fira Code字体【教程】1. 什么是Fira Code字体2. 安装Fira Code字体3. 配置vscodeReference 1. 什么是Fira Code字体 Fira Code&#xff1a;是一种带有编程连字的等宽字体。…

多组试验时正态分布标准差估计公式

本文介绍如何通过多组试验数据来估计正态总体的标准差. 一,各组试验次数相等 设正态总体X&#xff5e;N(μ,σ),其中均值μ和标准差σ未知.今有m组样本,每组样本大小n相等,其试验数据如下:求标准差σ的估计σ. 多组试验时正态分布标准差估计公式 - 百度学术

机器人制作开源方案 | 行星探测车概述

1. 功能描述 行星探测车&#xff08;Planetary Rover&#xff09;是一种用于进行科学探索和勘测任务的无人车辆&#xff0c;它们被设计成能够适应各种复杂的地形条件和极端环境&#xff0c;以便收集数据、拍摄照片、采集样本等。行星探测车通常包含以下主要组件和功能&#xff…

Ubuntu - 查看 IP 地址

要查看 Ubuntu 操作系统中的 IP 地址&#xff0c;可以使用 ip 命令或者 ifconfig 命令。以下是使用这两个命令的示例&#xff1a; 使用 ip 命令&#xff1a; 打开终端。 输入以下命令&#xff1a; ip a 这将显示网络接口信息&#xff0c;包括 IP 地址。通常&#xff0c;IP…

彩虹工具网程序开源未加密版源码_支持插件扩展 支持暗黑模式

2023全新UI彩虹站长在线工具箱系统源码下载 全开源版本 支持暗黑模式 支持高达72种站长工具、开发工具、娱乐工具等功能。本地调用API、自带免费API接口&#xff0c; 是一个多功能性工具程序支持后台管理、上传插件、添加增减删功能。 源码下载&#xff1a;https://download…

谈谈 Redis 主从复制模式

谈谈 Redis 主从复制模式 第一次主从节点同步是全量复制 接下来&#xff0c;我在具体介绍每一个阶段都做了什么。 第一阶段&#xff1a;建立链接、协商同步 执行了 replicaof 命令后&#xff0c;从服务器就会给主服务器发送 psync 命令&#xff0c;表示要进行数据同步。 psync…

推荐一下中国可看到当前就业形势统计的网站

推荐一下中国可看到当前就业形势统计的网站 要查看中国的就业形势统计&#xff0c;你可以考虑以下几个官方和主流的资源网站&#xff1a; 国家统计局 (National Bureau of Statistics of China): 网址&#xff1a;http://www.stats.gov.cn/国家统计局是中国官方发布各种统计数…

Jetpack:011-Jetpack中标题栏

文章目录 1. 概念介绍2. 使用方法2.1 标题与导航2.2 详情菜单 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中进度条相关的内容&#xff0c;本章回中主要介绍 标题栏。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&#xff01; 1. 概念介绍 我们在本章回…

航天科技×辰安科技 打造智慧化工园区安全保障平台

近年来&#xff0c;国内化工园区安全事故频发&#xff0c;多起化工园区重特大事故造成了严重人员财产损失的同时&#xff0c;也重创了行业的整体发展。在智能制造和工业互联网的背景下&#xff0c;建设智慧化工园区&#xff0c;使用智能化手段实现安全生产是解决当前化工园区安…

2023年Q3季度国内手机大盘销额下滑2%,TOP品牌销售数据分析

根据Canalys机构发布的最新报告&#xff0c;2023年第三季度&#xff0c;全球智能手机市场出货量仅下跌1%&#xff0c;可以认为目前全球手机市场的下滑势头有所减缓。而国内线上市场的表现也类似。 根据鲸参谋数据显示&#xff0c;今年Q3京东平台手机累计销量约1100万件&#xf…

MYSQL学习笔记1-window安装mysql5.7

1.下载安装包 官网下载&#xff1a;MySQL :: Download MySQL Installer (Archived Versions) 第一个是在线安装&#xff0c;不下载这个&#xff1b;我们下载第二个 2. 安装mysql 1&#xff09;选择自定义安装 双击下载的msi文件 “Developer Default”是开发者默认 “Server o…

RK3568平台开发系列讲解(驱动篇)Linux 中断实验

🚀返回专栏总目录 文章目录 一、中断处理函数二、request_irq 函数三、中断号四、free_irq 函数五、中断使能与禁止函数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便…

Spring核心扩展点BeanDefinitionRegistryPostProcessor源码分析

我们知道&#xff0c;只要在一个Java类上加上Component、Service、Controller等注解&#xff0c;就可以被加载到Spring容器中&#xff0c;除了以上方式&#xff0c;加了Bean和Import好像也可以将对象添加到Spring容器中&#xff0c;究竟Spring是如何实现这些功能的呢&#xff1…

YAPI介绍及Docker Compose部署指南

我们团队的项目最初前后端是同一个开发人员在做&#xff0c;因此并不存在提供详细接口文档等问题。随着项目的不断迭代&#xff0c;团队规模逐渐扩大&#xff0c;我们决定将前后端分开&#xff0c;专门由专业的前端和后端人员进行开发工作。然而&#xff0c;这样的改变也带来了…

多线程下的单例设计模式(新手必看!!!)

在项目中为了避免创建大量的对象&#xff0c;频繁出现gc的问题&#xff0c;单例设计模式闪亮登场。 一、饿汉式 1.1饿汉式 顾名思义就是我们比较饿&#xff0c;每次想吃的时候&#xff0c;都提前为我们创建好。其实我记了好久也没分清楚饿汉式和懒汉式的区别。这里给出我的一…