AI Agent 上下文压缩利器 Headroom

30 阅读23分钟

过去一年,大模型上下文窗口从 128K 快速推进到百万级。表面看,工程师终于不用再为“塞不下”焦虑;但真正把 AI Agent 跑进生产后,另一个问题会立刻出现:能装得下,不代表装得便宜;能读得完,不代表读得快;上下文越长,也不代表推理越稳。

AI Agent 和普通 Chatbot 最大的区别,不在于它能多说几句话,而在于它会不断和外部世界交互。它会读文件、查数据库、跑命令、调 API、抓日志、检索知识库、分析测试输出,再把这些中间结果作为下一轮推理的上下文继续投给模型。这个 Tool-Use Loop 一旦拉长,Token 成本、首字延迟和注意力漂移都会一起失控。

Headroom 解决的正是这个问题。它是一个面向 AI Agent 的上下文压缩与优化层,位于 Agent 编排框架和底层 LLM Provider 之间。它不是简单把文本“总结短一点”,而是对工具输出、日志、RAG 分块、代码、JSON、历史对话做类型识别、结构化压缩、缓存对齐和按需原文检索。根据 Headroom 官方 README 与文档,截至 2026-06-23,它提供 library、proxy、MCP server、agent wrapper 等多种接入方式,项目宣称在重度工具调用场景中可实现 60% 到 95% 的 token 削减。

这篇文章会重点讲三件事:

  1. 为什么 AI Agent 的上下文问题不是“换一个长上下文模型”就能解决。
  2. Headroom 的核心架构和底层原理是什么。
  3. 在生产环境中,哪些场景适合使用 Headroom,哪些场景应该谨慎使用。

一、痛点场景:AI Agent 为什么会被上下文拖垮

1. Token 账单不是线性增长,而是循环放大

普通问答中,用户输入一次,模型回答一次,成本大致可控。但 Agent 是循环系统:

用户目标
  -> Agent 思考下一步
  -> 调用工具
  -> 工具返回大量结果
  -> 结果进入历史上下文
  -> Agent 基于完整历史继续推理
  -> 再调用工具
  -> 上下文继续膨胀

假设一次 SRE 故障诊断中,Agent 做了 10 轮工具调用:

  • 第 1 轮读取集群状态,返回 8,000 tokens。
  • 第 2 轮读取 Pod 日志,返回 20,000 tokens。
  • 第 3 轮查询链路追踪,返回 15,000 tokens。
  • 第 4 轮读取服务配置,返回 6,000 tokens。
  • 后续每一轮又继续携带前面的上下文。

实际成本不是“这些输出加起来一次性送入模型”,而是随着每轮对话不断被重新投递。大量重复的工具输出、固定系统提示词、相似日志、重复 JSON key、历史中间状态,会在多轮推理里被反复计费。

这就是很多企业内部编码 Agent、AIOps Agent、RAG Agent 的真实账单来源:不是用户问得多,而是 Agent 每一步都把自己之前读过的东西又读了一遍。

2. 首字延迟被 Prefill 拖爆

大模型生成第一个 token 前,需要先处理输入上下文,这个阶段通常称为 prefill。上下文越长,prefill 越重,首字响应时间 TTFT 就越高。

对于人机协作型 Agent,TTFT 很关键。编码助手如果每次等 10 秒才开始说话,用户会觉得它迟钝;SRE Agent 如果在告警期间慢慢吞日志,实际排障价值会被削弱。

更重要的是,长上下文还会消耗 provider 的缓存能力。很多模型服务商支持 Prompt Caching 或 Prefix Caching,但要求前缀内容稳定。如果 Agent 每轮都在系统提示词前部插入当前时间、trace id、随机 session id,就会破坏缓存命中,导致每轮都重新 prefill。

3. 长上下文会带来“注意力稀释”

上下文窗口变大后,模型理论上能看到更多信息,但不代表它一定能稳定使用这些信息。工程里常见的问题包括:

  • 关键错误只出现一行,但被数万行健康检查日志淹没。
  • JSON 中真正变化的字段只有 2 个,但重复 schema 和空字段占据大部分 token。
  • 代码仓搜索返回 100 个文件命中,模型却抓住了不相关的旧实现。
  • RAG 召回分块重复度很高,模型被相似段落干扰。
  • 历史对话中早期约束被后续工具输出冲淡。

这种问题不能靠“塞更多”解决。Agent 需要的是更干净、更稳定、更可检索的上下文表示。

4. 典型高风险场景

Headroom 最适合的问题,不是单轮问答,而是重度 Agent 场景。

AIOps / SRE 故障诊断

Agent 会读取 kubectl logs、事件列表、Pod spec、Prometheus 指标、trace、应用配置。原始输出往往有大量重复时间戳、健康检查、心跳日志、相同字段名。真正关键的可能只是某个异常状态、错误码或依赖超时。

企业级编码 Agent

Agent 会读多个文件、搜索引用、跑测试、看 lint 输出、分析 CI 日志。一次失败测试可能输出几千行,但关键点可能是一个 assertion diff 或一段 stack trace。

数据分析和 BI Agent

Agent 会从数据库读取大批表格行、API 返回和统计结果。JSON/CSV 中重复 key、空值、常量字段很多,直接塞给模型成本高,且模型未必需要每一行。

RAG 与知识库 Agent

召回结果经常有模板化页眉页脚、重复段落、相似文档块。粗暴 top-k 召回会把上下文填满,但有效信息密度并不高。

多 Agent 协作

一个 Agent 读过的长文档,另一个 Agent 又读一遍;一个 Agent 已经分析过的日志,另一个 Agent 在 review 阶段再次投递。没有共享缓存和去重时,多 Agent 系统会重复为同一份上下文买单。


二、传统压缩方案的死穴

1. LLM 摘要法:看似聪明,实际不稳定

最直观的做法是让一个便宜模型先总结日志或文档,再把摘要交给主模型。这种方案有三个明显问题:

  • 串行调用增加延迟:主模型之前多了一次 LLM 请求。
  • 成本没有真正归零:摘要模型也要收费,尤其是长日志输入本身仍然昂贵。
  • 摘要会丢细节:错误码、字段名、路径、参数、堆栈行,常被摘要器误判为噪音。

对文章总结来说,这种风险可以接受;对故障诊断和代码修复来说,它可能直接导致错误结论。

2. 滑动窗口:便宜但健忘

另一种常见做法是只保留最近 N 条消息,超出的历史直接丢掉。它适合短对话,但对 Agent 很危险。

Agent 的早期步骤经常包含关键上下文:

  • 用户最初设定的约束。
  • 第一轮检测到的环境变量。
  • 某个临时文件路径。
  • 某个服务版本号。
  • 某个已经排除过的假设。

硬截断会让 Agent 在后续步骤里“忘记自己为什么这么做”,产生重复操作、反复验证甚至错误回滚。

3. 纯文本压缩:忽略了 Agent 上下文的结构性

Agent 上下文不是普通自然语言。它包含 JSON、代码、日志、表格、HTML、命令输出、diff、trace。不同内容的“重要信息”完全不同。

例如:

  • JSON 中重复 key 可以抽出 schema,但异常 item 必须保留。
  • 代码可以保留签名、类型和 import,但不能破坏语法。
  • 日志可以聚类重复模式,但 error、fatal、exception 不能丢。
  • RAG 文本可以去噪,但引用来源和实体名不能丢。

这正是 Headroom 选择“内容路由 + 专用压缩器 + 可逆检索”的原因。


三、核心架构与底层原理解析

Headroom 的核心思路可以概括为一句话:先把上下文变成高信息密度的轻量视图,再保留原文的按需回查能力。

从官方架构文档看,它的主链路大致包含 CacheAligner、ContentRouter、SmartCrusher、CodeCompressor、Kompress-base、Context Manager 和 CCR。

flowchart TD
    A[&#34;Agent / App<br/>LangChain, LangGraph, Claude Code, Codex, Cursor, Custom Agent&#34;] --> B[&#34;Headroom Proxy / SDK / MCP&#34;]
    B --> C[&#34;CacheAligner<br/>稳定 Prompt 前缀&#34;]
    C --> D[&#34;ContentRouter<br/>识别内容类型&#34;]
    D --> E[&#34;SmartCrusher<br/>JSON / 结构化数据&#34;]
    D --> F[&#34;CodeCompressor<br/>AST 感知代码压缩&#34;]
    D --> G[&#34;Kompress-base<br/>文本与日志压缩&#34;]
    E --> H[&#34;Context Manager<br/>上下文预算与重要性裁剪&#34;]
    F --> H
    G --> H
    H --> I[&#34;CCR Store<br/>原文缓存与检索引用&#34;]
    H --> J[&#34;LLM Provider<br/>OpenAI / Anthropic / Google / Bedrock 等&#34;]
    J --> K[&#34;必要时调用 headroom_retrieve&#34;]
    K --> I
    I --> J

1. CacheAligner:压榨 Prompt Caching 的基础红利

很多模型服务商已经支持缓存能力,但缓存命中的前提是前缀稳定。问题是 Agent 的 prompt 经常把动态信息放在前面:

You are an SRE Agent.
Current time: 2026-06-23 14:03:21
Session ID: 9f4a...
Trace ID: req-...
...

时间、session id、trace id 每轮都变。哪怕后面 90% 的系统提示词和工具定义完全相同,只要前缀早期字节不同,缓存收益就会被破坏。

CacheAligner 的做法是把稳定内容放在前缀,把动态内容搬到尾部或上下文附录中:

Stable prefix:
  You are an SRE Agent.
  Follow the incident diagnosis SOP.
  Available tools: ...

Dynamic tail:
  Current time: ...
  Session ID: ...
  Trace ID: ...

这样做的收益有两层:

  • provider 端更容易复用 KV cache,降低 TTFT。
  • 缓存 token 通常有折扣,实际输入成本下降。

这不是模型能力层面的优化,而是请求工程层面的优化。对长时间运行的 Agent 来说,它往往比单次压缩更稳定。

2. ContentRouter:上下文压缩的“分诊台”

Headroom 不把所有输入都当成自然语言。ContentRouter 会先识别内容形态,再选择对应压缩路径。

常见类型包括:

  • JSON 数组、嵌套对象、API 响应、数据库行。
  • 构建日志、测试日志、Kubernetes 日志、异常堆栈。
  • 源代码、diff、搜索结果。
  • HTML、文档、普通文本。
  • 历史对话消息。

这种设计的关键价值是:每一种内容都有自己的保真边界。

JSON 的保真重点是 schema、异常项、统计分布和字段关系;代码的保真重点是语法、调用关系、类型和局部逻辑;日志的保真重点是错误等级、时间序列、异常模式和重复模式;对话历史的保真重点是用户意图、已完成动作和未解决约束。

如果无法安全识别或压缩,Headroom 的默认策略通常是 passthrough,即返回原文。这一点很重要:生产压缩层应该失败为“多花 token”,而不是失败为“悄悄丢信息”。

3. SmartCrusher:结构化数据的高收益压缩器

SmartCrusher 是 Headroom 最容易产生高收益的部分,因为 Agent 工具输出中大量内容都是结构化数据。

一个 API 返回可能长这样:

[
  {
    "namespace": "prod",
    "service": "checkout",
    "status": "ok",
    "region": "us-east-1",
    "timestamp": "2026-06-23T10:00:01Z",
    "cpu": 0.32,
    "memory": 0.61
  },
  {
    "namespace": "prod",
    "service": "checkout",
    "status": "ok",
    "region": "us-east-1",
    "timestamp": "2026-06-23T10:00:02Z",
    "cpu": 0.33,
    "memory": 0.60
  }
]

这里很多 token 被重复 key、常量字段、连续时间戳占据。模型并不需要逐字读取每个 key 才能理解数据。SmartCrusher 可以做几类处理:

  • 抽出全局 schema,减少重复字段名。
  • 对常量字段做一次性声明。
  • 对数值序列保留统计摘要、异常点和变化点。
  • 对字符串数组做去重和采样。
  • 对日志数组保留 error、warning、fatal 等异常项。
  • 保留头部样本用于理解 schema,保留尾部样本用于体现最近状态。

官方限制文档提到,JSON 数组、结构化日志、数据库行、API 响应通常是 Headroom 最有价值的场景;而小数组、短内容、格式损坏 JSON 会直接跳过压缩。

4. CodeCompressor:AST 感知,但默认保守

代码压缩最危险。去掉空格很容易,但真正压缩函数体、注释和样板逻辑时,一不小心就会破坏模型修复 bug 所需的信息。

Headroom 的 CodeCompressor 基于 tree-sitter 做 AST 感知处理,目标是保留:

  • import。
  • 函数和方法签名。
  • 类定义。
  • 类型注解。
  • 装饰器。
  • 关键控制结构。
  • 错误处理边界。

理论上,它可以把长函数体压缩为结构骨架,让模型先理解代码拓扑;当模型需要细节时,再通过 CCR 取回原文。

但生产上要注意:官方限制文档明确强调,代码压缩默认有保护机制。比如用户正在要求 analyze、review、fix、debug 时,相关代码通常会被保护,避免压缩掉关键实现。换句话说,Headroom 并不盲目追求“代码也必须压短”,而是优先保证正确性。

这是合理的。对代码任务来说,错误压缩一次造成的修复偏差,可能比节省的 token 更贵。

5. Kompress-base:面向文本和日志的本地模型

对普通文本、长文档、非结构化日志,规则压缩很难完全覆盖。Headroom 使用 Kompress-base 这类本地轻量模型做 extractive compression:不是重新生成摘要,而是对 token 或片段做 keep/drop 判断,保留更可能承载语义的信息。

这种方法相比 LLM 摘要有两个优势:

  • 它是本地执行,不需要额外远程 LLM 调用。
  • 它偏抽取式压缩,少一些“编造摘要”的风险。

但它也不是万能的。文本压缩通常比 JSON 压缩收益低,且可能增加本地推理延迟。因此在生产系统中,应当通过压缩收益、任务准确率和 retrieval 频率共同评估。

6. Context Manager:让上下文预算可控

压缩单个工具输出还不够,Agent 的完整消息数组仍然可能超过模型预算。Context Manager 的职责是决定最终哪些消息进入请求,哪些消息被折叠、裁剪或放入 CCR。

简单策略是 rolling window:保留系统提示词和最近对话,丢弃旧消息。更高级的策略会按重要性打分,例如:

  • 最近性。
  • 是否与当前问题语义相关。
  • 是否包含 error、exception、failed 等异常线索。
  • 是否被后文引用。
  • token 密度。
  • 是否包含用户约束或工具决策。

被移出主上下文的内容不应直接销毁,而应该进入 CCR store,保留检索路径。


四、进阶核心机制

1. CCR:Compress-Cache-Retrieve,让压缩具备可逆性

CCR 是 Headroom 区别于普通压缩器的关键机制。它的核心不是“压缩得更狠”,而是“压缩后还找得回来”。

处理流程如下:

sequenceDiagram
    participant Tool as Tool Output
    participant HR as Headroom
    participant Store as Local CCR Store
    participant LLM as LLM

    Tool->>HR: 返回原始长输出
    HR->>Store: 缓存原文,生成 hash/ref
    HR->>LLM: 发送压缩视图 + retrieval marker
    LLM->>LLM: 基于压缩视图推理
    alt 信息足够
        LLM-->>HR: 直接完成任务
    else 需要细节
        LLM->>HR: 调用 headroom_retrieve(ref, query)
        HR->>Store: 查询原始内容或相关子集
        Store-->>HR: 返回原文片段
        HR-->>LLM: 回填细节继续推理
    end

CCR 解决了传统压缩的根本矛盾:

  • 压缩太保守,省不了多少 token。
  • 压缩太激进,容易丢关键细节。

有了 CCR,系统可以默认给模型一个高信息密度视图,把原始内容放在本地缓存中。模型只有在需要时才取回完整内容或相关片段。官方 CCR 文档还提到,retrieval 可以带 query,在缓存内容中搜索相关子集,避免一次性把完整原文重新塞回上下文。

2. Retrieval 频率是压缩质量的核心指标

很多团队评估压缩只看 token saving,这是不够的。真正应该同时看:

  • 压缩率。
  • 任务成功率。
  • retrieval 触发率。
  • retrieval 后仍然失败的比例。
  • 单次请求总延迟。
  • provider cache hit rate。

如果 retrieval 很少触发,说明压缩视图足够表达任务信息;如果 retrieval 高频触发,说明压缩过激或路由策略不适合当前业务。此时应降低压缩强度,或把某些内容类型加入保护名单。

3. CacheAligner 与压缩收益可以叠加

Headroom 的收益不是单纯来自 token 数减少。更准确地说,它有三层收益:

  1. 减少输入 token:SmartCrusher、Kompress、Context Manager 让请求更短。
  2. 提升缓存命中:CacheAligner 让稳定前缀更容易命中 provider cache。
  3. 减少重复上下文:共享存储和 CCR 让多轮、多 Agent 不必反复发送全量原文。

举例来说,100K tokens 的上下文如果先压到 20K,再让其中大部分稳定前缀命中缓存,实际成本可能远低于单纯的 80% token reduction。

这也是为什么 Headroom 更适合长会话 Agent,而不是一次性短问答。

4. Cross-Agent Shared Memory:避免多个 Agent 重复读同一份材料

在复杂研发环境中,不止一个 Agent 在工作:

  • 编码 Agent 读代码和测试日志。
  • Review Agent 读 diff 和规范。
  • SRE Agent 读部署日志。
  • 安全 Agent 读依赖扫描结果。

如果每个 Agent 都把相同文档、相同日志、相同代码片段重新投给模型,成本会被横向放大。Headroom 的 cross-agent memory / shared store 思路,是把已读上下文在本地索引、去重、记录来源和引用关系。

这样当另一个 Agent 需要相似内容时,可以优先复用本地压缩表示或引用,而不是重新发送全量文本。

这类机制对企业内部平台尤其重要,因为企业知识库、代码仓、运行日志往往高度重复。

5. headroom learn:从失败会话中学习上下文偏好

Headroom README 中提到 headroom learn 能从失败会话中提取修正,写入 CLAUDE.mdAGENTS.md 一类 Agent 指令文件。这个方向值得关注,因为上下文压缩不仅是算法问题,也是组织偏好问题。

例如,不同团队对“保留什么”有不同要求:

  • SRE 团队可能要求保留 error code、timestamp、pod name、namespace。
  • 金融风控团队可能要求保留金额、账号、交易时间、规则命中原因。
  • 编码团队可能要求保留文件路径、函数签名、测试名、失败断言。

如果压缩层能从失败样本和人工中断中学习这些偏好,就可以逐渐把“通用压缩器”变成“团队上下文策略”。

6. 输出 Token 也值得治理

很多上下文工程只关注输入,但模型输出也收费,而且有些模型输出 token 价格更高。Agent 常见的输出浪费包括:

  • 重复复述用户问题。
  • 逐字打印刚刚读过的代码。
  • 对简单工具调用写长篇过程说明。
  • 每一步都输出模板化礼貌语。

Headroom README 提到它也关注 output token reduction。落地时可以配合系统提示词和 Agent 策略,让模型只输出决策、证据和下一步动作,减少仪式性文本。


五、AIOps 工业级实战示例

假设我们有一个 K8s 故障自动化诊断 Agent,目标是定位线上 checkout 服务延迟升高的原因。

1. 原生 Agent 的上下文膨胀

Agent 可能执行这些步骤:

kubectl get pods -n prod -o json
kubectl describe pod checkout-xxx -n prod
kubectl logs checkout-xxx -n prod --tail=5000
kubectl get events -n prod --sort-by=.lastTimestamp
curl http://prometheus/api/v1/query_range ...
curl http://tracing/api/search?service=checkout

返回内容包括:

  • Pod JSON,字段重复度极高。
  • describe 输出,包含大量正常事件。
  • 应用日志,绝大多数是 info 级别心跳。
  • Prometheus 时间序列,很多点变化很小。
  • Trace JSON,结构复杂且嵌套很深。

如果这些内容被原样塞入模型,单次诊断很容易达到数万 token。更糟的是,后续每轮工具调用都会继续携带这些内容。

2. Headroom 介入后的处理链路

原始上下文:
  Pod JSON + Event + Logs + Metrics + Trace
  约 60K 到 80K tokens

Headroom 处理:
  1. CacheAligner 固定系统提示词、SRE SOP、工具说明。
  2. ContentRouter 分流 JSON、日志、普通文本、历史消息。
  3. SmartCrusher 压缩 Pod / Trace / API JSON。
  4. 日志压缩器保留 error、warning、异常模式、时间边界。
  5. Context Manager 保留当前诊断最相关消息。
  6. CCR 缓存原始输出并注入可检索引用。

送入模型:
  高信息密度诊断视图 + 可回查 ref

模型先看到的是压缩后的诊断材料:

[pod_summary]
- namespace: prod
- service: checkout
- abnormal pod: checkout-7d9...
- restart_count: 4
- recent state: CrashLoopBackOff
- anomalous events preserved: FailedMount, BackOff
- full pod json available via headroom_retrieve(ref=pod_abc)

[log_summary]
- 5000 lines compressed by pattern clustering
- preserved fatal/error lines:
  - 10:42:13 FATAL database connection pool exhausted
  - 10:42:14 ERROR retry budget exceeded for payment-service
- full logs available via headroom_retrieve(ref=log_def)

如果模型需要确认完整堆栈,它再调用 retrieval:

headroom_retrieve(ref="log_def", query="database connection pool exhausted stack trace")

这样它不必一开始就读取所有日志,但也不会永久失去原始证据。

3. 生产部署方式

最容易落地的是 proxy 或 sidecar:

pip install "headroom-ai[proxy]"
headroom proxy --port 8787 --host 0.0.0.0

在 Agent 中把 LLM base URL 指向 Headroom:

from openai import OpenAI

client = OpenAI(
    base_url="http://headroom:8787/v1",
    api_key="your-provider-key",
)

Kubernetes 中可以把 Headroom 作为 sidecar 或独立 service 部署:

FROM python:3.11-slim
RUN pip install --no-cache-dir "headroom-ai[proxy]"
EXPOSE 8787
CMD ["headroom", "proxy", "--port", "8787", "--host", "0.0.0.0"]

生产上还需要补充:

  • CCR store 的 TTL。
  • 本地缓存磁盘配额。
  • 敏感字段脱敏。
  • telemetry 开关。
  • retrieval 调用审计。
  • 按租户隔离缓存。
  • 故障时 passthrough 策略。

六、Benchmark 与收益应该怎么解读

Headroom 官方文档给出了一些 benchmark,例如 JSON 压缩、HTML 提取、SRE incident debugging、GitHub issue triage 等场景。官方 README 中展示过 SRE incident debugging 从 65,694 tokens 到 5,118 tokens 的示例,约 92% savings;benchmark 文档中也有 JSON 场景从 10,144 tokens 到 1,260 tokens 且问题回答保持正确的案例。

这些数字有参考价值,但不应该直接复制成自己的生产承诺。原因很简单:压缩收益强依赖内容结构。

通常高收益场景:

  • 大型 JSON 数组。
  • 结构化日志。
  • 重复 API 响应。
  • 构建和测试输出。
  • 多轮 Agent 会话。
  • 多 Agent 重复读取同一份上下文。

通常低收益场景:

  • 短对话。
  • 单轮问答。
  • 用户消息本身很短。
  • 已经很紧凑的 grep/search 结果。
  • 需要逐字分析的代码片段。
  • 小于几百 token 的工具输出。

评估 Headroom 时建议建立自己的对照实验:

维度原生 AgentHeadroom Agent备注
输入 token记录真实请求记录压缩后请求看总体节省
TTFTp50 / p95 / p99p50 / p95 / p99看用户体验
任务成功率人工或自动评测人工或自动评测不能只看 token
retrieval 频率每轮统计高频说明压缩过激
缓存命中率provider 指标provider 指标CacheAligner 收益
误诊 / 误修复率基线实验组生产最关键

七、生产级避坑指南

1. 不要压缩用户原始意图

用户请求、业务目标、明确约束应该尽量原样保留。压缩用户意图很容易导致 Agent 做错方向。Headroom 官方限制文档也强调 user messages 默认不压缩。

2. 代码压缩要保守

如果用户正在让 Agent 修复 bug、review 代码、解释实现,代码本体就是证据。此时不应为了节省 token 压掉函数体。更稳的方式是:

  • 当前工作文件保持原文。
  • 旧的、不相关代码进入 CCR。
  • 大范围代码仓搜索结果做结构化摘要。
  • 通过 retrieval 精确取回需要的文件片段。

3. CCR store 必须纳入安全设计

“原文可回查”意味着原文被本地保存。企业场景必须考虑:

  • 是否包含 PII、密钥、客户数据。
  • 缓存是否加密。
  • TTL 多长。
  • 是否按租户隔离。
  • 是否进入备份。
  • 谁能触发 retrieval。
  • retrieval 是否写审计日志。

4. Passthrough 是重要安全阀

一个生产压缩层应该允许失败时直接传原文,而不是抛错中断业务,更不能在压缩失败时返回残缺内容。Headroom 文档中提到许多压缩器会 fail gracefully:无法解析、依赖缺失、压缩后更长等情况会返回原文。

5. 不要把官方最高收益当默认收益

“最高 95%”通常来自结构化且重复度很高的内容。真实生产流量中,短请求、普通对话、代码阅读混在一起,中位节省可能没那么夸张。落地时要按业务流量结构拆分评估。


八、Headroom 的最佳使用姿势

如果你准备在企业 Agent 中引入 Headroom,我建议按以下路径推进。

第一步:Shadow Mode 观测

先不改变模型真实输入,只把上下文镜像给 Headroom,记录如果压缩会节省多少 token、耗时多少、哪些内容会被压缩。

第二步:先开 JSON 和日志压缩

JSON、API 响应、数据库行、构建日志通常收益高且风险低。代码压缩、用户消息压缩应保持关闭或保守。

第三步:开启 CCR 并监控 retrieval

没有 retrieval 的激进压缩风险很高。开启 CCR 后,重点看模型是否频繁取回原文,以及取回后任务是否成功。

第四步:做任务级评测

不要只比较 token。要准备一组真实任务:

  • 线上故障诊断样本。
  • 历史 CI 失败日志。
  • 代码修复任务。
  • RAG 问答任务。
  • GitHub issue triage 任务。

比较原生 Agent 与 Headroom Agent 的最终结果。

第五步:接入缓存与共享上下文

当单 Agent 压缩稳定后,再做 CacheAligner、Shared Memory、多 Agent 去重。这些能力在长会话和企业多 Agent 系统里收益更明显。


结语:上下文不是越长越好,而是越准越好

长上下文模型让 Agent 有了更大的工作台,但没有自动解决成本、延迟和注意力管理问题。工程上真正需要的是上下文治理:哪些信息要原样保留,哪些信息可以结构化压缩,哪些信息只需要引用,哪些信息应该按需取回。

Headroom 的价值就在这里。它把上下文压缩从 prompt trick 提升成了基础设施层能力:ContentRouter 负责识别内容,SmartCrusher 处理结构化数据,CodeCompressor 谨慎处理代码,Kompress-base 压缩普通文本,CacheAligner 提高 provider 缓存命中,CCR 保证压缩后仍能回查原文。

如果你的 Agent 只是单轮问答,Headroom 可能并不必要。但如果你的系统已经开始吞日志、跑命令、读代码、查库、做多轮工具调用,并且账单和延迟都在上升,那么上下文压缩就不是锦上添花,而是 Agent 工程化的必修课。

在 LLM 时代,真正成熟的系统不会问“最多能塞多少 token”,而会问:每一轮送进模型的 token,是否真的值得再次付费?


参考资料