Agent 账单突然变高,先别急着换模型。一次回复可能包含系统提示、工具说明、技能、会话历史、检索资料和多轮工具调用;如果每轮都把整份手册塞进去,几句回答也会重复付输入 token 的钱。
这篇用虚构咖啡店资料做了本机实测:同一个模型分别读取整份手册和只含相关条目的短资料,再比较输入 token 和答案。随后再看模型分层、提示词缓存和 OpenClaw 用量记录各自能解决什么问题。
先看每轮实际用了多少
在 OpenClaw 对话里运行 /usage tokens 查看本轮 token 与缓存明细;/usage full 还可能显示费用估算。费用需要有用量数据和该模型的本地价格配置。没显示金额,不代表费用为零;如果一轮经过多次工具调用、重试或模型切换,要把各次模型请求都算进去。Token 用量说明
如果要找输入从哪里来,可运行 /context detail 看系统提示、工具、技能和注入文件占用。优先清理每轮都会重复发送、但当前任务用不上的内容;答案有依据的前提下,按问题检索几条相关资料,比把完整知识库交给模型更容易控量。
本机实测:同一个问答,少发无关资料
我准备了一份虚构咖啡店手册,包含 42 种饮品与食品、配送规则、12 条操作流程和 8 条常见问题。测试问题固定为“拿铁多少钱?满多少元免配送费?”,答案依据是拿铁 26 元、满 60 元免配送。
测试用 Ollama 0.35.1 分别运行本机 Qwen3.8-27B 和 Gemma4-E2B。对每款模型都做两轮:一轮把完整手册放进提示词,另一轮只放拿铁价格和免配送门槛;两轮要求输出相同 JSON。输入、输出 token 数和耗时由 Ollama Chat API 返回,不用字符数估算。Chat API 字段说明
| 本机模型 | 完整手册输入 | 精简资料输入 | 输入减少 | 输出 token(完整 / 精简) | 答案(完整 / 精简) | 耗时(完整 / 精简) |
|---|---|---|---|---|---|---|
| Qwen3.8-27B | 2300 | 107 | 95.35% | 29 / 29 | 正确 / 正确 | 29.902 / 3.448 秒 |
| Gemma4-E2B | 2540 | 113 | 95.55% | 26 / 26 | 正确 / 正确 | 5.944 / 0.436 秒 |
这是同一台 M1 Max 上的单题试跑。每个模型的第一轮包含模型加载,第二轮在模型已加载时运行,因此耗时只作现场记录,不用于横向性能排名;本例更有用的结论是精简资料后两个模型仍答对,输入 token 分别少了 95.35% 和 95.55%。一次正确不等于生产验收通过。
脚本直连 Ollama API,没有经过 OpenClaw Agent;因此不包含 OpenClaw 自动加入的工具说明、技能、会话历史和多轮工具调用。它只验证“把当前任务用不上的资料拿掉”这一项。
另试了本机 DeepSeek-R1 8B,在完整与精简资料两轮中都用完 512 个输出 token 上限,没有交付可解析的 JSON;这个配置不通过本题。小参数模型若输出推理很长,未必省总 token。它需要调整输出预算并重新评测,不能把这次截断推广成该模型在所有任务上的结论。
这些数字测的是本机模型的输入 token,不是 DeepSeek 云 API 的计费 token;本地推理没有按 token 收取的 API 费,但仍占用设备、电力和时间。完整脚本、虚构资料和模型返回记录在成本控制练习包。
按任务选模型,先用小样本验收
把高频、规则明确、出错影响小的分类或字段提取任务交给更便宜或本机的小模型;涉及多条件判断、金额、隐私或对外动作时,先用小模型和较强模型跑同一组固定样例,再决定路由,并保留程序校验或人工复核。模型参数大小本身不能证明质量,至少记录每题的正确字段、耗时和模型实际返回的 token。
OpenClaw 的 utilityModel 适用于标题、进度摘要等短内部任务,调用它会产生单独的模型请求;它不是所有用户请求的自动“小模型路由”。agents.defaults.model.fallbacks 是模型出错时的故障转移,也不是按任务难度或价格自动挑选模型。要做任务路由,应明确把不同任务放入不同 Agent 或在任务开始时选定模型,再用同一份验收集检查结果。模型配置 · 故障转移说明
缓存能省重复前缀,不能省掉所有输入
提示词缓存复用的是连续且相同的前缀。把稳定的系统规则、工具定义和固定资料放在前面,把每次变化的问题放在后面;在稳定前缀里插入当前时间、随机编号或每轮变化的说明,可能让后面的内容无法复用。缓存只改变某些输入 token 的处理和价格,不会让答案生成所需的输出 token 消失。
DeepSeek API 会在用量中返回 prompt_cache_hit_tokens 和 prompt_cache_miss_tokens;文档说明缓存是尽力而为,前缀要完整匹配已持久化的缓存单元,命中率不保证为 100%。OpenClaw 有时会把提供方缓存用量归一化为 cacheRead / cacheWrite。没有缓存计数时,命中率应记为“未知”,不能直接当作零命中或全命中。DeepSeek 缓存规则 · OpenClaw 缓存说明
估算单次 API 费用时,按提供方返回的实际用量分桶:
费用(美元) = (未命中输入 token × 未命中单价
+ 命中输入 token × 命中单价
+ 输出 token × 输出单价)÷ 1,000,000
DeepSeek 当前价格页区分峰时与非峰时,也按模型分别列出缓存命中、未命中和输出价格;价格会变,估账时从官方页面取当前费率。练习包里的 s163_cost.py 读取 API 响应用量对象并按输入费率计算,不把本机 Ollama 的 token 数伪装成云账单。DeepSeek 官方价格表 · API 用量字段
自己复现
解压练习包,确认 Ollama 已启动并下载包内 README 列出的本机模型。先运行 python3 s163_prompt_budget.py,看全量与精简两轮是否都返回正确字段;如果脚本提示任一答案错误,就不要把该模型用于无人复核的自动回复。再保存一份 DeepSeek API 的原始 JSON 响应,用官方价格页当前的三个费率运行 s163_cost.py。不要把真实 API Key 写进脚本或交付包。
本轮没有发起 DeepSeek API 请求,因此没有测试云端缓存命中或核对实际扣费。练习包给出的是可自行复现的 API 费用计算方式,不是本机实测账单。对真实业务,还要用脱敏样例测多种问法、资料变更、提示注入和模型异常,并监控整轮所有请求的费用。