【小白指南针】AI Coding自动化编程从0~1的蜕变三:Token成本优化与CodeGraph落地
AI Coding Agent Token 成本优化与 CodeGraph 落地
理解 Token 成本从哪来、我们实际落地了哪两项优化(bash 输出压缩 + CodeGraph 默认工具)、如何验证它们生效
目录
1. Token 成本从哪来
一次 AI Coding Agent 请求的成本结构:
一轮请求成本 ≈ 固定前缀(系统提示+工具定义) + 会话历史 + 运行时检索 + 工具往返 + 模型输出
- 用户输入通常 <1% —— 大头是系统上下文重复传输(历史、工具定义、代码文件)
- 工具往返最容易被忽视:一次工具调用(工具定义 + 参数 + 返回值)全量进上下文,常常比原始问题还长
- 重试 = 整包上下文重复付费:一次失败,下一轮把同样的上下文再发一遍
五种成本类型
| 成本类型 | 说明 | 优化手段 |
|---|---|---|
| 输入 Token | 上下文传输 | Prompt Cache、上下文压缩 |
| 输出 Token | 模型生成 | 控制 verbosity / max tokens |
| 推理 Token | thinking budget | 复杂任务开、模板任务关 |
| 工具往返 | 工具定义+参数+返回值进上下文 | 减少调用次数、工具少而精 |
| 重试 | 失败后整包重发 | 减少重试本身就是硬优化 |
优化思路(五层模型,由浅入深)
使用习惯 → 模型路由 → Context 工程 → 代码图谱 → Agent 架构
核心概念:
- Prompt Cache(前缀缓存):缓存稳定前缀的处理结果,不是缓存答案。写法上静态内容前置、动态内容后置;“写稳不写短”——频繁改 system prompt 会导致缓存失效。省的是重复成本而非首轮成本
- 模型路由:模板化任务(单测、commit、格式修复)用便宜模型,复杂推理(架构设计、复杂 Bug)用强模型;级联工作流(便宜模型初筛 → 强模型深推理)
- 上下文压缩:对终端输出、模型回复、工具结果做压缩/裁剪,避免无关内容进上下文
- 代码图谱:跨文件查询一次拿全源码+调用链,替代多轮 grep/read(实测详见第 3 节)
- 多 Agent:subagent 独立上下文,不污染主会话
- MCP 少而精:每个 MCP 的工具定义都会进上下文,堆工具 ≠ 更强
常见误区:上下文越多越好、MCP 越多越强、所有 Agent 都用最贵模型、聊天记录当记忆、只看单价不看总成本、无脑最短 prompt——以上皆错。
2. 我们实际落地了什么
2.1 落地项 1:bash 输出 Token 压缩
文件:~/.zshrc(63-66 行)
# 开启 bash 输出 token 压缩(实验性,观察准确性后决定去留)
# TOKEN_EFFICIENCY 为父开关,HEURISTIC 为启发式压缩子开关,两者需同时开启才生效
export MIMOCODE_EXPERIMENTAL_TOKEN_EFFICIENCY=1
export MIMOCODE_EXPERIMENTAL_TOKEN_EFFICIENCY_HEURISTIC=1
实测发现的坑(不踩会白配):
MIMOCODE_EXPERIMENTAL_TOKEN_EFFICIENCY是父开关,..._HEURISTIC是子开关- 二进制逻辑要求
TOKEN_EFFICIENCY && TOKEN_EFFICIENCY_HEURISTIC同时为真才执行启发式压缩 - 只开 HEURISTIC 会被父开关短路,不生效
可调参数(保持默认观察中):
MIMOCODE_EXPERIMENTAL_TOKEN_EFFICIENCY_MAX_LINE_CHARS:触发阈值,默认 500 字符/行MIMOCODE_EXPERIMENTAL_TOKEN_EFFICIENCY_LINE_HEAD_KEEP:保留行首长度,默认 160MIMOCODE_EXPERIMENTAL_TOKEN_EFFICIENCY_NEVER_WORSE_MARGIN:默认 0
2.2 落地项 2:CodeGraph 设为代码查询默认工具
文件:~/.config/mimocode/instructions.md(全局指令,跨项目生效)
规则要点:
- 跨文件/结构化查询默认用
codegraph_explore,grep/glob/read 降级为兜底 - 单文件小改动、精确已知路径仍可直接 read/grep(不做无谓绕路)
codegraph_explore返回的源码视为已读,不要重复 Read(省 token 的关键习惯)- 无
.codegraph/目录时正常使用内置工具
CLI 速查(codegraph <cmd>,项目目录内执行):
codegraph explore <query> # 与 MCP 工具同输出:源码+调用链一次拿全
codegraph node <symbol> # 单符号源码 + caller/callee 轨迹
codegraph callers <symbol> # 谁调用了它
codegraph callees <symbol> # 它调用了谁
codegraph impact <symbol> # 改动影响分析(改代码前必查)
codegraph query <search> # 符号定位
codegraph status # 索引健康检查
codegraph sync # 手动增量同步
3. 如何验证生效(实测举例)
3.1 验证 bash 输出压缩
三步确认法:
第 1 步:环境变量加载检查
echo $MIMOCODE_EXPERIMENTAL_TOKEN_EFFICIENCY # 应输出 1
第 2 步:行为对比(最直观)
python3 -c 'for i in range(3): print("X" * 2000)'
- 生效前(基线实测):输出完整,单行 2000 字符,共 6003 字节
- 生效后:每行被截断到约 160 字符
第 3 步:日志确认(定量证据)
grep "heuristic cleaned" ~/.local/share/mimocode/log/*.log | tail -3
应看到形如 bash output heuristic cleaned {bytesIn: 6003, bytesOut: 483, saved: 5520},saved 即每次省掉的字节数。日志仅在实际发生压缩(bytesOut < bytesIn)时记录。
补充验证(本次实际用过的):对 mimo 二进制做 strings 提取,确认读取逻辑为值 “true”/“1” 视为开启、且启发式分支要求父子开关同时为真。
3.2 验证 CodeGraph 索引健康
codegraph status # 看文件/节点/边数量 + 末尾 "✓ Index is up to date"
实测数据:
- AiCodingProject:69 文件 / 624 节点 / 1398 边
- prevent-drowning-service(Java,473 文件):17,436 节点 / 24,623 边
新鲜度对照:改一个文件 → 等几秒(file watcher 自动同步)→ 再 codegraph node 看是否反映新代码。MCP 工具每次调用会从磁盘重读源码,源码永远新鲜;符号图靠 watcher 同步。
3.3 对照实验:CodeGraph 到底省多少(核心演示)
问题:pushAndSaveVoiceRecord 等四个告警推送方法的调用链(prevent-drowning-service,473 文件 Java 库)
CodeGraph 路径:1 次调用拿到全部:
- 调用链:
EventAlarmServiceImpl:776/814/854/894 → AliyunService:19(接口) → AliyunServiceImpl:120/149/179(实现) - 3 个文件的源码(focused 裁剪,只给命中方法体,其余只列签名)
- Blast radius:每个方法的调用者 + ⚠️ 无覆盖测试警告
grep 路径:至少 7 轮:
- grep 得 8 处匹配跨 3 文件 → 2. read EventAlarmServiceImpl(929 行,无关方法全进上下文)→ 3. read AliyunServiceImpl → 4. read AliyunService 接口 → 5-7. 再 grep 另外 3 个符号确认调用点……
| 维度 | grep+read | codegraph_explore |
|---|---|---|
| 工具调用轮次 | ≥7 轮 | 1 轮 |
| 上下文消耗 | read 整文件(929 行全进上下文) | focused 裁剪(只给命中方法) |
| 调用链推导 | 人工判断 | 自动给出 + 动态分发提示 |
| 附加信息 | 无 | blast radius、无测试警告 |
3.4 现场演示:任务执行链路(AiCodingProject)
问题:UI 点击"启动执行"后任务如何走到 mimo agent?一次 explore 拿到:
startExecution (execution-store.ts:32) ← UI 4 处触发
→ window.electronAPI.startExecution (IPC 桥)
→ executor.ts → TaskRunner.execute (task-runner.ts:43)
→ createWorktree (worktree-manager.ts:50)
→ runMimoAgent / runMimoAnalysis (mimo-bridge.ts:41/112)
4 个文件源码 + 全部调用者一次返回。
4. 日常使用速查卡
| 场景 | 用什么 | 为什么 |
|---|---|---|
| 跨文件问题(“X 如何工作”、“X 如何到 Y”) | codegraph_explore |
一次拿全源码+调用链,省 7+ 轮 grep/read |
| 改代码前 | codegraph impact <symbol> |
看改动影响面 |
| 找定义/调用者 | codegraph node/callers <symbol> |
精确 file:line |
| 单文件小改动、已知路径 | 直接 read/grep | 不做无谓绕路 |
| explore 返回的源码 | 视为已读 | 不要重复 Read(省 token 关键习惯) |
| 输出带 ⚠️ 陈旧警告 | 才 Read 原文件 | 索引落后的兜底 |
| 新终端后验证压缩 | 三步法(env → 长行行为 → 日志 grep) | 见 3.1 |
5. 注意事项
- bash 输出压缩为实验性开关:观察准确性中。若发现信息丢失,调大
MAX_LINE_CHARS(触发阈值)或LINE_HEAD_KEEP(保留行首);观察几天无信息丢失后可删掉注释与开关之一 - 环境变量仅新终端/新会话生效:改 zshrc 后旧会话不生效
- CodeGraph 收益与大库相关:大/中型代码库收益显著,小项目有限——不必强上
- MCP 少而精:每个 MCP 的工具定义都进上下文,堆工具不等于更强
- prompt 缓存要求"写稳不写短":避免频繁改系统提示导致缓存失效
下期预告,自动化开发看板初步功能介绍及建设思路
更多推荐




所有评论(0)