智能AI morning

RPG 与 RPG-Encoder:为仓库级 AI 工程,量身打造一种中间表示

2026-05-20 1 阅读 微软研究院AI
(本文阅读时间:15分钟) 近年来,很多大模型都能从自然语言描述中稳定地写出单个函数或单个文件。但如何将这种能力延伸到“从高层规格生成完整仓库”,或者“对真实仓库形成持续可用的全局理解”,目前仍处于早期阶段。而这两个看似相互独立的方向,实则共享着同一个底层困局—— 缺少一种适合代码仓库的中间表示。 目前主流的AI智能体框架普遍依赖三类代偿性表示: 自然语言计划:如MetaGPT、ChatDev 等多智能体系统让不同角色通过自然语言进行协商。但自然语言的歧义性往往会导致长程规划在迭代中逐渐漂移。 依赖图:通过静态分析得到的引用与调用(import/ call)拓扑。这种方式虽然结构清晰,却缺少”为什么这些代码会组织在一起”的功能语义。 API 文档:语义丰富,但缺少全局拓扑结构,不足以驱动跨文件的导航与编辑。 图1:三种代码表示的对比:API 文档语义丰富但缺拓扑,依赖图结构严谨但缺语义,RPG 在两个维度上同时收敛 由此可见,这三种表示方式在某一维度上各自可用,却都 无法构成一个同时具备语义密度与拓扑严谨性,且双向可达的统一基底。 基于这一洞察,微软亚洲研究院的研究员们提出了两个方向相反但互为补充的配套工作: 正向的RPG (Repository Planning Graph)瞄准 “从零生成一个完整仓库”的长程任务 ; 反向的RPG-Encoder 则瞄准了 “已有仓库的理解、定位、修改与持续维护” 。 两项工作围绕同一种结构化图表示(RPG)展开,一个负责”从需求生成代码”,另一个负责”从代码反推规划,并在其上做长期推理”,共同构成了一个完整的闭环。 为了让这一闭环真正落地,研究员们进一步将其封装进了 开源工具 RPG-Kit 。对编程智能体而言,优秀的软件规划不应只是聊天中“一瞬即逝的非结构化文本(transient chat artifact)”,而应当是有依据、可验证且可复用的“结构化实体”。RPG-Kit 正是 将动态的生成计划固化为持久的图结构 。 简而言之,如果说 RPG 负责将自然语言需求转化为仓库级规划,RPG-Encoder 负责将已有代码仓库逆向压缩回同一种规划表示,那么 RPG-Kit 则把RPG变成了面向真实变成智能体的控制层,让 Claude Code、GitHub Copilot 等前沿智能体可以围绕同一张持久图,不断进行规划、代码生成、仓库理解与图感知编辑。目前,RPG-Kit已在 GitHub 上开源了论文代码。 RPG项目系列链接: https://github.com/microsoft/RPG-ZeroRepo 相关论文已整理于文末,欢迎点击相关链接,了解更多技术详情。 RPG:从零生成完整仓库的”蓝图” 在“从零生成完整仓库”的任务中,智能体需要独立完成模块划分、文件拆分、接口设计、数据流定义到具体函数实现的完整链路。在此过程中,自然语言计划往往在 4–5 轮迭代后就会开始漂移和断裂,导致模块无法吻合,整个仓库变成一堆碎片。 RPG 的核心思路是 将规划的载体从自然语言替换为结构化的图表示 。作为一种对仓库做”语义 + 实现”双视图编码的图表示,RPG的每个节点都同时承载了两层信息:在功能层上,它代表高层模块(如 algorithms)、中层组件(如 regression)或具体算法、类、函数;在结构层上,它对应实际的目录、文件或代码定义。两层在同一节点上完全对齐。 同时,图中的边也分为两类:跨模块的“数据流边”用于刻画输入与输出的依赖关系,模块内的“文件顺序边”则刻画同一模块下文件的执行顺序。这种双视图特性是RPG区别于传统表示方式的根本所在。 图2:RPG 结构示例 为了高效利用这一表示,研究员们设计了 ZeroRepo 三阶段流水线 ,将复杂的生成过程拆解为可控的图操作: 提案级构建(Proposal-Level Construction):将自然语言需求解耦并映射为一棵自顶向下的语义功能树,顶层是仓库目标,中层是模块边界,底层是可实现的功能单元,从而在结构化先验上完成系统功能框架的检索与枚举。 实现级构建 (Implementation-Level Construction): 把抽象的语义功能树进一步扩展为具象的仓库级实现蓝图。该阶段专注于明确文件结构、确定模块职责、规范接口抽象、定义数据流关系与依赖约束,为后续代码生成确立确定性的演进路径。 图引导代码生成(Graph-Guided Code Generation):按照拓扑顺序遍历 RPG,对每个叶节点执行测试驱动开发,并提供基于图的定位与逐层测试验证。 图3:ZeroRepo 三阶段流水线 为了评估该流水线,研究员们构建了基于 6 个真实 Python 项目(scikit-learn、pandas、sympy、statsmodels、requests、django)的 基准RepoCraft ,共包含1052 个执行式任务。实验结果表明,ZeroRepo 实现了 81.5% 的功能覆盖率与 69.7% 的测试通过率,其生成的仓库平均规模约为 Claude Code 基线的 3.9 倍,并展现出 近线性的代码量增长 (线性拟合 R² = 0.97)。相比之下,自然语言计划基线在 4–5 轮迭代后便陷入停滞。 实验进一步发现,这种出色的可扩展性并非源于 prompt 技巧,而是来自 RPG 结构本身——即便去掉 EpiCoder Feature Tree 这一外部知识库,ZeroRepo 仍然保持线性增长。 表1:RepoCraft 主结果:ZeroRepo 在覆盖率、通过率、规模三个维度全面领先 图4:功能数量随迭代轮次的增长曲线:ZeroRepo 持续线性增长,自然语言基线快速饱和 RPG-Encoder:让已有仓库逆向重构 在真实的软件工程场景中,开发者更多面对的是已有仓库的维护与重构。此时智能体面临的核心挑战是”该改哪里”以及如何随仓库每天的提交持续维护一份准确的全局理解。RPG-Encoder正是为了解决这一痛点,其核心逻辑在于: 生成是将意图扩展为实现,而理解则是将实现压缩回意图。生成与理解是同一推理循环中的逆过程。 为了从已有代码中反推出同一种 RPG,RPG-Encoder 将过程拆分为Encoding 三阶段: 语义提升(Semantic Lifting ):利用大语言模型为每个代码实体(如函数或类)生成一组原子的动宾特征(atomic verb-object features),例如 validate token、load config等,把不同文件、不同风格的代码统一到一致的语义粒度上。 语义结构重组(Semantic Structure Reorganization):找出仓库的架构性质心(centroid),如 DataProcessing或ModelTraining,并将所有低层节点按语义贴近度自下而上归位,重新组织成三层功能结构。 产物锚定(Artifact Grounding):把每个抽象子树锚定回它对应的物理目录,并通过 AST 分析补上 import/ call 等依赖边。 通过这种方式反向恢复出来的 RPG,与 ZeroRepo 正向生成的图在结