Caveman v4.0:从原始人说话到六件套 token 优化系统
项目:JuliusBrussee/caveman 仓库:https://github.com/JuliusBrussee/caveman 语言:Go 今日 Star:+530 HN #1
目录
Caveman v4.0:从"原始人说话"到六件套 token 优化系统
项目:JuliusBrussee/caveman
仓库:https://github.com/JuliusBrussee/caveman
语言:Go | 今日 Star:+530 | HN #1
一、一个被 Adobe 引用的"笑话"
2026 年 4 月,一个叫 caveman 的项目冲上 Hacker News 第一。它的口号是:
"why use many token when few token do trick"
(为什么用很多 token,当少量 token 就能搞定。)
听起来像段子。但五个月后,Adobe Research 在一篇论文里引用了 caveman 的方法,实测在 8 个模型上平均省 1.4-2.4 倍成本。JetBrains 做了 A/B 测试,8.5% 输出 token 减少,答案质量无显著差异(p=0.82)。Elasticsearch Labs 基于 caveman 的方法重做了一个版本。
一个"原始人说话"的段子,为什么会被 Adobe 和 JetBrains 认真研究?
二、核心洞察:模型不是在"思考",是在"翻译"
caveman 的第一件 rock 叫 Say less。它做的事情是:把 agent 的输出从"完整英文段落"压缩成"控制英语"。
举个例子。agent 原本会输出:
"The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle. When you pass an inline object as a prop, React's shallow comparison sees it as a different object every time, which triggers a re-render. I'd recommend using useMemo to memoize the object."
caveman 把它压缩成:
"New object ref each render, so React re-renders. Wrap the prop in useMemo."
63 token 变成 20 token。答案一样,修复一样。
这里有一个关键洞察:模型的大部分输出不是"思考过程",是"语言包装"。真正的信息是"新对象引用导致重渲染,用 useMemo 包裹",但模型习惯性地加上"The reason... is likely because..."、"When you pass..."、"I'd recommend..."这些连接词和客套话。
caveman 不是在"破坏语法",是在"剥离语言包装,只留信息内核"。
三、ASD-STE100:航空维修手册的启示
caveman 的设计灵感不是凭空来的。它参考了 ASD-STE100(Aerospace Specification for Simplified Technical English)——航空维修手册使用的受控英语。
航空维修手册为什么用受控英语?因为维修技师在 3 万英尺高空修飞机时,不能有歧义。"Remove the bolt" 不能被理解成 "Check the bolt"。ASD-STE100 规定了:
- 每个词只有一个意思
- 每句话不超过 20 个词
- 不用被动语态
- 不用比喻
这是一个跨域同构:同一个原则(控制语言复杂度),在航空业解决"安全问题",在 AI 业解决"成本问题"。
四、v4.0 的六件套:从单点工具到系统
caveman v4.0 不再只是一个"压缩输出"的 skill,它变成了六件套(caveman 叫 "rocks"):
| Rock | 做什么 | 效果 |
|---|---|---|
| Say less | 压缩输出语言 | 63→20 token |
| Read less | 压缩输入文件(CSV/日志/YAML) | 28k→314 token(98.9%) |
| Auto | 自动选模型(贵模型做难题,便宜模型做简单题) | 54% 成本下降 |
| Blocks | 复用之前的代码块 | 397→76 token |
| Waste fixes | 识别并跳过无效修复 | 减少空转 |
| Browse | 压缩网页内容 | 129.8x 体积减少 |
这解决了一个根本问题:agent 不需要读全文件,它需要的是文件的"结构"。你问"这个 CSV 里有没有 null 值",agent 不需要看每一行,它需要看 schema 和 null 统计。caveman 的 Read less 就是把"全文件"变成"结构摘要"。
五、Auto:让模型自己选模型
Auto 是 v4.0 最有意思的设计。它做的事情是:根据任务难度,自动选择模型。
- 简单任务(比如格式化 JSON)→ 用 Haiku(便宜)
- 中等任务(比如写一个 React 组件)→ 用 Sonnet(中等)
- 困难任务(比如调试并发问题)→ 用 Opus(贵但强)
这背后的洞察是:不是所有任务都需要最贵的模型。大多数编码任务的难度分布是长尾的——80% 是简单任务,20% 是困难任务。固定用最贵模型,等于为 80% 的简单任务付了冤枉钱。
Auto 做的事情像一个好的项目经理:简单活派给初级工程师,难活派给高级工程师,不是所有活都让技术总监干。
六、"Your prompts stay yours":一个反直觉的设计
caveman 有一个原则叫 "Your prompts stay yours"(你的 prompt 还是你的)。
什么意思?caveman 不会压缩你的输入 prompt,只压缩 agent 的输出。如果你把 prompt 也压缩成 caveman 风格,agent 的回答质量会下降。
为什么?因为模型是在"完整 prompt"上训练的。你给它 caveman 风格的 prompt,它就离开了训练分布,回答质量下降。但模型的输出不需要完整——输出是模型"生成"的,不是"理解"的,压缩输出不影响理解。
这是一个精妙的区分:输入要完整(匹配训练分布),输出要精简(只留信息)。很多 token 优化工具搞错了这一点,把输入也压缩了,结果答案质量下降。caveman 的设计是:只在输出端做压缩,输入端保持原样。
七、Blocks:代码复用的正确姿势
Blocks 解决的是另一个问题:agent 反复生成相同的代码块。
比如 agent 在调试时跑了 5 次测试,每次都输出完整的测试代码。这 5 次的代码 90% 是一样的,只有几行不同。caveman 的 Blocks 会识别这种情况:第一次输出完整代码,后续只输出 diff。
397 token 变成 76 token。这不是"压缩",是"去重"。
这像 git 的设计哲学:第一次 commit 存完整文件,后续 commit 只存 diff。caveman 把同样的原则应用到 agent 输出上。
八、为什么这件事比看起来重要
caveman 表面上是一个"省 token 的工具",实际上揭示了一个更深的洞察:
AI agent 的输出有大量"结构性冗余"。
不是模型在"思考"时浪费 token,是模型在"翻译思考结果为自然语言"时浪费 token。模型的思考过程是高效的(内部是向量运算),但输出过程是低效的(要生成符合语法的自然语言)。
caveman 的六件套分别针对六种不同的冗余:
- Say less → 输出语言的冗余
- Read less → 输入文件的冗余
- Auto → 模型选择的冗余
- Blocks → 重复输出的冗余
- Waste fixes → 无效尝试的冗余
- Browse → 网页内容的冗余
Adobe 和 JetBrains 认真研究 caveman 的原因就在这里:它不是在"省 token",是在"揭示 AI 输出的冗余结构"。当你说清冗余在哪里,压缩就是自然而然的结果。
链接
- 仓库:https://github.com/JuliusBrussee/caveman
- 主页:https://caveman.so
- Adobe Research 引用:见 caveman 主页