Headroom 深度解析:AI Agent上下文压缩层
Headroom 深度解析:AI Agent 的上下文压缩层——Compress-Cache-Retrieve 如何实时减少 60-95% Token 消耗
目录
- 问题的根源:Agent 循环中的 Token 通胀
- Headroom 是什么
- 核心原理:CCR 可逆压缩
- 内容感知压缩器:三把手术刀
- Pipeline 生命周期:从输入到发送
- 三种集成模式:Library / Proxy / Agent Wrap
- 输出 Token 缩减:砍掉模型写回来的浪费
- 跨 Agent 记忆与失败学习
- 实测数据:Benchmark 与真实负载
- 与竞品对比:为什么是 Headroom
- 快速上手:60 秒部署
- 团队与企业部署
- 局限性与适用场景
- 总结
问题的根源:Agent 循环中的 Token 通胀
如果你每天都在用 Claude Code、Codex 或 Cursor 写代码,你一定见过这种场景:
Agent 读取一个 500 行的文件 → 返回 3000 tokens
Agent 执行一个 shell 命令 → 输出 800 行日志 → 返回 12000 tokens
Agent 搜索代码库 → 返回 100 条匹配结果 → 返回 18000 tokens
然后这些输出全部塞进下一轮的上下文窗口。10 轮对话之后,你的上下文已经膨胀到 10 万 tokens,其中一半以上是冗余信息——格式化空白、重复的 JSON 结构、不会被用到的日志行、已经看过的代码片段。
痛点很清楚:
- 费用:Claude Opus 输入 $15/MTok,输出 $75/MTok。Agent 一次复杂任务轻松烧掉 $5-20
- 延迟:上下文越大,模型推理越慢
- 质量:冗余信息挤占有用的上下文窗口,模型注意力被稀释
这就是 Headroom 要解决的问题。
Headroom 是什么
Headroom 是一个本地运行的上下文压缩层,部署在你的 Agent 和 LLM Provider 之间。它在数据送入模型之前进行内容感知的可逆压缩,在不丢失关键信息的前提下,将 Token 消耗降低 60-95%(JSON 数据)或 15-20%(代码 Agent)。
一句话:同样的答案,极少的 Token。
你的 Agent / 应用
(Claude Code, Cursor, Codex, LangChain, 你自己的代码…)
│ prompts · tool outputs · logs · RAG results · files
▼
┌────────────────────────────────────────────────────┐
│ Headroom (本地运行 — 数据不离开你的机器) │
│ ──────────────────────────────────────────────── │
│ CacheAligner → ContentRouter → CCR │
│ ├─ SmartCrusher (JSON) │
│ ├─ CodeCompressor (AST) │
│ └─ Kompress-v2-base (text, HF) │
│ │
│ Cross-agent memory · headroom learn · MCP │
└────────────────────────────────────────────────────┘
│ 压缩后的 prompt + 检索工具
▼
LLM Provider (Anthropic · OpenAI · Bedrock · …)
Headroom 的核心设计原则:
- 本地优先(Local-first):所有压缩在本地完成,数据不离开你的机器
- 内容感知(Content-aware):不同类型的数据用不同的压缩策略,JSON 走结构压缩,代码走 AST,自然语言走模型
- 可逆(Reversible):原始数据被缓存,LLM 可以通过
headroom_retrieve工具按需取回 - 零代码侵入:Proxy 模式下不需要修改任何应用代码
核心原理:CCR 可逆压缩
CCR 是 Headroom 最核心的设计——Compress(压缩)→ Cache(缓存)→ Retrieve(检索)。
为什么需要"可逆"?
传统压缩(如 gzip、上下文截断)有一个致命问题:信息丢失是不可逆的。一旦你压缩了,LLM 就永远看不到原始内容。如果压缩过程中丢失了关键细节——比如一个错误堆栈中的具体行号,或者 JSON 中某个嵌套字段的值——模型就会给出错误的答案。
Headroom 的 CCR 解决了这个问题:
工作流程:
- Compress:内容路由器检测数据类型,选择合适的压缩器生成紧凑表示,发送给 LLM
- Cache:原始数据以结构化形式存储在本地(内存 + 可选持久化),带 TTL 自动过期
- Retrieve:LLM 在需要时调用
headroom_retrieveMCP 工具,按 ID 或 key 取回原始内容
这相当于给了模型一个"需要时再展开"的能力——大多数内容压缩后已经足够,偶尔需要完整信息时,模型可以主动获取。
与 Prompt Caching 的配合
Headroom 的 CacheAligner 模块专门处理 Provider 的 KV Cache 问题。核心挑战在于:
- Anthropic/OpenAI 的 Prompt Cache 依赖前缀的字节级匹配
- 如果你修改了历史消息的任何部分,整个 Cache 全部失效
CacheAligner 的做法是仅压缩新增内容(Live-zone Compression)——冻结的历史前缀原封不动,只压缩最新一轮的 tool output。这样 Provider 的 Prompt Cache 依然命中,同时新内容也被压缩。
关键洞察:Headroom 不做"丢掉历史消息"这种粗暴的上下文管理。历史全部保留,只是压缩了表示。
内容感知压缩器:三把手术刀
Headroom 不是"一个压缩算法打天下"。它的 ContentRouter 先识别数据类型,然后分发给专门的压缩器。
SmartCrusher:JSON 的终结者
Agent 最常见的上下文膨胀源是什么?JSON。Tool outputs、API responses、RAG search results——几乎全是 JSON。
SmartCrusher 利用 JSON 的结构冗余进行压缩:
- 数组去重与摘要:100 条相似的搜索结果 → 保留结构模板 + 差异字段
- 嵌套展平:深层嵌套的对象 → 扁平化的 key-path 表示
- 类型感知:区分枚举值、自由文本、数字范围,对每种类型使用不同的紧凑表示
- Schema 推断:自动推断 JSON schema,用 schema + values 替代重复的 key-value 对
实际效果:100 条代码搜索结果,17,765 tokens → 1,408 tokens(压缩 92%)。
压缩前:
{"file": "src/auth/login.ts", "line": 42, "content": "export async function login...", "score": 0.95}
{"file": "src/auth/login.ts", "line": 58, "content": " const user = await db...", "score": 0.93}
... (100 条)
压缩后:
schema: {file, line, content, score}
items: [
["src/auth/login.ts", 42, "export async function login...", 0.95],
["src/auth/login.ts", 58, " const user = await db...", 0.93],
...
]
CodeCompressor:AST 感知的代码压缩
代码不是纯文本——它有结构。注释、空行、格式化空格、冗余的 import、类型注解的重复……这些都浪费 Token。
CodeCompressor 使用 Tree-sitter 解析 AST,支持 7 种语言(Python、JS/TS、Go、Rust、Java、C/C++、Perl):
- 去除注释和文档字符串(保留关键的 docstring 第一行)
- 压缩空白和格式化
- 移除未使用的 import
- 函数体摘要:对于足够简单的函数(getter/setter/单行委托),用签名 + 一行摘要替代完整函数体
- 保留语义完整性:不改变 AST 结构,确保压缩后的代码在语义上等价
Kompress-v2-base:自然语言的智能压缩
对于日志、错误消息、RAG chunk、对话历史等自然语言内容,Headroom 使用自己训练的模型 Kompress-v2-base(发布在 HuggingFace)。
这是一个专门在 Agent 工作负载上训练的压缩模型:
- 训练数据:Agent 对话轨迹(tool outputs, error logs, search results, conversation turns)
- 压缩策略:去除冗余表述、合并重复信息、保留关键实体和数值
- 本地运行:模型下载到本地,不需要外部 API 调用
图像压缩
Headroom 还包含一个训练过的 ML 路由器的图像压缩管道,可将发送给视觉模型的图像减少 40-90%。
Pipeline 生命周期:从输入到发送
Headroom 暴露了一个稳定的请求生命周期,无论是 compress() 库调用还是 Proxy 模式,都遵循同一个 Pipeline:
每个阶段都可以通过 Pipeline Extensions 进行定制:
from headroom import compress, on_pipeline_event
@on_pipeline_event("Input Compressed")
def log_compression(event):
print(f"Saved {event.savings_tokens} tokens ({event.savings_pct:.1%})")
result = compress(messages, model="claude-sonnet-5-20251001")
这种设计让核心编排逻辑保持干净,同时保留了充分的扩展性。
三种集成模式:Library / Proxy / Agent Wrap
Headroom 提供三种集成方式,从轻到重,按需选择。
1. Library 模式:代码内嵌
最适合已有 Python/TypeScript 应用:
from headroom import compress
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "..."},
# ... 大量 tool results
]
compressed = compress(messages, model="claude-sonnet-5-20251001")
# compressed 是压缩后的 messages,直接发给 LLM
import { compress } from 'headroom-ai';
const compressed = await compress(messages, { model: 'claude-sonnet-5-20251001' });
SDK 集成也很方便:
# Anthropic SDK
from headroom import withHeadroom
client = withHeadroom(Anthropic())
# LangChain
from headroom.langchain import HeadroomChatModel
llm = HeadroomChatModel(your_llm)
2. Proxy 模式:零代码侵入
常用启动参数
headroom proxy \
--port 8787 \ # 监听端口(默认 8787)
--anthropic-api-url <URL> \ # 自定义上游 API 地址
--mode cache \ # 缓存优先模式(默认,最大化前缀缓存命中)
--mode token \ # Token 优先模式(更激进压缩)
--target-ratio 0.4 \ # 文本压缩率(越低越激进,默认自动)
--code-aware \ # 启用 AST 代码压缩
--memory \ # 启用跨会话持久记忆
--code-graph \ # 启用代码库智能索引
--log-file ~/.headroom/proxy.log \ # 自定义请求日志路径(默认自动写入 ~/.headroom/logs/proxy.log)
--log-messages \ # 记录完整消息内容(含敏感数据,调试用)
--rpm 120 \ # 每分钟请求数限制
--tpm 200000 # 每分钟 Token 限制
启动一个本地 HTTP 代理,将所有 LLM 请求路由过去:
headroom proxy --port 8787
然后设置环境变量:
export ANTHROPIC_BASE_URL=http://localhost:8787
export OPENAI_BASE_URL=http://localhost:8787
任何使用标准 Anthropic/OpenAI SDK 的应用都会自动受益,一行代码都不用改。
Proxy 还附带一个实时仪表盘:
headroom dashboard
使用非 Anthropic 后端(如 DeepSeek)
如果你的 Claude Code 配置了第三方 Anthropic 兼容 API,需要指定上游地址。
启动命令
headroom proxy --port 8787 --anthropic-api-url https://api.deepseek.com/anthropic
或用环境变量:
ANTHROPIC_TARGET_API_URL=https://api.deepseek.com/anthropic headroom proxy --port 8787
完整架构:
3. Agent Wrap 模式:一键集成
针对主流 AI Coding Agent 的深度集成:
headroom wrap claude # Claude Code
headroom wrap codex # OpenAI Codex
headroom wrap cursor # Cursor
headroom wrap copilot # GitHub Copilot CLI
headroom wrap aider # Aider
headroom wrap 做了三件事:
- 启动本地 Proxy
- 安装 Serena(语义代码导航 MCP 工具)
- 启动被包装的 Agent,配置其通过 Proxy 发送请求
撤销也很简单:
headroom unwrap claude
模式选择建议
| 场景 | 推荐模式 |
|---|---|
| 自己写的 Python/TS 应用 | Library |
| 使用现成 Agent 工具(Claude Code / Codex 等) | Agent Wrap |
| 多语言 / 无法修改代码 / 需要统一管理 | Proxy |
| MCP 客户端 | MCP Server(headroom mcp install) |
输出 Token 缩减:砍掉模型写回来的浪费
前面的所有内容都是关于压缩输入。但输出 Token 同样烧钱——在 Opus 级别的模型上,输出 Token 的价格是输入的 5 倍。
而且大量输出是浪费:
- “好的,让我来帮你……”(开场白)
- 重新打印你已经看过的代码
- 对于常规步骤(读一个文件、跑一个通过的测试)的深度"思考"
Headroom 在 Proxy 层面提供了输出 Token 缩减(不需要修改任何代码):
Verbosity Steering
在系统提示末尾追加一个简短的"简洁指令"。之所以放在末尾而不是修改系统提示开头,是为了不影响 Prompt Cache 命中(Cache 依赖前缀匹配)。
export HEADROOM_OUTPUT_SHAPER=1
headroom proxy --port 8787
Effort Routing
智能判断当前 turn 的复杂度:
- 常规步骤(文件读取后继续、通过的测试):降低 reasoning effort
- 新问题、错误:保持完整 effort
支持 Anthropic(thinking.budget_tokens)和 OpenAI(reasoning_effort)。
自适应学习
headroom learn --verbosity 会分析你过去的会话,自动学习你偏好什么样的简洁程度:
headroom learn --verbosity # 预览(dry run)
headroom learn --verbosity --apply # 应用,Proxy 立即生效
设计哲学:用户不是"说"自己要什么简洁程度——他们是"展示"出来的。当你反复打断长回复、或者在读完之前就继续操作时,已经表明了你的偏好。
如何度量输出节省
因为输出节省是"反事实"的(你看不到模型"本来会"写什么),Headroom 采用对照组估计:
export HEADROOM_OUTPUT_HOLDOUT=0.1 # 10% 的对话不压缩,作为对照组
headroom output-savings
# Reduction: 31.7% (95% CI 27.7% … 35.7%) [measured]
不是拍脑袋的数字,而是带有置信区间的统计估计。
跨 Agent 记忆与失败学习
Cross-Agent Memory
如果你同时使用 Claude Code 和 Codex,它们各自拥有独立的上下文。但你的代码库、项目结构、最近的改动——这些信息是共通的。
Headroom 提供了一个跨 Agent 共享记忆存储:
from headroom import SharedContext
ctx = SharedContext()
ctx.put("project_structure", {...}) # Claude 写入
# ... 切换到 Codex ...
struct = ctx.get("project_structure") # Codex 读取
自动去重 + Agent 来源标记,确保共享信息不会重复注入。
headroom learn:从失败中学习
这是 Headroom 最独特的功能之一——挖掘失败的 Agent 会话,自动生成改进指令:
headroom learn
工作流程:
- 扫描 Agent 会话历史,识别失败的交互(工具调用错误、循环、错误答案)
- 分析失败模式(缺失的上下文、不完整的指令、被忽略的文件)
- 生成纠正指令,写入
CLAUDE.local.md(gitignored)或CLAUDE.md(团队共享)
headroom learn --target CLAUDE.md # 写入团队共享文件
# 或
headroom learn # 默认写入 CLAUDE.local.md(个人,不提交)
支持的 Agent:Claude Code、Codex、Gemini。
实测数据:Benchmark 与真实负载
真实 Agent 工作负载
| 工作负载 | 压缩前 | 压缩后 | 节省 |
|---|---|---|---|
| 代码搜索(100 条结果) | 17,765 | 1,408 | 92% |
| SRE 事件调试 | 65,694 | 5,118 | 92% |
| GitHub Issue 分类 | 54,174 | 14,761 | 73% |
| 代码库探索 | 78,502 | 41,254 | 47% |
准确率保持(标准 Benchmark)
| Benchmark | 类别 | N | Baseline | Headroom | 差异 |
|---|---|---|---|---|---|
| GSM8K | 数学 | 100 | 0.870 | 0.870 | ±0.000 |
| TruthfulQA | 事实性 | 100 | 0.530 | 0.560 | +0.030 |
| SQuAD v2 | 问答 | 100 | — | 97% | 19% 压缩 |
| BFCL | 工具调用 | 100 | — | 97% | 32% 压缩 |
核心结论:压缩不牺牲准确率。在个别基准(TruthfulQA)上甚至有轻微提升——可能是因为去除了噪声信息后模型注意力更集中。
复现命令:
python -m headroom.evals suite --tier 1
与竞品对比:为什么是 Headroom
| 方案 | 范围 | 部署 | 本地 | 可逆 |
|---|---|---|---|---|
| Headroom | 全部上下文 — tools, RAG, logs, files, history | Proxy · Library · Middleware · MCP | ✅ | ✅ |
| RTK | CLI 命令输出 | CLI wrapper | ✅ | ❌ |
| lean-ctx | Tool output, files, shell, history | Proxy · Library · Middleware · MCP · CLI | ✅ | ✅ |
| Compresr, Token Co. | 发送到其 API 的文本 | 托管 API 调用 | ❌ | ❌ |
| OpenAI Compaction | 对话历史 | Provider-native | ❌ | ❌ |
Headroom 的几个独特优势:
- 全内容类型覆盖:不是只压缩对话历史或 CLI 输出,而是所有内容类型
- 本地运行:数据不离开你的机器,企业安全友好
- 可逆压缩:CCR 确保关键信息可检索——这是 lean-ctx 之外所有方案都不具备的
- 跨 Agent 记忆:Claude Code 和 Codex 之间共享上下文
- 失败学习:
headroom learn是被动压缩之外的主动改进
注:Headroom 内置了 RTK 和 lean-ctx 的二进制文件用于 shell 输出重写,通过
HEADROOM_CONTEXT_TOOL切换或关闭。
快速上手:60 秒部署
安装
# Python CLI(推荐)
uv tool install --python 3.13 "headroom-ai[all]"
# 或
pip install "headroom-ai[all]"
# TypeScript SDK(仅库模式,无 CLI)
npm install headroom-ai
选择模式
# 一键部署 + Agent 配置
headroom deploy
# 包装 Claude Code
headroom wrap claude
# 启动 Proxy
headroom proxy --port 8787
# 或 Python 库
from headroom import compress
验证
headroom doctor # 健康检查
headroom perf # 性能报告
headroom dashboard # 实时节省仪表盘(需要 Proxy 运行中)
更新
headroom update # 自动检测安装方式并升级
headroom update --check # 只看最新版本,不升级
MCP 客户端配置
对于 Codex 等不能继承 Shell PATH 的 MCP 客户端:
command -v headroom # 获取绝对路径
[mcp_servers.headroom]
command = "/Users/you/.local/bin/headroom"
args = ["mcp", "serve"]
团队与企业部署
Headroom OSS 面向个人开发者:在自己的笔记本上运行,几分钟内开始节省 Token——免费、本地优先、数据不外传。
但在整个工程团队中使用是另一回事:
- 共享的、始终在线的部署
- 集中化配置和版本管理
- 全组织节省仪表盘
- SSO 和访问控制
- 气隙环境 / VPC 部署
Headroom Labs 提供团队版(自托管 + 支持,或全托管)。
OSS 永远保持 Apache 2.0 开源。托管版只是为需要企业级部署和支持的团队准备的。
局限性与适用场景
适合你,如果你……
- 每天使用 AI Coding Agent,想要无痛节省 Token
- 同时使用多个 Agent(Claude Code + Codex + Cursor),需要共享记忆
- 需要可逆压缩——完整原文在 TTL 内可检索
- 数据不能离开本地(企业安全 / 合规要求)
可能不适合,如果你……
- 只使用单一 Provider 的原生上下文压缩,且不需要跨 Agent 记忆
- 在严格沙箱环境中工作,无法运行本地进程
- 主要使用微调模型,上下文长度本身就很短
其他注意事项
- CPU 要求(x86/x86_64):ONNX 功能(Magika 内容检测、嵌入相关性)需要 AVX2 指令集。不支持 AVX2 的主机(部分 Docker/QEMU 设置、旧云 VM)会自动回退到非 ONNX 路径(BM25 相关性、启发式检测),不会崩溃
- Apple Silicon:原生支持,无需 AVX2
- Python 版本:需要 3.10+。如果想在仪表盘中看到
$ Saved数字(需要 LiteLLM),使用 3.13——3.14+ 不支持 LiteLLM
总结
Headroom 解决了一个越来越痛的问题:随着 AI Agent 变得越来越复杂、越来越自主,它们消耗的上下文也在指数增长。每一次工具调用、每一个文件读取、每一条日志,都变成了下一轮上下文的组成部分。
传统的做法是截断历史、限制输出长度——但这些是"砍掉",不是"压缩"。信息丢失了,模型回答的质量也差了。
Headroom 的思路不同:
- 不丢信息,压缩表示:CCR 让 LLM 在需要时可以取回原文
- 内容感知:JSON、代码、自然语言——各走各的压缩管道
- 本地优先:数据安全,延迟低,无外部依赖
- 零侵入:Proxy 模式下不需要修改任何代码
- 开源:Apache 2.0,自由使用
如果你的团队每月在 LLM Token 上有可观开支,Headroom 是目前最完整的上下文压缩方案——不仅仅是"省 Token",而是通过更智能的上下文管理,让 Agent 工作得更好。
更多推荐


所有评论(0)