GitHub详解Copilot成本优化:缩短单个输出可能让整个任务更贵
GitHub官方博客介绍四项降低Copilot编码成本的具体改动,并指出单次工具调用token数不是衡量效率的合适指标。
AI解读:如果只盯着单次调用的token数,可能省了小钱花了大钱:GitHub用自家基准测试发现,强行截短工具输出会让模型回头重新读取原文件或重跑命令,整体耗时和token消耗反而上升。因此Copilot的优化重心从"减少每次输出"转向"减少整个任务中的重复工作",具体落地了四项改动:压缩安装/构建等重复噪音但保留源码类输出、去掉文件读取时不再需要的行号前缀、用元提示词循环把任务工具的指令削减约一半、把后台任务的完成结果直接发给模型省去额外检索。GitHub给出部分量化结果:去掉行号前缀让离线推理成本降约 5%、在线每日人均推理成本降约 3%,压缩提示词每个回合省约 1300 个token,直接投递后台结果让AI点数用量降约 2.3%。但对开发者而言,这些改动大多不需要你做任何事——Copilot CLI、Copilot应用和代码审查共用同一底层框架,改动会逐步生效。GitHub也提醒,成本优化只在特定工作负载下有效,Copilot代码审查中省成本的做法在Copilot CLI里反而增加成本,最终没有上线。
GitHub于 9 月 2 日发布一篇工程博客,详细解释GitHub Copilot团队如何在不牺牲任务质量的前提下降低AI编码成本。文章的核心论点是:单个工具调用的token数不是衡量效率的合适指标,因为过短的输出可能导致模型重读输出、重跑命令,从而让整个任务消耗更多token和时间。作者Erik Krogh Kristensen和Napalys Klicius介绍了四项已部署的改动,并给出相应的基准和在线实验数据。
本地指标陷阱:更短的输出可能让任务更贵
文章首先用一个内部实验说明"本地优化"的失败:团队评估了工具RTK(Rust Token Killer),它会在agent读取shell输出前缩短内容。在GitHub的基准测试中,RTK确实缩短了部分响应,但当被省略的内容对模型重要时,模型有时会重新打开原输出或重跑命令来恢复所需信息。这些恢复步骤增加了轮次,并携带了更多上下文。结果是:单个工具响应更短,但任务平均使用了更多token并耗时更长。作者总结:"我们在本地省了token,却全局花了更多。"
文章指出,该结果仅适用于测试的集成方式和工作负载,不适用于所有RTK配置或一般的输出压缩。因此团队得出结论:按工具调用token数衡量是错误的优化目标,效率改动必须从用户请求到最终结果的全程来评估。
四项已生效的优化及其量化效果
GitHub介绍了四项具体改动。第一项是选择性输出压缩:分析基准运行发现,安装、构建、测试和lint输出往往含有重复噪音,而源码类输出和任意命令结果更可能包含agent所需信息。团队据此开发了压缩器,并制定了三条策略:保留源码类输出和任意输出(如cat、git diff、git show和任意脚本返回时不压缩);重组搜索结果但不丢内容(如grep的匹配项和文件列表可高效分组但保留全部结果);仅当节省显著时压压缩重复噪音。压缩后,agent仍可通过直接恢复路径获取完整原始输出。离线任务中未检测到任务成功率的统计显著下降,agent极少打开保存的原始内容;在线实验中,平均成本略有下降。
第二项是移除view工具中的行号前缀。view工具让agent把文件内容读入上下文,之前每行都加行号,但当前编辑工具通过匹配周围代码定位,不再依赖行号。移除行号前缀后,离线基准中模型推理成本下降约 5%,成功率在预期波动范围内;线上实验中,每个用户每日平均模型推理成本下降约 3%,未检测到质量和满意度指标的实质退化。GitHub称这是"理想的改动":无需给模型新指令,没有信息源需要恢复,也没有额外决策。行号在diff和短片段中仍有用,但在每次文件读入中属于浪费。
第三项是压缩任务工具的提示词。GitHub Copilot的task工具会启动专门的agent进行并行工作,其指导文本分散在工具描述、schema、agent定义和系统指令中。团队用元提示词循环(Copilot迭代编写自己的提示词)将提示词削减约一半。但第一个在线实验发现了一个离线评估遗漏的退化:循环把"谨慎的并行指导"改写成了硬性调度策略,导致独立的自定义agent串行运行,实验随即被中止。修复时,团队用一句话替换了显式的允许/禁止列表:"独立的agent可以并行运行;考虑副作用。"最终发布的提示词每个回合约减少 1300 个task-tool prompt token,对应每会话总prompt token减少约 1.8%,每活跃小时标准化成本降低 2.9%,未检测到质量退化。
第四项是后台完成通知。agent常并行运行后台工作,如长时shell命令和子agent调查。以前,后台任务完成的通知不包含已完成的结果,agent需要多花一个回合去取回Copilot已经收到的输出。现在,harness批量发送符合条件的完成通知,并直接以现有工具结果格式投递完成结果。以shell命令和子agent为例,改动前需要四次模型调用才能继续工作(每完成一个任务要一次请求结果、一次处理结果),改动后一次模型调用即可处理两个结果。这一改动使AI点数衡量的平均token相关用量下降约 2.3%。
度量须在目标工作流中进行,因为证据具有局部性
文章强调,在一个Copilot工作流中省token的改动可能在另一个中增加成本。例如,一套更精简的文件工具指令在Copilot代码审查中效果积极,但在Copilot CLI的在线实验中反而增加了成本,因此没有上线。相反,移除行号前缀和选择性输出压缩各自在Copilot代码审查的大规模评估中使平均每审查prompt token减少约 5%,未检测到审查质量指标的实质变化。这些结果与之前Copilot代码审查迁移到共享文件工具的改动(该改动加上审查指令调优,使代码审查成本下降约 20%)是分开的。
作者总结了五条经验:优化整个任务而非工具调用;优化编排而非仅模型输出;按输出代表的内容进行压缩(保留精确内容、偏好无损变换、度量恢复路径的使用频率);提示词重写有时会有意外后果,需验证预期行为是否保留;证据是工作负载局部性的,须在离线基准、在线实验和每个产品表面上重新评估。作者指出,这些改动没有让模型变得更聪明,而是移除了模型本不需要做的工作。相关改动正在使用同一底层框架的GitHub Copilot体验中部署,涉及GitHub Copilot CLI、GitHub Copilot应用和Copilot代码审查。