Uber 大规模高效运行软件工厂(Software Factory)的实践与成本方程
原文地址: https://x.com/ubereng/status/2093444169037762840
原文作者: @udaykiran / Uber Engineering
引言(Introduction)
AI 工具现已嵌入 Uber 软件开发的各个阶段。超过 70% 的 Pull Request(PR)归功于本地或云端 Agent。工程师们在整个软件开发生命周期(SDLC)中构建了超过 3,600 个 Agent Skills,每天执行超过 30,000 次 Agent Skill 调用。
在 AI Engineer 2026 大会上,我们分享了对“软件工厂(Software Factory)”的愿景,以及贯穿整个生命周期的基础构件和托管 Agent(Managed Agents)。随着这一愿景的推进,越来越多的开发会话不再由人类主动发起,而是由自动化的托管 Agent 承担:包括代码审查、CI 失败自愈、带有视觉验证的端到端 PR 完成、On-call 告警分流、Bug 排查以及由人类审核/升级的各类代码维护任务。
从 2026 年 2 月到 8 月,Uber 全体员工(工程师与非工程师)在所有 Agent 产品中的周活跃用户数(WAU)增长了 7 倍,周 Agent 请求量增长了 9.4 倍。与此同进,由于全方位的工程优化,Uber 的 AI 总支出自 4 月以来已基本保持平稳。
由于采纳率、工作负载组合和模型升级都在持续变化,为了隔离我们自身的优化成效,我们保持固定模型基准(因为模型行为会随每次升级和模型家族而变化):从 2 月到 7 月,每 1,000 次模型请求的成本相比峰值下降了近 34%,单会话成本相比 6 月峰值下降了 52%。
本文将详细拆解我们对软件工厂的思考体系:Agent 会话运行的四个层级、用于分解支出的成本方程、每一项指标的衡量方式,以及贯穿各层的具体优化杠杆。
本文所有对比中的定价与供应商指标均基于公开信息,成本效益的提升来源于在标准定价层级内对 Uber 内部工作负载进行更智能的路由。虽然具体测得的降本数据受我们自身环境影响,但以真实工作负载为基准、对准确性与成本进行系统优化的工程方法论是普遍适用的。
软件工厂与其成本方程
Agent 使用的四个层级(Four Layers of Agent Usage)
我们将 AI 的使用划分为四个层级,从最专用到最通用。层级越高,我们对成本、质量和模型选择的控制力就越强:
- Layer 4:托管后台 Agent(Managed Background Agents / 自主与事件驱动) —— 如 uReview(AI PR 代码审查)、CI 自愈、自动化 Bug 分诊、依赖项升级与迁移。
- Layer 3:专用交互式工作流(Purpose-Built Interactive Workflows) —— 领域特定的编码工作流、故障修复辅助等。
- Layer 2:标准交互式 Agent CLI / IDE(Standard Interactive Agent CLI / IDE) —— 终端/编辑器集成,结合内部工具与标准 Skills。
- Layer 1:通用聊天 / 临时 Prompt(Raw Chat / Ad-hoc Prompting) —— 通用探索与临时提问。
成本方程(The Cost Equation)
在上述任意层级中,我们可以将单次 Agent 会话的成本分解为以下乘积项,每一项都可以被独立测量与优化:
\[\text{总成本} = \text{用户数} \times \frac{\text{会话数}}{\text{用户}} \times \frac{\text{轮次}}{\text{会话}} \times \frac{\text{请求数}}{\text{轮次}} \times \frac{\text{Token数}}{\text{请求}} \times \frac{\text{单价}}{\text{Token}} \]
- 前两项(用户数 \(\times\) 人均会话数):代表采纳率与活跃度,我们希望其在整个用户群中保持持续增长(无论是交互式使用还是 Agent 代劳)。
- 中间三项(轮次/会话 \(\times\) 请求/轮次 \(\times\) Token/请求):这是最核心的优化空间——即 Agent 在工程师原始请求之外自行开展的额外工作。Uber 绝大部分优化精力都倾注于此,包括帮助 Agent 更快规划、消除无效轮次与错误、优化输入 Token 等机制。
- 最后一项(Token 单价):由模型选型与供应商层级路由决定。
衡量体系(How We Measure)
以下是我们按周和按月追踪的完整指标集,支撑短期与长期的预测与规划:
- 各工程及非工程团队的活跃用户数与采纳率
- 人均会话数与单会话 Agent 调用次数
- 单次请求的输入、输出及思考(Reasoning)Token 数
- Prompt 缓存命中率与 TTL 有效性
- 单 PR 成本、单会话成本及单故障解决成本
- 质量指标(自动化审查的 Precision、Recall、F1 分数,PR 合并采纳率)
核心优化杠杆(Optimization Levers)
1. 优化 Token 单价(Optimizing Price / Token)
供应商决定 Token 价格,我们决定哪项工作负载运行在哪个模型上。在所有托管 Agent 层级中,我们选择针对该负载帕累托最优(Pareto Efficient)的模型。对我们而言,帕累托最优综合考虑:单任务完成成本、输出质量与模型可靠性。
基于基准测试的模型选型(Benchmark-Driven Model Selection)
我们运行的所有托管 Agent 都遵循相同的四步模型选型流程:
- 基于 Agent 的真实工作构建基准测试(Benchmark)。
- 在统一的 Harness 框架上运行 Agent,通过单一接口接入前沿模型(Frontier)与开源权重模型(Open-weight)。
- 切换到当前的帕累托最优模型并持续迭代——前沿水平每隔几周就会发生转移。
- 持续利用托管 Agent 的汇总洞察来测试和部署动态模型路由策略。
例如用于所有 PR 代码审查的 uReview:我们利用包含已知 Bug 的真实 PR 构建测试集(分级为简单、中等、困难),评估 Precision、Recall、F1 分数,并结合单次审查成本、延迟、超时率与噪音指标。通过模型切换,在显著降低单 PR 审查成本的同时提升了 F1 表现。
此外,依托 Uber 大型 Monorepo 的数千个真实 PR,我们在内部建立了 Uber SWE Benchmark,跨不同任务类型评测前沿和开源模型,指导所有 SDLC 托管 Agent 的模型选择。
默认模型配置(Default Model Selection)
在交互式界面中,Token 单价是固定的,但可以通过两项默认配置战略性地管理人群的 Token 分布:
- 初始会话模型
- Subagent(子代理)默认模型:这是最见成效的杠杆。随着多 Agent 编排能力的增强,拉起 Subagent 的会话比例持续攀升。因为 Subagent 执行的是输入明确、不需要前沿推理能力的特定子任务,我们将 Subagent 默认设为成本更低的模型(同时保留手动覆盖权限)。由主模型负责任务拆解与评估,Subagent 负责执行。
2. 优化单请求 Token 消耗(Optimizing Tokens / Request)
会话的每一轮交互都会重新发送完整的对话历史、项目上下文和工具执行结果。任何减少单请求 Payload 的机制都会在会话中产生复利效果。
标准化默认设置
- 即使在 1M 上下文模型中,也在 400k Tokens 触发自动压缩(Compaction):平衡模型性能与缓存失效/重复输入 Token 成本。
- Reasoning Effort 默认设为 Medium:主力模型的输出 Token(包含内部思考 Token)收费标准是输入 Token 的数倍。将推理深度默认设为 Medium,可以在成本与质量之间取得最佳平衡。
Prompt 缓存策略(Prompt Caching Strategy)
Prompt 缓存的经济学逻辑:后续命中读取仅需标准输入 Token 费率的 0.1 倍,但写入存在溢价(5 分钟 TTL 写入费率 1.25 倍,1 小时 TTL 为 2 倍)。
- 交互式会话:工程师经常在交互之间停顿超过 5 分钟。我们将默认的 5 分钟 TTL 切换为 1 小时窗口,避免因闲置超时导致缓存失效、产生高昂的全量上下文重构费用。
- Subagent 会话:保持 5 分钟 TTL,因为子任务生命周期短且高度聚焦。
通过 Shell 执行 MCP 工具(Executing MCP Tools via Shell)
Uber 将所有模型上下文协议(MCP)交互路由到统一的 MCP Gateway,集成了 1,000 多个内部与第三方 SaaS MCP Server。
传统 MCP 会把所有工具 Schema 直接加载到每个会话的上下文,100 个工具就会在每轮交互前增加 50K~70K Token 的开销。为此 Uber 引入了两套互补机制:
- CLI 工具解析(CLI Tool Resolution):取代直接 Schema 注入,允许模型执行 Shell 命令。所有 1,000+ 工具映射为 CLI 命令,在调用时由 Gateway 动态解析,彻底消除了初始上下文中的 Schema 负担。
- 工具搜索(Tool Search):支持模型按需搜索工具目录并仅加载当前所需工具,在工具库扩展到数千个时依然保持精准选择与低 Token 占用。
Code-Mode(代码模式批量执行)
当工具可以直接通过 Shell 命令调用时,模型可以在一个脚本中批量执行多步操作。
- 传统 MCP 流程中,执行一条 SQL 查询需要提交请求、轮询状态 2~5 次(每次都产生完整上下文往返的模型轮次),然后再拉取结果。
- Code-Mode 将整套流程封装为子进程中的 Python 循环,中间轮询不进入模型的活动上下文,仅返回最终摘要。
- 实测效果:即使对于极小的数据集,Code-Mode 也能降低 50% 以上的 Token 消耗;在批量工作流中,成本节省更是超过 90%。Uber 为高频 MCP Server 预建了 25+ 个 Code-Mode Skills。
SaaS MCPs
第三方 SaaS MCP Server 往往包含大量工具 Schema(例如某协同套件单个 Server 包含 49 个工具 / 约 22K Tokens)。Uber 将 SaaS MCP 同样接入内部 Gateway 转化为 CLI,并在 Code-Mode 插件中编写专用技能封装高频流程。
3. 优化每轮请求数(Optimizing Requests / Turn)
未建立上下文锚定(Ungrounded)的 Agent 失败起来既缓慢又昂贵——它会带着不断膨胀的上下文反复去多处盲目搜索。提前提供丰富准确的信息是消除搜索开销的最强杠杆。
上下文工程与 AI Context Graph
在 Uber 包含数亿行代码和数万张数据表的复杂生态中,Agent 大部分轮次都在检索信息而非编写代码。
Uber 构建了 AI Context Graph(AI 上下文图谱):
- 包含 2,400 万节点与 8,000 万条边,覆盖 86 种节点类型与 117 种边类型。
- 整合了 30 多个内部系统的数据:服务定义、工程团队、Incident 故障日志、PR、架构设计文档、部署记录、数据集及历史表查询日志。
- 允许任何 Agent 通过自然语言检索图谱。
对比效果:
- 接入 Context Graph 的 Agent:查询历史用量,精准定位 50+ 分析师共用的特定数据表,38 秒给出答案。
- 未接入的 Agent:因缺乏对该表的可见性,花费 20 分钟阅读服务源码、创建 2 个 Subagent、遭遇 3 次报错,最后得出“该数据集无法查询”的错误结论。
可见性与开发者引导(Visibility & Education)
- 终端状态栏(Status Line):在 Harness 底部实时显示当前会话与全局累计消费计数器。
- 分级额度与可见性(Spend Tiers):统一的 Harness 共享额度池、50%/80%/100% 预算门槛的 Slack 预警、一键主管审批通道以及交互式成本优化建议。
- 会话分析看板(Session Analysis Dashboard):直接分析本地与云端沙箱的会话 Trace,精准识别 16 种反模式(次优模型路由、上下文膨胀、缓存过期低效、Prompt 初始化过大等)并给出具体改进方案。
下一步展望(What’s Next?)
- 扩充托管 Agent 舰队:为每个新 Agent 确立目标指标、评测基准与帕累托最优模型。
- 动态模型路由(Dynamic Model Routing):扩大基准测试在不同编程语言、仓库和模态上的覆盖面。
- 深化 Context Graph 集成:向更多自主 Agent 开放图谱查询能力。
- 实时开发者指引:从定期批量反模式检测转向持续 Trace 监控,提供实时效率建议。
- Skill 持续自进化:自动收集 Agent Skill 执行中的痛点并由 Trace 自动生成 Skill 迭代。
结论(Conclusion)
管理和遏制不断上升的 AI 编码支出是一个切实可解的工程问题。通过系统性消除无价值的无效 Token 浪费,而非单纯依赖降价或降低工具标准,Uber 在使用规模增长 7 倍的同时,降低了全维度的单位成本并保持了高质量产出。
战略核心在于:从工程师个人的交互式工作流转向全面托管的 Managed Agents。将 SDLC 负载迁移到托管环境中,能够实现对模型路由、执行 Harness 和运营成本的完全可控。
致谢(Acknowledgments)
核心团队与贡献者:Abhishek Bhatia, Adam Huda, Aditya Patel, Alok Srivastava, Ameya Ketkar, Anil Purohit, Atakan Kandemir, Ben Chou, Brandon Barker, Danielle Yim, Deepanshu Mehndiratta, Gaurav Gill, Israel Marban, Jason Varbedian, Karen Xu, Lei Shi, Mager Mager, Meghana Somasundara, Peng Liu, Preet Inder, Qiushen Wang, Rush Tehrani, Shesh Patel, Shiven Tripathi, Shubham Gupta, Stas Khalup, Ting Chen, Tse-Shi Wang, Ty Smith, Vikram Hullukunte, Weiqiang Wang, Will Bond。领导层支持:Johannes Gehrke, Mattie Toia, Sumanth Sukumar, Praveen Neppalli Naga。