AI Coding Agent Token 成本优化与 CodeGraph 落地

理解 Token 成本从哪来、我们实际落地了哪两项优化(bash 输出压缩 + CodeGraph 默认工具)、如何验证它们生效


目录

  1. Token 成本从哪来
  2. 我们实际落地了什么
  3. 如何验证生效(实测举例)
  4. 日常使用速查卡
  5. 注意事项

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:保留行首长度,默认 160
  • MIMOCODE_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 轮

  1. 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. 注意事项

  1. bash 输出压缩为实验性开关:观察准确性中。若发现信息丢失,调大 MAX_LINE_CHARS(触发阈值)或 LINE_HEAD_KEEP(保留行首);观察几天无信息丢失后可删掉注释与开关之一
  2. 环境变量仅新终端/新会话生效:改 zshrc 后旧会话不生效
  3. CodeGraph 收益与大库相关:大/中型代码库收益显著,小项目有限——不必强上
  4. MCP 少而精:每个 MCP 的工具定义都进上下文,堆工具不等于更强
  5. prompt 缓存要求"写稳不写短":避免频繁改系统提示导致缓存失效

下期预告,自动化开发看板初步功能介绍及建设思路

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐