部署OpenClaw后收到第一份账单的那一刻,我是真的愣住了。一个月642美元,我当时还以为自己看错了小数点,反复核对了好几遍API平台的用量报表才接受现实。作为一个把OpenClaw同时挂在电商客服、日程管理、网页操作三个场景里的人,我一开始以为是自己任务量太大,后来翻日志才知道,真正吃掉token的往往不是任务本身,而是那些看不见的重复上下文、失败重试和超长系统提示词。这篇就聊聊我是怎么把同一套OpenClaw的月成本从1000美元级别压到20美元上下的,核心思路说白了就三个字:别浪费。
这篇内容不是讲什么高深理论,就是一套经过实测的API Token优化路径。如果你正在跑OpenClaw、被月度账单搞得焦虑,或者正准备部署却被网上的"烧钱案例"劝退,这篇文章可以直接给你一条从花钱大户到精打细算的完整路线。
1. 先搞懂钱花在哪:OpenClaw的Token消耗模型
1.1 智能体框架天然就是"token粉碎机"
很多人对成本的第一反应是"我任务太多",其实任务多只是表象。OpenClaw这类智能体框架的收费逻辑,跟普通聊天完全不同。你每次给模型发消息,它返回结果不叫一次对话,在OpenClaw里这叫做一个turn。一个任务又往往由多个turn组成,每个turn都是一次独立的API调用。更要命的是,每次调用的输入里都必须带上系统提示词、工具描述、对话历史、最新执行结果,这四样东西一个都少不了。
我用一个实际案例来算账。假设你让OpenClaw查一个电商订单的状态,整个流程大致是这样的:
- 用户输入"帮我查订单12345的物流状态",这是最开始的200个token。
- 系统提示词,我当时的配置大概有6000个token。
- 工具定义,OpenClaw加载了20个skill,每个skill的描述平均250个token,一共5000个token。
- 对话历史,如果保留了最近20条消息,每条平均800个token,一共16000个token。
- 模型判断需要调用查询接口,返回一个工具调用指令,这一步输出约500个token。
- 工具执行结束后,结果又作为新的观察内容回传给模型,于是又要重新注入系统提示词+工具定义+历史+刚才的工具结果,再来一轮。
- 如果订单有多个包裹,模型可能还要再调用一次物流查询接口,于是又多一轮。
你算算看,一次看起来不到一分钟的查询任务,实际消耗的输入token可能在8万到15万之间。按当时我用的旗舰模型价格算,输入每百万token约3美元,输出每百万token约15美元,这一个订单查询就花掉大概0.3到0.5美元。单看一次不心疼,但如果你一天要处理几百个这样的任务呢?一个月下来账单飙到几百上千美元,真的一点都不奇怪。
我把这个机制理解成一个生活类比:你去一家公司办事,每问一次问题,前台都要把你入职时签的那本十几页的员工手册从头到尾念一遍,然后再加上你今天聊过的所有对话记录,最后才能回答你。这种重复消耗,才是OpenClaw烧钱的真正根源。
1.2 三步定位你的TOP3烧钱场景
既然知道了烧钱原理,接下来就是找出你自己的"账单黑洞"。我建议你按下面三个步骤做一次体检,整个过程大概需要半天时间,但这半天能帮你省下之后每个月的大几百美元。
第一步,去API平台看用量报表。重点看两个数据:请求次数和平均每次请求的输入token。大多数平台都提供按模型分组的统计,如果某个模型占了总消耗的70%以上,那它就是头号目标。我当时看到的数据是,旗舰模型虽然只占了18%的调用次数,却贡献了64%的token消耗,这就是典型的"高频大模型"陷阱。
第二步,翻OpenClaw自己的日志,统计skill的调用频率。日志里通常会记录每次工具调用的名称,你可以用一条命令把最高频的工具捞出来:
bash复制grep -o '"name":"[a-z_]*"' ~/.openclaw/log/*.jsonl | sort | uniq -c | sort -rn | head -20
这个命令会把所有工具调用按频次排序,排名前5的工具往往就吃掉了50%以上的token。我自己的实测结果很讽刺:消耗最大的根本不是电商客服这种"正经业务",而是一个定时轮询某网页状态的后台任务,它每隔几分钟就唤醒一次模型,每次都要重新注入完整上下文。这属于典型的无谓损耗。
第三步,做场景开关对照。把你配置里的skill分组,关掉一组,运行两三天,对比每日token消耗。通过这种"控制变量法",你能清楚地知道每个业务场景的真实成本,而不是靠猜。我做完这三步之后,发现钱主要花在三个地方:无意义的轮询任务、过长的对话历史、以及没有缓存的情况下反复注入的系统提示词和工具定义。知道敌人是谁之后,剩下的就好办了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模型路由与本地部署:省钱的第一刀
2.1 让便宜模型干80%的活
定位完消耗大户,我们就可以开始动刀了。第一刀也是最立竿见影的一刀,就是给OpenClaw装上"模型路由",让便宜模型去处理80%的简单任务,把贵模型留给真正需要复杂推理的活。
很多人的误区是"只有一个模型配置,所有任务都在用它"。这种配置省心,但非常烧钱。你想想,查询天气、读取邮件、格式化文本、提取JSON字段,这些活用得着顶级模型吗?就像你叫了个米其林大厨天天给你切葱花,技术上没问题,但成本完全不成比例。
OpenClaw的配置里通常会提供主模型和快速模型两个入口,具体变量名可能因版本而异,但逻辑是一致的。以我当时的配置为例:
yaml复制model:
main: claude-sonnet-4-20250514
fast: claude-haiku-4-20250514
router:
enable: true
simple_intents: [query, search, format, summarize, calculate]
这样设置之后,当我输入"帮我把这段文字整理成表格",OpenClaw会把任务分给快速模型,它的价格只有旗舰模型的几分之一,处理这种简单任务的质量也足够好。而遇到"帮我把三个供应商的报价做个对比分析并给出建议"这种需要多步推理的任务,才动用主模型。
成本差距有多大呢?我按当时公开价格粗略算过一笔账:快速模型每百万输入token约1美元,旗舰模型约15美元,单单这一项路由优化,就让我的月度token成本降了差不多一半。而且路由规则是可以精细打磨的,你可以按意图关键词分类,也可以按任务复杂度分级,规则越细,省钱效果越明显。前提是你得先想清楚哪些活"小模型能干",哪些活"必须大模型上"。
2.2 Ollama本地模型的接入与取舍
如果快速模型是打折商品,那本地模型就是彻底的"零元购"。OpenClaw支持通过Ollama这类本地推理引擎接入开源模型,部署好之后,每次调用不花一分钱API费用。这也就是为什么你会在网上看到大量"ollama部署openclaw"的教程。
接入步骤比我预期的简单。装好Ollama之后,先拉取一个合适的模型:
bash复制ollama pull qwen2.5:7b
然后在OpenClaw的配置里指定本地模型的地址:
yaml复制model:
local_base_url: http://localhost:11434/v1
local_model: qwen2.5:7b
这里我要泼一盆冷水:本地模型不是免费的午餐,它有两个你必须接受的代价。第一是响应质量。7B级别的模型做做字段抽取、简单分类、格式化输出绰绰有余,但让它做多步推理或长文生成,效果跟旗舰模型差距明显。第二是响应速度。如果你的机器没有一块像样的显卡,跑7B模型可能几十秒才返回一次结果,这种延迟对交互式任务非常考验耐心。
我的做法是混合架构:本地模型先接住意图分类、关键词提取、JSON格式化这类轻量操作,快速模型处理常见查询,旗舰模型只负责真正复杂的最终决策。经过这样三层分流之后,我一个月花在API上的钱就只剩原先的一个零头了。
2.3 安卓/Termux部署时的成本细节
网上关于"openclaw安卓部署"和"termux安装openclaw"的热度一直不低,我也试过在手机上跑。这里必须说一个很关键的省钱细节:手机端部署时,千万不要用旗舰模型接所有请求。手机作为个人助理的入口,场景通常是语音备忘、提醒设置、快速查询,这些活儿本地3B小模型就能干。
在Termux里跑OpenClaw,我建议走本地模型路线,拉一个量化版本的小模型:
bash复制ollama pull qwen2.5:3b
手机端跑3B模型,速度还算能忍,功耗比7B低很多。如果你手机性能实在撑不住本地推理,那就给云端API加一条fast路由,至少保证简单任务别触发主模型。另外提醒一句:手机端跑推理会发热、耗电,不适合长时间挂机当主力节点,更适合作为偶尔使用的移动入口。
3. 上下文压缩与缓存策略:把每一万个Token掰成两半用
3.1 滑动窗口与摘要压缩
模型路由解决的是"每次调用单价太贵"的问题,接下来要解决的是"每次调用带的行李太多"的问题。这一步的核心是对上下文做瘦身,我用的方法是滑动窗口加摘要压缩。
先说为什么会堆积。OpenClaw默认会把对话历史一直保留,保留得越久,每次注入的输入token就越多。而且随着对话轮数增加,模型每次要读的历史越来越长,成本不是线性增长而是像滚雪球一样膨胀。我见过有人开了会话之后连续跑了十几个小时,最后一次调用的输入里带着几万token的历史记录,而这个会话里真正有用的信息可能只有两百个token。
我的解决办法是在配置里锁定历史窗口的长度:
yaml复制context:
history_limit: 20
summary_on: true
summary_trigger_turns: 10
当一轮对话的turn数超过10次时,触发一次摘要压缩。OpenClaw会把窗口之前的旧对话交给模型提炼成两三百字的摘要,接下来的输入只用摘要加最近20条消息。这就像开会时每过半小时让助理把前面的讨论浓缩成几条结论,后面再聊就不用翻前面的录音了。摘要压缩本身也需要一次模型调用,所以触发阈值不能设得太低,否则你会为了省钱反而花更多的钱。按我的实测,10到15个turn触发一次比较合适,既能控成本,又不影响对话连续性。
3.2 提示词缓存:同一段前缀不要重复付费
上下文瘦身之后,还有一个巨大的浪费源,就是系统提示词和工具定义。这两块内容在每个turn里都会反复注入,而且它们是固定的,完全可以用缓存技术吃掉这部分的重复成本。
拿我当时的参数来说:系统提示词6000token加工具定义5000token,一共11000token的固定前缀。如果一天跑1000个turn,没有一个字节变化,却要重复付费1100万token的输入费用。而提示词缓存机制允许你在API端做标记,让相同前缀在后续请求中只按缓存读取计费,价格远低于正常输入价格。
配置方式取决于你用的是哪家API。以支持缓存控制的服务为例,你在系统提示词和工具描述部分加上缓存标记即可:
yaml复制context:
cache_control: true
cache_prefix: "system_prompt+tool_definitions"
这里有个非常容易踩的坑:缓存要求前缀完全一致,只要前缀里有一个动态内容,比如时间戳、随机ID、变量值,缓存就会全部失效,前面的努力全白费。所以动态信息一律放在缓存前缀的后面,让整个前缀对每个turn保持不变。
我做了缓存优化之后,每天固定的11000token前缀不再按全价重复计费。按照当时的价格模型,缓存读取的单价大约只有正常输入价格的十分之一,仅这一项,每月就省掉了大概两百多美元。建议你在配置里打开这个功能前先算一笔账:如果你每天调用的turn数少于几十次,缓存省下的钱可能覆盖不了写入缓存的成本,那就不如不开。
3.3 Skill机制:模板复用带来的双重收益
OpenClaw的skill机制是我最喜欢的功能,也是省钱的一把好手。官方把skill定义为可复用的能力模板,我的理解就是把你常用的业务流程固化下来,让模型按照固定模式执行,而不是每次都靠自然语言自由发挥。
这种机制带来两个方面的收益。第一,你对同一个任务的口头描述会随着情境变化而越来越啰嗦,比如"帮我处理客户退货,先查订单、再确认退款、然后发通知",每次描述都要消耗几十上百个token,而且模型还不一定理解到位。而写成一个skill之后,你只需要说"处理退货订单12345",剩下的一整套动作都由skill里的指令接管,输入token骤降。
第二,skill能约束输出格式。比如电商客服场景,我要求模型必须以固定JSON结构返回结果,而不是自由发挥成一篇小作文。结构化的输出token量通常只有自然语言输出的三分之一到一半。实测下来,同一个任务用了skill模板之后,单次任务的输入token从4000降到了1500,输出token更是少了六成。这是除了缓存之外最容易被忽视的省钱利器。
4. 实操配置:从默认参数到"省钱模式"的完整改造
4.1 一份可以直接抄的配置文件模板
聊了这么多原理,我直接把我最终在用的那套配置模板放出来。需要说明的是,这个模板基于我当时使用的OpenClaw版本整理,具体变量名在你的版本里可能有差异,但配置思路是通用的。
yaml复制model:
main: claude-sonnet-4-20250514
fast: claude-haiku-4-20250514
local_base_url: http://localhost:11434/v1
local_model: qwen2.5:7b
router:
enabled: true
simple_intents:
- query
- search
- format
- summarize
- calculate
complex_intents:
- analyze
- plan
- debug
context:
history_limit: 20
summary_on: true
summary_trigger_turns: 10
cache_control: true
memory:
store_raw_history: false
store_summary_only: true
retry:
max_attempts: 2
backoff_seconds: 5
log:
level: WARNING
store_trace: false
每个配置项背后的逻辑都很明确。主模型选旗舰,快速模型选便宜款,本地模型做兜底。路由规则把简单意图分给便宜模型,复杂意图才走昂贵模型。历史窗口限制在20条,超过10个turn就生成摘要,配合缓存把固定前缀的开销降到最低。原始历史不落盘,只存摘要,省存储的同时也避免未来哪个功能没注意又去读全量历史。重试次数限制在2次,防止模型在任务失败时反复重试、疯狂叠token。日志只保留警告级,不存全量调用链路,因为调试一天省下的那一小会儿时间,可能比日志占用的token还贵。
4.2 日志、记忆与定时任务:堵住后台偷跑的口子
配置改完之后,我还做了一步很多人容易忽略的检查——寻找后台偷跑的口子。这类问题藏得很深,不仔细看根本发现不了。
第一个口子是日志和持久化。默认配置下,OpenClaw会把每次调用的上下文、工具执行结果全部写入日志或持久化存储。表面上看这只是占用磁盘空间,但这些存下来的原始记录将来可能被其他功能重新读取、注入到上下文里,变成未来的输入token。我在配置里把日志级别调到WARNING,关掉trace,同时把持久化的历史改成只存摘要,不存原文。这一项改动不大,但堵住了后期成本反弹的隐患。
第二个口子是定时任务和轮询。我之前的账单里有个后台任务每小时唤醒模型检查某个状态,每唤醒一次都要注入完整上下文,一个月下来吃掉好几美元的token,而它的实际用途只是让我"随时掌握那个网页的新动态"。我的处理方案是把轮询频率从每10分钟一次改成每天两次,任务重要性又没有下降,费用却大幅缩水。
第三个口子是预算告警。大多数API平台都支持设置月度预算提醒,千万别嫌麻烦。我把阈值设到月度预算的80%,达到后先告警,到100%直接停用高风险任务。这就像车的油表报警灯,虽然不能帮你剩油,但能防止你把车开到半路彻底趴窝。
4.3 从$1000到$20的月度成本推演
根据我自己踩坑过程的复盘,我整理了一个成本变动的路径表。你不用一次性抄完所有优化,按阶段来就行,每做完一个阶段都能在下一张账单上看到变化。
| 优化阶段 | 主要动作 | 预估月成本 |
|---|---|---|
| 初始状态 | 旗舰模型跑所有任务、全量历史、无缓存 | $1000+ |
| 阶段一 | 引入快速模型路由、限制重试次数 | $350-450 |
| 阶段二 | 上下文滑动窗口、摘要压缩、日志瘦身 | $150-250 |
| 阶段三 | 开启提示词缓存、skill模板化 | $60-100 |
| 阶段四 | 本地Ollama模型承接简单任务 | $20-40 |
需要说明一下,这个表是我基于自己每天几百次调用量的估算。如果你任务量更轻,比如每天只有几十次,那么优化后的成本可能是几美元;如果你任务更重、场景更复杂,做到20美元可能有点难,但50美元以内是有希望的。关键在于不要指望一步到位,而是每一步都观察几天,看看token消耗曲线是不是真的按预期下降。
5. 常见问题与排查技巧实录
5.1 换了便宜模型,账单为什么纹丝不动
这是我在社区里被问得最多的问题。很多人照着教程配好了fast模型,结果月底一看账单,跟之前几乎没差别。根据我自己的排查经验,这个问题通常有三个原因。
第一,配置根本没有生效。OpenClaw的配置加载方式比较多样,有人改了配置文件却忘了重启服务,或者写错了环境变量名,导致主模型压根没换成快速模型。这个最基础但最容易犯。
第二,路由规则没有覆盖到高频任务。你以为的"简单任务"可能不在simple_intents列表里,而实际真正高频的那个操作你恰好没配进去。所以配置好路由后,一定去日志里确认一下,实际请求到底打给了哪个模型。
第三,输出token没有被约束。便宜模型的输出可能更啰嗦、更爱自由发挥,如果你没有给temperature降温和限制最大输出token,那便宜模型反而会因为话多把成本补回来。我给输出加的约束是max_output_tokens限到500到1000,按场景分配,效果很明显。
5.2 提示词缓存命中率低,问题出在哪
如果你开了缓存,但账单没降多少,多半是缓存根本没命中。最经典的原因就是前缀不一致。你想想,如果某个动态内容被放在了系统提示词的最前面,比如当前时间,那每次请求都因为这一个字符的不同导致整个缓存失效。
排查方法倒也简单:拿日志里两次请求的输入前缀做一下diff,看看前面几十个token是否完全一致。只要前面有任何变动,缓存读取率就会直线下降。解决方法是把动态内容全部挪到固定前缀之后,让系统提示词、工具定义这些"雷打不动"的内容永远排在前面。另外注意,工具描述列表的顺序一变,缓存也会失效,所以尽量别在高峰期调整skill的加载顺序。
5.3 本地模型"免费"背后的两笔隐性账单
有人听说本地模型零成本,就把所有任务都切到Ollama,结果发现整体体验反而变差了。这里有两个容易被忽略的隐性账单。
第一笔是硬件账单。跑本地模型需要电费,如果你的显卡功耗高,一个月电费并不低,而且一大笔硬件折旧摊到每月也是一笔钱。第二笔是隐性重试账单。本地模型质量不够时,任务经常失败,失败了就会触发云端兜底,或者反复重试。我统计过,本地模型成功处理一次任务的成本虽然接近零,但每失败一次,可能就要花掉相当于两三次云端简单调用的钱。所以我的建议是:本地模型只做它有把握的事,一旦需要推理或理解复杂指令,直接走云端,别让它硬扛。
5.4 问题排查速查表
| 症状 | 可能原因 | 解决思路 |
|---|---|---|
| 换了便宜模型账单没降 | 配置未生效或路由未覆盖 | 重启服务,检查日志实际调用的模型 |
| 缓存开了但成本没降 | 前缀包含动态内容 | 把动态内容移到缓存前缀之后 |
| 本地模型接入了开销反而变大 | 本地频繁失败触发重试 | 限制本地任务类型,失败后直接走云端 |
| 某天token突然暴增 | 定时轮询或后台任务异常 | 查看时间点附近的工具调用日志 |
| 输出token异常偏高 | temperature太高或未限长度 | 降低temperature,设置max_output_tokens |
我自己练出来的一个习惯是每周抽十分钟看一次API平台的用量曲线,遇到异常突起就当天排查,绝不拖到月底。成本控制不是一次性的调参工程,它是一种细水长流的运营习惯。最后再提醒一句:各家API的定价和模型版本变动很快,你配置文件里写的模型名和缓存开关,最好每隔一两个月审视一遍,说不定随便换个新模型或者调整一下路由,又能再省一笔。
