Claude 每天对你说「你说得完全对」,有人受不了了

小岛AI 2026 / 07 / 15

昨天刷到一段代码,作者 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,只不过在送到你眼前的最后一米,被你的脚本截下来涂改成了小丑。它压根没治那个毛病,它是给你眼睛蒙了块布。

hook 改的是显示层,话到眼前的最后一米才被涂掉,模型脑子里那句根本没变

打个不太准确的比方,这跟你嫌同事老说口头禅,于是买了个耳塞,是一个路子。耳朵是清净了,人家还在说。

那要真想让它少说这些词,得往哪动手。得往上游,往生成那一层动手。

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,去生成层跟它掰扯。

一个治标,一个治本,你分得清就行。