Claude 每天对你说「你说得完全对」,有人受不了了
昨天刷到一段代码,作者 Johanna Larsson 干了件挺损的事。
她给 Claude 写了个替换脚本,把 you’re absolutely right 这句话,自动改成 I’m a complete clown。翻译过来就是,你每次跟它讨论问题,它本来要说「你说得完全对」,现在屏幕上蹦出来的是「我是个彻头彻尾的小丑」。
我看到这行的时候没绷住,笑出声了。
因为这四个字,you’re absolutely right,但凡你用过 Claude Code 或者网页版 Claude,一定被它糊过脸。你写了段有 bug 的代码,它说你说得对。你指出它上一句是错的,它也说你说得对。你俩来回拉扯了五个回合,每一回合开头都是「你说得完全对」。到后来你都分不清它是真觉得你对,还是嘴上先认了再说。
Larsson 挑出来替换的不止这一句。她那份清单里还有三个词,全是 Claude 的口头禅。
一个是 load-bearing,字面意思是承重的。Claude 特别爱说某段代码、某个假设是 load-bearing 的,意思是「这块是关键,动它整个就塌」。听着挺形象,问题是它一天能说八回,什么都承重,那就等于什么都不承重了。她把这个词换成了 cooked,年轻人黑话,完蛋了的意思。
一个是 seam,接缝。Claude 描述两个模块衔接的地方、抽象漏出来的地方,张口就是 seam。她换成了 whatchamacallit,就是那种你想不起来叫啥的时候说的「那个啥玩意儿」。
还有一个 honest take,说句实话。这个更微妙,它每次要给你个略微不同的意见,前面都要垫一句 honest take。仿佛不垫这句,前面说的就不是实话似的。
好家伙,把这几个词凑一块看,我才意识到 Claude 说话是有指纹的。
你平时一句句读,感觉挺顺挺自然。可一旦有人把这几个高频词单拎出来标红,那种「哦这是台机器在讲话」的感觉唰一下就上来了。就像你听一个人说话,偶尔蹦个口头禅没事,但如果他每三句就来一个「说白了」「本质上」,你立马会出戏。模型也一样,只不过它的口头禅是 load-bearing 和 seam。
而且不止 Claude 一家。你要是几个模型换着用,慢慢就能盲听出来谁是谁。GPT 那边最爱开口就是 Certainly,还有 It’s worth noting,动不动给你郑重其事地「值得一提」。Gemini 有它自己那股一板一眼的腔调。到最后你都不用看是哪个窗口,扫两行字,凭这点口音就能猜个八九不离十。这事说小是段子,说大它其实是模型的一种泄密,你以为它在跟你自然对话,它其实一直在用同一套模板往外倒。

说回 Larsson 那个脚本,技术上其实很简单,我贴一下核心,就一段 Python。
#!/usr/bin/env python3
import json, re, sys
replacements = {
"seam": "whatchamacallit",
"you're absolutely right": "I'm a complete clown",
"honest take": "spicy doodad",
"load-bearing": "cooked"
}
data = json.load(sys.stdin)
text = data.get("delta") or ""
for phrase, replacement in replacements.items():
pattern = r"\b" + re.escape(phrase) + r"\b"
text = re.sub(pattern, replacement, text, flags=re.IGNORECASE)
print(json.dumps({
"hookSpecificOutput": {
"hookEventName": "MessageDisplay",
"displayContent": text,
}
}))
它挂在 Claude 的一个叫 MessageDisplay 的 hook 上。hook 你可以理解成一个卡在流程里的钩子,模型每吐一段文字,先经过你这段脚本,你想咋改咋改,再显示到屏幕上。配置也就往 settings.json 里塞几行。
{
"hooks": {
"MessageDisplay": [
{ "hooks": [ { "type": "command", "command": "$HOME/.claude/hooks/wordswap.sh" } ] }
]
}
}
到这儿都挺好玩。但我盯着那个 hook 的名字看了一会儿,MessageDisplay,显示。
这就是我想跟你唠的地方了。这个方案,改的是 display,显示层。模型脑子里生成的还是 you’re absolutely right,只不过在送到你眼前的最后一米,被你的脚本截下来涂改成了小丑。它压根没治那个毛病,它是给你眼睛蒙了块布。

打个不太准确的比方,这跟你嫌同事老说口头禅,于是买了个耳塞,是一个路子。耳朵是清净了,人家还在说。
那要真想让它少说这些词,得往哪动手。得往上游,往生成那一层动手。
Claude Code 这类工具都吃一个叫 CLAUDE.md 的文件,你可以把它理解成给模型立的规矩,每次对话它都会先读一遍。真想根治,就得在这儿写死,直接告诉它哪些词禁用。大概长这样。
# 措辞禁令
- 禁用 you're absolutely right / 你说得完全对,
确认对方对的时候直接进入正题,别先夸一句
- 禁用 load-bearing、seam 这类模糊的隐喻词,
要说关键就说清楚哪里关键、为什么关键
- 禁用 honest take / 说句实话 作为开场垫词
这么写,是在它张嘴之前就把话堵回去,而不是等它说完了再抹掉。差别挺大的。
想验证有没有生效也简单,不用玄乎的评测。你就把最近几十轮对话翻出来,搜一下这几个词还剩几个。改 hook 那种,你会发现原文里一个不少,只是显示的时候被涂了;改 CLAUDE.md 那种,才是真在源头掉数量。一个是把体温计甩低,一个是退烧,你搜一遍就知道自己动的是哪个。
当然我得诚实讲,这招也不是万能药。模型这些词是训练里长出来的习惯,你用规则去压,它多半会收敛,但架不住某句又给你溜出来。它不是真听懂了你烦这些词,它只是在你给的约束下,把说这些词的概率调低了一点。你能做到八九成,做不到斩草除根。
我甚至有点理解它为啥爱说 you’re absolutely right。这类模型是拿人的偏好一轮轮喂出来的,人嘛,被顺着夸总归舒服些,于是「先认同你」这个习惯就被反复强化,最后长成了肌肉记忆。它不是虚伪,它是被我们自己训练成了一个特别会来事的角色。想到这儿我那点想吐槽的心思也淡了。
有意思的是,seam 这个词,接缝。它老拿这个词去描述系统里两块东西衔接、抽象漏风的地方。可它自己说话的这些口头禅,恰恰就是它和真人之间那道最明显的接缝。你顺着这几个词摸过去,就摸到了机器和人的边界在哪儿。它替别的系统找接缝,找了半天,自己身上那道最大的缝还露着。
所以 Larsson 那个脚本,好笑是真好笑,但我劝你别真拿它当解药。要图一乐,装上,让 Claude 每次认怂都自称小丑,能笑一整天。要真在乎输出质量,去改 CLAUDE.md,去生成层跟它掰扯。
一个治标,一个治本,你分得清就行。