如何使用 MessageDisplay Hook 替换 Claude 的重复性短语

如何使用 MessageDisplay Hook 替换 Claude 的重复性短语

使用 Hook 替换 Claude 的重复性短语

核心结论: 你可以通过安装一个 MessageDisplay hook 来抑制 Claude 最喜欢的口头禅(例如 load‑bearinghonest take),该 hook 会运行一个微型脚本,在输出到达你的屏幕之前对其进行重写。


为什么 Hook 很重要

Claude 经常在代码解释和散文中插入相同的习语——load‑bearing seamshonest takesspicy doodads。用户报告称,这些重复性内容令人感到突兀,尤其是在阅读预期为人类口吻的非技术文本时。该 hook 提供了一种即时、用户可控的修复方法,而无需重新训练模型。


Hook 的实现方式

  1. 创建替换脚本 (wordswap.sh)。该脚本读取 Claude 的 JSON delta,应用不区分大小写的正则替换,并输出新的 JSON payload。
#!/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,
    }
}))
  1. 使脚本可执行
chmod +x ~/.claude/hooks/wordswap.sh
  1. ~/.claude/settings.json 中注册 Hook
{
  "hooks": {
    "MessageDisplay": [
      { "hooks": [ { "type": "command", "command": "$HOME/.claude/hooks/wordswap.sh" } ] }
    ]
  }
}
  1. 重启 Claude(或开始新会话)。该 hook 会在每次显示消息时自动运行,实时替换定义的短语。

社区反应

“当我与 Claude 协作编程时,我不介意它使用那些典型的 Claude 式用语。但当我阅读博客文章、电子邮件或其他形式的散文时,看到那些相同的 Claude 式用语,我会感到非常困扰。”doctoboggan

“LLM 现在每天通过数十亿个 token 广播单一模型的措辞偏好,因此任何特有的短语都会显得非常突兀。”infogulch

“我整理了一套技能来审查其写作,并让它编辑自己的输出(例如代码注释)。这有所帮助,但默认词汇量仍然感觉有限。”pocketarc

“我在 CLAUDE.md 中保存了指令以避免此类陈词滥调,但模型的过度复杂化倾向仍然存在。”btbuildem

这些评论说明了两个更广泛的观点:

  1. 风格偏好是一个真实的可用性问题,当 LLM 的输出被视为人类撰写的文本时。
  2. 用户侧的后处理(hook、自定义提示词或自我编辑技能)是主要的缓解策略,直到模型提供商开放更细粒度的风格控制。

扩展方法

  • 添加更多模式replacements 字典可以包含任何你觉得烦人的短语,例如 “substrate”、“steelman” 或 “production ready”。
  • 动态配置:将映射关系存储在单独的 JSON 文件中,并在运行时由脚本加载,从而实现无需编辑脚本即可进行即时更新。
  • 条件逻辑:使用 data payload 来检测消息角色(例如 assistantsystem),并且仅重写 assistant 消息。
  • 结合其他 Hook:Claude 支持多种 hook 类型(例如 MessageSent, ToolCall)。你可以将它们串联起来,以同时过滤输入和输出。

潜在的权衡

  • Latency:hook 会增加一个微小的处理步骤;大多数用户报告延迟几乎可以忽略不计,但极高吞吐量的会话可能会察觉到几毫秒的延迟。

  • Context loss:替换短语会改变 Claude 生成的精确 token 序列,这可能会影响下游的基于 token 的分析(例如日志解析)。如果你需要原始的 delta,请保留一份副本。

  • Model behavior:一些研究人员认为,改变模型的输出可能会微妙地影响其内部注意力模式。目前还没有具体的证据,但如果你依赖 Claude 进行高度敏感的推理任务,这值得监控。


核心结论

如果 Claude 的标志性短语破坏了你的阅读流,MessageDisplay hook 提供了一个轻一个轻量级、可逆的解决方案。通过定义一个简单的替换映射,你可以在不牺牲其底层能力的情况下,重新获得对模型口吻的的控制权。

Sources