成本控制实战:OpenClaw+Qwen3-4B的Token消耗监控与告警

张开发
2026/6/14 7:41:42 15 分钟阅读
成本控制实战:OpenClaw+Qwen3-4B的Token消耗监控与告警
成本控制实战OpenClawQwen3-4B的Token消耗监控与告警1. 为什么需要关注Token消耗当我第一次在本地部署OpenClaw对接Qwen3-4B模型时完全没意识到Token消耗会成为一个问题。直到月底收到云服务账单才发现短短两周就消耗了价值数百元的Token。这让我意识到长期运行的自动化任务必须建立完善的成本监控机制。OpenClaw的每个操作都需要大模型决策从简单的鼠标点击到复杂的文本处理都会产生Token消耗。特别是当任务链条较长时Token消耗会呈指数级增长。比如我设置的一个自动整理文档的任务单次执行就要消耗近2000个Token如果每天运行10次一个月下来就是60万Token。2. 搭建基础监控系统2.1 获取原始调用数据OpenClaw默认会在日志中记录每次模型调用的Token使用情况。我们可以通过分析这些日志来建立监控基础。在我的Mac上日志通常位于~/.openclaw/logs/gateway.log我编写了一个简单的Python脚本提取关键信息import re from collections import defaultdict def parse_openclaw_logs(log_file): token_usage defaultdict(int) pattern rmodel(.*?).*?prompt_tokens(\d).*?completion_tokens(\d) with open(log_file) as f: for line in f: matches re.search(pattern, line) if matches: model_name matches.group(1) prompt_tokens int(matches.group(2)) completion_tokens int(matches.group(3)) token_usage[model_name] prompt_tokens completion_tokens return token_usage2.2 建立每日统计报表为了让数据更直观我改进了脚本使其生成每日报表import datetime import json def generate_daily_report(log_file): today datetime.date.today().strftime(%Y-%m-%d) report { date: today, total_tokens: 0, models: {}, tasks: defaultdict(int) } task_pattern rtask_id(.*?) token_pattern rprompt_tokens(\d).*?completion_tokens(\d) with open(log_file) as f: for line in f: task_match re.search(task_pattern, line) token_match re.search(token_pattern, line) if token_match: task_id task_match.group(1) if task_match else unknown tokens int(token_match.group(1)) int(token_match.group(2)) report[total_tokens] tokens report[tasks][task_id] tokens # 按模型统计 if model in line: model line.split(model)[1].split()[0].strip() report[models].setdefault(model, 0) report[models][model] tokens # 保存报表 with open(ftoken_report_{today}.json, w) as f: json.dump(report, f, indent2) return report这个脚本会生成一个JSON格式的日报表包含总Token数、各模型使用情况和各任务的消耗明细。3. 实现超额预警机制3.1 设置预算阈值我在配置文件中增加了预算控制部分{ cost_control: { daily_budget: 100000, monthly_budget: 2000000, alert_emails: [your_emailexample.com], fallback_model: qwen3-4b-low-cost } }3.2 预警脚本实现当Token消耗接近预算时系统会自动发送邮件提醒import smtplib from email.mime.text import MIMEText import json from datetime import datetime def check_budget_alert(report_file): with open(report_file) as f: report json.load(f) with open(~/.openclaw/openclaw.json) as f: config json.load(f) daily_usage report[total_tokens] daily_budget config[cost_control][daily_budget] if daily_usage daily_budget * 0.9: send_alert_email( config[cost_control][alert_emails], fOpenClaw Token消耗预警 - {report[date]}, f今日Token消耗已达{daily_usage}接近日预算{daily_budget} ) def send_alert_email(to_emails, subject, content): msg MIMEText(content) msg[Subject] subject msg[From] openclaw_alertyourdomain.com msg[To] , .join(to_emails) with smtplib.SMTP(your_smtp_server) as server: server.send_message(msg)4. 自动切换低成本模型当Token消耗超过阈值时系统会自动切换到备用模型def switch_to_fallback_model(): import shutil from pathlib import Path config_path Path(~/.openclaw/openclaw.json) backup_path config_path.with_suffix(.json.bak) # 备份原配置 shutil.copy(config_path, backup_path) with open(config_path) as f: config json.load(f) fallback_model config[cost_control][fallback_model] config[models][default] fallback_model with open(config_path, w) as f: json.dump(config, f, indent2) # 重启OpenClaw网关使配置生效 import subprocess subprocess.run([openclaw, gateway, restart]) return fallback_model5. 完整监控方案集成将上述功能整合成一个完整的监控系统import schedule import time from datetime import datetime, timedelta def daily_monitor_job(): today datetime.now().strftime(%Y-%m-%d) log_file f~/.openclaw/logs/gateway_{today}.log report_file ftoken_report_{today}.json # 生成日报表 report generate_daily_report(log_file) # 检查预算 check_budget_alert(report_file) # 如果超过预算切换模型 if report[total_tokens] get_daily_budget(): fallback_model switch_to_fallback_model() send_alert_email( get_alert_emails(), OpenClaw已自动切换模型, f由于Token消耗超过预算已切换至备用模型{fallback_model} ) def get_daily_budget(): with open(~/.openclaw/openclaw.json) as f: config json.load(f) return config[cost_control][daily_budget] def get_alert_emails(): with open(~/.openclaw/openclaw.json) as f: config json.load(f) return config[cost_control][alert_emails] # 设置定时任务 schedule.every().day.at(23:50).do(daily_monitor_job) while True: schedule.run_pending() time.sleep(60)6. 实际效果与优化建议这套监控系统部署后我的Token消耗得到了有效控制。最明显的变化是当自动任务出现异常循环时系统能及时发出警报并自动切换到低成本模式避免了不必要的支出。几个优化建议细化任务级监控为不同重要级别的任务设置不同的Token预算关键任务可以分配更多资源。历史数据分析收集长期数据分析使用模式优化预算分配。我增加了一个月度分析脚本def monthly_analysis(): month datetime.now().strftime(%Y-%m) reports [] for day in range(1, 32): try: with open(ftoken_report_{month}-{day:02d}.json) as f: reports.append(json.load(f)) except FileNotFoundError: continue # 分析月消耗趋势、任务分布等 # ...动态预算调整根据工作日/节假日自动调整每日预算更灵活地控制成本。多级备用模型设置多个备用模型根据消耗情况逐步降级而不是直接切换到最低成本模型。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章