正在刊行长文 · Essay
2026-06-24所有内容
随机比特 · Random Bits

Agent 的上下文账单,常常死在工具输出上

2026-06-24AI Engineering / Systemsrbits.uk

很多人调 Claude Code、Codex、opencode 的第一反应,是换更强模型、加更长上下文、买更贵套餐。更便宜的第一步,是先看一次 session 里到底有多少内容值得送进模型。

我今天修 daily-digest 管线时,这个问题很明显:真正要判断的是几条质量门结果,模型却会反复读完整草稿、审稿意见、修复提示和上下文说明。短文只有一千字,review/repair 调用的输入却能膨胀到数千 token。成本不只来自模型价格,也来自喂进去的材料太粗。

一个 Agent 跑任务时,模型经常读到未经处理的工具回声:grep 返回 200 行,只有 8 行相关;日志刷了几屏,核心报错只有一条;RAG 召回 5 个 chunk,其中 3 个在讲同一段背景;文件被整段塞进去,模型只需要函数签名和附近几行。上下文窗口看起来很大,实际被噪声吃掉了。

Headroom 这个 GitHub 项目抓的就是这层浪费。它在 README 里把自己定义为 AI agents 的 context compression layer:内容进入 LLM 前,先压缩 tool outputs、logs、RAG chunks、files 和 conversation history。README 给了多类压缩收益示例,这些数字先当项目方口径看;对工程师更有用的是它提示了一个位置:LLM 入口前需要上下文闸门。

先别急着装工具。先做一次账本。我的本地日志会长成这样:

{"caller":"opencode-user-review","provider":"opencode","prompt_tokens":1450,"completion_tokens":377,"total_tokens":1827}

再用排序命令找大户:

jq -r '[.caller,.provider,.prompt_tokens,.completion_tokens,.total_tokens] | @tsv' calls.jsonl \
  | sort -k3,3nr | head

看三件事:哪个 caller 的输入最长;长输入是否主要来自工具输出、文件全文或重复上下文;压缩后答案是否变差。如果只是为了省钱把证据删掉,后面会用更贵的返工还债。

我的接入顺序会很保守:先在日志、搜索结果、RAG chunk 上做局部压缩;记录压缩前后 token、通过率、回取原文次数;连续几天稳定后,再考虑 proxy 或 MCP server。Headroom 支持多种接入形态,但我不会第一天就包住整条调用链。全局代理太容易误伤 patch、审计和配置修改。

适合压缩:搜索结果、重复日志、长堆栈、重叠 RAG chunk、只需局部阅读的大文件。

谨慎压缩:生成 patch、审计配置、合规审查、合同阅读、schema 修改。这些任务里,少一行原文就可能变成错误判断。

一周内能做的事:给自己的 Agent 管线加调用日志,按 prompt_tokens 排序,先挑前三个输入最长的 caller 改。比例降下来,准确率不掉,再引入 Headroom 或自研更窄的压缩器。

参考资料:headroomlabs-ai/headroom GitHub README。

随机比特公众号二维码
公众号 · 随机比特
从 AI 工具热闹里拆工程真相

写边界、控制面、上下文、成本与安全。