Skip to content
Go back

Agent 成本高,先查 Harness

当一个 Agent 返回了正确答案,账单却比预期高很多,第一反应通常是怀疑模型价格或模型能力。真正的差异可能藏在模型外面:运行时把多少上下文送进每一轮、调用了多少次模型、工具结果保留多久,以及哪些工作可以交给代码或子代理完成。

这层包住模型循环的运行时,通常叫 Agent Harness。本文根据 Avi Chawla 的文章和 TrueForge 的公开文档,拆开它怎样影响 token 成本、执行速度与凭据安全。读完后,你可以用一组具体问题检查自己的 Agent:成本究竟花在了模型上,还是花在了上下文搬运上?

先看结论

问题关键判断
成本从哪里来上下文会在每次模型调用中重新参与处理,工具往返还会增加调用次数
首要优化点让启动上下文保持轻量,并控制运行过程中不断增长的结果
常用手段延迟加载工具、卸载大结果、子代理隔离、Code Mode、上下文压缩
安全边界沙箱负责代码、文件和 Shell;Harness 持有凭据并代理工具请求
适用范围多工具、多步骤、多人并发的 Agent 最容易从中受益,简单单轮问答收益有限

Harness 到底负责什么

一个只服务开发者自己的 Agent,往往可以假设机器、终端和操作者都在身边。放到真实用户面前,运行时还要处理这些问题:

因此,生产 Harness 会接管工具执行、上下文、记忆、会话持久化、错误处理、权限和并发。它也决定哪些内容在下一轮继续携带。模型负责完成推理,Harness 负责安排推理发生的方式。

为什么一个工具结果会被读很多遍

假设某个工具在第 4 步返回了 50,000 token 的 JSON,而运行时没有把它移出对话。到第 19 步,模型已经再次读取这份结果 15 次:

50,000 token × 16 次读取 = 800,000 token 的上下文占用

提示词缓存可以降低重复前缀的计费价格,但不会让这 50,000 token 从上下文窗口消失。模型仍然要在每次调用中处理它,才能生成下一步结果;如果更早的内容发生变化,缓存还可能失效。

工具定义也会占据启动上下文。每个工具都带有名称、描述和输入输出结构,接入大量 MCP 服务后,真正的用户问题可能还没有出现,提示词已经很长。

所以要分开看两个变量:

  1. 每次调用时,模型要读取多少上下文;
  2. 一个任务需要调用模型多少次。

扩大上下文窗口只能解决“装不下”的问题,无法自动解决“每轮都在处理大量旧内容”的成本问题。

TrueForge 的五种上下文控制方式

TrueForge 的 Harness Capabilities 文档把输入上下文和运行时上下文分开管理。前者在任务开始时加载,后者随着用户消息、工具调用、工具结果和子代理结果逐步增长。

1. 延迟加载:开始时只带目录

技能先提供名称和描述,只有任务确实需要时才从沙箱读取完整的 SKILL.md。工具也可以关闭预加载,让模型先看到 MCP 服务的名称和简介,随后按需查询:

  1. list_tools:列出服务可用的工具;
  2. get_tool_info:读取某个工具的描述和输入输出结构;
  3. get_tool_output_schema:只读取输出形状,便于编写处理脚本;
  4. call_tool:确认需要后再调用工具。

如果一个内部服务有 100 个工具,而当前任务只需要其中 2 个,其余定义就不必进入这次运行的提示词。

2. 大结果卸载:把全文放到沙箱文件

假设工单系统返回 400 条记录,每条带标题、描述、评论、标签、负责人和时间戳,而当前问题只需要账号 ID 与主题。Harness 可以把完整结果写入沙箱文件,只在上下文里留下简短预览和文件路径。

后续需要完整数据时,Agent 再通过沙箱读取、过滤或解析文件。并行工具同时返回多个大结果时,运行时可以优先卸载最大的结果,让这一批响应先低于上下文预算。

这一步的核心不是删除数据,完整结果仍然保留,只改变它进入模型上下文的时机和形态。

3. 子代理:把中间过程留在独立上下文

如果 12 个客户各自需要查询工单、CRM 和文档,根 Agent 可以把 12 组原始记录全部带在自己的历史里,也可以为每个客户创建一个子代理。

子代理在独立上下文中完成查询,只把短摘要返回给根 Agent。根 Agent 看到的是 12 份摘要,不需要反复携带 12 组原始数据。这种隔离同时保留了并行执行的可能性。

4. Code Mode:让代码完成数据处理

“把工单和账号表按 ID 连接,再统计每个账号的数量”属于数据连接任务。若让模型逐轮拉取两份数据、匹配字段、计算结果,原始记录会经过多次模型调用。

Code Mode 则让 Agent 在沙箱里写一个脚本,直接调用工具,在代码中完成连接、过滤、排序和汇总,最后只打印结果表。原始 ID 和记录留在脚本或文件中,模型只接收它真正需要解释的摘要。

这还减少了手算错误:计数、求和和分组由代码执行,模型负责选择处理方式和解释结果。

5. 上下文压缩:历史过长时保留结构化摘要

前面几种方式主要控制新结果进入上下文的方式。对话本身变成大 payload 后,就需要压缩历史。

TrueForge 当前文档显示,压缩默认在活动上下文超过 50,000 token 后触发。运行时会把意图、关键决策、文件与产物、错误与修复、下一步等内容整理成结构化摘要,用它替换较早的消息;完整事件历史仍保存在服务端。

压缩是有损的。它适合保留任务状态,不适合代替对关键原文、精确日志或完整数据的持久化。需要细节时,应回到沙箱文件或事件记录中读取。

凭据为什么不该放进沙箱

减少上下文后,Agent 往往需要更自由地运行代码、读写文件和访问外部系统。把模型 API key 或 MCP 凭据直接放进沙箱,会让生成代码拥有和 Harness 相同的秘密。

TrueForge 将 Agent 循环和凭据留在服务端,沙箱只负责代码、文件和 Shell。当沙箱脚本调用 call_tool 时,请求会回到 Harness,由 Harness 使用已保存的凭据访问 MCP 服务,再把结果返回给沙箱。

这样,工单和账号数据可以留在沙箱里处理,脚本本身不需要知道认证信息。需要审批的工具仍会暂停等待批准,Code Mode 也不能绕开权限模型。

基准数据说明了什么

TrueForge 官方基准页使用 14 个企业任务,连接 Jira 风格的项目跟踪器、Salesforce 风格的 CRM 和 Drive 风格的文档库。每个配置使用相同模型、相同工具、相同系统提示词和全新的会话,每种配置运行 3 次,再报告平均值。独立的 LLM 评审只看任务标准和答案,不知道答案来自哪个 Harness。

当前公开表格如下:

配置平均完成任务每次成本每次 token
Claude Managed Agents · Opus 4.810.7 / 14$11.810.0M
TrueForge · Opus 4.810.7 / 14$8.63.7M
TrueForge · GLM-5.211.7 / 14$3.03.8M
deepagents · Opus 4.810.0 / 14$21.216.5M
deepagents · GLM-5.212.0 / 14$9.111.9M

从同模型配置看,TrueForge 使用约 37% 的 Claude Managed Agents token,约 22% 的 deepagents token;3.7M 与 10.0M 的比值约为 2.7 倍差距。这个结果支持一个重要判断:相同模型和工具下,运行时怎样携带上下文,会显著改变成本。

也要留意基准的边界。14 个任务、每种配置 3 次试验,足以展示工程方向,不能保证所有业务都能得到相同的比例。模型价格、任务类型、工具返回大小和 Harness 配置变化后,结果都会变化。

在本机运行 TrueForge

官方 Quickstart 当前要求 Node.js 22.14 或更高版本。本地模式只需要一个进程和 SQLite:

npx @truefoundry/trueforge

启动后打开 http://localhost:8790,然后按这个顺序配置:

  1. Settings → Models 添加模型提供商;
  2. Settings → Connectors 连接 MCP 服务;
  3. 如果要使用技能、Code Mode 或文件卸载,在 Settings → Sandbox providers 配置 Daytona;
  4. 创建 Agent,选择模型、连接器、技能和指令;
  5. 先用一个小任务验证工具调用、结果摘要和审批行为,再扩大任务范围。

本地模式默认没有登录,官方建议只绑定本机地址。需要多人共享时,使用 hosted mode,以 Postgres 保存持久数据、Redis 支持多副本之间的协作,并通过 Docker Compose 或 Helm 部署。

一份可执行的检查清单

当 Agent 成本上升时,可以按下面顺序检查:

  1. 记录每次模型调用的输入 token、输出 token、工具名和响应大小;
  2. 找出重复出现的大段工具结果,确认它们是否每轮都被重读;
  3. 对工具定义启用按需加载,先减少启动上下文;
  4. 将大结果保存到文件,只把预览、路径和必要字段送进模型;
  5. 将连接、聚合、排序等确定性处理移入代码;
  6. 把互相独立的实体查询拆到子代理,再让根 Agent 只接收摘要;
  7. 检查凭据是否只由 Harness 或服务端持有;
  8. 为长对话设置压缩阈值,并保留可回查的原始事件和文件。

这套检查顺序可以帮助团队先找到“上下文搬运”问题,再决定是否更换模型。模型升级仍然有价值,但它无法阻止运行时把同一份 50,000 token 结果重复送入 16 次调用。

适用边界

Agent Harness 最有价值的场景是:任务步骤多、工具返回大、需要并行查询、会话要跨重启恢复,或多个用户共享同一个服务。若只是一次短问答、没有外部工具和长历史,延迟加载、子代理与压缩带来的收益很小。

基准数据来自 TrueForge 项目维护者公开的测试,适合用来理解成本结构和复现实验,不应直接当成所有框架的排名。采用开源 Harness 的主要价值在于可以检查并修改上下文、工具和权限策略;是否值得引入,仍要用自己的任务、模型和数据验证。

总结

Agent 花费过高时,先沿着 trace 看每一轮到底携带了什么。延迟加载减少启动负担,结果卸载和压缩减少历史负担,子代理隔离中间过程,Code Mode 把数据处理交给代码,服务端凭据代理则守住安全边界。

这些机制共同说明了一件事:模型只看到 Harness 递给它的上下文。把这层运行时设计好,同一个模型就可能用更少的 token 完成相近的工作;把它交给默认配置,成本会随着工具数量和任务长度一起增长。

如果这类 AI 助手、开发工具和软件工程实践对你有帮助,欢迎关注 Aide Hub。这里会继续记录可验证的工具与工程经验。

参考


Tags


Next

.NET 用 AVX-512 加速 IPv4 解析