Vomit:用另一个 LLM 清洗 Claude 5 的 token 呕吐物
文章摘要
Vomit 是 Zach Ahn 写的一个 Go 工具,功能一句话说完:把 Claude 的「token 呕吐物」通过一个本地 LLM 转换成英语。完全本地运行,没有遥测,没有外部依赖,GPL v3 许可。
它的工作方式是挂进 Claude Code 的 hook 体系:缓冲 Claude 的输出,把消息转发给本地 LLM(作者一直用 gpt-oss:20b),等它重写,然后通过 MessageDisplay hook 把修正后的版本显示在会话里,替换掉原来那堆 token。安装是 go install github.com/zachahn/vomit@latest,然后 vomit init 配置本地 LLM 连接,vomit scrub -claude 会给出用 hook 替换 Claude 输出的说明。此外还有非侵入式的旁路模式:vomit list 列出 Claude 会话标识、vomit tail [<session_identifier>] 翻译指定会话(或跟随最新的那个)。它兼容 Llama.app、Ollama,以及「任何用 OpenAI API 的东西」。作者推荐的组合是 Llama.app 加通过它下载的 GPT-OSS 20B。
README 里的免责声明写得很实在:本地 LLM 只能看到 Claude 试图表达的内容(无法访问任何动作或文件),所以它会有一点幻觉;速度挺慢;「完全是 vibe-coded 的,只在 Mac 上测过」;有可能你会彻底错过 Claude 的原始信息,可以用 AgentsView 之类的工具拿回原文,因为 Vomit 在运行时不改动任何东西(技术上只往 TMPDIR 写文件)。
配套博客(zachahn.com/posts/1787191554)交代了动机,语气相当情绪化:他讨厌读 Claude 的「解释」,读的时候血压会升高。他认为荒谬的地方在于——我们按 token 付钱给 Anthropic,然后再花 token 预算去写「该怎么说话」的指令,结果 Claude 要么完全无视,要么把文字弄得更糟,最后只能放弃这个会话、换个会话重试一遍循环。他猜测原因可能是预训练里没包含好的散文写作,也许和人们观察到的「不懈的主动性(relentless proactivity)」行为有某种相关。他把 Vomit 定位为一个「艺术项目」,并给了一个真实例子:他让 Claude 改写 git 历史后的汇报,原文有「一个警告,而且是真的警告(One caveat, and it’s a real one)」这种小标题、破碎的名词短语列表和大量被动构造;经 GPT-OSS-20B 重写后变成连贯的第一人称叙述——我 force-push 了分支、我核对了本地和远端都在同一个 commit、老的 tip 仍能在 GitHub 上通过完整 SHA 拉到、我删掉了 FETCH_HEAD 并 expire 了 reflog、如果你想让那些 commit 在 GitHub 侧也不可达,可以找 GitHub Support 跑 GC 或删库重建。他的感慨是:竞争对手(OpenAI)那个免费的、小的、20B 参数的开源模型,在写作上打败了 Anthropic 的旗舰 Opus 模型,这件事很疯狂;而更关键的判断是——「我不认为值得花这么多 token 去求 Claude 写好一点。它做不到。我们是工程师,我们造解决方案。」
HN 评论精华
这条帖子 303 分、297 条评论。作者 zachahn 全程在评论区活跃。讨论主线有三条:一是集体确认「Opus 5 的散文风格确实退化了」并交换各种缓解方案;二是一场关于「抱怨 LLM 文风是不是无病呻吟」的正面冲突;三是对成因的技术推测。此外还有一条明显偏离主题的支线,是关于 Anthropic 在 HN 上口碑变化的讨论。
- user102030 直接把整个工具的核心——那段 prompt——贴了出来,可以看出作者的诊断有多具体:扮演编辑,输入的消息会有这些奇怪特征——主语动词的诡异搭配、本该是宾语的东西当了主语、绕来绕去还夹着伪顿悟的推理、干扰阅读节奏的「拍子」、自我表扬;请去掉这些特征,用清晰的对话式风格重写,保留意图、不丢细节。具体规则包括:消息通常用第一人称;只有人、人的集合、agent 可以做「动作动词」;物体永远不该做事(要避免「X carries…」「X names…」这种);API 是动作动词规则的次要例外,可以做 CRUD、排队、运行、调用这类刻板动作;避免破折号,因为它会加进一个干扰性的停顿。
- imalerba 指出还有一个同类项目叫 claudish-to-english(gvzdv/claudish-to-english),名字他更喜欢。rafram 发现了全场最好笑的一点:那个项目自己的 README 里满是漂亮的 Claudish,比如「如果 CLAUDISH_MODEL 指向一个你还没拉取的模型,每次重写都会被跳过——附带上面那条一次性通知」。LtdJorge:「本来也想说这个,那个 README 根本读不下去。」
- 对症状的描述构成了这条帖子最强的部分。dgfl 说 Opus 4.x 有的每一个语言怪癖在 Opus 5 上都被推到了 11 档,「名词在动词化,缝在缝合(nouns verbing and seams seaming)」,除了代码之外完全不可用,而且他有一半的时候得在 commit 前删掉它那些莫名其妙的注释。incrudible 说 Opus 5 对他而言字面上无法忍受,比 4.8 差得多,而 4.8 本来就已经很烦。jmuguy 说得最直接:如果你不觉得整天读几十段这种东西近乎不可能,那我只能假设你根本没在读——他现在连略读都抓不到要点,「我其实宁愿它像原始人或幼儿那样说话,只要我能快速消化」。astrange 的比喻是本期最生动的:他这辈子读过不少难懂的东西,比如 C++ 报错信息,但 Opus 5 是他第一次感觉「被自己的终端毒害」,「我一直得离开去公司健身房」。crab_galaxy 贴出五分钟前 Opus 的真实输出片段(大意是「过滤器,包括没有过滤器。请求携带页面已有的任何过滤器对象。……这里没有任何一步是基于含义做选择的。它是一个过滤、一个排序、一个切片。」),并指出最糟糕的是:即便要求它用简单英语或 200 词以内总结,它也做不到,「它根本无法被引导去写出可读的散文」。ashdksnndck 接了一句:「照这个势头,Claude 很快就要开始写欧陆哲学了。」
- 反方阵营同样有分量。extr 说这种对 LLM 输出风格的抱怨很难为情:这些东西不是你的酒友,是专业工具;术语滥用当然烦,但它不是「字面上无法阅读」的,只是不理想——「我大部分工具都不理想,这没关系,这就是我拿工资的原因」。256BitChris 附议:这些东西在做以前需要昂贵工程师花几个月、质量还更差的活,而我们的反应是挑它比我们希望的更啰嗦?就像对付啰嗦的人一样,过滤噪音抓重点本身是种技能。cortesoft:在所有对编码 agent 的抱怨里,「我不喜欢它的解释性散文」排得挺后面。反驳来自 latentsea:没有什么东西以 100 倍速度和质量在完成,我们得一天八小时坐着读这些 LLM 输出,读它们的 UX 非常重要。bcooke 把不满的来源说清楚了:抱怨源于看着沟通风格明显退化,而这对想用这些东西做事的人是大问题——他们在持续跟工具搏斗,同时还要承受营销和虚假承诺的轰炸以及裁员、压力、疯狂预期这些更广的后果。
- 缓解方案的交流很实用,也很悲观。juancn 给出的咒语是让它使用 ASD-STE100 简化技术英语(在不损害含义时);vardalab 试过把 Claude Code 的 output style 改成 ASD-STE100,效果仍然不大,还是会冒出「Standing where it stood」这种宝石;ivankabiden 认为 ISO 24495-1 比 ASD-STE100 好得多,因为后者词表受限,常把精确的技术术语替换成简单但含糊的说法。cjk 分享了一个元操作:他直接问 Opus 5 该怎么指示它不啰嗦才会真的被遵守,得到的答复大意是「『简洁』『短』不是客观度量,试着给一个严格的字数预算」,于是他改成「除非我要求展开,用不超过一段回答,句子不超过 20 词」——「有点管用」,但仍会被经常违反。zachahn 回复说这确实符合 Anthropic 自己的文档:每条规则都应该有非主观的通过/失败判定方式;不过他补充「说『好建议』也许不如说『这是我们目前能拿到的最好建议』准确」。他自己的结论很干脆:他试过 output styles,试过用 hook 反复告诉它做好一点,都没帮上忙,「我发现配一个小 LLM 的 vomit 比 Opus 5 自己写过的任何东西都好。我不认为 Opus 5 会写作。」对于用 hook 灌指令这条路,他的批评是:这么做很蠢——要一遍遍逐字重复地浪费我们自己付钱的大量 token,结果它照样无视指令,这是对钱和算力的浪费。bcrosby95 指出问题的机制:这类要求必须随每一轮一起注入,否则 LLM 很快漂移,他是先在自己写的 D&D harness 里注意到的(那里特别明显)。tombot 的方案最省事:切回 Opus 4.8,能力一样,输出还能看懂;purpleflame1257 说他「降级」到了 Opus 4.6,那是最后一个没有这些问题的版本。onoesworkacct 的做法是在长任务末尾用一个无上下文的 subagent 改写,他发现 Haiku 的写作风格很好,主 agent 再去修正事实错误。NitpickLawyer 推荐本地的 Muse Glimmer 30B,理解力足够读一个 repo 找到相关内容,输出风格开箱即用没有废话。data-ottawa 的流程更极端:用 Mistral medium 重写 Claude 的全部文档和注释,然后自己再改一遍 Mistral 误解的部分。
- 关于成因的讨论有几个值得记的观点。svachalek 提出 Ouroboros(自噬)理论,并引用 OpenAI 对 ChatGPT 为何执着于 goblin 的官方解释作为类比:某种风格被奖励 → 部分被奖励的样本含一个独特词癖 → 该词癖在 rollout 中更频繁出现 → 模型生成的 rollout 被用于 SFT → 模型更习惯产出这个词癖。zachahn 表示不太确定这(目前)成立,因为他认为这些新模型是在结果上训练的(agent 用最少提示把代码跑起来),而不是在文本上,即所谓 RLVR。astrange 的解释更直接:预训练里满是糟糕的写作但并不造成问题,写作风格来自后训练,这次变差是因为他们优先了 agentic 能力。qlte 展开了同一逻辑:我们已经过了 peak-RLHF 好几代,现在更多是 RLVR,恰好与 benchmaxxing 军备竞赛和 agentic coding 的市场契合,而语言演化可以用「越来越多层的模型评判模型、用模型开发模型」来解释。bcooke 补了一个 RLHF 侧的假设:当数百万人只是略读回复、或在自己能力范围之外操作却给出不合格反馈时,大规模 RLHF 的自然结果就是「听起来聪明」压过「真的聪明」。
- svara 提出了唯一一条系统性的「其实还好」的辩护:他几个月前也很受挫,但发现自己开始学会这门方言了——它对「密集术语」和「僵硬隐喻」的使用其实惊人地一致,它在说自己的方言,你会习惯,之后读起来会容易很多甚至有效率,因为那些怪隐喻在 Opus 语里往往有精确含义(Fable 说的是非常相似的方言)。retrac 从另一个角度补充并部分反驳:这门方言其实是你和 Claude 基于会话历史和记忆共同特化出来的——他注意到 Claude 的输出在模仿他自己的写作风格,连他偏好的拼写都学了;而正如 HN 上多条评论所暗示的,这种在一个人脑子里可以极其精确的行话,一旦多人一起使用就会迅速崩塌。cafebeen 指出一个真实风险:习惯这种沟通风格之后,我们可能不小心把它用在与真人的交流中——他已经在各种会议上看到会话特化的 LLM 行话冒出来,说话者自己毫无察觉,有人会点出来,有人则干脆从讨论中断线。porkpieshoe 用一句自带 Claudish 的话完美收尾:「你说得完全对,把 LLM 行话作为人类说话者采纳会是一个承重(load-bearing)的错误。」
- bob1029 提出了最锋利的战略性质疑:如果我们需要用另一家厂商的模型给它 100% 的输出当保姆,那还值得用 Anthropic 的模型吗?为什么不直接全用那家的?他还指出这种帖子能上首页的前提,是「OAI 极差、Anthropic 无可指摘」那个年代的遗留物,这种随时间的翻转正是他避免在技术厂商上搞部落主义的原因。回应有几个不同角度:lxgr 说几乎所有模型现在都能做好风格迁移,但「真正的推理」不行,如果两者组合比各自单用效果更好,为什么不叠起来用?RogerL 指出个人可以随风摇摆,但买了一千个席位、投入大量培训、定好政策、审过允许哪些扩展的公司,迁移成本高得多。nijave 补了一个务实的合规视角:在中小企业侧,你可能有钱买 Claude 订阅(每 token 性价比通常很好)但其他选项受限于合规文书、成本、财务、法务;他个人在家不会用 Anthropic,但在公司这是把数据留在美国境内的最具成本效益的选项之一(他们的美国客户倾向于要这个)。excentricus 认为技术上切换模型和 harness 非常容易,Anthropic 真正的护城河可能就是 FOMO。
- 一条明显偏离标题的支线是关于 Anthropic 口碑的:wood_spirit 回忆「几个月前」Anthropic 因为对当局的道德立场加上普遍认为模型最好,在 HN 上是获得声援的挑战者,而最近的温度像是「他们已经跳过了鲨鱼」——品牌不再散发伦理气味,模型也令人失望。qwerpy 的解读是 HN 的情绪通常对一切都酸,只会被情绪化(通常是政治性的)事件短暂影响,反当局的加成过去了,于是又回到对 Anthropic 发酸。Otterly99 则认为是 Dario 本人毁了声誉:他年初那篇「AI 极度危险、我们需要护栏」的文章看起来真的在担忧,但后来言行分裂变得明显。