跳转到内容

Token 优化与成本管理

Token 优化与成本管理

学习目标

本章要解决什么问题:理解 ECC 如何从多个维度同时优化 Token 消耗和成本。

读完本章后,你将了解:

  • ECC 的推荐模型选择策略及成本影响
  • MAX_THINKING_TOKENS 控制的原理
  • 战略压缩 vs 自动压缩的差异
  • Stop 钩子中的成本追踪机制

前置知识

本章涉及模型适配和上下文管理的通用原理,建议先阅读:

下文假设你已理解上述概念,直接聚焦 ECC 的具体实现。


项目实践

多维成本优化矩阵

ECC 的成本优化不是单一策略,而是从 6 个维度同时入手:

优化维度具体操作成本影响实现方式
默认模型降级Sonnet 替代 Opus 作为日常编码~60% 降低settings.jsonmodel: "sonnet"
子代理模型降级Haiku 用于文件读取/探索~80% 降低CLAUDE_CODE_SUBAGENT_MODEL=haiku
思考 Token 控制MAX_THINKING_TOKENS=10000~70% 降低隐藏成本环境变量
战略压缩逻辑断点手动 /compact减少上下文浪费strategic-compact 技能建议
上下文监控耗尽/范围蔓延/循环警告避免无意义消耗ecc-context-monitor.js 钩子
成本追踪每会话 Token/费用标记可见性cost-tracker.js Stop 钩子

推荐设置组合

ECC 在 docs/token-optimization.md 中给出一组推荐设置:

{
"model": "sonnet",
"env": {
"MAX_THINKING_TOKENS": "10000",
"CLAUDE_CODE_SUBAGENT_MODEL": "haiku"
}
}

这组设置的累积效果:

  • Sonnet 日常编码(~60% 成本降低 vs Opus)
  • 思考 Token 上限 10000(~70% 隐藏成本降低 vs 默认 31999)
  • 子代理使用 Haiku(~80% 子代理成本降低)

战略压缩技能

ECC 的 strategic-compact 技能建议在逻辑断点手动执行 /compact,而非依赖自动压缩:

何时压缩

  • 探索完成后,开始实现之前
  • 完成一个里程碑后
  • 调试完成后,继续新工作之前
  • 重大上下文切换之前

何时不压缩

  • 任务进行到一半(会丢失中间状态)
  • 刚刚完成规划(规划结果还在上下文中)

ECC 的 suggest-compact.js 钩子在 PreToolUse 阶段(Edit/Write 事件)检查工具调用次数,大约每 50 次工具调用后建议手动 /compact

成本追踪 Stop 钩子

ECC 在 Stop 阶段运行 cost-tracker.js 钩子:

每次 Stop → cost-tracker.js → 轻量标记
标记内容:会话 ID、工具调用次数、估算成本
输出:追加到本地成本日志文件

设计特点

  • 异步执行(不阻塞响应)
  • 轻量标记(不记录完整 Token 计数)
  • 订阅用户可以关闭 API-rate 成本估计警告(ECC_CONTEXT_MONITOR_COST_WARNINGS=off),但保留上下文耗尽警告

问题与规避

自动压缩在任务中触发

问题:Claude Code 的自动压缩可能在任务中间触发,丢失关键上下文。

ECC 的规避

  • 战略压缩技能建议在任务边界手动压缩,而非依赖自动压缩
  • suggest-compact.js 钩子在逻辑断点提醒用户
  • 部分用户报告 CLAUDE_AUTOCOMPACT_PCT_OVERRIDE 的行为与预期相反(降低阈值反而更早压缩),ECC 文档建议移除此覆盖

成本估计不准确

问题:ECC 的上下文监控从本地钩子遥测估算 API-rate 成本,订阅用户的实际账单与此不同。

ECC 的规避

  • 订阅用户可通过 ECC_CONTEXT_MONITOR_COST_WARNINGS=off 关闭成本估计警告
  • 保留上下文耗尽、范围蔓延、循环警告(这些与账单无关)

过度优化导致体验下降

问题:同时应用所有优化(Sonnet + Haiku 子代理 + 低 Thinking + 频繁压缩)可能导致 Agent 表现明显下降。

规避方案

  • 使用 Profile 思维:简单任务用最小成本配置,复杂任务通过 /model opus 临时升级
  • 不要将 MAX_THINKING_TOKENS 设为 0(完全禁用扩展思考),而是设为合理值(10000)

设计取舍

环境变量 vs 配置文件

ECC 的成本优化设置主要通过环境变量而非配置文件实现:

  • 优势:可以在不同会话中动态切换(如今天用 strict profile,明天用 minimal)
  • 代价:需要用户在 shell 配置文件中持久化这些变量
  • 替代方案:在 settings.json 中内置优化配置。ECC 选择环境变量因为 settings.jsonenv 字段也支持环境变量引用

战略压缩 vs 自动压缩

ECC 推荐手动战略压缩而非依赖自动压缩:

  • 手动压缩的优势:在逻辑断点执行,不丢失任务上下文
  • 自动压缩的优势:不需要用户干预
  • ECC 的判断:自动压缩的触发时机不总是最优的,手动压缩在关键断点执行效果更好

成本可见性 vs 隐私

ECC 的成本追踪将标记写入本地日志文件:

  • 优势:用户可以了解自己的成本模式
  • 代价:本地文件可能包含敏感的会话元数据
  • 规避:仅写入轻量标记(会话 ID、工具调用次数),不写入实际 Token 内容

参考来源

  • 源码验证: docs/token-optimization.md — 完整优化指南
  • 源码验证: scripts/hooks/cost-tracker.js — 成本追踪 Stop 钩子
  • 源码验证: scripts/hooks/ecc-context-monitor.js — 上下文监控
  • 源码验证: scripts/hooks/suggest-compact.js — 战略压缩建议
  • 源码验证: skills/strategic-compact/ — 战略压缩技能
  • 多模型适配架构 — 通用模型路由与成本优化