如何让 Claude Code 在不知情时停止“胡编乱造”(附精确设置方案)

@0x_rody
英语1个月前 · 2026年6月06日
346K
256
29
8
1.2K

TL;DR

本指南提供了一套全面的 4 层框架,通过实施严格的诚实规则、验证协议和自动化 Linter 钩子,防止 Claude Code 在生成函数或测试时产生幻觉。

Claude Code 每天都在对你当面撒谎。编造的函数、虚构的导入、"测试通过"时其实什么都没跑。解决办法是一个四层机制,让撒谎的代价变得高昂。

Claude 告诉你 bug 修好了。两小时后你发现它调用的函数根本不存在。

大多数开发者学会了反复核查一切,然后去责怪模型。真正的解决办法是在每一个谎言离开你的机器之前就将其捕获。

以下是完整的诚实机制 **👇

rody - inline image

为什么 Claude 会瞎编

Claude 本质上是一个文本预测器。当它不知道某件事时,它会预测那些看起来合理的文本。编造的函数名看起来像真的。信心满满地说的胡话,和信心满满地说出的真相,读起来没有区别。

只有等到两小时后你的代码崩溃,并且你还得多花一小时调试时,你才看得出区别。

解决办法不是更聪明的模型。而是让 Claude 的输出能够实时被检查,并且让"我不知道"的成本低于瞎猜。

下面这 4 层机制,加在一起几乎能把瞎编的概率降到零。

rody - inline image

第一层:CLAUDE.md 中的诚实规则

第一层是在 CLAUDE.md 中设置一组规则,明确告诉 Claude 在什么时候、以什么方式承认不确定性。把这个放在你的项目根目录:

markdown
1## 诚实规则(每次对话回合都要阅读)
2
3在声称某个函数、类或导入存在之前,请先通过读取文件或运行 grep
4进行验证。切勿捏造符号名称。
5
6如果无法验证,请明确说出"我还没验证这一点"。不要编写依赖
7未经验证的声明的代码。
8
9如果任务要求你使用在这个项目中从未见过的库,请先询问再添加。
10
11如果任务涉及测试或构建,除非你真的在此会话中运行了测试或构建命令,
12否则不要声称成功。
13
14切勿编造错误信息、API 响应或堆栈跟踪。如果你没亲眼看到,就如实说。
15
16当你真的不知道时,正确的答案应该是"我不知道"或"我需要先查一下"。
17这两种回答都比自信的猜测要好。

这些规则看起来显而易见。

但实际上并非如此,因为 Claude 默认是被优化成显得"乐于助人"的,而"我不知道"除非你明确许可,否则会显得不够有用。

最后一行是最重要的。它是说"我不知道"的许可,而大多数人从未给予这个许可。

第二层:先验证再写入的模式

第二层强制要求 Claude 在写入之前先进行验证。把这段内容加到 CLAUDE.md 中的诚实规则下面:

markdown
1## 验证协议
2
3在编写或编辑使用某个符号(函数、类、类型、常量)的代码之前,
4请执行以下操作之一:
5
61. 读取定义该符号的文件,确认签名
72. 运行 `grep -r "符号名" .` 或使用 Glob 工具找到它
83. 检查 package.json、requirements.txt、Cargo.toml 或类似的依赖清单
9
10如果跳过验证,请在代码前加上注释:
11`// UNVERIFIED: 我尚未确认此符号是否存在`
12
13对于涉及多个文件的任务,优先使用"先计划后执行"模式。
14在开始之前使用 Shift+Tab 进入计划模式。

这会让 Claude 每次会话多花几次工具调用。但换来的是节省了你本可能要花在调试虚构函数调用上的数小时时间。

第三层:实时捕获谎言的钩子

第三层是在 settings.json 中设置钩子,每当 Claude 写入一个文件时就运行类型检查器或 linter。如果 Claude 凭空发明了一个导入,检查器会立即失败,Claude 必须在声称任务完成前修复它。

json
1{
2 "hooks": {
3 "PostToolUse": [
4 {
5 "matcher": "Write(*.ts|*.tsx)|Edit(*.ts|*.tsx)",
6 "hooks": [
7 { "type": "command", "command": "npx tsc --noEmit --pretty false 2>&1 | head -20" }
8 ]
9 },
10 {
11 "matcher": "Write(*.py)|Edit(*.py)",
12 "hooks": [
13 { "type": "command", "command": "ruff check --quiet $file && pyright $file 2>&1 | head -20" }
14 ]
15 },
16 {
17 "matcher": "Write(*.rs)|Edit(*.rs)",
18 "hooks": [
19 { "type": "command", "command": "cargo check --message-format=short 2>&1 | head -20" }
20 ]
21 }
22 ]
23 }
24}

钩子的输出会作为上下文返回给 Claude。如果 tsc 说"找不到模块 'foo'",Claude 会立即看到并修复这个编造的导入。没有凭空编造的代码能逃过 PostToolUse 检查。

对于涉及测试的任务,添加一个 Stop 钩子,在 Claude 宣称会话完成之前运行测试套件:

json
1"Stop": [
2 {
3 "hooks": [
4 { "type": "command", "command": "npm test 2>&1 | tail -30" }
5 ]
6 }
7]

现在 Claude 不能再在没有实际运行测试的情况下说"完成了,测试通过"。钩子会执行它们。

结果会返回给 Claude。如果测试失败,Claude 必须修复它们或者承认测试没有通过。

第四层:事实核查子 Agent

第四层是一个子 Agent,它的唯一工作是在 Claude 的声明"发布"之前对其进行核查。

把这个放在 .claude/agents/fact-checker.md

yaml
1---
2name: fact-checker
3description: 在 Claude 对代码功能、测试结果或库支持情况做出声明后使用此 Agent。在每次提交前、每次面向用户的总结前,以及任何引入新依赖的任务后调用。
4tools: Read, Grep, Glob, Bash
5model: sonnet
6---
7
8你负责验证声明,不编写代码。
9
10被调用时,请执行以下操作:
11
121. 识别最近对话中的每一个事实性声明。例如:
13 "函数 X 执行 Y 操作"、"测试通过了"、"库 Z 支持 W 功能"、
14 "这个导入是正确的"。
15
162. 对每个声明进行独立验证:
17 - 代码声明:读取实际文件并确认
18 - 测试声明:亲自运行测试
19 - 库声明:检查实际的包或其文档
20 - 导入声明:确认包在依赖清单中
21
223. 生成一份报告:
23 - VERIFIED: 声明、证据(文件:行号 或命令输出)
24 - WRONG: 声明、实际情况是什么
25 - UNVERIFIABLE: 声明、无法检查的原因
26
27永远不接受"相信我"之类的声明。永远不要做出你自己的声明。
28如果你无法验证,正确的输出是 UNVERIFIABLE。

在提交之前或与团队分享结果之前调用此 Agent。它能捕获其他 3 层遗漏的谎言。

rody - inline image

"我不知道"的许可

Claude 被训练成要乐于助人,而承认无知感觉上不太乐于助人。所以它猜测,并且猜测看起来和真相一样合理。

解决办法是给予不知道的许可。CLAUDE.md 是其中一半。你的反应是另一半。用耐心来奖励"我还没验证这一点",你每次会话都能得到一个诚实的 Claude。用不耐烦来惩罚它,Claude 就会回到瞎猜的状态。

这不是一个配置,而是一种习惯。是整个方案中最被低估的解决方案。

如何判断它真的在起作用

留意你日常会话中的三个迹象。

Claude 在添加依赖之前会询问。"我应该添加 X 还是使用标准库?"而不是默默地 npm install。

Claude 在谈及现有代码时会引用文件:行号。"src/auth/middleware.ts:47 的 validateToken 执行 Y 操作"而不是"validateToken 函数执行 Y 操作"。

tsc 和你的 linter 不再报错。钩子能立即捕获极少出现的捏造,Claude 会自我修正。所以等你去看的时候,谎言已经消失了。

一两天后还没看到这些现象?说明某个层没加载成功。通常是 CLAUDE.md,位置不对或者名字不对。

rody - inline image

让 Claude 持续撒谎的常见错误

CLAUDE.md 太长。 Claude 只读前半部分,后面的就扫一眼。诚实规则要放在前 50 行。

钩子静默记录。 如果输出没有到达 stdout,Claude 就不知道它撒谎了。确保钩子的输出能返回到会话中。

你跳过了计划模式。 那是 Claude 在动手写之前暴露错误假设的地方。跳过它,就等于错过了捕获谎言最便宜的时机。

你不调用事实核查器。 子 Agent 只有在你真正调用它时才起作用。把 @fact-checker 纳入你的提交流程。

你对"我不知道"反应不佳。 惩罚诚实一次,Claude 就会回去瞎猜。没有这个习惯,其他 3 层也坚持不下去。

rody - inline image

5 分钟诚实审计

1 分钟:将 CLAUDE.md 的诚实规则和验证协议复制到你的项目根目录。

1 分钟:将钩子块复制到 ~/.claude/settings.json.claude/settings.json

2 分钟:使用上面的模板创建 .claude/agents/fact-checker.md

1 分钟:运行一个你通常会反复核查的任务。留意 tsc 的输出是否返回给 Claude。确认 Claude 明确说出"已验证"或"我还没验证这一点"。

完成。捏造从"每次会话都发生"降到"很少出现且立即被捕获"。模型没变聪明。是你的设置变聪明了。

感谢阅读!

rody - inline image
一键保存

使用 YouMind AI 深度阅读爆款文章

保存原文、追问细节、总结观点,并在一个 AI 工作空间里把爆款文章沉淀成可复用笔记。

了解 YouMind
写给创作者

把你的 Markdown 变成干净的 𝕏 文章

图片上传、表格、代码块,往 𝕏 上手动重排太痛苦。YouMind 把整篇 Markdown 一键转成干净、可直接发布的 𝕏 文章草稿。

试试 Markdown 转 𝕏

更多可拆解样本

近期爆款文章

探索更多爆款文章