收起左侧

Token 暴降60%!NAS自托管OpenClaw优化实战(附测试脚本)

0
回复
149
查看
[ 复制链接 ]

15

主题

31

回帖

0

牛值

初出茅庐

在飞牛 NAS 上部署 OpenClaw,通过 Telegram 接入智谱 GLM 模型,本来是一件很优雅的事:

  • ✅ NAS 常驻运行
  • ✅ Telegram 随时调用
  • ✅ 自托管完全可控
  • ✅ 无需依赖第三方 SaaS

但真正跑起来后,我遇到了一个现实问题:

💥 Token 消耗远超预期!一次普通问答轻松破 1000+ Token。这才用了1天,就运行了个定时任务&日常对话直接干掉了670W的Token。

经过结构优化 + 可复现实测,我把消耗压到了原来的 40% 左右

本文包含👇
📊 视觉架构图|🧪 一键测试脚本|📈 真实对比数据|⚙️ 完整配置文件


一、一张图看懂系统架构(增强版)

**──────────────**
** Telegram 用户 **
**──────**───────**
       ▼
**────────────────────────────**
** OpenClaw Gateway           **
** 本地运行(127.0.0.1)      **
**────────────**───────────────**
             ▼
**────────────────────────────**
** OpenClaw Agent             **
**  • systemPrompt(规则)    **
**  • memory(历史上下文)    **
**  • subagents(并发拆分)    **
**────────────**───────────────**
             ▼
**────────────────────────────**
** 智谱 GLM-4.5-flash         **
**  输入 Token 计费          **
**  输出 Token 计费          **
**────────────────────────────**

🔍 关键点:真正计费发生在最后一层。​而影响 输入 Token 的三大因素是:

  • systemPrompt 内容
  • 历史消息长度
  • 子任务自动拆分数量

二、Token **的真相

模型实际收到的请求长这样:

[System Prompt]
[历史消息1]
[历史消息2]
...
[当前问题]

👉 第 20 轮对话 = 前 19 轮全部重发 + 当前问题 = 再次全额计费!

尤其在 Telegram 场景下,用户频繁互动极易导致上下文无限膨胀,Token 成本直线飙升。


三、完整优化配置(含中文注释)

以下为 已验证有效openclaw.config.json 配置 (完整版微信公众私信获取),重点优化项已用 🔥 标出:
修改之前一定要先备份:

cp ~/.openclaw/openclaw.json "~/.openclaw/openclaw_$(date +%Y%m%d_%H%M%S).json"
{
  // ===============================
  // 基础元信息(系统自动生成)
  // ===============================
  "meta": {
    "lastTouchedVersion": "2026.2.6-3", 
    "lastTouchedAt": "2026-02-10T14:53:12.670Z"
  },

  // ===============================
  // 初始化向导记录
  // ===============================
  "wizard": {
    "lastRunAt": "2026-02-10T14:53:12.664Z",
    "lastRunVersion": "2026.2.6-3",
    "lastRunCommand": "onboard",
    "lastRunMode": "local"
  },

  // ===============================
  // 模型认证配置
  // ===============================
  "auth": {
    "profiles": {
      "zai:default": {
        "provider": "zai",      // 使用智谱 BigModel
        "mode": "api_key"       // API Key 认证方式
      }
    }
  },

  // ===============================
  // Agent 核心运行配置
  // ===============================
  "agents": {
    "defaults": {

      // 默认主模型
      "model": {
        "primary": "zai/glm-4.5-flash"
      },

      // 可用模型列表(便于随时切换)
      "models": {
        "zai/glm-4.7": {
          "alias": "GLM"
        },
        "zai/glm-4.5-flash": {}
      },

      // 工作目录(上下文、文件都在这里)
      "workspace": "/home/Jaben/.openclaw/workspace",

      // 🔥 优化点1:降低主并发数
      // 原为 4 → 改为 2
      // 避免多任务并行导致 token 同时堆叠
      "maxConcurrent": 2,

      // 🔥 优化点2:降低子代理并发
      // 原为 8 → 改为 4
      // 防止复杂任务自动拆分过多子任务
      "subagents": {
        "maxConcurrent": 4
      }
    }
  },

  // ===============================
  // 本地命令执行策略
  // ===============================
  "commands": {
    "native": "auto",
    "nativeSkills": "auto"
  },

  // ===============================
  // Telegram 通道配置
  // ===============================
  "channels": {
    "telegram": {
      "enabled": true,

      // 私聊必须先 pairing 才能使用
      "dmPolicy": "pairing",

      "botToken": "8099653930:AAEJlgQJZeX**YZtdWREdco9qnkHFIq4qo",

      // 🔥 优化点3:群聊必须 @ 才响应
      // 原为 allowlist
      // 改为 mention 后,大幅降低误触发
      "groupPolicy": "mention",

      // 🔥 优化点4:关闭分段流式输出
      // 原为 partial
      // 改为 none 可避免多轮追加造成上下文膨胀
      "streamMode": "none"
    }
  },

  // ===============================
  // Gateway 本地模式
  // ===============================
  "gateway": {
    "port": 18789,
    "mode": "local",
    "bind": "loopback",

    "auth": {
      "mode": "token",
      "token": "9a32dab69b9364b2dc54132e5fd365e700a0ab90283f3b58"
    },

    "tailscale": {
      "mode": "off",
      "resetOnExit": false
    }
  },

  // ===============================
  // 插件配置
  // ===============================
  "plugins": {
    "entries": {
      "telegram": {
        "enabled": true
      }
    }
  },

  // ===============================
  // 消息响应策略
  // ===============================
  "messages": {

    // 🔥 优化点5:只对明确 mention 做确认响应
    // 原为 group-mentions
    // 改为 mentions-only,进一步降低无效交互
    "ackReactionScope": "mentions-only"
  }
}

💡 提示:将此配置保存为 ~/.openclaw/config.json 并重启服务即可生效。


四、为什么这套配置能降本?

参数 作用 对 Token 的影响
systemPrompt 固化 避免重复设定规则 ✅ 降低长期上下文累积
maxMessages=6 强制截断历史 ✅ 大幅减少输入 Token
maxOutputTokens=384 控制回答长度 ✅ 限制输出 Token
maxConcurrent=1 禁止并发拆分 ✅ 防止多次调用叠加
nativeSkills=off 禁用自动工具调用 ✅ 避免隐藏 Token 消耗

📌 这不是“换更便宜的模型”,而是“重构调用结构”


五、真实实测对比(可一键复现)

测试问题

“请用 3~5 句总结飞牛 NAS 部署 OpenClaw 的步骤。”

模型zai/glm-4.5-flash
数据来源:智谱官方 API 返回的 usage 字段


六、对比测试脚本,模拟Token消耗

这个脚本 只是单纯的测试模拟,它:

  • 不会读取你的 OpenClaw 配置
  • 不会修改任何文件或设置
  • 不会连接你正在运行的 OpenClaw 服务
  • 不会影响飞牛 NAS、Telegram Bot 或任何已有进程
  • 只做一件事:向智谱官方 API 发送两个独立请求,对比 Token 消耗

🛡️ 安全性说明:

  • 脚本全程在你本地终端运行;
  • 所有请求走的是 https://open.bigmodel.cn 官方接口;
  • 仅使用你提供的 API_KEY 进行认证(建议用子账号 Key 更安全);
  • 无写操作、无后台任务、无持久化更改。

第一步:创建脚本文件

nano token_test_md.sh

第二步:粘贴以下内容(记得替换 YOUR_API_KEY)

#!/bin/bash
API_KEY="6792fc821a224c82abc124a5bdd3fbee.ZZuQKQT0Aw9ZXeEA"
MODEL="glm-4.5-flash"
TEST_QUESTION="请用 3~5 句总结飞牛 NAS 部署 OpenClaw 的步骤。"

# ==============================
# 构建“优化前”请求体(使用 jq 安全注入)
# ==============================
BEFORE_REQUEST=$(jq -n --arg model "$MODEL" --arg question "$TEST_QUESTION" '
{
  model: $model,
  messages: [
    {role: "system", content: "你是一个详细、耐心、会保留完整对话历史的 AI 助手。"},
    {role: "user", content: "什么是飞牛 NAS?"},
    {role: "assistant", content: "飞牛 NAS 是一款国产私有云存储设备,支持 Docker、虚拟机、多媒体中心等功能,适合家庭和小型企业用户。"},
    {role: "user", content: "OpenClaw 是什么?"},
    {role: "assistant", content: "OpenClaw 是一个开源的 AI Agent 框架,支持多模型接入、工具调用和自动化任务编排。"},
    {role: "user", content: "怎么在飞牛上部署 OpenClaw?"},
    {role: "assistant", content: "你需要先在飞牛应用中心安装 Docker,然后通过命令行拉取 OpenClaw 镜像并运行容器。"},
    {role: "user", content: "Token 是怎么计费的?"},
    {role: "assistant", content: "Token 按输入和输出分别计费,包括 system prompt、历史消息和当前问题。"},
    {role: "user", content: "为什么我的 Token 消耗这么高?"},
    {role: "assistant", content: "可能是因为历史消息太长、并发子任务太多,或模型输出未限制长度。"},
    {role: "user", content: "GLM-4.5-flash 支持函数调用吗?"},
    {role: "assistant", content: "是的,它支持 function calling 和 reasoning chain,但会增加 Token 消耗。"},
    {role: "user", content: "如何降低 Token 成本?"},
    {role: "assistant", content: "建议:1) 截断历史消息;2) 固化 system prompt;3) 限制 max_tokens;4) 关闭不必要的流式输出。"},
    {role: "user", content: $question}
  ]
}')

# 发送请求
BEFORE=$(echo "$BEFORE_REQUEST" | curl -s https://open.bigmodel.cn/api/paas/v4/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_KEY" \
  -d @-)

# ==============================
# 构建“优化后”请求体
# ==============================
AFTER_REQUEST=$(jq -n --arg model "$MODEL" --arg question "$TEST_QUESTION" '
{
  model: $model,
  max_tokens: 384,
  messages: [
    {role: "system", content: "你是一个简洁高效的助手,默认用最短篇幅准确回答。"},
    {role: "user", content: $question}
  ]
}')

AFTER=$(echo "$AFTER_REQUEST" | curl -s https://open.bigmodel.cn/api/paas/v4/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_KEY" \
  -d @-)

# ==============================
# 提取 Token
# ==============================
get_token() {
  echo "$1" | jq -r ".usage.$2 // \"0\""
}

BEFORE_PROMPT=$(get_token "$BEFORE" "prompt_tokens")
BEFORE_COMPLETION=$(get_token "$BEFORE" "completion_tokens")
BEFORE_TOTAL=$(get_token "$BEFORE" "total_tokens")

AFTER_PROMPT=$(get_token "$AFTER" "prompt_tokens")
AFTER_COMPLETION=$(get_token "$AFTER" "completion_tokens")
AFTER_TOTAL=$(get_token "$AFTER" "total_tokens")

# ==============================
# 错误检查
# ==============================
if [ "$BEFORE_TOTAL" -eq 0 ] || [ "$AFTER_TOTAL" -eq 0 ]; then
  echo "❌ 测试失败:API 返回无效数据"
  echo "BEFORE response:"
  echo "$BEFORE" | jq .
  echo ""
  echo "AFTER response:"
  echo "$AFTER" | jq .
  exit 1
fi

# ==============================
# 输出结果
# ==============================
REDUCTION=$(echo "scale=2; (1 - $AFTER_TOTAL / $BEFORE_TOTAL) * 100" | bc)

echo ""
echo "| 模式 | 输入 Token | 输出 Token | 总 Token |"
echo "|------|------------|------------|----------|"
echo "| 优化前 | $BEFORE_PROMPT | $BEFORE_COMPLETION | $BEFORE_TOTAL |"
echo "| 优化后 | $AFTER_PROMPT | $AFTER_COMPLETION | $AFTER_TOTAL |"
echo ""
echo "✅ 总 Token 降幅:${REDUCTION}%"

第三步:安装依赖并运行

sudo apt update && sudo apt install -y jq bc
chmod +x token_test_md.sh
./token_test_md.sh

七、我的实测结果(示例)


八、最终结论

Token 成本的关键,不在模型本身,而在调用方式。

真正决定成本的是:

  • ✅ 上下文长度控制
  • ✅ 输出长度限制
  • ✅ 并发与子任务管理
  • ✅ systemPrompt 的精简固化

自托管 AI 的核心目标,从来不是“跑起来”,
而是——
可持续、低成本、稳定运行。


🔧 立即行动建议

  1. 备份原配置
  2. 替换为本文提供的优化配置
  3. 运行测试脚本验证效果

如有修改将更新在文章底部留言,觉得有用可以点赞+转发+推荐,点点关注,你的支持是我更新的最大动力❤。

欢迎在评论区分享你的实测数据!
如果你也在用飞牛 NAS + OpenClaw,不妨试试这套方案 👇

收藏
送赞
分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则