多智能体工作流的 Token 预算规划

单次 LLM 调用很容易做预算。多智能体工作流则不然。
规划器会撰写简报。检索器会分散展开。工作器会消耗检索到的上下文。审核器会阅读它们的输出。一次失败的工具调用会触发重试。等到最终答案出现时,同一条信息可能已经跨过多个模型边界——而每个边界都可能产生新的输入和输出用量。
这就是为什么多智能体工作流的 token 预算规划必须在工作流层面进行,而不仅仅是在每个提示词中进行。
本指南将提供一个实用的分配公式、一个规划器–检索器–工作器–审核器的完整示例,以及一个可直接粘贴运行的测试,你可以通过 TokenTest 来验证实时用量行为。
简短答案
先设定一个硬性的工作流上限,然后将其分配到各个智能体调用、工具负载、重试和共享预留中:
workflow_hard_cap
= sum(expected_calls × per_call_token_cap)
+ tool_result_allowance
+ retry_reserve
+ shared_emergency_reserve
对于每一次模型调用,定义:
per_call_token_cap
= maximum_input_tokens
+ maximum_output_tokens当提供方报告了缓存输入和推理 token 时,请分别跟踪它们,但不要假装它们从工作流中消失了。缓存输入仍然属于输入用量,而推理 token 即使最终答案中不可见,也会消耗输出额度。
为什么仅靠单个智能体的限制还不够
假设每个智能体的输出上限看起来都很合理。工作流仍然可能超出预算,因为存在四个放大因素。
1. 扇出会放大调用次数
一次规划器调用可能会启动两个检索器和三个工作器。若某个工作器的预算是 2,000 token,那么当有三个工作器运行时,这并不等于 2,000 个工作流 token——它最多会达到 6,000。
2. 交接内容会被再次计数
规划器的输出是规划器调用中的输出用量。当该计划被插入到工作器提示词中时,它就变成了工作器调用中的输入用量。在每个模型边界上汇总用量并不是重复计算;这反映了多步推理在实际中的消耗和报告方式。
3. 工具结果会扩展下游提示词
搜索片段、数据库行、代码输出和文件摘录可能比请求它们的智能体指令更大。如果工具负载没有大小限制,下游输入就可能主导整个运行。
4. 重试隐藏在编排逻辑中
超时、无效的 JSON 响应、失败的工具调用或审核器拒绝,都可能让一个昂贵步骤重复执行。生产环境的预算需要在重试发生前就预留重试额度。
一个能在生产环境中站得住脚的工作流 token 预算公式
用相同的结构为每个角色做预算:
role_budget
= maximum_call_count
× (maximum_input_tokens + maximum_output_tokens)然后计算工作流上限:
workflow_hard_cap
= planner_budget
+ retriever_budget
+ worker_budget
+ reviewer_budget
+ tool_result_allowance
+ retry_reserve
+ shared_emergency_reserve这是一种刻意保守的做法。它是硬上限模型,而不是预测模型。对于日常规划,请保留另一个基于实际观测到的中位数用量的数值。硬上限用于保护系统;观测预算则帮助你优化它。
示例:一个 16,636-token 的研究工作流
想象一个工作流:先研究一个问题,再起草答案,最后在交付前进行检查。
| 角色或预留 | 最大调用次数 | 每次输入上限 | 每次输出上限 | 分配的 token |
|---|---|---|---|---|
| Planner | 1 | 900 | 220 | 1,120 |
| Retrievers | 2 | 650 | 80 | 1,460 |
| Workers | 3 | 1,800 | 450 | 6,750 |
| Reviewer | 1 | 2,400 | 300 | 2,700 |
| Tool-result allowance | — | — | — | 1,200 |
| Retry reserve | — | — | — | 2,406 |
| Shared emergency reserve | — | — | — | 1,000 |
| Workflow hard cap | 16,636 |
模型调用小计为 12,030 个 token。重试预留为该小计的 20%,即 2,406 个 token。工具结果和应急预留则单独添加。
这张表为编排器可强制执行的决策提供了依据:
- 不要启动超过两个检索器。
- 不要启动超过三个工作器。
- 在整个运行过程中,工具结果在累计超过 1,200 个 token 后应截断或摘要。
- 当剩余预算低于审核者分配额度加上应急预留时,停止可选工作。
- 仅当特定步骤仍有足够预留时,才允许重试。
按角色分配,而不是按相同比例分配
平均切分看起来很简单,但智能体角色承担的工作并不相同。
Planner:输出少,杠杆高
Planner 通常应该产出一个紧凑的任务图,而不是长篇论文。为它提供足够的输入,以理解约束,并提供足够的输出,以定义任务、依赖关系和验收标准。如果计划过于冗长,下游每个智能体都要为这份冗长再次付费。
Retriever:严格的输出结构
Retrievers 往往只需要很少的生成式输出。它们的预算风险主要在于返回的证据。限制结果数量、摘录长度和工具有效载荷总量。在可能的情况下,请求标识符和简短片段,而不是完整文档。
Worker:最大的有效分配
Workers 通常需要最大的角色预算,因为它们要结合指令、证据和中间状态。应根据任务难度来分配。如果只有一个分支承担困难的综合工作,就不要让每个并行 worker 都拥有相同的最大额度。
Reviewer:受保护,而非可有可无
在 workers 开始之前,先预留 reviewer 的预算。否则,早期智能体可能会耗尽整个工作流上限,导致没有空间来验证答案。Reviewer 应检查任务完成情况、矛盾之处、引用覆盖率和格式,而不是默认重写整段回复。
同时使用软限制和硬上限
硬上限回答的是:“这个运行何时必须停止?”软限制回答的是:“编排器何时应改变行为?”
两者都要设置。
| 护栏 | 示例行为 |
|---|---|
| 已消耗 50% | 正常继续 |
| 已消耗 70% | 停止启动可选分支 |
| 已消耗 85% | 总结状态并直接路由到审查 |
| 达到审查者预留额度 | 阻止新的 worker 调用 |
| 达到硬上限 | 以预算耗尽状态停止工作流 |
软限制使工作流能够优雅降级。如果没有软限制,只有硬上限,往往会在已经付出昂贵代价后突然失败。
跟踪解释超支的 token 字段
至少为每次模型调用记录以下字段:
{
"workflow_id": "research-042",
"agent_role": "worker",
"attempt": 1,
"requested_model": "your-model-alias",
"returned_model": "reported-model-version",
"input_tokens": 0,
"cached_input_tokens": null,
"output_tokens": 0,
"reasoning_tokens": null,
"total_tokens": 0,
"tool_result_tokens": 0,
"remaining_workflow_budget": 0,
"finish_reason": "stop",
"task_valid": true
}
对“未报告”的情况使用 null。不要把缺失的 cached-token 或 reasoning-token 字段变成 0。0 表示提供方明确报告没有;null 表示你没有证据。
OpenAI 的 Agents SDK 文档展示了请求、输入 tokens、输出 tokens 和总 tokens 的运行级用量聚合,并在可用时提供缓存输入和推理输出的详细字段。其 tracing 文档还描述了跨 agent 运行、模型生成、函数调用、handoff 和 guardrails 的 traces 与 spans。这个组合才是正确的心智模型:先跟踪工作流结构,再把用量附加到每个可计费的模型边界上。
先计数,后验证
使用三层方法,而不是只相信一个数字。
- 本地估算:在编辑提示词时很有用,但前提是分词器和请求模板与目标模型足够接近。
- 提供方原生预检:在可用时使用提供方的计数端点。OpenAI 文档说明了
POST /v1/responses/input_tokens;Anthropic 文档说明了POST /v1/messages/count_tokens;Google 为 Gemini 模型文档说明了countTokens。 - 实时用量验证:运行真实端点并检查返回的用量、停止行为、缓存证据和 reasoning-token 证据。
预检计数估算的是请求。实时用量揭示的是完整的工作流行为,包括生成的输出和重试。
多语言工作流需要单独的预算
不要把英语 token 比率应用到每一种语言上。
分词结果会因分词器、模型、标点、脚本、代码混用和聊天模板而变化。在多语言请求中,工具 schema 和重复的英文字段名也会改变比率。
对于每种生产语言:
- 保持任务含义和输出 schema 等价。
- 统计完整请求,而不只是翻译后的用户句子。
- 运行相同的工作流形态和调用限制。
- 比较中位数输入、输出、重试率和任务有效性。
- 根据更高的观察到的百分位数加上余量来设定生产上限。
如果某种语言持续消耗更多输入,请针对该语言调整检索规模或提示结构,而不要默默降低输出质量。
可直接粘贴的 TokenTest 测试
将此提示用作受控的 worker 任务。跨运行保持模型、temperature、输出上限和端点不变。
You are the worker agent in a multi-agent research workflow.
Budget constraints:
- Return valid JSON only.
- Use no more than 180 visible words.
- Include exactly three evidence items.
- If evidence is insufficient, set "status" to "needs_more_evidence" instead of guessing.
Task:
Explain why workflow-level token budgets must include fan-out, retries, tool results, and downstream handoffs.
Output schema:
{
"status": "complete | needs_more_evidence",
"summary": "string",
"evidence": [
{"factor": "string", "budget_effect": "string"}
],
"next_action": "string"
}
在 TokenTest 中运行它,然后检查端点是否报告了合理的输入、输出和总用量;输出是否在配置的限制附近停止;以及当路由声称支持时,缓存或推理细节是否出现。至少重复测试三次,然后再将中位数作为规划输入。
TokenTest 目前的评估控制台旨在针对 token 用量、能力、路由协议、安全边界和通道可靠性进行实时端点检查。其用量完整性检查包括用量是否存在、总量一致性、输入单调性、输出合理性、停止限制关联、流式用量、缓存证据以及思考或推理证据。TokenTest 声明不会存储 API 密钥,但你仍应遵循组织的凭据和数据处理政策。
实用的编排策略
以下策略可作为起点:
before launching a call:
projected = current_usage + call_input_cap + call_output_cap
if projected > workflow_hard_cap:
stop with budget_exhausted
if remaining_budget <= reviewer_reserve + emergency_reserve:
block new optional workers
route current evidence to reviewer
after every call:
record reported usage
update remaining budget
validate the output
release unused reserved output only if no retry is pending
关键细节在于,编排器必须在每次调用之前检查预算,而不仅仅是在提供方返回用量之后。
常见的 token 预算错误
只为最终答案做预算
用户可能只看到 300 个 token,而工作流在规划、检索、起草和审查中消耗了数千个。
在上下文规划中减去缓存 token
缓存可能会改变计费或延迟行为,这取决于提供商,但缓存的 tokens 仍然是输入序列的一部分。应将它们单独跟踪;不要把它们当作免费的上下文。
默认允许审阅者重写
完整重写会生成另一段大规模输出。更好的做法是使用返回通过/失败决策和受限补丁列表的审阅者。只有当答案未通过定义好的门槛时才重写。
将最大上下文窗口作为运行预算
模型的上下文窗口是技术上限,不是安全的工作流目标。你的运行预算还需要为输出留出空间、为重试留出空间、考虑工具调用波动,以及下游审阅容量。
在验证任务之前比较效率
较短的无效答案并不更高效。请记录 task_valid,并且只在满足任务的输出之间比较 token 效率。
最终清单
在部署多智能体工作流之前,请确认你已经具备:
- 一个工作流硬上限;
- 按角色划分的调用次数和每次调用上限;
- 工具结果额度;
- 重试储备;
- 受保护的审阅者储备;
- 软限制行为;
- 每次调用的使用记录和追踪记录;
- 独立的多语言测试结果;
- 以及一条在调用超过剩余预算之前阻止调用的规则。
然后在 TokenTest 中使用真实路由运行工作流,保存原始用量证据,并用观测到的中位数和高百分位限制来替换规划假设。
常见问题
多智能体工作流应该保留多少重试储备?
先从按步骤观察到的重试率出发。在还没有生产数据之前,对于最容易失败的关键步骤,保留一个有上限的重试额度(例如一次重试)比无限重试更合理。本文中的 20% 储备只是示例,不是通用规则。
每个智能体都应该获得相同的 token 预算吗?
不应该。应按角色、调用次数、任务复杂度和下游复用情况分配。规划器和检索器通常需要简洁输出;综合生成组件通常需要更多;审阅者则需要受保护的储备。
推理 tokens 算入输出限制吗?
对于 OpenAI 推理模型,官方文档说明推理 tokens 属于输出 token 用量,并受 max_output_tokens 控制。其他提供商可能以不同方式报告或限制它们,因此请验证你实际使用的路由。
一个 token 计数器能估算工作流中的每个模型吗?
不能可靠地做到。不同的模型家族和服务栈可能使用不同的分词器、聊天模板、特殊 tokens 和工具编码。更推荐使用模型原生计数和实时用量证据。
来源
- TokenTest 首页和实时产品行为:https://tokentest.io/
- TokenTest 手册:https://tokentest.io/manual
- OpenAI token 计数指南:https://developers.openai.com/api/docs/guides/token-counting
- OpenAI Agents SDK 用量:https://openai.github.io/openai-agents-python/usage/
- OpenAI Agents SDK 追踪:https://openai.github.io/openai-agents-python/tracing/
- Anthropic 消息 token 计数:https://platform.claude.com/docs/en/api/messages-count-tokens
- Google Gemini token 计数:https://ai.google.dev/gemini-api/docs/tokens