用AI核查AI:我开发的fact-check工具四次踩坑记
上周遇到一件让人后背发凉的事。
AI帮我汇总资料时写道「Claude现在是200k token」,还信誓旦旦地引用了官方博客作为佐证。
但实际上现在已经是1M token了。
它并非故意欺瞒,只是把半年前的数据当作当下事实写了出来。这种失误最危险,因为表述得很肯定、还能搬出各种背书资料,肉眼根本无法辨别。等真正派上用场时才发现「这个早就改了」,之前基于错误信息做出的决策全得推倒重来。
于是我开发了一个叫fact-check的skill,专门让AI去验证AI整理的内容是否准确。工作原理很直接:把内容中的事实陈述逐条提取出来,对照官方文档进行核实,生成一份「正确/过期/错误/无法确认」的四级评估报告,并附带修正差异说明。
听起来挺简单的。但它的4个迭代版本,每一个都是在处理真实任务时被它自己揪出问题,被迫加上新规则才完善的。
下面四个案例,都是使用fact-check前后的真实对比。
场景:让AI帮我整理一份Claude Code配置项速查表,准备放进团队知识库给同事参考。AI整理出一堆功能说明,我跑了第一版fact-check。
使用前:速查表里有十几条事实陈述(「X参数默认值是Y」「Z配置项已废弃」这类),全靠我手动一条条翻文档核对,花了整整一上午。
使用后:fact-check跑完,告诉我「检查了12条陈述,1条错误、1条过期」。
听起来挺好?但我数了它前面列的提取表格:14条。最终正式报告里又只列了11条。
三处数字完全对不上。它中间合并了?丢失了?还是遗漏了?一个字都没解释。
我根本无法判断它说的「1错1过期」对应哪几条。那条错误是Claude Code的某个参数?还是某个已废弃的配置?过期的那条是默认值变了?还是字段名变了?无法追踪、无法验证、无法修改。我跑这一遍fact-check干了什么?什么都没解决。等于白查。
补充v1.1规则:禁止无声合并或丢弃;三处数字必须保持一致(提取表行数=口述数=报告表行数)。如果做了合并或丢弃,必须在报告末尾明确说明哪几条被合并了、原因是什么。
场景:让AI帮我整理一份「Claude桌面端产品对比」给同事看,要说清楚Claude Desktop和Claude Code Desktop的区别。
使用前:AI整理的初稿中写道「Claude Desktop侧重聊天、Claude Code Desktop侧重编程,是两个独立的应用」,听起来很有逻辑。
使用后:fact-check跑完,连续两轮都告诉我:「作者把它们当作两个应用是正确的✅。」
理由听起来逻辑很通顺:一个在support.claude.com的文档里,一个在code.claude.com的文档里,连官方文档站点都不同,能是同一个吗?
但实际上就是同一个应用。
只是这个应用在不同时期、不同业务线下,文档站用了不同的名字。下载下来是同一个安装包。
我让它做「交叉验证」才发现的:去官方下载页看是不是同一个安装包、去FAQ查有没有「X和Y是什么关系」、去官方博客查历史更名记录。它做完才说:「哦,是同一个东西。」
整份对比要从「两个应用对比」改成「同一个应用的两种使用模式」,差别大了去了。
补充v1.2规则:名称不同不代表实体不同。当同一概念在不同的官方文档站出现不同叫法时,必须先做交叉验证(下载页、FAQ、博客)再下结论。
场景:5月15日,让AI帮我整理三份对比清单给团队:「Cursor Rules vs Anthropic Skill」「AGENTS.md跨工具兼容性」「always-on Rule的最佳实践」。
使用前:第二份清单里写「AGENTS.md是开放标准,Cursor、Codex、Claude Code都原生支持✅」。
这话不是AI这次自己想出来的。是我之前跟另一个AI聊「AGENTS.md是行业标准」时,它顺嘴推断「既然是开放标准,那同类AI工具都该支持」,我就信了,记在脑子里、又口头传给了这次的AI。
使用后:fact-check跑出来的报告里,有一行让我心里一沉:
「Claude Code官方明确写的是读取CLAUDE.md,而非AGENTS.md,不支持原生读取AGENTS.md。」
我愣住了。我之前一直以为「AGENTS.md谁都支持」是常识,结果是从一次AI顺嘴推断里来的,我自己根本没核实过。
幸亏跑了fact-check,否则这条「权威性错误」就要进团队知识库了:说得很有把握、引了一堆背书,但核心结论不对。看到的人一旦把AGENTS.md配置给Claude Code,怎么都跑不通,回头还以为是自己的配置出了问题。
补充v1.3规则:「行业标准」不等于「每家都支持」。跨工具支持声明必须每家工具独立去官方文档查明确的explicit支持声明,不能默认推断。
场景:那三份对比简版做完后,让AI帮我把每一条都加上正例和反例,做成详细版。
使用前:详细版里加了两个看起来很合理的例子:
「.cursor/rules只有Cursor能看到,.codex/只有Codex能看到→都是工具私有格式」
「Claude现在是200k token,always-on Rules一多就挤爆上下文」
使用后:fact-check又揪出两个问题。
第一个,.codex/这个目录根本不是「Codex的私有指令格式」。它是Codex的配置目录,存放的是config.toml、auth.json、history.jsonl这种东西。说白了就是Codex自己的设置和登录信息,不是用户写给AI看的指令。Codex真正给AI看的指令文件,用的是开放标准AGENTS.md。
我把它当反例举,是完全搞错了。应该换成.windsurfrules那种真正「只服务一家工具」的格式。
第二个,「Claude现在是200k token」这句话半年前写是对的。今天再写就是错的。Claude Sonnet 4.6/Opus 4.6(2026年3月13日起GA)已经是1M token。
补充v1.4规则:
1.看到.xxx/目录名别想当然,先去查官方docs那个目录到底是「配置」还是「私有指令」
2.上下文窗口、价格、版本号这种时间敏感的「现状数字」必须当场查最新官方源,不能信作者写的时候的数字
回头看这4个版本,每一条新加的规则都不是我空想出来的:
这跟我以前写工作流文档完全不一样。
以前写文档,我习惯先把「所有可能踩的坑」想一遍,写进去。听起来很周全,但实际上你想不到的坑它一定会踩。
那些坑只能在真实场景里冒出来。
skill也一样。第一版只能写到「最少能跑」的程度,剩下的规则全靠它自己跑出来被打脸、再回头补。
那这种「被打脸式迭代」危险吗?
危险。但它是唯一可靠的路径。
如果我不让它在真任务里跑,我永远不会发现它会「静默合并陈述」,也永远不会发现「Claude 200k token」这句话已经过时了。
写完这一轮,我对「AI给AI审稿」这件事有了新的理解。
很多人以为,AI之间是「自证陷阱」:A编了一段错话,B看不出来,因为B跟A是同一拨训练数据训出来的,两个AI会串通。
但fact-check这一轮跑下来,我发现并不是。
AI不会跟AI串通。AI+工具+规则,才会跟AI翻脸。
原因是B根本不是「另一个A」。
B是A加上一套工具、加上一套规则。A的目标是写得通顺,B的目标是找到原文。A用脑子里的记忆(有截止日的训练数据),B必须当场去拉实时官方文档。A没人逼它「找不到不许猜」,B被强制了。
所以B抓A的,不是它自己的智慧,是「实时世界」。官方文档才是真正的裁判,B只是搬运工。它甚至会抓出我之前跟另一个AI对话时被顺嘴带偏的判断,因为带偏那次也是「靠记忆」,跑fact-check时B拿的是「实时docs」。
反过来也成立。如果让B去审一段「我建议你这样做」的方法论,外部没有官方源可查,B跟A一样只能凭感觉,结论会高度相似。这就是为什么fact-check写明「跳过方法论不审」:不是看不上,是真的审不了。
但前提是你得给它规则。没有规则的B,确实会跟A串通(「差不多就是这样吧」);有规则的B,会在你最不希望的地方拆穿你(「这话是错的,幸亏被拦下来了」)。
写fact-check的过程,本质上是在给AI装「自我反省」的能力。
而它装得最好的地方,不是技术多复杂,而是4个版本里每一条规则都来自被自己揪出现行——没有这一步,规则就是空话。
人也一样。你想自查的时候,光在脑子里转一圈不算数。得把「裁判」搬到脑子外面:数据、checklist、不留情面的朋友。
你最近被AI一本正经地骗过哪条信息?评论区聊聊。
👉推荐阅读
《AI给我照了张10年阅读X光片,震惊到我了…》
《AI按点上班的三种姿势》
《我让4个AI同时干活,结果它们打起来了》