Headroom 深度实战:当 AI Agent 的上下文压缩层省下 95% Token——从 ContentRouter 智能路由到 CCR 可逆压缩、从 Claude Code 到 MCP 的生产级完全指南(2026)
引言:AI Agent 时代,上下文成本正在吃掉你的预算
如果你每天用 Claude Code、Cursor、Codex 或自研 Agent 处理代码仓库、排查线上故障、读 issue、写文档,那你一定见过这种账单:一次 SRE 故障定位,LLM 输入 token 轻松冲破 6 万;一次代码库探索,工具返回的 JSON、日志和文件内容把上下文窗口塞满。更糟的是,窗口一满,模型开始遗忘,答案质量下降,你不得不拆链、分页、加记忆层,工程复杂度直线上升。
这背后的根因不是模型不够聪明,而是我们喂给它的东西太“脏”。Agent 的工具输出、RAG 召回片段、日志流、对话历史里,充满了重复、格式噪音、无关字段和过度详细的 ceremony。LLM 被迫在这些噪声里找信号,我们则按 token 付费。
Headroom 就是冲着这个痛点来的。它给自己的定位非常精准:AI Agent 的上下文压缩层(Context Compression Layer)。在 prompt 到达 LLM 之前,先把内容做一次智能压缩,宣称可节省 60–95% 的 token,同时保持答案质量不变。它不提供新模型,不改变你的 Agent 逻辑,只作为一个中间层存在:Library、Proxy、Agent Wrap、MCP Server 四种接入方式,几乎能覆盖所有主流 AI 工程栈。
本文不会只贴 README,而是从一个准备把它落地到生产的人视角出发,讲清楚:
- 为什么“上下文压缩”应该是独立层,而不是提示词技巧;
- Headroom 的架构和压缩管线到底怎么工作;
- 四种接入方式如何选型与实战;
- 代码示例:JSON 工具输出、RAG、代码片段、Agent 包装;
- 输出 token 塑形、跨 Agent 记忆、CCR 可逆压缩等高级能力;
- 生产落地的调参、监控、成本核算与隐私安全。
一、核心概念:把上下文压缩从“技巧”变成“层”
1.1 为什么不是提示词工程?
很多人第一反应是:压缩 prompt 不就是写一句“请精简”吗?或者手动把 JSON 转成更短的格式?这在 demo 里可行,但在生产里会快速崩溃:
- 泛化性差:不同工具输出格式各异,日志、代码、RAG 片段需要不同策略;
- 精度不可控:让模型自己压缩,很容易把关键信息也删掉;
- 可观测性弱:你不知道它到底省了多少 token,也不知道答案下降了多少;
- 无法复用:每个项目都写一遍 prompt,维护成本高。
Headroom 的思路是:把上下文压缩拆成一个有输入、输出、策略、度量的独立层。它站在 Agent 和 LLM 之间,像网络协议里的压缩层(gzip、brotli)一样,对上层透明,对下层减负。
1.2 压缩管线的四层抽象
Headroom 内部把一次压缩任务拆成四个阶段,每个阶段都对应明确的工程职责:
| 阶段 | 组件 | 职责 |
|---|---|---|
| 前缀稳定 | CacheAligner | 识别动态内容(UUID、时间戳、行号),保留静态前缀,提升 KV Cache 命中率 |
| 内容路由 | ContentRouter | 判断内容类型:JSON、代码、散文、图片,选择压缩算法 |
| 压缩执行 | SmartCrusher / CodeCompressor / Kompress-base / Image Router | 针对类型做结构化或语义压缩 |
| 可逆存储 | CCR(Contextual Compression Reversibility) | 把原始内容存到本地缓存,LLM 可通过工具按需取回 |
这套抽象的好处是:你不需要为每种内容写一种 prompt,而是让系统根据数据类型自动选择最佳算法。
二、架构分析:本地优先、零侵入、可扩展
2.1 整体数据流
Headroom 的物理形态可以是一个本地进程、一个 Python 函数、一个 MCP 服务器或一个 ASGI 中间件。它的数据流长这样:
Agent / App / Claude Code / Cursor / LangChain / Agno
│
▼ prompts · tool outputs · logs · RAG chunks · files
┌────────────────────────────────────────────────────┐
│ Headroom (runs locally, data stays here) │
│ ────────────────────────────────────────────── │
│ CacheAligner → ContentRouter → CCR │
│ ├─ SmartCrusher (JSON) │
│ ├─ CodeCompressor (AST) │
│ ├─ Kompress-base (text, HF) │
│ └─ Image Router (ML routing) │
│ Cross-agent memory · headroom learn · MCP │
└────────────────────────────────────────────────────┘
│ compressed prompt + retrieval tool
▼
LLM provider (Anthropic / OpenAI / Bedrock / ...)
注意几个关键设计:
- 本地优先:所有原始数据、缓存、模型都在本地跑,除非你显式配置远程 provider;
- 零侵入:通过
headroom proxy或headroom wrap可以不改代码直接接入; - 可逆压缩:不是有损丢弃,而是把原文映射成压缩 ID,LLM 可以通过
headroom_retrieve随时取回; - 跨 Agent 记忆:Claude、Codex、Cursor 可以共享同一个压缩后的上下文池。
2.2 压缩引擎解析
SmartCrusher:JSON 的“统计+结构”压缩
JSON 是 Agent 工具输出最常见的格式,但通常包含大量重复 schema、默认值、嵌套层级。SmartCrusher 的做法是:
- 对数组型 JSON 做统计分析,识别重复字段;
- 使用 Kneedle 等算法保留异常值和变更点;
- 对稳定字段做 schema 提取,把
[{...},{...},...]压成更紧凑的表示; - 保留原始数据到 CCR,供 LLM 需要时取回。
典型场景:一次代码搜索返回 100 个结果,每个结果都有 path、start_line、end_line、snippet、score 等字段。SmartCrusher 会把重复的结构抽出来,只保留有差异的部分。
CodeCompressor:AST 感知切片
代码压缩最怕破坏语法结构。CodeCompressor 基于 tree-sitter 做 AST 感知切片:
- 保留函数签名、类定义、导入语句;
- 对函数体做摘要,保留控制流骨架;
- 支持 Python、JavaScript、Go、Rust、Java、C++ 等主流语言;
- 压缩后的代码仍然是“可理解”的,而不是把整段变成注释。
这对 Claude Code 这类代码 Agent 特别有用:读大仓库时,不用把每个文件完整内容塞进 prompt,而是把无关实现折叠成摘要。
Kompress-base:文本语义压缩模型
对于非结构化的散文、日志、RAG 片段,Headroom 提供了一个基于 HuggingFace ModernBERT 的模型 chopratejas/kompress-v2-base。它的训练目标是:在保留信息密度的前提下,把长文本压缩成短表示。
这不是简单的摘要,而是把一段文本映射成“信息量等价但 token 更少”的表示。它通常和 CCR 配合使用:压缩后的内容进入 LLM,如果模型需要原文细节,再通过 retrieval 工具取回。
CacheAligner:KV Cache 的“加速器”
很多人忽视了 Anthropic 和 OpenAI 的 KV Cache 机制:如果连续请求的前缀稳定,后续请求可以复用前缀的缓存,大幅降低延迟和首 token 成本。CacheAligner 会:
- 检测动态占位符(时间戳、UUID、随机数、行号);
- 把动态部分替换成稳定占位符,让前缀尽量一致;
- 在真正发送前把占位符还原。
这意味着,即使你的 Agent 每次都在追加新日志,系统也能让 LLM 看到稳定的系统 prompt 和上下文结构,从而命中缓存。
三、五种接入模式:从一行代码到全局代理
Headroom 提供四种主要使用方式,覆盖从轻量脚本到企业级部署:
| 模式 | 适用场景 | 侵入性 | 代码改动 |
|---|---|---|---|
| Library | Python / TypeScript 应用内调用 | 低 | 几行代码 |
| Proxy | 本地网关,任何 OpenAI 兼容客户端 | 零 | 改环境变量 |
| Agent Wrap | 一键包装 Claude / Codex / Cursor / Aider | 零 | 一条命令 |
| MCP Server | 接入任何 MCP 客户端 | 零 | 配置 JSON |
| ASGI / Framework 中间件 | 服务端请求压缩 | 中 | 加中间件 |
3.1 Library 模式:最灵活
from headroom import compress
messages = [
{"role": "system", "content": "你是一名资深 SRE,协助排查线上故障。"},
{"role": "user", "content": "帮我分析这段 5 万行日志,找出 FATAL 根因。"},
{"role": "assistant", "content": "请提供日志。"},
{"role": "user", "content": long_log_content}, # 5 万行日志
]
compressed = compress(
messages,
model="claude-sonnet-4-20250514-v1:0",
# 可选:指定算法权重
algorithms=["smartcrusher", "kompress-base"],
)
print(f"压缩率: {compressed.compression_ratio:.1%}")
print(f"节省 token: {compressed.tokens_saved}")
print(f"压缩后上下文长度: {compressed.tokens_after}")
Library 模式适合你自己写 Agent 或数据处理脚本。它返回的 compressed 对象通常包含 messages(可直接传给 LLM SDK)、compression_ratio、tokens_saved、tokens_after 等字段,便于做度量和 A/B 测试。
3.2 Proxy 模式:零代码改动
export OPENAI_API_KEY=sk-...
export ANTHROPIC_API_KEY=sk-...
headroom proxy --port 8787
然后把你原来指向 api.openai.com 或 api.anthropic.com 的客户端改到 http://localhost:8787/v1:
# 例如 OpenAI 官方 CLI 或第三方 Agent
export OPENAI_BASE_URL=http://localhost:8787/v1
claude code
Proxy 模式的优势是:所有 Agent 都可以立刻享受压缩,不需要改业务代码。它会在请求离开本机前做压缩,在响应回来后把需要 retrieval 的调用再转回本地 CCR。
3.3 Agent Wrap 模式:一键包装常用 Agent
headroom wrap claude # 包装 Claude Code
headroom wrap codex # 包装 OpenAI Codex CLI
headroom wrap cursor # 包装 Cursor
headroom wrap aider # 包装 Aider
headroom wrap copilot # 包装 GitHub Copilot CLI
wrap 会启动本地 proxy,然后启动目标 Agent,并自动配置环境变量。对 Claude Code 和 Codex 还能开启 --memory 共享记忆和 --code-graph 代码图压缩。
3.4 MCP Server 模式:让所有 MCP 客户端都能压缩
headroom mcp install
安装后,MCP 客户端会获得三个工具:
headroom_compress:主动压缩一段上下文;headroom_retrieve:从 CCR 取回原始内容;headroom_stats:查看压缩统计。
这种方式适合把 Headroom 作为基础设施接入到已有的 MCP 生态中,比如 Claude Desktop、Cursor MCP、或任何自研 MCP host。
3.5 LangChain 集成示例
from langchain_openai import ChatOpenAI
from headroom.integrations.langchain import HeadroomChatModel
base = ChatOpenAI(model="gpt-4o", temperature=0.2)
model = HeadroomChatModel(base)
# 后续用法和 LangChain 原生模型完全一致
from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent
tools = [...] # 你的工具
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(model, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = executor.invoke({"input": "分析仓库里最近的 50 条 CI 失败日志"})
HeadroomChatModel 会把每次输入先过压缩管线,再传给底层模型。对上层应用透明。
3.6 Agno 集成示例
from agno.models.openai import OpenAIChat
from headroom.integrations.agno import HeadroomAgnoModel
from agno.agent import Agent
model = HeadroomAgnoModel(OpenAIChat(id="gpt-4o"))
agent = Agent(
model=model,
description="你是一个代码审查助手,擅长从大量 diff 中找出潜在问题。",
tools=[github_tool, diff_tool],
)
agent.print_response("帮我 review 最近 100 个 PR 的变更摘要")
四、代码实战:四个真实场景的压缩方案
4.1 场景一:压缩代码搜索结果
假设你让 Agent 在仓库里搜索所有调用 getUserById 的地方,结果返回 100 条记录,每条记录包含完整文件路径、行号、代码片段和匹配分数。原始 token 可能接近 1.8 万。
from headroom import compress
search_results = [
{
"path": "src/services/user.ts",
"start_line": 42,
"end_line": 58,
"snippet": "async function getUserById(id: string) { ... }",
"score": 0.97,
},
# ... 100 条
]
messages = [
{"role": "system", "content": "你是代码架构师。请基于搜索结果给出重构建议。"},
{"role": "user", "content": f"搜索结果:\n{json.dumps(search_results, ensure_ascii=False, indent=2)}"},
]
compressed = compress(messages, model="claude-sonnet-4")
print(compressed.compression_ratio) # 约 80–92%
SmartCrusher 会抽掉重复 schema,把 path、start_line、end_line 这类对当前问题价值不高的字段做压缩或索引化,只保留 snippet 和 score 的精简形式。
4.2 场景二:压缩 SRE 故障日志
日志通常有强烈的时间序列重复和固定格式。CodeCompressor / Kompress-base 组合效果显著:
import json
from headroom import compress
log_blob = """
2026-06-18T10:12:01.123+0800 ERROR [worker-3] [req-uuid=a1b2c3] payment_gateway timeout after 3000ms
2026-06-18T10:12:01.145+0800 WARN [worker-3] [req-uuid=a1b2c3] retry attempt 1/3
2026-06-18T10:12:01.234+0800 ERROR [worker-7] [req-uuid=d4e5f6] payment_gateway timeout after 3000ms
...
""" # 几千行
messages = [
{"role": "system", "content": "你是 SRE,找出故障根因并给出修复步骤。"},
{"role": "user", "content": f"请分析以下日志:\n{log_blob}"},
]
compressed = compress(messages, model="claude-sonnet-4", algorithms=["kompress-base"])
CacheAligner 会先把时间戳和 UUID 替换为占位符,让前缀稳定;Kompress-base 再对重复日志模式做语义压缩。最终 1.7 万 token 可能压到 1400 左右。
4.3 场景三:RAG 召回片段压缩
RAG 是最典型的“上下文里有大量低信息密度内容”的场景。传统做法是截断 top-k,但截断会丢信息。Headroom 的做法是把 top-k 做压缩,保留更多文档:
from headroom import compress
rag_chunks = [
{"doc_id": "d1", "text": "PostgreSQL 的 shared_buffers 默认是 128MB...", "score": 0.91},
{"doc_id": "d2", "text": "在 Linux 上,/proc/sys/vm/swappiness 控制...", "score": 0.88},
# ... 20 个 chunk
]
messages = [
{"role": "system", "content": "你基于以下文档回答问题。"},
{"role": "user", "content": json.dumps(rag_chunks, ensure_ascii=False)},
{"role": "user", "content": "为什么我的 PG 查询在内存充足时仍然出现大量 disk read?"},
]
compressed = compress(messages, model="gpt-4o")
RAG 压缩的妙处在于:你仍然可以召回 20 个 chunk,但实际进入 LLM 的 token 只相当于 5-8 个 chunk 的原始量。对准确率的影响,在 README 的 SQuAD v2 和 BFCL 测试上分别只损失约 3%,压缩率 19–32%。
4.4 场景四:自定义压缩器与扩展点
Headroom 提供了 pipeline 扩展机制。如果你公司内部的日志格式特别固定,可以写自定义压缩器:
from headroom.pipeline import CompressionMiddleware, on_pipeline_event
class MyLogCompressor:
def __init__(self):
self.pattern = re.compile(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+\+\d{4}")
def compress(self, text: str) -> str:
# 把连续重复的时间戳前缀抽成占位符
return self.pattern.sub("[TS]", text)
def decompress(self, token: str) -> str:
# 实际通过 CCR 反向查找
return token
middleware = CompressionMiddleware()
middleware.register_compressor("my_logs", MyLogCompressor())
on_pipeline_event("input_received", middleware.on_input)
扩展点的存在让 Headroom 不只是“通用工具”,而是可以成为企业内部上下文压缩基础设施。
五、高级能力:输出塑形、跨 Agent 记忆与 CCR
5.1 输出 Token 塑形:不只省输入,还省输出
Headroom 大部分能力在压缩输入,但它也提供输出 token 塑形(Output Shaping):
export HEADROOM_OUTPUT_SHAPER=1
headroom proxy --port 8787
它通过两种方式减少输出 token:
- Verbosity steering:在 system prompt 末尾追加一句“be terse, don't restate context”的轻量指令,让模型少讲废话;
- Effort routing:当当前 turn 只是读取文件或测试通过后的继续时,自动降低思考 effort;遇到新问题或错误时恢复全力。
输出节省的测量是“反事实”的——你永远看不到模型本会写多少。Headroom 用统计方法给出置信区间,而不是编一个数字:
headroom output-savings
# Reduction: 31.7% (95% CI 27.7% … 35.7%) [estimated]
如果你更严谨,可以设置 HEADROOM_OUTPUT_HOLDOUT=0.1,留 10% 的对话作为对照组,得到 measured 数值。
5.2 跨 Agent 记忆:Claude 和 Codex 共享上下文
headroom wrap claude --memory
headroom wrap codex --memory
两个 Agent 都会把压缩后的上下文写入同一个本地 SharedContext 存储。好处是:
- 你在 Claude 里让 Agent 读了 100 个文件,切换到 Codex 时不需要重新读;
- 自动去重,避免重复拉取相同文件;
- 上下文带有 agent provenance,方便审计。
这在多 Agent 协作的复杂任务里(比如一个 Agent 做架构设计,另一个做实现)能显著减少重复劳动。
5.3 CCR 可逆压缩:把“丢弃”变成“按需加载”
CCR 是 Headroom 架构里最优雅的部分。它不是简单地把内容变短,而是把原始内容存到本地缓存,给 LLM 一个压缩过的表示和一个 retrieval 工具。当模型需要看原文时,它会调用 headroom_retrieve:
# 在 LLM 的 function tools 里注册
{
"name": "headroom_retrieve",
"description": "当需要查看被压缩内容的原始版本时调用",
"parameters": {
"type": "object",
"properties": {
"context_id": {"type": "string"},
"reason": {"type": "string"}
},
"required": ["context_id"]
}
}
这解决了压缩的根本矛盾:想省 token,又怕丢信息。CCR 把问题变成“先给摘要,需要再展开”。
六、性能优化与生产调参
6.1 算法选择策略
| 内容类型 | 推荐算法 | 理由 |
|---|---|---|
| JSON 工具输出 | SmartCrusher | 结构化强,重复字段多 |
| 代码片段 / 文件 | CodeCompressor | AST 感知,不破坏语法 |
| 日志 / 散文 | Kompress-base | 语义压缩,保留信息密度 |
| 混合内容 | 自动 ContentRouter | 让系统根据类型动态路由 |
| 图片(base64) | Image Router | ML 路由 + OCR,可省 40–90% |
不要手动指定所有算法,先让 ContentRouter 自动选择,然后针对特定场景微调。
6.2 KV Cache 优化
如果你用 Anthropic Claude 或 OpenAI,开启 CacheAligner 几乎总是值得的。它不需要你改 prompt,只需要 Headroom 知道哪些字段是动态的。默认情况下它会识别时间戳、UUID、随机 token 等。如果你的业务里有更多动态占位符,可以配置:
export HEADROOM_CACHE_ALIGN_PATTERNS="session_id:[a-z0-9]{32},trace_id:[a-z0-9]{16}"
6.3 压缩强度与准确率平衡
Headroom 默认是“质量优先”的。如果你想更激进地省钱,可以在 library 模式调 compression_level:
compressed = compress(messages, model="gpt-4o", compression_level="aggressive")
级别通常分为 conservative、balanced、aggressive。建议:
- 代码搜索、重构建议:balanced;
- 日志分析、监控巡检:aggressive;
- 需要精确数值/数学推理:conservative。
6.4 离线运行与企业环境
Headroom 默认会下载两个外部资源:
cdn.pyke.io的 ONNX Runtime(Rust 核心);huggingface.co的kompress-base模型。
在离线或企业 SSL 检测环境里,可以:
# 预下载模型
export HF_HUB_OFFLINE=1
# 指定本地 ONNX Runtime
export ORT_STRATEGY=system
export ORT_LIB_LOCATION=/path/to/onnxruntime
# 企业 SSL 检测:信任公司 CA
export REQUESTS_CA_BUNDLE=/path/to/corp-ca.pem
export SSL_CERT_FILE=/path/to/corp-ca.pem
export CURL_CA_BUNDLE=/path/to/corp-ca.pem
如果 corporate 环境无法编译 Rust 依赖,先安装 Rust 再装 Headroom,或使用预编译 wheel:
pip install --only-binary headroom-ai headroom-ai
七、监控、成本核算与落地建议
7.1 监控指标
Headroom 提供 headroom perf 和 headroom stats:
headroom perf
# 显示:输入 token 节省、输出 token 估算、KV Cache 命中率、各算法耗时
headroom stats --format json
# 返回结构化统计,可接入 Prometheus / Grafana
建议把以下指标接入你的可观测平台:
headroom_input_tokens_saved_total:累计节省输入 token;headroom_output_tokens_saved_estimate:输出 token 估算节省;headroom_compression_ratio_avg:平均压缩率;headroom_retrieval_calls_total:CCR 取回次数(太高说明压缩过度)。
7.2 成本核算
假设你每月消耗 1 亿输入 token(Claude Sonnet 4 级别,约 $30/百万输入),压缩率 70%:
原始成本:1 亿 × $30 / 1M = $3,000
压缩后:0.3 亿 × $30 / 1M = $900
节省:$2,100 / 月
如果同时开启输出塑形,按 30% 输出节省,输出成本再降一层。对于中大型 Agent 应用,Headroom 的投入产出比极高。
7.3 落地 checklist
- 选定接入模式:Library(自研 Agent)、Proxy(多 Agent 共用)、MCP(已有 MCP 生态);
- 在 staging 环境跑
headroom evals suite --tier 1,确认目标场景准确率无损; - 开启
HEADROOM_OUTPUT_SHAPER=1并设置HEADROOM_OUTPUT_HOLDOUT=0.1测量真实输出节省; - 配置企业 CA 和离线模型(如需);
- 把
headroom stats接入监控; - 逐步从
balanced切换到aggressive,观察headroom_retrieve调用频率。
八、总结与展望
Headroom 的出现代表 AI 工程进入“精细化运营”阶段。前两年大家关注模型能力、上下文窗口长度、RAG 架构;现在则开始关心:如何把同样能力,用更少的 token、更低的延迟、更低的成本跑起来。
它的核心洞察是:上下文压缩不应该是一个 hack,而应该是一个独立的、可观测的、可扩展的基础设施层。通过 ContentRouter 做智能类型分发,通过 SmartCrusher、CodeCompressor、Kompress-base 做针对性压缩,通过 CCR 实现可逆与按需加载,通过 Cross-agent memory 和 Output Shaping 把节省延伸到多 Agent 协作和输出侧,Headroom 提供了一套完整的生产级方案。
当然,它也有适用边界:
- 如果你只用单一 provider 的原生压缩,且没有跨 Agent 需求,那可能不需要它;
- 如果你在完全隔离的 sandbox 里无法运行本地进程,那 proxy 或 library 模式也不适用;
- 对于极其依赖长程精确引用的任务(比如法律合同逐条分析),建议保守使用压缩,并开启 CCR retrieval。
展望未来,上下文压缩层很可能成为每个 AI 应用栈的标准组件,就像 HTTP 里的 gzip、数据库里的查询优化器一样。模型会越来越大,但工程上的胜负手,往往在于你怎么喂它。Headroom 给出的答案就是:先把饭做精,再让模型吃。