• 正文
  • 相关推荐
申请入驻 产业图谱

AI编程省钱方案:Headroom 实现 Claude/Codex 上下文降噪压缩

06/22 09:45
428
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

原标题:Github狂揽4万Star,这个开源项目让Agent节省60~95%的token消耗

最近用 Claude Code、Codex、Cursor、Aider 这类 AI Agent 写代码的人,应该都遇到过一个问题:Agent 很好用,但账单也是真的会动。

不是因为它每次都在写什么惊天动地的架构。更多时候,它只是在重复做一些很普通的事:读文件、搜代码、跑测试、贴日志、分析工具返回结果。你看见的是一句“继续”,模型那边可能已经吃进去了几千、几万 token。

这就是 Agent 开发和普通聊天不一样的地方。普通聊天主要为问答付费;Agent 场景里,你还在为上下文搬运付费。

今天看一个开源项目:chopratejas/headroom。

它干的事很直接:

在工具输出、日志、文件、检索片段、历史对话进入 LLM 之前,先压缩或筛选一遍,让模型少读噪声,多读有用信息。

官方 README 给它的定位是:The context compression layer for AI agents。项目宣称,在一些真实 Agent 工作负载里,可以减少 60% 到 95% token,并提供 library、proxy、MCP server、Agent wrap 等接入方式。

这个方向有意思的地方不只是“省钱”。它其实在提醒我们:上下文不是越多越好,尤其是 Agent 这种会疯狂调用工具的系统。

Agent 为什么特别浪费 token

普通聊天里,token 主要花在用户问题和模型回复上。

Agent 不一样。它会不断把工具结果塞回上下文:

• rg 搜索出 100 条代码结果

• cat 读取一个几百行文件

• 测试失败后贴一大段堆栈

• CI 日志里混着大量成功步骤和少数错误

• RAG / 搜索检索返回几十段相似资料

• 多轮之后,历史上下文越滚越长

这些内容有一个共同点:有用信息不多,噪声很大。

比如一次测试失败,真正值得模型看的可能只有几件事:哪个测试失败、断言是什么、关键异常栈在哪里、最近改了哪些文件。

但现实里,模型经常会吃下整段日志。你付费让它读了一堆 passedinstalledcached,还有一些和当前问题没关系的 warning。

Headroom 想解决的就是这个问题。

它不是换便宜模型,也不是让你少用 Agent,而是在 Agent 和模型之间加一层上下文压缩。

Headroom 到底做了什么

可以把 Headroom 理解成一个本地运行的上下文网关。

原来的链路是:

1Agent / App -> LLM Provider

加上 Headroom 后变成:

1Agent / App -> Headroom -> LLM Provider

它会先判断上下文内容大概属于哪一类,再选择压缩策略:

    • JSON / API 返回:保留异常、边界和代表性样本,压掉重复项
    • 日志 / 测试输出:保留失败、错误和关键变化,删掉大量正常噪声
    • 搜索结果:保留更相关的片段;已经很精简的 grep/search 输出可能直接透传
    • 普通文本:压缩冗余表达
    • RAG 文档上下文:取决于内容形态,部分场景会保守透传
    • 对话历史:减少长期滚动上下文的浪费
    • 代码:默认非常保守,很多场景会直接透传,避免把模型需要看的代码压没

最后这点挺重要。

token 优化不是压得越狠越好。把真正的错误信息压没了,省下来的钱会以调试时间的形式还回来。Headroom 的设计里有一个 CCR,也就是 Compress-Cache-Retrieve:先压缩,把原文缓存在本地;如果模型后面需要原始内容,再取回来。

它要做的不是简单丢上下文,而是先给模型一个更小的工作集。

省 token 为什么能省钱

LLM API 的费用通常和输入 token、输出 token 都有关。Agent 的输入 token 很容易膨胀,因为工具调用会把机器可读、但人根本不想完整读的内容塞回上下文。

Headroom 官方 README 里列了几组 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%

这些数字别直接理解成“谁用了都能省 90%”。更现实的说法是:如果你的 Agent 工作流里有大量工具输出、日志、搜索结果、JSON 数据,它就有机会帮你省下明显的输入成本。

它抓住的是 Agent 成本里最常见的一块浪费:工具输出太长,信息密度太低。

它适合谁

我觉得 Headroom 最适合这几类人:

    1. 每天高频使用 AI 编程 Agent 的开发者
    2. 在大代码库里频繁让 Agent 搜索、阅读、跑测试的团队
    3. 做数据库查询、API 工具调用、检索增强应用的 LLM 开发者
    4. 有多 Agent 协作,希望共享压缩上下文和记忆的系统
    5. 想降低 API 成本,但又不想简单换小模型的人

尤其是第二类。

很多开发者以为 Agent 账单高,是模型太贵。真实编码场景里,贵的经常是另一件事:模型反复读了太多它不该完整读的东西。

这和人类工程师一样。你不会把 10 万行日志扔给同事说“你自己看吧”。你会先筛出错误、上下文、最近改动和可疑路径。

Headroom 做的就是把这个筛选过程自动化一部分。

什么时候别急着用

这类工具不是银弹。

根据 Headroom 文档,它在下面这些场景收益有限:

    • 很短的单轮对话• 没有工具输出的普通聊天• 纯代码阅读/修改场景,因为代码默认会被保护或透传• 已经非常精简的 grep/search 输出• 对延迟极其敏感、但 token 成本不是问题的链路

还有一个现实问题:它需要在本地运行代理,或者集成 SDK。个人开发者通常能接受;公司内网、代理、证书、审计要求比较严格的环境,就要多评估一步。

所以我不会建议一上来全局打开。先放到最浪费 token 的地方试:

    • 长日志• 大 JSON• 搜索结果• 检索结果或相似资料片段• 长 Agent session

有收益,再扩大范围。

快速上手

Headroom 支持多种接入方式:Python library、TypeScript SDK、proxy、MCP server、Agent wrap。

如果只是想体验,建议先从 proxy 或 wrap 开始。

1. 安装

Python 需要 3.10+。

1pip install "headroom-ai[all]"

如果你使用 Node / TypeScript:

1npm install headroom-ai

2. 包一层现有 Agent

如果你用 Claude Code、Codex、Cursor、Aider、Copilot CLI,可以先试官方提供的 wrap:

1headroom wrap claude

Codex:

1headroom wrap codex

Aider:

1headroom wrap aider

这种方式适合先试水。不用改业务代码,先看自己的 Agent 工作流到底能省多少。

3. 或者启动本地代理

1headroom proxy --port 8787

然后把 OpenAI-compatible client 指向这个本地代理:

1OPENAI_BASE_URL=http://localhost:8787/v1 your-app

如果是 Claude Code,可以按官方文档里的方式指定 Anthropic base URL:

1ANTHROPIC_BASE_URL=http://localhost:8787 claude

4. 查看节省情况

代理跑起来后,可以看统计:

1curl http://localhost:8787/stats

也可以用:

1headroom perf

重点看这些指标:

    • 压缩前 token• 压缩后 token• tokens saved• 压缩比例• 是否影响最终回答质量• 是否增加了不可接受的延迟

不要只看“省了多少”。更该看的是:省下 token 后,Agent 有没有继续把事情做对。

5. 在代码里直接调用

如果你在写自己的 LLM 应用,可以直接在 Python 里压缩 messages:

1234567891011121314151617181920212223

from headroom import compress
from openai import OpenAI

client = OpenAI()

messages = [
{"role": "system", "content": "You analyze tool outputs."},
{"role": "user", "content": "Summarize the important failures."},
{
"role": "tool",
"content": "... very long logs / JSON / search results ..."
},
]

result = compress(messages, model="gpt-4o")

response = client.chat.completions.create(
model="gpt-4o",
messages=result.messages,
)

print(f"saved: {result.tokens_saved}")
print(response.choices[0].message.content)

TypeScript 也有类似写法:

12345678

import { compress } from "headroom-ai";

const result = await compress(messages, {
model: "gpt-4o",
baseUrl: "http://localhost:8787",
});

console.log(result.tokensSaved);

注意:官方文档说明 TypeScript SDK 会调用本地 Headroom proxy,所以要先启动代理。

我会怎么落地它

如果我是团队里的技术负责人,不会第一天就把 Headroom 接到所有 LLM 请求上。

我会先找一个 token 浪费最明显的场景,比如 CI 日志分析、SRE 日志诊断、代码搜索结果总结。跑一周 A/B:一半走原始链路,一半走 Headroom。记录成本、延迟、任务成功率和人工返工次数。

如果成本明显下降,成功率没掉,再扩到更多 Agent 工作流。关键生产链路要留回退开关,压缩异常时直接透传原文。

省 token 是目标,但不是唯一目标。Agent 系统最后看的还是单位成本下的可靠完成率。

上下文不是垃圾桶

Headroom 有意思的地方,不只是它能不能帮你省下某个百分比的 token。

它提醒我们一件事:上下文窗口再大,也不该被当成垃圾桶。

过去一年,很多 LLM 应用的设计方式有点粗暴:窗口变大了,就多塞;模型变强了,就少做结构化;工具输出长了,就直接交给模型。

结果很直接:成本上去,延迟上去,模型注意力还会被噪声稀释。

Agent 真正工程化以后,核心能力不只是“会调用工具”,还包括“知道哪些工具结果值得进入上下文,以什么形式进入上下文”。

Headroom 这类项目的价值就在这里:它把上下文管理从 prompt 工程里的手工技巧,变成了一个可以插拔、可观测、可优化的系统层。

参考链接

    • GitHub 仓库:chopratejas/headroom• 官方文档:Headroom Docs• 快速上手:Quickstart• 使用边界:Limitations• 代理模式:Proxy Server

相关推荐