2026年9月16日 · 阅读 —
AI 越用越贵还越用越慢,问题出在你把冗余和关键一起喂进去了
AI 越用越贵还越用越慢,问题出在你把冗余和关键一起喂进去了
跑 Agent 跑到后期,你会撞上一堵墙。
不是模型不够聪明,是 token 账单长得太快。
让 Agent 去搜代码库,它读回十万 token 的工具输出;让它排查线上事故,它把一整段日志倒进上下文;让它在一个长会话里干一整天,历史越积越厚。
每一次都是钱,而且都是整份复制——上下文里塞满重复的样板、成片的相似 JSON、日志里挨着的同构行。
上下文一大,模型还变慢、变笨。
很多人第一个反应是:换个便宜的模型,或者干脆把上下文长度砍了。
这是治标。
问题的形状其实是另一个:你喂进去的 token 里,绝大部分是冗余,一小部分是关键,而现成的工具大多不知道怎么把这两者分开。
把冗余和关键一起砍,模型会丢掉 FATAL 错误行——这叫丢信息换省钱,是自杀式压缩。把冗余单独剔掉、关键逐字保留——这才叫工程。
这就是 headroom 想干的活。
它给自己的定位:AI Agent 的上下文压缩层。
Agent 读的一切——工具输出、日志、RAG 检索块、文件、历史对话——在到 LLM 之前先过一遍压缩。同一个答案,几分之一的 token。
关键一条:**压缩在本地跑,你的 prompt 和文件内容不会被发到任何地方去做压缩。**它不是云服务,不是”把你的上下文发给我们”,是你电脑上跑的一个本地层。就贴在你的 Agent 和数据之间。
开源,仓库在 headroomlabs-ai/headroom,Apache 2.0。热度能看出来,Trendshift 拿过 #1 Repository Of The Day。
拆开”压缩”这个词,难点从来不在把字删少。真难的是分辨什么是冗余、什么是关键。
Headroom 绕开了很多方案踩的坑——不用关键词列表来挑保留哪些。
关键词规则一看就懂,一用就崩。以为”FATAL、ERROR 要保留”,结果正经的 JSON 数据里,最关键的往往是那条超出统计范围的异常记录,它既不叫 FATAL 也不叫 ERROR。
它换了个思路,用数据驱动做选择:不看名字,看统计。
分析字段的方差,把”错误项、偏离正常统计范围的值、首尾边界”这些统计上不寻常的东西挑出来保留。为什么?一条日志里真正承载信息的,恰恰是那些不像其他行的行——FATAL 行在成片 INFO 里显得突兀,唯独它要留着。
这个判断我认同,而且觉得是整套设计的底色:压缩要保护的,不是”看起来重要的”,是”统计上稀有的、承载了增量信息的那一部分”。
压缩器它不搞一把刀通吃所有格式,按类型路由:
- SmartCrusher——通用 JSON。数组、嵌套对象、混合类型都行,靠字段方差统计挑,不靠关键词。
- CodeCompressor——源代码,AST 感知,懂语法结构地压缩。覆盖 Python、JS/TS、Go、Rust、Java、C/C++、Perl。
- Kompress-v2-base——自然语言文本,一个在 agentic traces 上训练过的 HuggingFace 模型。
这个分工很:JSON 有 JSON 的冗余形状,代码有代码的冗余形状(AST 懂结构),散文有散文的冗余形状,不能用同一种招式。
还有个容易漏的:图片压缩,能减 40–90%,走训练过的 ML router。工具输出里夹着截图、报错图这类东西其实占很大一块 token,很多人没想到。
压缩最怕动了不该动的。Headroom 在这件事上有两条设计,值得拆开说。
第一条:CacheAligner,绝不改写 prompt。
现在的模型服务大多用 KV-cache 缓存前缀来加速、省钱。每次请求前缀有一点变化,缓存就失效,等于白付一遍钱。CacheAligner 做的事是:**标注出会搞坏缓存前缀的”易变内容”,但从不改写 prompt。**只告诉你”这段是活的”,让缓存策略正确避开,不替你动手改。
第二条:Live-zone compression,只压缩新字节。
Headroom 不是每次请求把整个历史重新压缩一遍——那样既贵、前缀每次都变,缓存全废,历史还可能被误伤。它只压缩”新区”:新鲜的工具输出、最新一轮对话。冻结的前缀保持字节级一致,历史永远不丢。
于是 provider 的缓存照样命中,你的长任务会话也不会因为压缩而失忆。
这两条合起来是同一句话的两个侧面:真正成熟的压缩不是一次性把上下文抹小,而是知道哪些能碰、哪些绝不能碰,只碰安全的增量。
用压缩的收益推不动,工程师大概率会反问:压缩本身要不要花时间?要是要,是不是得不偿失?
README 给了两个数字直接堵住这个问题:
- 10K token 的 JSON 搜索结果,0.21 ms p50
- 100K token,1.4 ms
都在一毫秒级。对一次动辄几十秒的 agent 请求,这个开销在延迟上基本无感。
这个数字说明压缩层的设计哲学是对的:它必须快到”存在但感觉不到”,否则用户会为了省 token 付更贵的时延,得不偿失。
省多少钱,空谈没感觉。README 放了四个基于真实 MCP server 输出格式构建、用 provider tokenizer 实测的场景:
| 场景 | 压缩前 | 压缩后 | 节省 |
|---|---|---|---|
| 代码搜索(100 结果) | 17,199 | 13,597 | 21% |
| SRE 事故排查 | 55,957 | 24,340 | 57% |
| 代码库探索 | 58,801 | 33,895 | 42% |
| GitHub issue 分类 | 46,067 | 32,429 | 30% |
注意那个 SRE 事故排查:55,957 → 24,340,砍掉 57%,而且第 67 行的 FATAL 逐字保住了——这是它第一屏就甩出来的图。
关键结论藏在表格注释里:省多少,取决于你的输入有多冗余。
- 重复的 JSON 数组、成片的相似日志行——能省掉 90%+。
- 散文、已经高度致密的输出——几乎不省。
注意力应该放在长任务的工具输出上,别指望短对话也能挤出油水。
所有”省 token”方案都逃不过一个灵魂拷问:你省了钱,会不会把答案也省没了?
Headroom 给了可验证的证据,不是一个”我们觉得没影响”的拍脑袋。
python -m headroom.evals suite --tier 1 跑出来的精确性基准:
| 基准 | 类别 | 基线 | Headroom | 变化 |
|---|---|---|---|---|
| GSM8K | 数学 | 0.870 | 0.870 | ±0.000 |
| TruthfulQA | 事实性 | 0.530 | 0.560 | +0.030 |
| SQuAD v2 | QA | — | 97% | 19% 压缩下 |
| BFCL | 工具调用 | — | 97% | 32% 压缩下 |
有个细节我挺喜欢:TruthfulQA 那个 +0.030,它自己标注了——N=100 时 ±0.03 落在置信区间内,所以那是**“检测不到差异”而不是”改进了”**。它没把噪音当卖点吹。这种把结论边界说清楚的诚实,在 AI 工具宣传里少见。
而且 SQuAD v2 和 BFCL 这两个更贴近真实场景的基准——QA 在 19% 压缩下保持 97%、工具调用在 32% 压缩下保持 97%——才是这套东西能不能上生产的关键证据。
很多人只盯着送进去的 prompt,忘了另一大块花销:模型写回来的每一个 token 也在付钱,而且 Opus 这类模型的输出价格是输入的 5 倍。
模型吐出来的很大一部分是”仪式感”——“好的,我们开始吧”这种开场白、把代码原封不动再抄一遍、在”读个文件”这种常规步骤上花大量深度思考。
Headroom 也能在代理层把这些删掉,不碰你的代码:
- Verbosity steering:在 system prompt 末尾追加一句”简短点、别复述上下文”。注意是追加在末尾,这样 prompt 缓存照样命中。
- Effort routing:这一轮只是工具结果之后的接续(读了文件、测试通过),就把思考力度调低;新问题、报错保持满档。
headroom learn --verbosity 读取过去的会话,把”我要简洁”这个隐含偏好挑出来。它其实是抓住了大多数人不会写进配置的动作:真会省的人不会把”简洁”写进配置,他是在打断长回复、在回复还没读完就切换走的那一刻,用行为表达了”我要简洁”。
得点一句:输出节省是反事实的——你看不到模型本来会写什么,所以它只能给一个带置信区间的估计,并如实标注这是估计值。这又是”把结论边界说清楚”的例子。
headroom learn 是这套系统里最有 Agent 气质的一块。
它会挖掘失败的会话,把找出来的修正写进 CLAUDE.local.md(默认,gitignored,只改本地)、CLAUDE.md(团队共享)、AGENTS.md 或 GEMINI.md。
这一下把”压缩”这个被动优化,升级成”从失败里沉淀”的闭环。失败不白失败,你踩过的坑被写回 Agent 记忆里,下次别再踩。跟前面说的”压缩冗余、留关键”一脉相承——都是让系统在时间维度上累积有价值的东西。
上手很快,README 给的 60 秒路径:
# 1 — 安装
uv tool install --python 3.13 "headroom-ai[all]" # 自带 CLI
# 或 pip install "headroom-ai[all]"
# 或 npm install headroom-ai # 只是 TS SDK,无 CLI
# 2 — 选一种方式接入
headroom wrap claude # 包装一个 coding agent
headroom proxy --port 8787 # 零代码改动的透传代理
# 或 from headroom import compress # 内联库
# 3 — 验证生效
headroom doctor
headroom perf
headroom dashboard # 实时看省了多少
四种接入方式,对应四种用法:
- Library:
compress(messages),Python / TypeScript,内联在你任何应用里。 - Proxy:
headroom proxy,零代码改动,任何语言都能用——就是挡在你和模型之间的一层。 - Agent wrap:
headroom wrap claude|codex|grok|copilot|...,一条命令包装好,headroom unwrap撤销。内置对一堆 coding agent 的支持,还会顺手装 Serena(语义代码导航)。 - MCP server:
headroom_compress/headroom_retrieve/headroom_stats,任何 MCP 客户端都能调。
再加上跨 Agent 共享记忆——Claude、Codex、Gemini、Grok 共用一个 store,自动去重。
我最看好的其实是 Library + 框架适配这一路:LangChain、LiteLLM、Vercel AI SDK、Agno、ASGI 中间件全都有钩子,它是长在你的技术栈里的,不是逼你搬进它的生态。
一篇工具文章只报喜是耍流氓。README 自己推荐的”何时用/何时跳过”,比一些营销文诚实得多:
适合如果你:
- 天天跑 coding agent,想不动代码就省钱
- 同时用好几个 agent,想要一份共享记忆
- 需要可逆压缩——原始内容通过 CCR 按配置的 TTL 保留,模型想要全文随时能检索回来
跳过如果你:
- 只用一个 provider 的原生压缩,不需要跨 agent 记忆
- 工作在沙箱里,本地跑不了进程
再提一个关键局限:短对话、散文、已经致密的输出,几乎不省,甚至原样返回(min_input_words 以下的块字节级一致返回)。它压的是长 agent 会话里沉重的工具输出,不是闲聊。
还有几个实操坑,README 标得很细。
Telemetry 默认是开的。 一个匿名信标,会上报压缩比率、计数器、provider 和模型 ID、OS 架构,但绝不发送 prompt、补全、代码或文件路径。不想要就 HEADROOM_BEACON=off 关掉,或 HEADROOM_BEACON 继承 DO_NOT_TRACK 惯例,或 --offline。
企业网络踩 SSL 检查的坑。 公司网络做 SSL 中间人拦截,pip install headroom-ai[all] 会报 CERTIFICATE_VERIFY_FAILED。先装 Rust 或在有预编译 wheel 的平台直接装 pip install --only-binary headroom-ai headroom-ai。还有 Python 3.13 + OpenSSL 3.x 默认开 VERIFY_X509_STRICT 的坑,Zscaler 这类检查根的 basicConstraints 没标 critical 位会被拒,HEADROOM_TLS_STRICT=0 只放松 strict flag,校验链、签名、过期、主机名全保留。
Python 版本要选对。 想要 dashboard 里”省了多少钱”那个美元数字,得用 Python 3.13——这个功能依赖 LiteLLM,LiteLLM 装不上 Python 3.14+。
macOS 原生 wheel 目前只覆盖 Apple Silicon 和 Linux。 Intel 的 Mac 得走 Docker 原生安装。x86 的机器还要 AVX2,没有 AVX2(某些 Docker/QEMU、老云虚拟机)会退回到非 ONNX 路径。
这些坑写这么细,反而给我更多好感——说明是真的在被真用户用,真问题被真修过。
README 里有个对比表,能看清它想站在哪:
| 范围 | 部署 | 本地 | 可逆 | |
|---|---|---|---|---|
| Headroom | 全部上下文——工具、RAG、日志、文件、历史 | 代理 · 库 · 中间件 · MCP | 是 | 是 |
| Compresr / Token Co. | 只发给它们 API 的文本 | 托管 API 调用 | 否 | 否 |
| OpenAI Compaction | 会话历史 | provider 原生 | 否 | 否 |
差异一眼就能看清:托管方案把内容发出去换压缩,provider 原生压缩只管会话历史,而 Headroom 长得最像”基础设施”的那个——它就是你终端和模型之间的那一层,什么都经过它,什么都可逆,什么都在本地。这也是它对我这种”先稳后强”的人最有说服力的地方。
它的搭配哲学很干脆:推荐配 Serena 做语义代码导航、Ponytail 精简模型输出,它压缩的是下游所有 MCP server 的输出。不管上游是谁,只要是经过它的,它就压缩。
深度看完这个项目,我最大的感受不是功能多,而是它押在了一个很多人不愿意碰的硬问题上:省 token 谁都会喊,难的是确保省下来的过程中 FATAL 行不丢、缓存前缀不坏、历史不丢、答案是同一个。
这四个”不”,每一个都需要把”怎么判断冗余 vs 关键”做成可重复验证的工程,而不是一个拍脑袋的规则。
它让我服气的,是这四个”不”各自都有了着落:
- FATAL 行不丢——靠数据驱动挑少数派,不靠”FATAL 这个词该留”
- 缓存前缀不坏——CacheAligner 只标注、不碰 prompt
- 历史不丢——Live-zone 只压增量
- 答案是同一个——精确性基准拿置信区间说话,不把噪音当卖点
如果你也在跑长任务的 agent,而且 token 账单让你皱眉,别急着降模型档次。去 [GitHub 仓库]https://github.com/headroomlabs-ai/headroom 看看,或者直接:
uv tool install --python 3.13 "headroom-ai[all]"
headroom wrap claude
headroom dashboard
先在自己的一条长会话上跑一遍 headroom savings,看看你的数据到底能省多少。
省不省、省多少,结果会告诉你——但方向,我认为是对的。
#LLM #Token成本 #上下文压缩 #Agent #headroom #开源 #AI工程