GitHub · AI/ML 项目

呵

如何在保证任务质量的前提下提升AI编程成本效率

How we make AI coding more cost efficient without sacrificing task quality

二〇二六年九月二日 · 英文原文

本文探讨GitHub Copilot中提升AI编程代理效率的四项改动:选择性压缩输出噪音、移除无用行号格式、精简提示指令、批量交付后台任务结果。核心观点是优化完整任务而非单次工具调用的token数,避免因过度压缩导致代理重复检索。离线benchmark与在线A/B实验显示,这些改动使模型推理成本降低约2.3%至5%,质量指标无实质回归。经验包括按内容类型压缩、验证提示行为、在具体工作流中衡量效果。相关改动已发布至Copilot CLI、应用及代码审查等产品。

与AI编程代理协作时,输出质量固然重要,但真正的效率来自于快速、高效地完成任务,并拥有恰当的上下文。因此,单次交互的token数量并不能有效衡量效率。目标不应是使用更少的token,而是利用适量的上下文来推进任务。如果简洁的工具响应遗漏了代理所需的信息,有时反而需要额外的调用或工作,最终使任务变得更慢、成本更高。这就是为什么我们希望优化结果而非工具调用本身。本文探讨了GitHub Copilot中体现这一原则的四项改动:在减少重复输出的同时保留有用上下文;移除对任务无价值的格式;在不改变有用行为的前提下精简指令;无需额外检索步骤即可交付已完成的背景工作。可能的改动通过代理编码benchmark进行离线评估。最有前景的改动在发布前经过受控在线实验验证。本文示例来自GitHub Copilot CLI。其他多个Copilot产品,如GitHub Copilot应用和Copilot代码审查,使用相同的底层框架,也通过这些改进提升了效率。

图1:四项独立的A/B实验,使用相同的AI积分指标。各段合并展示以作比较;其效果不一定严格叠加。

局部指标陷阱

缩短每次工具调用的输出以降低代理成本是常见做法。RTK(Rust Token Killer)是一个在代理读取前缩短shell输出的工具。我们使用代理编码benchmark评估了它对GitHub Copilot的影响。在我们的框架和benchmark配置中,RTK缩短了一些响应,但当省略的文本至关重要时,模型有时会重新打开原始输出或重新运行命令以恢复所需信息。这些恢复步骤增加了轮次并携带了更多上下文。单个工具响应更短,但平均而言,任务使用了更多token且耗时更长。我们在局部节省了token,却在全局花费更多。

局部胜利,工具输出更短 > 有用细节缺失 > 恢复,重读或重跑 > 更多轮次和上下文被携带。然后选择结束于“端到端结果,token和成本上升,任务时长增加,任务完成:稳定”,或“恢复重复”回到“有用细节缺失”。

图2:当缺失细节迫使代理重读输出、重跑命令并携带更多上下文时,更短的工具响应可能使完成任务更昂贵。

这一结果适用于我们测试的集成和工作负载,而非所有RTK配置或一般输出压缩。这意味着每次工具调用的token数并非正确目标。效率改动必须从用户请求到最终结果的完整任务维度进行评估。更有用的是考虑我们能移除什么而不让模型重复工作。

压缩噪音,保留有用信息

目标是缩短重复输出,同时保留代理完成任务所需上下文,避免其回溯步骤。对benchmark运行的分析显示,安装、构建、测试和lint输出通常包含重复噪音,而类似源代码的输出和任意命令结果更可能包含代理所需信息。该分析指导了一个选择性输出压缩器,部分借鉴了RTK及类似方法。原型在代理编码benchmark和一系列开源仓库上评估,测试了其构建、测试和lint系统。早期版本过于激进,导致模型重复工作或读取完整保存输出,增加了端到端成本并降低了任务成功率。例如,我们最初压缩了git diff,但在benchmark任务显示代理重新打开原始输出以恢复缺失信息后移除了该过滤器。这些早期失败促成了三部分策略:保留类似源代码和任意输出。诸如cat、git diff、git show及任意脚本等命令原样返回。在不丢失内容的情况下重组搜索结果。来自grep等工具的匹配和文件列表可以更高效地分组,同时保留每个结果。选择性压缩重复噪音。安装、构建、测试和进度输出仅在节省显著时压缩。发布版本通过反复评估和细化产生。它保守并非因为目标是构建保守压缩器,而是因为评估支持如此。当输出被压缩时,代理仍可通过直接恢复路径检索完整原始内容。

图3:发布的压缩器保留类似源代码输出,无损重组搜索结果,仅压缩可预测的重复噪音,同时保留完整原始内容。

该恢复路径既是安全机制也是评估信号。我们跟踪代理是否打开保存的原始内容、重跑命令、重复探索、缩小搜索范围或采取额外轮次。频繁恢复表明压缩器移除了有价值内容。在触发输出压缩的离线任务中,未检测到统计显著的任务成功率下降,代理极少打开保存的原始内容。在线实验中,平均成本略有下降,跟踪的质量指标无实质性回归。

先移除格式,再移除信息

一个干净的token优化来自view工具,代理用它读取文件内容到上下文。此前,view在向模型显示内容前为每行添加编号。早期文件编辑工具使用这些编号定位更改,但当前工具改为匹配周围代码,不使用行号。尽管正常流程不再使用行号前缀,它们仍然存在。每个前缀很小,但跨每行和每次文件读取重复,未使用的格式在整个会话中累积。因此,我们移除了它。

图4:移除行号前缀精确保留源代码,同时消除每次文件读取中重复的格式。

行号在diff和短片段中仍有用。此处它们浪费是因为附加到每次文件读取而不服务于当前编辑流程。移除它们使离线代理编码benchmark中的模型推理成本下降约5%。成功率保持在预期运行间方差内,编辑失败未增加。我们随后在Copilot CLI用户中测试了该改动。在线实验将每位用户每日平均模型推理成本降低约3%,跟踪的质量或满意度指标无实质性回归。对开发者而言,这意味着更多上下文窗口可用于实际工作,而非代理不使用的格式。这是理想改动:无新模型指令,无信息恢复来源,无额外决策。文件内容原样到达模型。

压缩提示而不压缩意图

提示携带塑造代理工作方式的指令,并在每轮发送给模型。仅当代理保持开发者依赖的行为时,缩短提示才提升效率。在GitHub Copilot中,task工具启动专用代理进行并行工作。其指导在工具描述、schema、代理定义、系统指令和配套工具中累积。一个元提示循环,Copilot迭代编写自身提示,将该提示减少约一半。Copilot生成并细化较小候选,定向行为测试检查我们希望保留的要求。首次在线实验发现了初始离线评估遗漏的回归。元提示循环将谨慎的并行指导重写为硬性调度策略,导致独立自定义代理串行运行。我们停止了实验。在再次更改提示前,我们为用户暴露的行为编写了回归评估。最终修复将一个显式允许列表和拒绝列表替换为一句话:独立代理可以并行运行;考虑副作用。这句话更短且限制更少;它将是否并行运行子代理的选择留给模型,而非先前的显式指导。通过它,我们的新行为测试通过,未导致任何现有行为测试失败。提示行为需要测试。如果行为未测试,更短的提示可能移除它而无人注意。

图5:提示压缩仅在回归测试暴露串行代理且一句话修复恢复并行后才安全;产生的token节省在每轮模型调用中重复。

发布的提示每轮移除约1,300个task-tool提示token,对应每会话总提示token减少约1.8%,每活跃小时标准化成本降低2.9%,测量评估中无质量回归。

无需额外检索轮次交付完成的背景工作

代理常在后台运行独立工作,如长时shell命令伴随子代理调查。通知让代理继续直到工作就绪,无需花费工具调用等待。如果代理未显式等待任一任务,框架在shell命令或子代理完成时唤醒模型并通知。此前,该通知不包含完成结果,因此代理必须花费另一轮检索Copilot已接收的输出。当多个任务接近完成时,该绕行可能重复。Copilot现在批量处理符合条件的完成通知,并直接以现有工具结果格式交付完成结果。代理可继续使用所需信息,无需额外轮次再次请求。对仍在运行工作的显式读取行为如常。

图6:此前,每次后台完成可能唤醒仅检索的模型轮次。之后,框架批量处理符合条件的完成并以现有工具结果格式交付完成结果。

在此改动前,每个完成任务需要一次模型调用请求结果和另一次处理。对于上述shell命令和子代理,这意味着工作继续前需四次模型调用。现在,框架批量处理两个完成并一起提供结果,因此单次模型调用可处理两者。移除这些检索绕行也避免通过不必要调用携带完整会话上下文。通过直接交付完成结果,不压缩、总结或扣留任何内容,框架将平均token相关使用量(以AI积分衡量)降低约2.3%。

在上下文中衡量改动

一项在某个Copilot工作流中节省token的改动可能增加其他工作流成本。例如,一组更紧凑的文件工具指令受Copilot代码审查积极结果启发。在Copilot CLI在线实验中,它增加了成本,因此我们未发布。相反,移除行号前缀和选择性压缩输出各自在大量Copilot代码审查任务上使用生产模型的独立评估中将平均每审查提示token减少约5%。我们未检测到跟踪的审查质量指标有实质性变化。这些发现与早期Copilot代码审查迁移到共享文件工具分开,后者结合审查指令调优,将代码审查成本降低约20%。每项改动需在其运行的工作流中衡量。

构建高效AI编码代理的五条经验

优化完成任务,而非工具调用。如果代理花费更多轮次恢复被移除内容,更短输出并不更便宜。优化编排,而非仅模型输出。消除框架可确定性完成的模型轮次。按输出代表内容压缩。保留精确内容,偏好无损转换,并衡量代理使用恢复路径的频率。提示重写有时有意外后果。验证预期行为被保留。证据局限于工作负载。在离线benchmark、在线实验及每个发布产品表面重新评估改动。

这些改动均未使模型更智能。它们移除了模型从未需要做的工作。本文描述的改动正在使用相同底层框架的GitHub Copilot体验中发布。

使用GitHub Copilot CLI将代理工作流带到终端 >

《我们如何在牺牲任务质量的前提下提高AI编码成本效率》一文首发于GitHub Blog。

译自 GitHub · AI/ML 项目 · 录于 二〇二六年九月二日