top of page

GitHub Copilot 运行时 Rust 迁移:智能体让重写在成本上变得可行

9月18日
讀畢需時 14 分鐘

GitHub 完成了 GitHub Copilot 运行时的 Rust 迁移,覆盖约 83 万行生产代码。该公司表示,智能体让这项重写在经济上变得可行。项目替换了运行时的 TypeScript 实现,而 Copilot 自身则协助生成、审查、测试和修复新代码。

这并非围绕某个孤立库打造的演示项目。该运行时在一款生产级编程产品中协调模型、工具、会话、扩展和宿主应用。工程师在改造底层机制的同时,GitHub 仍持续发布公开的 CLI 版本。

更尖锐的矛盾并非 Rust 与 TypeScript 之争,而是智能体生成速度与确保大规模迁移在行为上正确所需人工验证工作之间的较量。GitHub 的结果表明,智能体能够压缩实现时间,但无法免除工程责任。

根据 GitHub 对 运行时迁移 的详细说明,该项目从 5 月 12 日持续至 8 月 21 日。在此期间,团队合并了 128 个迁移拉取请求,并发布了 135 个公开 CLI 版本。

这一过程之所以重要,是因为它挑战了人们对重写的一个常见假设。大规模重写通常需要长期功能冻结、独立替代方案,或历经数年的渐进式迁移。GitHub 则在保持产品持续演进的同时更换了实现。

这一结果为工程领导者提供了一次罕见的、生产规模的 AI 辅助软件开发测试。它也带来了一项警告:代码生成只是工作的一部分,而且往往并非最困难的部分。

GitHub Copilot 运行时 Rust 迁移改变了什么

GitHub 替换了一套生产运行时,但并未将重写视为一个独立、隐蔽且仅在完成后才会亮相的项目。

旧架构在软件开发工具包与 Copilot CLI 之间设置了进程边界。进程边界要求组件跨不同操作系统进程通信,通常涉及序列化消息和生命周期管理。

新设计同时支持进程内和进程外托管。进程内托管将运行时置于调用应用内部,避免了独立进程带来的部分启动、通信和内存成本。

这一架构变化使项目范围超出了语法翻译。团队必须在改变所有权、并发、错误处理、状态管理和集成边界的同时,保留运行时可观察到的行为。

GitHub 最终的代码历史显示,生产 Rust 代码约为 83 万行,Rust 单元测试约为 46.9 万行。到项目结束时,TypeScript 实现已降至零。

这些数字需要结合背景理解。代码行数并不能一致地衡量质量、难度或开发者产出。生成的代码可能较为冗长,而测试中也可能包含 fixture、辅助工具或机械扩展的用例。

不过,这些数据确立了迁移的规模。这不是一个周末就能完成的命令行工具转换。它涉及一个拥有多个宿主、扩展行为、模型编排、持久会话、平台特定集成和外部库的运行时。

GitHub 在过渡期间采用了临时互操作层。互操作性使不同语言编写的代码能够通过既定接口相互调用,同时让两种实现保持运行。

项目通过 N-API 暴露 Rust 函数;N-API 是 Node.js 应用原生模块使用的稳定接口。因此,TypeScript 调用方能够在整个依赖链完成迁移前调用新移植的 Rust 组件。

随着工程师在既有 TypeScript 调用方之下引入 Rust 实现,这一临时表层逐渐扩大。之后,当这些调用方迁入 Rust、不再需要桥接时,它又逐步收缩。

这种先增长后收缩的过程很重要。永久性的互操作层可能演变为自身的一套架构,伴随序列化成本、重复类型和复杂的所有权规则。GitHub 将该桥接层视为脚手架,而非最终目标。

迁移还按照从较小基础组件到更大编排和会话组件的顺序推进。这种次序让智能体和工程师在处理行为影响范围更广的代码前,先建立起成熟的 Rust 接口。

与此同时,团队在迁移窗口内发布了 135 个公开 CLI 版本。这一数字超过了 128 个迁移拉取请求,表明常规产品交付与重写同步进行。

这一结果改变了可行重写的样貌。组织无需为长期替代方案资助一支平行团队,而可以利用智能体加速边界明确的迁移单元。

但这一可能性取决于测试、稳定接口,以及理解原有行为的审查者。缺少这些控制措施,快速翻译只会更快地产生错误软件。

为什么智能体让 80 万行重写在成本上变得可行

经济性的变化来自并行实现和持久上下文,而不是智能体独立决定运行时应如何工作。

传统重写面临严酷的成本曲线。工程师必须阅读现有代码、还原未文档化的契约、设计替代接口、加以实现,并将结果与生产行为进行比对。

每个阶段都会与功能开发和事故响应争夺资源。重写持续得越久,原产品变化越多,替代团队面对的目标也越是不断移动。

编程智能体减轻了部分阅读与实现负担。它们能够追踪引用、起草等效模块、生成测试、运行构建命令,并在失败后修订代码。

GitHub 的工作展示了这种辅助如何超越自动补全。智能体通过长时间运行的会话工作,并将子任务委派给子智能体,围绕共同的迁移目标形成并行工作流。

一个迁移 session.ts 的会话运行了 25 小时。它使用了五个子智能体,并在七轮工作中创建了 15 个子会话。

另一个会话专注于模型编排,持续了 42 小时,并涉及 126 个子智能体。GitHub 的时间线显示,大部分代码在最初 12 小时内出现,随后进入广泛的验证和审查阶段。

这种模式揭示了一个核心机制。智能体能够迅速产出初版实现,但信心的积累要慢得多,必须经过编译、测试、对比和人工检查。

另一次独立的扩展运行时迁移持续了 88 小时。阅读、编写、构建和审查在该会话的大部分时间内交错进行,而非形成清晰的顺序阶段。

这种差异很重要,因为并非每个组件都适用同一种工作流。相对自包含的模块可以从生成阶段进入验证阶段;而边界复杂的运行时则需要在新交互逐渐显现时反复迭代。

提示词缓存也影响了成本结构。在各迁移会话中,96.22% 的提示词输入来自缓存读取。缓存写入占 3.07%,新输入仅占 0.71%。

提示词缓存会复用先前处理过的模型上下文,减少重复计算指令和仓库资料的需求。当大部分上下文保持稳定时,它能够让长时间会话更快、成本更低。

这些百分比并不能说明项目的总财务成本。GitHub 并未公布智能体辅助迁移与完全人工重写之间的常规人力成本比较。

但它们表明,该工作流依赖于上下文复用。若每次都将大型仓库、设计指令和累计发现作为新输入重新提供,成本结构将截然不同。

正是在这里,GitHub Copilot 运行时 Rust 迁移不再只是一个语言故事。该项目检验了智能体能否在依赖图中持续工作,同时不丢失先前任务已经确立的决策。

这一要求类似于任何大型工程组织内部的知识管理。重要约束分散在代码、测试、问题讨论、架构说明和审查反馈之中。

尝试类似项目的团队需要可靠的工程知识库。智能体无法应用其无法检索的契约,而未文档化的假设无论模型质量如何都依然危险。

因此,这次迁移改变了成本可承受性的方程式,却并未默认让重写变得廉价。智能体降低了阅读和起草的边际成本,而组织仍须投入验证、协调和运营风险管理。

真正的较量是生成速度与审查能力

GitHub 自身的交互数据表明,人类注意力转向了检查、质疑和完成智能体的工作。

GitHub 分析了迁移过程中的 2,639 条人工撰写消息。其中 31% 涉及审查、测试或持续集成。

另有 17.4% 质疑技术或设计决策。还有 15% 的消息推动智能体完善工作,往往指出初步处理遗漏的内容。

这些类别共同描述了一种角色转变。工程师花在逐行输入实现代码上的时间更少,而更多地用于规定标准、检查结果和指导修复。

这并不意味着人类贡献变小。审查工作所需的专注程度可能高于编写熟悉模块,因为审查者必须在不熟悉的生成代码中发现细微的行为差异。

GitHub 识别出的五类回归问题体现了这一负担。它们包括迁移不完整、状态和生命周期错误、行为契约不匹配、宿主边界问题,以及错误的测试预言机。

当新实现遗漏原实现中存在的路径、选项或副作用时,就会发生迁移不完整。智能体可以生成能够编译的代码,却遗漏某种很少使用的行为。

状态和生命周期失败在 Rust 中尤其值得关注。Rust 在编译时编码所有权和借用规则,但程序仍可能错误地建模应用状态。

编译器可以拒绝不安全的内存访问,却无法知道某个会话是否应在特定事件后继续可用。类型安全与产品正确性相互关联,但并不相同。

当两个实现接受相同输入,却在时机、顺序、错误文本、重试或清理方面不同,便会出现行为契约不匹配。即使没有正式规范记录这些细节,下游软件仍可能依赖它们。

宿主边界又增加了一层复杂性。运行时必须在嵌入不同应用,或作为独立进程运行时都表现正确。环境处理、取消、文件访问和进程终止在不同宿主之间可能有所不同。

错误的测试预言机会造成最具迷惑性的失败。测试预言机定义了用于判断实现是否正确的预期结果。如果智能体同时生成代码和错误的预期,那么所有测试都可能通过,同时保留错误行为。

这就是为什么基于同一解读生成的测试无法提供独立确认。团队需要生产环境追踪数据、现有测试夹具、人工指定的不变量,以及与旧实现的对比。

GitHub 的 Rust 代码包含 158 个 unsafe 块。在 Rust 中,unsafe 允许编译器无法完全验证的特定操作,例如调用外部函数或解引用原始指针。

GitHub 表示,全部 158 个块都出现在外部边界处,包括 C 接口、Windows API、POSIX 和 libc 调用、SQLite、动态库加载以及进程环境变更。

这种集中分布符合 Rust 预期的安全模型。该语言鼓励开发者将无法验证的操作隔离在小型接口之后,同时让更大范围的程序保持在编译器检查的规则之内。

相关的 unsafe Rust 指南还作出了一个关键区分:unsafe 放宽了某些编译器检查,但并不免除程序员维护安全要求的责任。

对审查者而言,这意味着不安全代码应接受重点检查。智能体可以生成绑定和封装层,但一个看似合理的封装层仍可能使用错误的生命周期、缓冲区长度、调用约定或同步规则。

审查瓶颈同样会影响组织规划。增加更多智能体能迅速提升代码产出能力,却不会自动增加足够了解运行时、能够批准变更的工程师数量。

这种失衡可能让团队被表面完成的工作淹没。拉取请求等待更久,审查者更频繁地切换上下文,细微的不一致也会在并行分支之间不断累积。

GitHub 似乎通过边界明确的组件、重复构建、子智能体专业分工和持续集成来应对这一压力。人工消息表明,团队进行了主动干预,而非被动接受结果。

因此,主要的对手并不是另一款编程助手,而是“实现吞吐量决定项目速度”这一旧有假设。

在智能体主导的迁移中,可信审查能力成为限制性资源。忽视这一转变的团队,可能会衡量生成代码的数量,却忽略了建立有依据的信心这一更缓慢的过程。

性能提升并不能解决正确性问题

新运行时在 GitHub 的测试中显著提速,但性能无法证明行为等价,也无法将该工作流推广到所有代码库。

从 5 月 12 日到 8 月 21 日,客户端和会话生命周期的测量结果发生了显著变化。在进程内创建客户端、启动会话、完成一轮交互并完成全部清理的时间,从 5.25 秒降至 55.3 毫秒。

这一对比意味着测得耗时缩短了近 95 倍。吞吐量从每秒 7.55 个会话提升至 120 个会话,约为此前速度的 16 倍。

架构变化解释了部分差异。进程内运行时避免了为每次交互启动并协调独立 CLI 进程。

Rust 还让开发者能够在没有垃圾回收运行时的情况下控制内存分配、数据布局和并发。不过,已公布的测量数据综合了语言、架构、实现以及持续积累的优化改动。

因此,声称仅仅以 Rust 替换 TypeScript 就带来了全部收益,将具有误导性。无论使用何种实现语言,移除进程边界都可能显著改变延迟表现。

该基准测试也反映了 GitHub 选择的工作负载和环境。读者不应将其中的比例直接换算为无关应用可预期的改进幅度。

不过,这一量级具有实际意义。更低的会话启动延迟可以让嵌入式智能体功能在编辑器、终端和后台自动化中显得更为灵敏。

更高的会话吞吐量可以支持每台主机处理更多并发任务,也能减少反复创建和销毁短生命周期会话的工作负载所需的基础设施。

这些收益解释了为何此次重写的战略价值不止于代码维护。GitHub 并非只是在改变语言偏好,而是在改变该运行时嵌入其他产品的便利程度。

质疑首先来自证据独立性。迁移数据、回归分类、交互分析和基准测试均来自 GitHub 自己的报告。

GitHub 提供了异常详尽的测量数据,但外部研究人员尚未复现完整迁移过程。代码库背景、内部测试、员工专业能力、模型访问权限和运营工具都塑造了这一结果。

该项目还由同时负责原运行时及其替代版本的团队参与。这为审查者带来了宝贵知识,但也使这项工作不同于外部团队对陌生遗留系统进行现代化改造的情形。

成熟的运行时可能比许多企业应用拥有更强的测试覆盖率和更清晰的模块边界。反过来,其跨平台宿主和智能体行为也可能在其他方面更复杂。

因此,46.9 万行单元测试令人鼓舞,但仍不足以下定论。测试数量无法证明重要的生产行为没有遗漏测试。

五类已知回归表明,仅有编译成功还不够。即使 Rust 提供了内存安全保证,也无法识别缺失行为、错误预期或不正确的产品契约。

智能体模型也在快速变化。GitHub 在主会话和子智能体中混合使用了多种模型,包括不同的高能力和低延迟系统。

这种多样性让工作流不易受单一模型局限的影响,却也增加了复现难度。即便提示词和代码库状态相似,未来的团队也可能得到不同输出。

安全性同样需要谨慎对待。生成的代码可能复现周边代码中的脆弱模式,或在集成点引入不安全的假设。

Rust 缩小了若干内存安全风险,但无法验证授权逻辑、密钥处理、命令构造或外部输入的可信度。审查者必须直接检查这些属性。

长时间运行的智能体还带来另一项运营风险。持续 25、42 或 88 小时的会话,需要资源限制、可观察的日志、可恢复的检查点以及清晰的权限边界。

缺少这些控制时,智能体可能消耗大量算力、重复失败的方法,或将任务扩展到预期范围之外。并行子智能体会同时放大有效工作和协调风险。

GitHub 的结果支持一个谨慎的结论:大型智能体辅助重写已从推测性的演示进入可信的生产工程阶段。

但它并不支持“任何组织都能将遗留系统交给智能体,并获得可信的 Rust 替代品”这一说法。缺失的关键并不是另一条提示词,而是一套用于验证行为的证据体系。

GitHub Copilot 的 Rust 重写带来的压力

这次迁移促使软件团队围绕审查证据重新设计开发流程,而不是将智能体视作更快的个人程序员。

第一重压力落在规划现代化工作的工程经理身上。过去因成本过高而被否决的项目,如今值得重新评估,尤其是那些能够拆分为可验证组件的项目。

这并不意味着每一次重写都应推进。当行为缺乏充分理解、依赖项不稳定,或替代方案无法带来可衡量的运营收益时,渐进式维护仍可能更安全。

不同之处在于,实现成本不再以相同方式主导评估。管理者必须纳入测试质量、审查者可用性、迁移边界、回滚选项和生产环境对比等因素。

第二重压力落在编程助手供应商身上。生成一个函数或解释一个文件,已不再是最具挑战性的基准。

生产客户将越来越多地追问:智能体是否能在数周内保持上下文、协调并行任务、保留契约,并为每项改动提供证据。

他们也会期待智能体能从失败中恢复。一个有用的迁移智能体必须能读取构建输出、隔离回归、调整方法,并知道何时需要人工决策。

第三重压力落在语言和平台团队身上。Rust 获得了一个引人注目的生产案例,但更深层的教训关乎迁移工具。

稳定的外部函数接口、自动化绑定、兼容的数据模型和临时桥接层,让团队可以按依赖切片进行迁移。缺少这些机制时,智能体就必须面对更大规模、非此即彼的改动。

官方 N-API specification 说明了稳定原生边界为何重要。它将原生模块与 JavaScript 引擎内部的许多变化隔离开来。

对 GitHub 而言,这一边界让 Rust 组件能在迁移期间为 TypeScript 调用方提供服务。这种方法减少了同时迁移所有调用方和依赖项的必要性。

第四重压力落在只统计产出、不衡量结果的组织身上。生成的代码行数、提交的提示词数量或消耗的智能体小时数,几乎无法说明生产价值。

GitHub 最有力的指标是行为和运营层面的:运行时实现了零 TypeScript、持续公开发布、降低了测得延迟、提高了吞吐量,并暴露了已知的回归模式。

未来的报告应进一步纳入逃逸缺陷、回滚频率、审查工时、事故率和总算力消耗。

三个信号将决定该项目能否成为可重复的模型。

第一个是迁移后的生产可靠性。稳定发布、较低的回归率和更少的运行时事故,将强化快速智能体主导迁移能够保留成熟行为的论据。

如果频繁出现紧急修复,即使 Rust 改善了性能,这一论据也会被削弱。关键问题不在于合并前测试是否通过,而在于用户是否获得等同或更好的体验。

第二个信号是 GitHub 之外团队的复现。独立组织需要记录具有相当规模、时间线、验证方法和运营结果的迁移案例。

较小的成功案例会有所帮助,但有说服力的比较需要复杂的生产系统。理想情况下,这些系统应具有不同架构,并且较少直接接触原始作者。

第三个信号是 GitHub 对该工作流本身的产品化。可复用的编排、迁移规划、审查关卡和证据摘要,将表明这一方法可扩展到一个内部项目之外。

GitHub 已提供用于委派开发的 Copilot coding agent 工作流。下一步是证明,代码库规模的协调能够成为普通工程团队可靠可用的能力。

这些信号对开发者而言,应比关于自主编程的宣称更重要。迁移中的人工消息数据显示,专业能力仍处于核心地位,只是其应用方式发生了变化。

工程师越来越需要定义不变量、检查边界、对比行为,并组织持久的技术上下文。当智能体能够起草数千行代码时,输入速度的重要性便会下降。

企业采购方也应提出同样具体的问题:哪些操作需要审批?系统如何保留上下文?审查者能否将生成的改动追溯至测试和既定需求?

他们还应询问工作流如何处理未完成的工作。除非系统谨慎追踪依赖关系,否则部分迁移的运行时可能造成重复实现、临时桥接层和混乱的所有权。

对知识工作者而言,这一更广泛的趋势并不止于软件领域。智能体降低了初步产出的成本,而验证与上下文的价值则愈发凸显。

团队可以借助个人知识系统,在长期项目中留存决策与证据。当机器产出的速度快于人们重新审视其假设的速度时,这些记录就变得至关重要。

GitHub Copilot runtime 向 Rust 的迁移之所以引人注目,在于它揭示了这场转变的两个侧面。智能体改变了可负担实施工作的规模,而人类仍承担着判断的责任。

请关注即将发布的 Copilot 版本、独立迁移项目以及 GitHub 工作流工具的可靠性。如果三者都经受住考验,这个项目将成为一种工程范式,而非一个特殊的内部案例。

如今团队面临的是一个实际问题:哪些被搁置的重写项目,具备足够的测试、可衡量的价值和审阅能力,值得开展一次受控的智能体辅助试验?

 
 

免费开始使用

一款本地优先的AI助手

为了获得更好的人工智能体验,

remio 目前仅支持Windows 10+ (x64)和M-Chip Mac 。

你的 AI 工作伙伴

和 remio 一起高效工作

规划、创作、交付

一站式完成

bottom of page