news 2026/9/2 11:41:38

如何为Caveman添加新的Compressor:压缩器注册与开发完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何为Caveman添加新的Compressor:压缩器注册与开发完全指南

如何为Caveman添加新的Compressor:压缩器注册与开发完全指南

【免费下载链接】caveman🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman项目地址: https://gitcode.com/GitHub_Trending/caveman1/caveman

Caveman 是一款面向 AI Agent 的 Token 压缩引擎,核心卖点是"用最少的 token 把事办成"——通过压缩器(Compressor)把 JSON、日志、代码等上下文缩减最多 65%。当你想支持一种新内容类型(比如 Markdown 表格、SVG、数据库查询结果),就需要为 Caveman 注册一个新的 Compressor。本文用通俗的方式讲清楚压缩器注册机制、开发步骤、安全等级声明和测试要求,帮助你从零到提交 PR。

一、先搞懂:Caveman 的压缩器注册机制

Caveman 的引擎采用「检测 → 查注册表 → 压缩 → 门禁校验」的流水线。所有 Compressor 都集中在engine/compressors/目录下,由一张**注册表(Registry)**统一路由:

  • Compressor 接口:每个压缩器只需实现 3 个方法,见 compressor.go
    • ContentType():返回它负责的内容类型名(如"json""log"
    • SafetyClass():声明自身在 S0–S4 安全阶梯上的等级
    • Compress(input):纯字节变换,成功返回压缩结果,任何解析失败都返回ok=false,引擎会把原始字节原样透传(fail-closed 设计)
  • Registry:一张「内容类型 → Compressor」的映射表。Default()函数一次性注册全部 15 个内置压缩器,你的新压缩器也在这里"上岗"。
type Compressor interface { ContentType() string SafetyClass() safety.Class Compress(input []byte) (out []byte, ok bool) }

内置 Compressor 一览

内容类型压缩器选择方式
jsonJSON 数组折叠(保留错误项、首尾元素)自动检测
log日志降噪(保留 ERROR/FATAL 行)自动检测
code源码精简(tree-sitter / go-ast 双实现)自动检测
diff/search-result/text/html/tabular/config/terminal对应专用压缩器自动检测
toon/a11y/toolschema/repetition高级变换仅显式指定Options.Type

几个设计要点值得新手特别注意:

  1. 纯字节变换:Compressor 不数 token、不存恢复记录、不碰网络——这些由引擎核心负责,所以每个压缩器都是自包含、可独立测试的模块。
  2. 确定性 + 幂等:相同输入永远得到相同输出,且压缩结果再压缩不会变化。
  3. 更小的门禁:压缩结果必须比原文小,否则引擎丢弃结果、回退原文。
  4. 有损可恢复:声明为 S4(有损)的压缩器,原始字节必须先存入 CCR 恢复存储(engine/ccr/),模型后续可按 handle 取回原文。

二、开发新 Compressor 的 5 个步骤

步骤 1:新建一个压缩器文件

engine/compressors/下新建文件(如markdown.go),参照 json.go 或 config.go 的写法:定义一个结构体持有可调参数(如保留行数、阈值),并提供NewXxx() Compressor构造函数。以 config 压缩器为例,它用一组正则识别 YAML/TOML/INI,结构体里只有minLineskeepHeadkeepTail等几个参数,非常轻量。

步骤 2:声明安全等级

安全等级由压缩方法本身决定,写在 engine/safety/safety.go 的阶梯里:

等级含义是否可改模型可见字节是否需要 CCR 恢复
S0 / S1元数据、缓存提示类
S2 / S3结构性 / 行为性变更
S4有损压缩(绝大多数压缩器)是,且必须披露丢弃了什么

如果你做的压缩会删减模型可见内容(折叠数组、省略行),就老老实实声明 S4。

步骤 3:实现 fail-closed 的 Compress

三条铁律(可对照 compressor.go 顶部注释):

  • 有界解析:不要无限制地递归解析,避免内存爆炸;
  • 任何疑问都放弃:解析失败、结构不支持、没有把握 → 返回(nil, false),绝不输出"看起来差不多"的结果;
  • 省略要留标记:像日志压缩器那样用... N lines elided (caveman)标记折叠区域,让模型知道内容被省略且可恢复。

步骤 4:在 Default 注册表中注册

打开 compressor.go 的Default()函数,加一行r.Register(NewMarkdown())。这里有个进阶细节:

  • 如果自动检测可能误判(比如 Markdown 和纯文本很难区分),学 TOON 和 a11y 的做法——注册但只允许显式指定类型到达,不进自动检测链;
  • 如果你的压缩器编译产物永远路由不到,把它加进manifestExcluded白名单。否则它会进入能力清单,导致RegistrySHA256变化,让所有已发布的 Cave Build 锁在运行期失效——这是注册时最容易踩的坑。

步骤 5:接入内容检测(如需自动选择)

自动检测逻辑在 engine/detect.go,顺序是:严格 JSON → 终端输出 → diff → HTML → 表格 → 代码 → 日志 → 搜索结果 → 配置 → 兜底text。新增检测信号时注意:

  • 信号必须是确定性、可证的(参考 ANSI 转义序列作为终端判定依据的做法——"只有终端输出才合法携带它");
  • 低置信度内容一律落入text,交给保守压缩器兜底。

三、Compressor 测试怎么写

参考 log_test.go 的测试套路,一个好压缩器的测试至少覆盖 4 类用例:

用例验证点
核心行为错误/关键行被保留,噪音被折叠,输出出现省略标记
体积门禁输出严格小于输入
幂等性压缩结果二次压缩保持不变
失败回退畸形输入返回ok=false,原样透传

测试 fixture 放在engine/compressors/testdata/,边界用例(空输入、恰好阈值长度、超大输入)用真实数据支撑,发布任何性能声明前必须有 fixture 背书(要求见 extending.md)。

四、提交前检查清单 🪨

  1. ✅ 无歧义的内容类型名 + 已声明的安全等级
  2. ✅ 有界解析、确定性输出、幂等
  3. ✅ 非法输入回退原始字节(fail-closed)
  4. ✅ S4 输出已接入 CCR 恢复存储
  5. ✅ 明确选择方式:自动检测 or 仅显式指定
  6. ✅ 覆盖有效/无效/输出变大/边界的 fixture 测试
  7. ✅ 更新Default()注册表及 engine.md 中的注册器数量与文档

五、关键文件路径速查

路径说明
engine/compressors/compressor.goCompressor 接口、Registry 与 Default 注册表
engine/compressors/json.goJSON 压缩器(省略标记、BM25 相关性选取)
engine/compressors/config.goYAML/TOML/INI 压缩器
engine/compressors/html.goHTML 正文提取(纯 Go 可读性启发式)
engine/detect.go内容类型自动检测路由
engine/safety/safety.goS0–S4 安全等级注册表
engine/ccr/有损压缩的原始字节恢复存储
docs/technical/engine.md压缩引擎官方文档(含流水线图)
docs/technical/extending.md扩展指南(新增压缩器要求清单)

掌握「接口三方法 + 注册表 + 安全等级 + fail-closed 测试」这四件套,你就能像维护者一样为 Caveman 贡献一个稳健的新 Compressor 了。

【免费下载链接】caveman🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman项目地址: https://gitcode.com/GitHub_Trending/caveman1/caveman

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 4:12:06

网易2018前端笔试卷深度解析:前端校招核心考点全梳理

网易2018校园招聘前端开发工程师笔试卷,这份卷子在圈里流传了好几年,到现在还有不少人在翻。有人觉得年份久了参考价值不大,但如果你真正把题目过一遍会发现,大厂前端笔试的命题骨架其实一直没怎么变——JS语言基础、浏览器机制、…

作者头像 李华
网站建设 2026/8/31 3:57:40

Caveman浏览器压缩实战:本地Chrome如何节省129倍Token

Caveman浏览器压缩实战:本地Chrome如何节省129倍Token 【免费下载链接】caveman 🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman 项目地址: https://gitcode.com/GitHub_Trend…

作者头像 李华
网站建设 2026/9/1 10:52:32

C#本地部署RMBG-2.0模型:基于OnnxRuntime的高精度背景去除实践

简介:图像分割是计算机视觉中的基础任务,其核心原理是通过深度学习模型对图像像素进行分类,区分前景与背景。这项技术的核心价值在于实现自动化、高精度的对象提取,广泛应用于电商产品图处理、人像摄影、内容创作等场景。在实际工…

作者头像 李华
网站建设 2026/9/1 5:50:36

两个月前端学习后的首次面试实录:八股文必须背熟

两个月前,我还坐在重庆某所大学的宿舍里,对着B站上的HTML教程一边敲代码一边怀疑人生。两个月后,我已经坐在一家互联网公司的会议室里,面对面试官抛来的“说一下闭包是什么”,沉默了将近十秒。这篇文章就是我的前端面试…

作者头像 李华
网站建设 2026/9/1 12:31:46

MinerU:4GB 显存跑通文档解析,输出 LLM 可用的 Markdown 与 JSON

MinerU:4GB 显存跑通文档解析,输出 LLM 可用的 Markdown 与 JSON 【免费下载链接】MinerU Transforms complex documents like PDFs and Office docs into LLM-ready markdown/JSON for your Agentic workflows. 项目地址: https://gitcode.com/GitHub…

作者头像 李华