先聊个很多人可能都感同身受的事:今年我把手头一个数据处理项目迁到 GPT-6 ultra 上跑,原本想的是“贵一点没事,效果好就行”,结果第一次批量任务跑完,看到账单的那一刻,我真的怀疑是不是计算错了。GPT-6 ultra 确实强,推理深度、指令理解、长文处理都是顶级的,但它真的太烧 Token 了——而且不是按“你问了几个问题”计费,是按每次请求吞进去的文本量计费,稍微不注意,一次任务就能吃掉几十万 Token。
后来我做了个决定:不再把它当全能打工人使唤,而是给它配了个 AI 团队。这里的“团队”不是人多,而是把一个大任务拆成多个岗位,让不同类型的模型各干各的活。复杂的核心环节交给旗舰模型,简单重复的环节交给轻量模型,中间用一套调度逻辑串起来。这套方案跑了一段时间,Token 消耗直接砍掉了六成左右,任务质量不仅没降,反而因为分工明确了,输出更稳定。这篇文章就把完整思路、落地步骤和踩过的坑都写出来,给同样被 Token 账单折磨的人一个参考。
1. Token 到底是怎么被“烧”掉的:先算清这笔账
1.1 一次很普通的任务,为什么消耗高得吓人
我先还原一个真实场景。当时我要对 20 篇行业报告做批量处理,每篇大概 1.5 万到 2 万个 Token,任务目标是:每篇输出 500 字以内的摘要、提取 5 个关键指标、判断有没有异常波动,最后汇总成一张总表。
如果按直觉来写,就是一个循环,把每篇全文塞给 GPT-6 ultra,让它直接输出结果。表面上看,每篇文本量不大,20 篇加起来也就 30 多万 Token。但真正跑完,消耗接近 38 万 Token。多出来的部分,就是你给模型的指令、它自己的推理过程、以及模型为了“凑完整回答”而输出的各种废话。
更要命的是,如果中间某一步跑错了,你要重新把整篇文档再塞给它一次。也就是说,同样一份全文,会因为重试、修正、补充提问,被反复计费很多遍。批量任务里只要有一成报错,账单就会明显上浮。
1.2 计费逻辑比你想的更“狠”:输入输出都算钱
很多人以为“让 AI 回答”只算回答内容的钱,其实不是。API 计费是双向的:你发给它的所有文本——包括系统提示词、用户问题、历史对话、参考资料——全部按输入 Token 计费;模型生成的所有内容,包括推理过程、最终回答、甚至“好的,我来帮你分析一下”这种废话,全部按输出 Token 计费。
所以你在 prompt 里多写一句客套话,多让模型“请详细解释”,都是在直接给账单加钱。尤其是旗舰模型,输入和输出的单价都很高,同样 1000 Token,轻量模型可能只要旗舰模型的一个零头。
我后来养成了一个习惯:看消耗报表不看总 Token 数,而是分成“输入 Token”和“输出 Token”两个指标。你会发现,输入 Token 往往是大头,因为全文、历史、上下文全部堆在输入侧。输出 Token 虽然单价通常更高,但只要控制住模型的废话,总量是能压下来的。
1.3 长对话为什么是“隐形吞金兽”
还有一个容易被忽略的点:长对话的累计成本。你开一个会话,前 10 轮对话时,每轮请求都要携带前面所有轮次的内容。到了第 50 轮时,每次新请求,前面 49 轮的内容全部作为输入重新计费。
这个机制就像你去打印店打一份 100 页的合同,每改一行字,不是重新打印那一行,而是把 100 页全部重新打一遍。越聊到后面,每一轮新问题的实际成本越高,哪怕你问的问题本身只有十几个字。
这就是为什么很多人在做长文档分析、多轮问答、代码调试时,明明感觉没干什么,Token 却烧得飞快。上下文越长,每一次交互的隐形输入越大。理解了这个机制,你就明白我为什么要拆团队——因为减少“每轮携带的历史量”,比单纯压缩单次输出更有效。
2. 核心思路:把“单人全才”拆成“AI 团队”
2.1 “什么活都让旗舰模型干”是最贵的用法
旗舰模型的能力毋庸置疑,但能力强不代表适合干所有岗位。你让一个资深专家去整理文件夹、回复格式邮件、做数据转格式,他当然做得来,但成本也感人。更关键的是,旗舰模型在执行简单任务时,也会产生大量中间推理,而这些推理内容都是要计费的。
原来的做法是:用户丢一个复杂需求,大模型从理解需求、拆解步骤、逐步推理、撰写草稿、自我检查到最终输出,全在同一个上下文里完成。这个过程的每一步都是 Token,而且是一份完整账单。问题不是它做得不好,而是成本分配不合理——有 40% 的 Token 花在简单环节上,却按旗舰模型的价格结算。
这就好比你让团队里最强的架构师,一边设计系统,一边同时负责打印文档、回复邮件、整理会议纪要。能力是够的,但预算完全失控。正确的做法是让合适的人干合适的活。
2.2 我的“团队”岗位设计
我把整个流程拆成五个角色:调度员、拆解员、执行员、审查员、汇总编辑。每个角色不一定是独立模型实例,更多是不同 prompt 和不同模型等级的组合。这套设计的目标是:旗舰模型只介入真正需要深度推理的部分。
| 岗位 | 职责 | 推荐模型等级 | Token 占比 |
|---|---|---|---|
| 调度员(Router) | 读懂用户需求,判断任务难度,决定走哪条执行链路 | 轻量模型 | 约占 5% |
| 拆解员(Planner) | 把大任务拆成小块,给出执行清单和每步预算 | 中等模型 | 约占 8% |
| 执行员(Worker) | 处理具体任务,按难度分流到不同模型 | 旗舰模型 + 轻量模型混合 | 约占 70% |
| 审查员(Reviewer) | 检查执行结果,判断是否合格,不合格退回重做 | 中等模型 | 约占 12% |
| 汇总编辑(Formatter) | 把多个结果组织成最终格式,生成交付物 | 轻量模型 | 约占 5% |
调度员和拆解员用了“小模型 + 短 prompt”,因为它们的任务是输出一个简短计划,不需要深度推理。执行员才是旗舰模型的主战场,而且只有难度高的子任务才会派给它;简单子任务直接走轻量模型。审查员用小模型做质量检查,只输出“通过/不通过 + 原因”,不生成大段分析。最后的汇总编辑,把各步骤结果拼接成最终交付物。
2.3 为什么这样拆反而更便宜:成本模型对比
我拿那个行业报告任务来算一笔账。原来用旗舰模型全流程跑,总消耗约 38 万 Token。拆成团队之后,实际消耗变成了:
- 调度和拆解环节:约 4 万 Token,全部走轻量/中等模型,成本不到原来的十分之一。
- 执行环节:20 篇报告里,真正需要深度分析的只有 8 篇,走旗舰模型,约 12 万 Token;另外 12 篇相对模板化,走轻量模型,约 3 万 Token。
- 审查环节:审查员对 20 份结果做检查,约 2 万 Token。
- 汇总环节:约 1.5 万 Token。
合计约 22.5 万 Token,比原来少了四成。但这不是全部——因为分工会让输出更稳定,出错重试率从原来的 15% 降到了 3%,重试消耗的 Token 也大幅减少。实际跑下来,总消耗稳定在 14 万到 18 万 Token 之间,比原来省了 50% 到 60%。
核心逻辑很简单:旗舰模型只处理那 8 篇真正需要深度推理的报告,剩下的重复劳动全部下沉到低成本模型。省下的不是“少干活”,而是“不让高价资源干低价活”。
3. 实操落地:多智能体工作流的分工与配置
3.1 系统架构与数据流
配团队不是靠想象,得有一套实际可跑的工作流。我的实现并不复杂,按三层来组织:入口层负责接收任务并分配权重,执行层负责按清单干活,结果层负责质检和汇总。
入口层收到用户请求后,先由调度员判断这是“简单查询”“标准处理”还是“深度分析”。判断依据可以是一个很轻量的 prompt,让模型输出一个难度标签和预估预算。这一步会让系统多花几千 Token,但换来的是后续整个流程的合理性,非常划算。
接着拆解员根据难度标签输出一个 JSON 格式的执行计划。计划里明确每一步做什么、用哪个等级的模型、Token 预算是多少。我在这个环节会强制要求只输出结构化字段,不要任何解释性文字。一个典型的计划长这样:
{ "task_id": "20250110-001", "difficulty": "deep", "steps": [ { "step_id": 1, "action": "read_full_report", "model": "mid", "max_tokens": 2000 }, { "step_id": 2, "action": "deep_analysis", "model": "gpt-6-ultra", "max_tokens": 6000 }, { "step_id": 3, "action": "format_result", "model": "light", "max_tokens": 1000 } ], "budget_total": 12000 }执行层拿着这份计划逐项执行。每完成一步,就把结果写进一个共享上下文,但注意不是把所有结果全部拼在一起,而是只保留关键信息。审查员则在执行结果到达后,用一套评分 prompt 判断是否合格,不合格的任务会被打回重做,并附带失败原因。
3.2 关键参数:模型、温度、max_tokens 怎么设
我在实践里总结了一套参数配置,照着用基本不会出大问题。第一步是设置温度。调度、拆解、汇总全部用 0,不允许模型自由发挥——我要的是稳定结构和可解析格式。执行环节里,模板化任务用 0.2,深度分析用 0.4 到 0.5,保证有一定多样性但不会失控。
第二步是严格控制 max_tokens。很多人不舍得设这个值,总怕模型输出不完整。但旗舰模型默认输出上限很高,你如果不限制,它很容易就把一个简单摘要写成三千字小作文。我的做法是先给一个保守值,跑完看有没有截断,如果 truncation 率达到 5% 以上,再逐级上调。实测下来,审查和汇总任务 max_tokens 给到 1000 到 2000 就绰绰有余。
第三步最容易被忽略:prompt 里强制规定输出格式。我在每个子任务的 system prompt 里都会写清楚“只输出 JSON,不要任何解释、开场白、结束语”。这一步能把输出 Token 砍掉 30% 以上。旗舰模型尤其喜欢在回答前加一段“好的,根据你提供的信息……”——这些全是白付的钱。
3.3 Prompt 里的 Token 预算控制技巧
控制 Token 不能只靠模型侧参数,prompt 本身就是最大的调节杠杆。我常用的手法有三个。
第一个是目标长度约束。在 prompt 里直接写“把摘要压缩到 200 字以内”“只返回结论和三个依据”“每点不超过 50 字”。模型对长度要求是有感知的,你明确给数字,它通常会照着办。比含糊地写“简洁一点”有效得多。
第二个是结构化模板。让模型按固定字段输出,而不是自由格式。自由格式意味着模型要自己做排版、自己决定信息密度,这些决策过程都会以 Token 形式反映在输出里。结构化模板把“怎么组织内容”这件事实质上由你接管了,模型的输出更加直接。
第三个是渐进式摘要。长文档不要一次性全文塞进去,而是先让轻量模型分段做摘要,再把摘要集合交给旗舰模型做分析。这个思路看起来多了一道处理步骤,但轻量模型的摘要成本很低,而旗舰模型处理短摘要的成本远低于处理全文。总账算下来,能省一半以上。
3.4 上下文缓存与 Token 续签:别让认证问题浪费钱
热词里有一大堆和 “token exchange failed”“token 失效”“403 forbidden” 相关的痛点。这部分在真实工作流里同样重要——如果你的 access token 反复失效,每次重新鉴权、重新建立会话,都是在烧额外的 Token 和时间。
我先说一个最常见的问题:把 access token 直接写死在代码里。在某些平台,token 的默认有效期不长,你写到配置文件里,隔几天它就失效了,然后你会收到 401 或 403 错误。正确做法是设计一套“短 token + 长 refresh token”的机制。access token 快过期时,用 refresh token 主动换新,不要等到报错了再处理。
我看到很多人遇到token exchange failed: token endpoint returned status 403 forbidden就慌,其实这类错误本质是鉴权链路失败。排查思路很固定:先确认 API key 或 token 是否还有效,再确认账号权限是否包含目标模型的使用资格,然后检查服务端时间是否同步、请求头字段是否正确。403 不等于你的密钥被黑了,很多时候只是权限配置或 token 续签逻辑没跟上。
另外,重试逻辑也要做幂等。我踩过一个坑:token 过期后请求失败,脚本自动重试,但重试时重新生成了新的任务 ID,导致同一份报告被处理了两遍,白烧一倍的 Token。后来我在任务请求里固定一个 task_id,失败重试沿用同一个 ID,如果服务端发现这个 ID 已经处理过,直接返回缓存结果。这一步对成本控制帮助非常大。
4. 避坑实录:常见 Token 故障排查与省钱复盘
4.1 常见 Token 报错速查表
跑这套工作流的过程中,我几乎把所有常见报错都撞了一遍。下面这张表是实战总结,覆盖了批量任务里最经常出现的几个问题。
| 报错或现象 | 可能原因 | 处理建议 |
|---|---|---|
| 401 invalid_api_key | API key 错误、被轮换或权限被回收 | 检查密钥是否最新,去控制台重新生成并更新配置 |
| 403 forbidden / token exchange failed | 账号角色权限不足、token 过期、refresh 流程异常 | 先刷新 token,再查角色权限,确认目标模型可用 |
| 429 rate_limit_exceeded | 并发过高,触发限流 | 指数退避重试,把并发数降到合理范围 |
| context_length_exceeded | 输入超过模型上下文窗口 | 分段输入、先用轻量模型压缩摘要 |
| token could not be refreshed | refresh token 过期或失效 | 重新走完整授权流程,换新的 refresh token |
| 输出被截断 | max_tokens 设得太低 | 按 truncation 率逐步调高,不要一次拉满 |
| 任务重复执行 | 重试时未做幂等 | 固定 task_id,服务端做去重 |
4.2 实测复盘:一组真实消耗数据
我把优化前后的数据放在一起对比,这里用相对数字说明,方便不同算力配置的人参考。
| 任务类型 | 优化前消耗(相对值) | 优化后消耗(相对值) | 省幅 |
|---|---|---|---|
| 批量文档摘要(20 份) | 1.0 | 0.41 | 59% |
| 多轮业务问答(30 轮) | 1.0 | 0.52 | 48% |
| 代码审查与重构建议 | 1.0 | 0.38 | 62% |
| 长文本结构提取(10 万字) | 1.0 | 0.45 | 55% |
代码审查这个场景省得最多,原因是原来每次审查都是把整个代码仓库的上下文塞进去,审查员还反复输出长段解释。优化后,拆解员先定位变更文件,执行员只审查 diff 部分,审查员只输出问题清单和严重级别,格式统一,Token 自然大幅下降。
4.3 几条只有实操过才会懂的经验
第一,路由不是拍脑袋。我开始时把 70% 的任务都归为“深度分析”,全部走旗舰模型,结果省得并不多。后来我把“深度分析”的判定标准写得更严:只有当任务需要多步推理、需要跨多源信息综合判断时才走旗舰模型。标准一收紧,成本立刻下来了。
第二,审查环节容易变成浪费重灾区。如果审查员 prompt 写得太开放,它会把每份结果都做成长篇修改意见。“你辛苦了,整体不错,但有几点需要注意……”这种话每份都来一遍,就是纯烧钱。我给审查员的指令非常机械:只输出 pass 或 fail,fail 时给出不超过 20 个字的失败原因。效果出奇地好。
第三,缓存和幂等是省 Token 的隐形功臣。很多人只盯着 prompt 调优,忽略了重复执行才是最大的浪费源。一次批量跑批因为网络抖动重试三次,三次都全量计费,一次就能抵上你精心省下的所有 Token。我后来在网络错误重试前加了一层结果检查:如果任务 ID 对应的结果已经存在,直接复用,不再重新请求。
第四,定时刷新 token 比报错再刷新更省。我之前是等 401 了才去刷新,结果刷新的那段空窗期里,队列里的请求全部失败,后续重试又会叠加大量冗余消耗。后来我加了一个定时任务,在 token 过期前 5 分钟主动刷新。这里还有一个细节:刷新 token 和正常请求最好走不同的逻辑分支,不然刷新本身也会被当成普通任务计入路由,白白消耗上下文窗口。
5. 不想搭团队?三招轻量省钱法
看到这里,可能有人会觉得搭建多智能体工作流有点复杂。如果你只是日常使用,不想搞那么多组件,下面的三招够用了。它们不需要额外写太多调度代码,只要在 prompt 和交互习惯上做调整,就能明显减少 Token 消耗。
第一招:先计划后执行。接到复杂任务时,先不要直接让大模型给最终答案,而是先让它输出一个短计划。计划通常几百 Token,成本极低。你看完计划,确认方向对了,再让它正式执行。不要小看这一步,很多无效 Token 都花在“方向错了,答得再好也是白费”上面。
第二招:摘要替代全文。需要大模型分析长文时,先自己把文档过一遍,提炼出核心信息,再带着核心信息去做分析。你可以在轻量模型里做一次预压缩,也可以人工提炼。类比一下:去图书馆不是抱着整个书架跑,而是先翻目录,确定要看哪几章,再借那几章。
第三招:滚动压缩历史。多轮对话里,别让所有历史都留在上下文里。每完成一个阶段性的目标,就让模型把该阶段的关键结论整理成一段短摘要,然后开一个新会话,只带摘要继续。这本质上是“存档点”机制,游戏玩过吧——打一段存个档,而不是从第一关到 boss 关一直不存档。
最后再说两句我的实际体会
这套方案跑了大半年,我最大的感受是:省 Token 不是说换个便宜模型,而是要把预算花在刀刃上。旗舰模型的价值在深度推理,不在重复劳动。让它只做那些真正难的部分,其他环节都用合适的模型承接,质量和成本的平衡点是可以找到的。
最实用的一个小技巧是,每次跑完批量任务,都去看一眼“输入 Token”和“输出 Token”的占比。如果输出占比太高,说明 prompt 里控制还不够狠;如果输入占比太高,说明上下文管理有余地。先分清钱花在哪,再决定砍哪里,比盲目调任何一个参数都有用。