Headroom — 六种压缩算法详解#
本章详细解析Headroom的内容路由机制和六种内置压缩算法,重点阐述SmartCrusher、CodeCompressor、Kompress-v2-base三种核心算法的工作原理与设计特点。
1. 内容路由机制:先诊断,再开方#
Headroom不像很多同类工具那样"一把锤子敲所有钉子"——它的第一原则是内容感知路由(Content-Aware Routing)。
为什么需要内容路由?#
简单截断或用一个小模型统一压缩所有内容,本质上是"信息盲"的:
截断不知道哪里重要,可能砍掉关键报错信息
小模型统一压缩无法利用结构化信息(JSON的键名、代码的语法树)
不同类型内容的冗余模式完全不同
路由流程#
输入内容
↓
[格式检测] → JSON?代码?日志?自然语言?混合?
↓
[特征提取] → 提取结构特征(如JSON嵌套深度、代码语言类型)
↓
[算法选择] → 路由到最适合的压缩算法
↓
[参数调整] → 根据内容特征调整压缩参数
↓
[执行压缩]
支持的内容类型#
内容类型 |
路由到的算法 |
典型压缩率 |
|---|---|---|
JSON数据 |
SmartCrusher |
70-90% |
源代码(Python/JS/Go/Rust/Java/C++) |
CodeCompressor |
40-70% |
自然语言/对话历史 |
Kompress-v2-base |
50-80% |
日志/终端输出 |
日志专用算法 |
80-95% |
混合内容 |
分块路由+多算法组合 |
视内容而定 |
RAG检索片段 |
RAG专用算法 |
40-60% |
2. SmartCrusher:JSON结构化压缩#
SmartCrusher是Headroom针对JSON数据设计的专用压缩算法。
设计原理#
工具返回的JSON(API响应、搜索结果、数据列表等)往往包含大量冗余:
重复的键名(数组中每个对象都有相同的键)
过长的嵌套路径
空值、默认值、重复值
数字ID、时间戳等对LLM推理无意义但占Token的字段
SmartCrusher利用JSON的结构统计特征进行压缩,而非语义理解:
键名去重:将重复出现的键名替换为短引用
数组摘要:长数组只保留前N个元素+总数统计
嵌套打平:深层嵌套的路径用点号表示打平
空值移除:null、空字符串、空数组直接移除
类型标注:保留数据类型信息,让LLM知道原结构
压缩效果#
根据README数据,SmartCrusher对JSON的压缩率达到70-90%。
压缩前(示例):
{
"results": [
{"id": 12345, "name": "utils.py", "path": "/src/lib/utils.py", "size": 4521, "type": "python"},
{"id": 12346, "name": "helpers.py", "path": "/src/lib/helpers.py", "size": 3210, "type": "python"},
{"id": 12347, "name": "constants.py", "path": "/src/lib/constants.py", "size": 1890, "type": "python"},
{"id": 12348, "name": "config.py", "path": "/src/lib/config.py", "size": 892, "type": "python"}
],
"total_count": 47,
"page": 1
}
压缩后(概念示例):
[Struct] results(array, total=47, showing=4)
{id:*, name:utils.py, path:/src/lib/utils.py, size:4.5k, type:py}
{id:*, name:helpers.py, path:/src/lib/helpers.py, size:3.2k, type:py}
{id:*, name:constants.py, path:..., size:1.9k, type:py}
...(+3 more)
page=1
3. CodeCompressor:基于AST的代码压缩#
CodeCompressor是Headroom最精巧的算法之一——它基于**抽象语法树(AST)**进行代码压缩。
设计原理#
代码不是普通文本,它有严格的语法结构。CodeCompressor利用这一点:
解析代码为AST(抽象语法树)
识别并保留结构关键信息
删除实现细节但保留"理解代码需要知道"的信息
保留什么?删除什么?#
保留(必须) |
删除(可压缩) |
|---|---|
|
函数体内的具体实现逻辑 |
函数/方法签名(名称、参数、返回类型) |
重复的注释和文档字符串 |
类定义、继承关系 |
空行、格式化空白 |
类型注解(Type Hints) |
调试代码(print、console.log) |
关键常量和枚举定义 |
冗余的错误处理样板代码 |
导出/公开API声明 |
长字符串字面量(摘要保留) |
支持的语言#
Python
JavaScript / TypeScript
Go
Rust
Java
C++
压缩效果示例#
压缩前(Python代码):
import os
import sys
from typing import List, Dict, Optional
def process_user_data(users: List[Dict], config: Optional[Dict] = None) -> Dict:
"""
Process user data according to configuration.
Handles validation, transformation, and aggregation.
"""
results = {}
default_config = {"validate": True, "transform": False}
if config is None:
config = default_config
for user in users:
user_id = user.get("id")
if not user_id:
print(f"Warning: user without id, skipping")
continue
if config["validate"]:
if "email" not in user:
print(f"User {user_id} missing email")
continue
# ... 50 more lines of processing logic
results[user_id] = processed
return results
压缩后(概念示例):
import os
import sys
from typing import List, Dict, Optional
def process_user_data(users: List[Dict], config: Optional[Dict] = None) -> Dict:
"""Process user data: validate, transform, aggregate"""
# [Impl: processes users, validates emails based on config, returns results dict]
# Key logic: config["validate"] checks email presence; skips invalid users
关键价值:模型读压缩后的代码仍然能正确理解模块结构、API接口、类型信息,但Token消耗大幅减少。当模型需要看具体实现时,可以通过
headroom_retrieve取回。
4. Kompress-v2-base:Agent场景专用自然语言压缩#
Kompress-v2-base是Headroom作者专门训练的一个小模型,用于自然语言压缩。
为什么需要专门训练?#
通用的文本摘要模型(如BART、T5)是为新闻文章、文档摘要设计的,它们不知道AI Agent场景下什么重要:
Agent对话中,工具调用和错误信息比寒暄重要
思考过程(Chain of Thought)中的推理步骤不能丢
用户的具体指令和约束条件必须保留
Kompress-v2-base的特点#
训练数据:大量Agentic Trace(Agent真实执行轨迹)
领域知识:知道Agent场景下哪些话可以丢掉,哪些必须保留
指令遵循:专门训练为"保留对LLM推理有用的信息,删除冗余寒暄和重复内容"
体积小:作为压缩模型,本身运行速度快、成本低
适用场景#
多轮对话历史压缩
RAG检索结果的语义去重
长文本摘要和要点提取
错误日志的自然语言描述压缩
5. 其他压缩算法#
除了上述三种核心算法,Headroom还内置了针对特定场景的压缩方案:
日志专用压缩算法#
识别日志级别(INFO/DEBUG/WARN/ERROR),默认过滤DEBUG和部分INFO
合并重复堆栈,只保留首次出现+出现次数统计
提取关键错误行,移除无关上下文
RAG专用压缩算法#
识别多个检索片段中的重复信息进行去重
保留与query最相关的片段,相关性低的片段只保留摘要
合并相邻片段中重叠的内容
混合内容路由算法#
对包含多种类型内容的消息(如既有代码又有自然语言解释)
先分块识别类型,再对不同块使用不同算法
最后合并压缩结果,保持块之间的逻辑关联
6. 与简单截断/统一压缩的对比优势#
对比维度 |
简单截断 |
小模型统一压缩 |
Headroom内容感知路由 |
|---|---|---|---|
信息保留 |
可能截断关键信息 |
无法利用结构特征 |
保留关键结构+按需取回 |
代码理解 |
差(截断可能断在代码中间) |
一般(不理解语法) |
好(保留AST结构) |
JSON处理 |
可能截断JSON导致无效 |
一般 |
优(统计式压缩) |
可逆性 |
不可逆(丢了就没了) |
不可逆 |
可逆(CCR机制) |
压缩率 |
高但风险大 |
中等 |
高且质量有保障 |
质量影响 |
可能严重损失 |
部分场景下降 |
不降反升(注意力更集中) |
7. 设计思想洞察:对症下药的工程智慧#
Headroom压缩算法体系体现了一个深刻的工程原则:利用结构,而非对抗结构。
面对结构化数据(JSON),利用统计特征压缩
面对半结构化数据(代码),利用语法树(AST)压缩
面对非结构化数据(自然语言),用专门训练的模型压缩
面对混合数据,分块路由、组合使用
这与Unix哲学中的"做一件事并做好"一脉相承——每个算法只解决自己最擅长的场景,通过路由层组合成完整方案。这比"一个万能模型处理一切"更高效、更可靠、更可解释。