AI-Chain

别再把 Token 节省当魔法:Caveman 用可恢复压缩替 AI Coding Agent 瘦身

分享:
别再把 Token 节省当魔法:Caveman 用可恢复压缩替 AI Coding Agent 瘦身
# 别再把 Token 节省当魔法:Caveman 用可恢复压缩替 AI Coding Agent 瘦身 ## 先讲结论 Caveman 不是另一个 coding agent,而是一层放在既有 agent 与模型供应商之间的本机工具。它把「减少 token」拆成两条不同路径:用 skill 让 agent 少写一点赘词,或用 Engine 与 local proxy 压缩 agent 反复送进模型的 logs、JSON、diff、HTML、搜寻结果与工具输出。 真正值得注意的不是「把文字变短」本身,而是它把压缩设计成可回复的资料管线:先把可能遗失资讯的原始 bytes 存进 Caveman Context Recovery(CCR),再把较小的表示与 recovery handle 交给模型;解析失败、结果没有变小、CCR 写入失败或安全条件不明时,就退回原文。 这个设计让 Caveman 比单纯的 prompt 技巧更像一个 context middleware。不过,它也不是无条件省钱工具:官方文件明确承认 skill 会增加输入 token、HTML benchmark 可能退步、local estimate 不是帐单数字,而且本机 CCR 可能保存敏感原文。 ## Caveman 解决的是哪一段成本? 一个长时间工作的 AI coding agent,通常会重复把几类内容送回模型:测试输出、编译器错误、JSON、git diff、搜寻结果、工具 schema、浏览器 accessibility tree,以及先前对话留下的 context。这些资料不一定需要逐 byte 保留在模型可见内容里,但又不能只靠粗暴截断。 Caveman 的产品模型把系统拆成数层: - **Skill、hooks、plugins:** 影响 agent 的输出风格,保留程式码、命令、识别字与技术细节。 - **CLI:** 安装元件、启动 agent、管理本机命令与整合。 - **Engine:** 判断输入类型、选择 compressor、计算估计 token,并保存 recovery data。 - **Local proxy:** 透过 loopback 接住 provider request,把选定的 input transform 套上去,再转送给原本的模型供应商。 - **MCP、memory、browser、shrink:** 把恢复、长输出、浏览器结构与本机记忆做成 agent 可使用的工具。 - **SDK:** 让应用程式直接接上 context assembly、provider routing、tracing 与 eval 能力。 这种分层的好处是可以只采用最小必要路径。只想让回答少一点赘词,可以只装 skill;需要处理长 logs 与工具输出,才启用 local runtime;要把自己的应用程式接进去,则改用 SDK 或 provider base URL。 ## 两条路径:缩短回答,或缩短输入 ### 1. Response skill:让 agent 少说废话 Caveman skill 是一份会被 agent 载入的规则,要求它缩短常见的冗余表达,并在较强的模式下允许片段式回答。它不应改写程式码、错误讯息、命令、路径或安全警告。 这条路径的优点是安装成本低,也不需要把 request 经过代理。不过规则本身会占用 input token,所以短问题可能反而变贵。官方 `HONEST-NUMBERS.md` 也指出,skill 并不压缩 context 或 model thinking tokens;是否有净节省,必须用同一任务的 provider usage 做 A/B 比较。 ### 2. Engine + proxy:让 agent 少读重复资料 第二条路径才是 Caveman 的核心工程。Engine 会先做 detection,再把资料送给对应的 compressor。官方目前列出的自动辨识类型包含 JSON、terminal output、diff、HTML、tabular data、source code、logs、search results、configuration text 与一般文字;TOON、accessibility tree 与 tool-schema 等较特殊的 transform 则不是一般 detection 自动选择。 Local proxy 透过 base URL 或环境设定包住既有 agent,并不取代 agent loop。它可为 Claude Code、Codex、Gemini CLI、Aider、Hermes、OpenClaw、opencode 等目标建立 launch profile,也能让 Anthropic、OpenAI、Google Gen AI、Vercel AI SDK、LangChain、LiteLLM、CrewAI、Pydantic AI 与 OpenAI Agents SDK 等应用使用整合配方。 ## 最重要的设计:压缩必须可恢复 Caveman Engine 的 pipeline 可以简化成以下流程: ```plain text 输入 bytes ↓ Detect:判断资料形状 ↓ Select:选择 compressor ↓ Transform:产生较小表示 ↓ 是否更小且通过安全检查?──否──→ 传回原始 bytes ↓ 是 是否需要 recovery?──否──→ 输出 compact bytes ↓ 是 把完整原始 bytes 写入 CCR ↓ 写入成功?──否──→ 传回原始 bytes ↓ 是 输出 compact bytes + recovery handle ``` 这里有几个实务上很重要的判断: 1. **变小不是唯一条件。** 解析错误、未知 mode、没有合适 compressor 或输出反而更大,都会 pass-through。 1. **Lossy output 要先保存原文。** 如果 recovery store 不存在或写入失败,就不应把压缩结果交给模型。 1. **Handle 不是品质保证。** 它只能让 agent 在需要时取回原始资料,不能保证模型一定会主动要求缺失内容。 1. **失败不应伪造成功。** Proxy 的 transform failure 会保持原始 provider traffic,而不是回传一个看似成功的假结果。 Engine 文件把 `Compress`、`Retrieve`、`Detect`、`Stats` 列为稳定核心操作,另外提供不提交正常 runtime side effect 的 `Simulate`。压缩器本身是纯 byte transform,网路、储存与 token accounting 由 Engine 外层控制,这让失败边界比较容易测试与审查。 ## 从 CLI 到 MCP:不只是一个 proxy Caveman 的 CLI 主要操作可以分成几类: ```bash caveman claude # 持续启用整合并启动 agent caveman wrap codex # 单次、暂时性的 wrapped session caveman tools compress < input.txt caveman tools retrieve caveman tools shrink -- go test ./... caveman tools mem remember "project uses PostgreSQL" caveman tools mem recall "database" caveman tools browse https://example.com "pricing" ``` 其中值得分开看的是三个本机工具: - **MCP server:** 提供 compress、retrieve、stats、TOON encode、TOON decode 等工具。Agent 何时呼叫由 host 决定,权限应限制在必要范围。 - **Cavemem:** 以 SQLite 保存 durable facts,使用本机 BM25 做 recall;它是持久化记忆,不是模型训练,资料也可能过时或错误。 - **Browser bridge:** 透过 Chrome DevTools Protocol 取得 accessibility tree,按查询过滤后回传元素 reference,必要时仍可 recovery 原始内容。它能 click 或执行 JavaScript,因此 read 与 write 权限必须分开管理。 Output shrinker 则是很直接的入口:把测试、编译或搜寻的长输出送进 shrinker,保留错误类型、exit status、重要路径与 recovery handle。文件特别提醒,不能用「只剩一段摘要」取代完整 debugging context。 ## Benchmark 应该怎么读? Caveman 的 `WRAP-BENCHMARK.md` 报告一组固定的 agent-shaped tool-output workload:六种 fixture、每个 arm 三次、总共 18 组 direct/Caveman pairs。文件报告 Caveman 端使用 591,673 个 provider-reported input tokens,直接使用 Claude Code 则为 885,793,并且两边都是 18/18 exact-answer checks 通过。 这个结果可以支持一个窄化的结论:在该版本、该 provider、该固定 fixture 与该 recovery 方法下,Caveman 对这组大型工具输入有明显 input reduction。它不能直接推导成所有 coding session 都会省相同比例,原因包括: - benchmark 是固定的大型工具输出,不是开放式实际专案。 - dashboard HTML 是负面案例,压缩没有生效时连 skill overhead 都算进去,结果反而增加 9.9%。 - 公开 repository 有报告与 provenance hash,但没有一并提供原始 harness 与 run artifacts,因此文件自己把它标成 pinned report,而不是从 checkout 即可独立重现的 benchmark。 - Engine 本机 token 数通常是 `inferred`,来自 offline tokenizer 或 fallback estimate,不等于 provider invoice。 这种把负面结果、品质 gate、测量 basis 与不可重现边界一起写出的方式,比只放一个「省了 X%」更值得参考。使用者真正应该做的是在自己的 workload 上跑同一任务、同一模型、同一 provider,对照帐单或 provider usage,再决定是否保留某个 transform。 ## 安全与隐私:本机不等于没有资料风险 Caveman 的本机层不需要 Caveman account,但 request 仍会送到你选定的模型 provider。更重要的是,CCR 会保存可恢复的完整原文;官方安全文件指出,这些内容可能包含 prompts、credentials embedded in content 与 tool results,应把 `~/.caveman/ccr.db` 视为敏感资料。 还有几个部署前必看的边界: - Standalone proxy 预设绑定 `127.0.0.1:8787`,loopback 模式接受所有 inbound request;不要把它暴露到 LAN、container bridge 或 public interface。 - Shared deployment 需要 `CAVEMAN_AUTH_TOKEN`,并应放在 private network、在前方终止 TLS;健康检查与 metrics endpoint 仍可能未验证。 - SSRF protection 预设封锁 private、loopback、link-local 等不安全目的地;若需要 self-hosted provider,应设定精确的 `CAVE_SSRF_ALLOWLIST`,不要开过大的网段。 - CLI anonymous telemetry 预设开启,但第一次互动命令会显示揭露;可用 `caveman telemetry off` 或 `DO_NOT_TRACK=1` 关闭。官方列出的 telemetry 是无内容的使用事件与 token aggregate,不包含 prompt、completion body、档案路径或 provider credentials。 - Browser bridge 可执行 JavaScript、click、表单提交甚至可能触发购买;它不应被当成单纯的 read-only scraper。 因此,部署 Caveman 的思考方式应接近「安装 coding agent 或本机 proxy」,而不是把它当作无风险的文字格式化工具。 ## 安装与使用建议 官方 README 提供 skill-only 与 runtime 两种入口。实际采用时,可以按这个顺序降低风险: 1. 先阅读 pinned release 的 `INSTALL.md`、`SECURITY.md` 与 license 边界,不要直接把未审查的远端安装脚本 pipe 进 shell。 1. 只想测试回答风格时,先采用 skill path,并用短任务与长任务各做一次 A/B。 1. 要启用 runtime 时,先用 `caveman setup` 检查元件,再从单一 agent 的 `caveman wrap ` 开始,不要一开始就改动所有全域整合。 1. 在敏感专案中确认 `~/.caveman/` 的权限、CCR retention 与 telemetry 设定;不要把 secrets 写进 YAML、benchmark fixture、prompt 或 command history。 1. 先使用 record/pass-through mode 验证既有流程,再逐一开启 JSON、logs、diff 或 browser 等 transform。 1. 用 provider-reported usage 与品质结果验证,若自己的 workload 变差,直接停用该路径。 ## License 与采用范围 这个 repository 不是单一 license。Skill、CLI、SDK 与部分 adoption surface 采 MIT;Engine、proxy、rewriter、browser、MCP、shrink、Cavemem Go core 与 shared platform 等 Engine-linked 元件采 BSL-1.1,并有 first-party self-hosted production 的 Additional Use Grant。若你要把 Engine-linked 功能提供给第三方服务,必须先读 `LICENSING.md` 与对应的 BSL 条款。 这个区分会直接影响架构选择:个人或团队内部自架,和把压缩 runtime 包进对外提供的 SaaS,并不是同一种授权情境。文章可以介绍它的设计,但不能把整个 repository 简化成「MIT 开源 proxy」。 ## 结语:值得研究,但先量自己的资料 Caveman 最有价值的地方,不是把 AI agent 变成更会讲电报文,而是把 context compression 做成一个有 detection、recovery、fail-safe、usage basis 与 evidence labels 的本机系统。它让「压缩」从 prompt trick 变成可以被拆解、测量与停用的 middleware。 但它的正确使用方式也很清楚:从最小 layer 开始,保留原始资料的复原能力,分清 inferred estimate 与 provider usage,完整评估本机 CCR、telemetry、SSRF、browser permission 与 license 边界,最后用自己的 coding workload 做 A/B。 如果你的 agent 大量反复阅读 logs、JSON、diff 与测试输出,Caveman 是值得深入研究的实作;如果你的工作主要是短问答、按 request 计费,或每个输入 byte 都必须直接可见,先不要假设它会带来净收益。 ## 参考资料 - [Caveman GitHub repository](https://github.com/JuliusBrussee/caveman) - [Product model](https://github.com/JuliusBrussee/caveman/blob/main/docs/technical/product-model.md) - [Architecture](https://github.com/JuliusBrussee/caveman/blob/main/docs/technical/architecture.md) - [Compression Engine](https://github.com/JuliusBrussee/caveman/blob/main/docs/technical/engine.md) - [Local tools](https://github.com/JuliusBrussee/caveman/blob/main/docs/technical/local-tools.md) - [Security and privacy](https://github.com/JuliusBrussee/caveman/blob/main/docs/technical/security-and-privacy.md) - [Honest Numbers](https://github.com/JuliusBrussee/caveman/blob/main/docs/HONEST-NUMBERS.md) - [Wrap benchmark](https://github.com/JuliusBrussee/caveman/blob/main/docs/WRAP-BENCHMARK.md) - [Repository SECURITY.md](https://github.com/JuliusBrussee/caveman/blob/main/SECURITY.md) - [Repository LICENSE](https://github.com/JuliusBrussee/caveman/blob/main/LICENSE)