AI Coding Agent Token 成本优化指南(下):工具层、代码图谱与多 Agent 协作
如果你把上篇的行动清单做完了,成本通常已经有明显下降。但如果你想继续往下压,就要开始处理系统层的问题:命令输出怎么压、检索怎么少走弯路、多个 Agent 怎么把上下文拆开。
本篇承接上篇的五层模型,继续往下走三层:
| 层级 | 主题 | 作用 | 特点 |
|---|---|---|---|
| 第三层 | 压缩工具 | 先把高频输入输出压下来 | 装完即用,立即见效 |
| 第四层 | 代码图谱 | 让检索不再盲搜 | 先知道该读哪里,再读文件 |
| 第五层 | 多 Agent 用法 | 把大任务拆成多个小上下文 | 边界清晰时更省 |
第四章 上下文压缩:先把高频上下文压下来
如果说上篇解决的是“少带无关上下文”,这一层解决的就是另一件事:把那些一定会进上下文的内容,尽量压短。
这四个工具方向不同,但可以叠加。你不一定要一次装全,但只要装上一个,通常就能立刻看到收益。
4.1 RTK:终端输出才是真正的 Token 大杀手
很多人把 Token 浪费归因于“聊太多轮”,但忽略了一个隐性大户:终端命令的冗余输出。
CodeBuddy 执行 cargo test,成千上万行测试日志、警告、进度条、ANSI 颜色码全部涌进上下文。
实测:30 分钟开发会话对比(来自 2900+ 真实命令测量):
| 场景 | Token 消耗 |
|---|---|
| 不用 RTK | ~150,000 |
| 用 RTK | ~16,850 |
| 节省 | 88.9% |
按命令类别的典型压缩率:
| 命令类别 | 原始 tokens | RTK 后 | 节省 |
|---|---|---|---|
| cargo test / npm test | 25,000 | 2,500 | -90% |
| pytest | 8,000 | 800 | -90% |
| vitest run | 102,199 字符 | 377 字符 | -99.6% |
| ls / tree | 2,000 | 400 | -80% |
| grep / rg | 16,000 | 3,200 | -80% |
| git status | 3,000 | 600 | -80% |
| git diff | 10,000 | 2,500 | -75% |
| cat / read | 40,000 | 12,000 | -70% |
说明:这张表混合了 token 和字符两种统计口径。前几行是 token,
vitest run这一行是字符长度,用来说明压缩幅度,不能和 token 行直接横向比较。
RTK 的四层过滤策略
- 智能过滤:剔除注释、空行、ANSI 颜色码、进度条、无关警告
- 分组聚合:同类输出合并展示(搜索结果按文件分组、错误按类型归类)
- 智能截断:按信息密度取样,保留关键片段,砍掉重复长尾
- 去重合并:「连接超时」重复 10 次 → 「连接超时(×10)」
5 分钟安装
# macOS(推荐)
brew install rtk
# Linux / WSL
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/master/install.sh | sh
注意:安装后用 rtk gain 验证。如果命令不存在,可能装了同名的 Rust Type Kit,需卸载重装。
# 全局启用 CodeBuddy(推荐)
rtk init -g
# 仅启用 Hook,不修改 CODEBUDDY.md
rtk init -g --hook-only
# 其他 AI 工具
rtk init -g --agent cursor # Cursor
rtk init -g --gemini # Gemini CLI
rtk init -g --codex # Codex
重启 CodeBuddy 后自动生效,所有命令透明经过 RTK 过滤,开发者无感知。
# 常用命令
rtk gain # 查看节省统计
rtk gain --history # 带命令历史
rtk discover # 扫描哪些命令还没用 RTK
# Git(压缩率 60-80%)
rtk git status
rtk git diff
# 测试(压缩率 90-99.6%)
rtk test cargo test
rtk vitest run
4.2 Caveman:压缩输出端的废话
RTK 压缩的是命令输出(输入 Token),Caveman 压缩的是 AI 回复(输出 Token)。两者方向不同,可以叠加。
核心数据(来自 arXiv:2604.00025):
| 任务类型 | 正常输出 | Caveman | 节省 |
|---|---|---|---|
| 解释 React bug | 118 tokens | 15 tokens | 87% |
| 配置 PostgreSQL | 234 tokens | 38 tokens | 84% |
| Docker 多阶段构建 | 104 tokens | 29 tokens | 72% |
| Code Review PR | 67 tokens | 39 tokens | 41% |
| 平均 | — | — | 65-75% |
Caveman 有四种模式,按压缩程度递增:
/caveman lite:删填充词,保留冠词,专业风格(适合正式输出)/caveman(full 默认):删冠词,碎片句,平衡压缩/caveman ultra:极度压缩,用A→B→C箭头因果链/caveman wenyan:文言文模式(理论上 token 效率最高的书面语)
实际效果示例(full 模式):
问:为什么 React 组件不断重渲染?
普通输出(69 tokens):
"The reason your React component is re-rendering is likely because you're
creating a new object reference on each render cycle..."
Caveman 输出(19 tokens):
"New object ref each render. Inline object prop = new ref = re-render.
Wrap in useMemo."
安装
# CodeBuddy 插件方式(推荐)
codebuddy plugin marketplace add JuliusBrussee/caveman
codebuddy plugin install caveman@caveman
安装后在 CodeBuddy 里输入 /caveman 即可激活。模式在会话内持续生效,输入 stop caveman 关闭。
4.3 headroom:压“进上下文的所有内容”
RTK 压的是命令输出,Caveman 压的是 AI 回复。headroom 压的是第三个方向:所有读进上下文的内容——文件内容、工具调用返回值、会话历史。
核心机制:可逆压缩(CCR)。原始数据本地保留,压缩版本送给 LLM,LLM 需要细节时再按需取回。不是丢数据,是推迟加载。
实测:47–92% token 减少(取决于内容类型)。
安装
pip install "headroom-ai[all]"
接入 CodeBuddy
# 基础接入
headroom wrap claude
# 推荐:同时开启跨 session 记忆 + 代码图谱集成
headroom wrap claude --memory --code-graph
之后正常用 CodeBuddy,headroom 在后台透明处理压缩,无感知。
也支持 MCP Server 模式
如果不想用 wrap 方式,可以走 MCP:
headroom mcp install
安装后在 CodeBuddy 里自动注册三个工具:headroom_compress、headroom_retrieve、headroom_stats。
与 RTK 的区别
| RTK | headroom | |
|---|---|---|
| 压缩对象 | 终端命令的输出 | 所有进上下文的内容 |
| 工作方式 | 过滤 + 截断 | 可逆压缩,按需还原 |
| 安装方式 | brew / curl | pip + wrap 命令 |
| 典型节省 | 89% | 47–92% |
两者方向不同,可以叠加使用。
4.4 context-mode:工具输出不再撑爆上下文
context-mode 解决的是一个具体痛点:MCP 工具调用的返回值太大。
一次 Playwright 快照 56 KB,二十条 GitHub issue 59 KB,一份访问日志 45 KB。用 30 分钟,40% 上下文就没了。然后 /compact 一压缩,CodeBuddy 忘了在改哪些文件、任务进行到哪了。
context-mode 是一个 MCP server 插件,四层能力一起上:
能力一:Sandbox 工具输出(98% 压缩)
工具调用结果先沙箱化,不直接进上下文。315 KB → 5.4 KB。LLM 按需取回原始数据,不是真的删掉。
能力二:跨 compact 会话连续性
所有文件编辑、git 操作、任务进度、错误信息全部记录到本地 SQLite。/compact 之后不丢失现场——context-mode 用 FTS5 全文索引按相关性取回,而不是把所有历史重新塞回去。
能力三:用代码代替读文件
ctx_execute() 工具让 CodeBuddy 写脚本处理数据,而不是读 50 个文件进上下文:
// Before: 47 次 Read() = 700 KB
// After: 1 次 ctx_execute() = 3.6 KB
ctx_execute("javascript", `
const files = fs.readdirSync('src').filter(f => f.endsWith('.ts'));
files.forEach(f => {
const lines = fs.readFileSync('src/' + f, 'utf8').split('\\n').length;
console.log(f + ': ' + lines + ' lines');
});
`);
CodeBuddy 生成并运行脚本,只把结果(几行文字)放进上下文,而不是把 47 个文件的内容全部读进来。
能力四:不干预输出格式
context-mode 只管数据往哪走,不管 CodeBuddy 怎么回答。如果你同时装了 Caveman,两者各管各的,不冲突。
安装(CodeBuddy 插件市场直装)
codebuddy plugin marketplace add mksglu/context-mode
codebuddy plugin install context-mode@context-mode
重启 CodeBuddy(或 /reload-plugins)后生效。
验证
/context-mode:ctx-doctor
所有项显示 [x] 即正常。
常用命令
/context-mode:ctx-stats # 查看节省统计,按工具分类
/context-mode:ctx-insight # 打开本地分析看板(90 个指标)
四个压缩工具一览
工具互补,不互斥。从左到右压缩复杂度递增:
| 工具 | 压缩什么 | 典型节省 | 装法 |
|---|---|---|---|
| RTK | 终端命令输出 → 上下文 | 89% | brew install rtk + rtk init -g |
| Caveman | AI 回复输出 | 65–75% | CodeBuddy 插件市场 |
| headroom | 所有进上下文的内容 | 47–92% | pip install headroom-ai[all] |
| context-mode | MCP 工具结果 + 会话连续性 | 98%(工具输出) | CodeBuddy 插件市场 |
最低成本起点:先装 RTK + Caveman,五分钟,立即见效。有时间再评估 headroom 和 context-mode。
第五章 代码图谱:让 AI 不再盲搜
前一层压的是“已经进来的东西”。这一层解决的是另一类浪费:本来就不该读进来的东西。
5.1 真正贵的是“找代码”,不是“读代码”
上下文窗口够大,不代表不需要图谱。
项目越大,AI 越容易陷入一个循环:
grep 一圈找入口
→ 读几个文件找关系
→ 发现漏了一个
→ 再 grep 一圈
→ 反复几轮才定位到
这个过程消耗大量 Tool Call 和上下文,而且结果还不一定准确。
代码图谱解决的是:让 AI 在动手读文件之前,就知道该读哪里。
5.2 Graphify:把代码库变成可查询的知识地图
Graphify 在 2026 年 4 月发布,10 天内 GitHub stars 超过 22k,如今已经来到 50.8k。
核心机制:用 Tree-sitter 解析代码构建知识图谱,AI 查图而不是反复读文件。
官方数据:比直接读文件减少 71.5 倍 Token 消耗。
安装和使用
# 安装
uv tool install graphifyy
# 或
pipx install graphifyy
# 注册到 CodeBuddy
graphify install --platform codebuddy
# 或
graphify codebuddy install
在 CodeBuddy 里执行 /graphify,自动扫描项目并生成三份产物:
> /graphify
Building knowledge graph...
Parsed 247 files (TS/Prisma)
Found 1,832 symbols, 4,217 edges
Detected 14 communities (clusters)
Generated:
- graphify-out/graph.html ← 交互式可视化
- graphify-out/GRAPH_REPORT.md ← 自然语言报告
- graphify-out/graph.json ← AI 查询用的数据
后续问跨文件问题时,AI 读 graphify-out/graph.json,而不是反复 grep 源码:
> 我想在 /api/v1/comments 加一个 PATCH 接口。
> 列出会受到影响的所有中间件、Prisma model、和测试文件。
影响分析(基于知识图谱):
中间件链:
- middleware/auth.ts → optionalAuth → requireAuth
- middleware/rate-limit.ts(commenting 路径 30/min 限制)
Prisma model:
- Comment(直接修改)
- User(通过 authorId 关联)
- Mention(通过 commentId 关联,PATCH 后需要重算)
测试:
- tests/comments.test.ts
- tests/integration/registration.test.ts(间接依赖)
不用图谱时,同样问题经常要靠多轮 grep 和补读文件来兜底,遗漏关键路径并不少见。用图谱后,定位和影响分析会稳定得多,尤其适合跨文件问题。
支持范围
- 30+ 种语言:Python、TypeScript、Go、Rust、Java、C/C++、Ruby、C#、Kotlin 等
- 多模态:SQL schema、Markdown 文档、PDF、图片(通过 LLM 提取语义)
- 增量更新:git hook 触发,每次 commit 自动重建
与 CodeGraph 的区别
CodeGraph 是另一个方向的工具,基于 MCP Server + 持久化图数据库(Neo4j/KuzuDB),对 7 个真实开源仓库做了完整 benchmark(v0.9.4,2026-05-24 复验):
平均数据:57% 更少 Token、71% 更少 Tool Call、35% 更低成本、46% 更快。
分仓库明细:
| 代码库 | 语言 | 成本 | Tokens | 工具调用 |
|---|---|---|---|---|
| VS Code | TypeScript | -26% | -78% | -85% |
| Excalidraw | TypeScript | -52% | -90% | -96% |
| Tokio | Rust | -82% | -86% | -92% |
| Django | Python | -12% | -36% | -53% |
| Gin | Go | -21% | -34% | -40% |
| OkHttp | Java | -2% | -13% | -45% |
| Alamofire | Swift | -47% | -64% | -83% |
注意:收益和项目规模、语言强相关。Rust/TypeScript 大型项目收益最显著,Java/Go 较小项目收益相对有限。
CodeGraph 安装:
# npm 安装
npm i -g @colbymchenry/codegraph
# 初始化项目
cd your-project
codegraph init -i
手动配置 CodeBuddy:
// ~/.codebuddy/.mcp.json
{
"mcpServers": {
"codegraph": {
"type": "stdio",
"command": "codegraph",
"args": ["serve", "--mcp"]
}
}
}
核心工具:
codegraph_context:找入口点和关键符号(第一跳)codegraph_trace:追调用路径(含动态派发)codegraph_impact:重构前影响分析
选哪个:个人项目、快速上手 → Graphify(Skill 形态,零配置)。团队、大型仓库、需要持久化查询 → CodeGraph(MCP 服务器,功能更完整)。
第六章 多 Agent 协作:边界清晰时,CodeBuddy 会更省 Token
前两层解决的是“单个上下文怎么更省”。这一层继续往前走:别让所有任务都挤进同一个上下文。
换句话说,前面讲的是“单个会话怎么省”,这里讲的是:多个 Agent 怎么分工协作,才能在任务边界清晰时更省。
CodeBuddy 本身就支持 subagent 调度、worktree 隔离、Skill 绑模型——不需要自己写 Orchestrator,用好内置能力就够了。
6.1 单 Agent 为什么越用越贵
复杂项目里,单 session 很容易演变成这样:
- 规划、写代码、跑测试、Code Review 全在一个会话
- 上下文越积越长(所有历史都往一个 session 里塞)
- 所有任务用同一个模型配置,便宜活也用最贵模型
职责越混,上下文越胖,成本越高。
6.2 subagent:任务隔离的最低成本方式
CodeBuddy 的 Skill 里可以直接调用 Agent tool,把子任务分发出去:
使用 Agent tool 分析这个 PR 的影响范围,
然后把结果返回给我,不需要读具体实现文件。
每个 subagent 都应该有独立的上下文边界——它只看到自己需要的内容,主 session 只看到结果。前提是子任务真的能拆开;如果每个 Agent 都要重复读同一批背景,拆得越多,反而越贵。
典型分工:
主 session(规划 + 决策)
├── subagent A:影响分析(只看图谱,不读源码)
├── subagent B:写实现(只看相关文件)
└── subagent C:跑测试 + 生成报告
与上篇 3.5 的连接:subagent 可以单独绑定便宜模型(见下节)。规划用强模型,执行用便宜模型,两者在不同 session 里,互不干扰。
6.3 /new、/compact、subagent、worktree:四种手段别混用
这四个动作都和“上下文变轻”有关,但解决的问题完全不同:
| 手段 | 解决什么 | 历史怎么处理 | 代码改动怎么处理 | 适用场景 |
|---|---|---|---|---|
/new |
切断无关任务 | 直接开新会话 | 仍在同一仓库 | 换话题、换需求 |
/compact |
压长会话历史 | 保留摘要,不保留完整过程 | 仍在当前工作区 | 长任务续做 |
| subagent | 拆子任务 | 只给子任务需要的上下文 | 默认不做代码隔离 | 搜索、分析、验证 |
| worktree | 隔离并发改动 | 历史不是重点 | 独立 git worktree | 多任务并行开发 |
一句话:
/new 解决换任务
/compact 解决历史过长
subagent 解决职责拆分
worktree 解决代码并发
6.4 worktree 并发:多任务同时跑不冲突
有一批互相独立的任务要处理(比如修 5 个不相关的 Bug),可以用 worktree 模式并发:
主分支
├── worktree-1:修 Bug A(独立 git worktree)
├── worktree-2:修 Bug B(独立 git worktree)
└── worktree-3:修 Bug C(独立 git worktree)
每个 Agent 在隔离的 worktree 里工作,改的是不同文件,互不冲突。
怎么开:在 CodeBuddy 里启动新任务时,指定 worktree 隔离:
开一个新的 worktree 分支修这个 Bug,
修完后告诉我分支名,我来 review 再合并。
怎么合:worktree 没改动自动清理;有改动返回路径和分支名,自己决定 review 后合并。
适用场景:互相独立的 Bug 修复、并行跑不同重构方案对比效果、同时生成多个文档。
6.5 Skill 绑定模型:系统默认更省
上篇 3.5 说过“Skill 可以绑定模型”,这里给具体配置。
CodeBuddy 的 Skill 支持在 frontmatter 里指定模型,不靠人记得手动切:
---
name: write-unit-tests
description: 为指定函数生成单元测试
model: deepseek-v4-pro
---
为以下函数写完整的单元测试,覆盖正常路径和边界情况:
...
推荐配置原则:
| Skill 类型 | 推荐模型 | 理由 |
|---|---|---|
| 写 UT、补注释、生成 commit | DeepSeek | 模式固定,不需要强推理 |
| Code Review、影响分析 | 中高档模型 | 需要语义理解 |
| 架构设计、复杂 Bug 分析 | 不绑定(用默认最强) | 需要长链路推理 |
一旦固化到 Skill 配置,成本治理就从“靠人记得切”变成“系统默认更省”。
6.6 记忆外置:别让 session 承载全部历史
用“永不清空的超长会话”模拟记忆,是最贵也最脆弱的做法。
真正该长期保留的信息,外置出去:
CODEBUDDY.md 系统:项目约定、关键决策、架构边界。保持 < 50 行,是索引不是文档。详细内容放 docs/,让 CodeBuddy 按需读取。
Graphify graph.json:代码结构的外置记忆。建一次,跨 session 共享,新 session 不需要重新扫描整个仓库。
headroom --memory:如果你装了 headroom,--memory 模式会把重要信息持久化到本地,跨 session 恢复。
好处不只是省 Token:
- 可更新(旧信息能被替换)
- 可检索(按需读入,不是全量注入)
- 不依赖 session 存活
原则:会话只承载“当前工作状态”,背景信息按需读入。
到这里,下篇真正想建立的心智模型其实也可以浓缩成一句话:不要只想着把单次回答压短,更要想办法让系统少把同一批背景反复搬进来。
第七章 误区:很多“优化”其实在加成本
误区一:上下文越多越好。
上下文越多不一定越准,但通常越贵。噪音越多,模型越容易分神。该读哪个文件,比读多少文件更重要。
误区二:MCP 越多越强。
工具堆得越多,选择空间越大、决策越慢、错误调用概率越高。低频工具长期挂载,贡献的更多是成本。
误区三:所有 Agent 都上最强模型。
这不叫优化质量,叫放弃路由。每个环节默认最贵模型,系统里就没有“资源分配”,只有“直接烧钱”。
误区四:聊天记录当长期记忆。
长会话方便,但不是记忆系统。长期依赖会话承载全部背景,最终成本越来越高,关键信息越来越难提取。
误区五:只看单价不看总成本。
便宜模型如果导致更多重试、更多搜索、更多上下文回填,总成本未必更低。真正该看的是完成一次任务的总成本。
误区六:Prompt 越短越好。
压缩时丢掉了必要的 few-shot 或格式说明,导致第一次输出不合格,反复重试。压缩要精准,不是一味缩短。
第八章 结语
两篇文章的核心只有一句话:
AI Agent 成本优化
本质不是让你少问一句话
而是让系统少重复做无效工作
压成公式:
更低成本
=
更少重复上下文(RTK、Caveman、headroom、context-mode、会话管理)
+ 更合理模型路由(任务匹配、Skill 绑模型)
+ 更精准代码检索(Graphify、CodeGraph)
+ 更清晰 Agent 分工(subagent 隔离、worktree 并发、记忆外置)
参考资料
[1] Anthropic,《Prompt caching》
https://platform.claude.com/docs/en/build-with-claude/prompt-caching
[2] Claude Code Prompt Cache 实战指南
https://cloud.tencent.com/developer/article/2662618
[3] RTK(Rust Token Killer)GitHub
https://github.com/rtk-ai/rtk
[4] RTK 实战指南
https://juejin.cn/post/7628503584259211316
[5] Caveman GitHub
https://github.com/JuliusBrussee/caveman
[6] Caveman 论文:Brevity Constraints Reverse Performance Hierarchies
https://arxiv.org/abs/2604.00025
[7] Graphify GitHub
https://github.com/safishamsi/graphify
[8] CodeGraph GitHub
https://github.com/colbymchenry/codegraph
[9] LLM 推理成本工程:五层防御体系
https://jishuzhan.net/article/2062415217950273537
[10] Google AI,《Context caching - Gemini API》
https://ai.google.dev/gemini-api/docs/caching
[11] headroom GitHub
https://github.com/chopratejas/headroom
[12] context-mode GitHub
https://github.com/mksglu/context-mode

浙公网安备 33010602011771号