去年有个数据让我愣了一下:Anthropic自己写的AI代理,连续跑8小时写代码,最后自我评估通过率97%,人类一看全是毛病。
我盯着屏幕看了很久。这不就是我吗?
过去半年我用Claude Code搭产品,每次问"这段实现对吗",回答永远是"是的,实现正确"。每次。哪怕代码带着明显bug上线崩掉。我以为是提示词没写好,直到Anthropic 2026年3月发了那篇《Harness design for long-running apps》,才发现问题根本不在提示词——我让生成器自己当裁判,这本身就是设计缺陷。
97%通过率 vs 人类判官:同一套代码,两种结局
Anthropic的实验设计很直白:让AI代理自主开发应用,多轮迭代,每轮自我评估。结果代理们对着明显平庸的产出自信点赞,甚至发现真问题后也会摆摆手说"不重要",然后照样通过。
他们原话是:「Claude is an inadequate QA agent out of the box.」
翻译过来:开箱即用的Claude,是个不合格的质检员。
但同一批实验里,Anthropic换了个架构——把生成和评估拆成三个独立代理——结果完全不同。评估代理每轮检查27项标准,提交的bug报告细到「fillRectangle存在但mouseUp时不触发」这种粒度。
我复盘了自己的Claude Code配置:CLAUDE.md塞满项目背景,Skills存着代码模式,但没有一个环节在真刀真枪地验货。我就是在重复Anthropic文档里的失败模式,只是之前不知道这叫失败模式。
规则文件:把踩过的坑变成AI的"肌肉记忆"
Claude Code有个隐藏机制:~/.claude/rules/目录下的文件每会话自动加载。这里适合放AI自己不会主动做、但生产环境要命的事。
我的Supabase/PostgreSQL规则现在30条,挑三条最痛的:
外键索引:PostgreSQL不会自动给外键列建索引。AI写schema时从来不管这个,查询慢了你才知道。
RLS性能陷阱:auth.uid()直接用在行级安全策略里,会每行执行一次。正确写法是包进SELECT——AI默认永远写错版本,小表测试通过,生产数据量上来直接卡死。
分页:OFFSET在深度分页时是性能灾难,AI却偏爱这个写法。规则强制改成游标分页WHERE id > $last_id。
这些规则没有一条是"最佳实践"抄来的,全是我真栽过的跟头。我把它们想成"再别踩这颗雷"档案——规则的本质是昂贵的教训,免费共享给未来的自己。
但rules有个硬约束:每会话全量加载,太多会吃掉上下文窗口。任务专属的内容得挪到Skills(.claude/skills/),默认只显示标题,按需触发。
我的CLAUDE.md里配了自动激活逻辑:
测试/TDD关键词 → 触发测试驱动开发Skill
Bug/Error关键词 → 触发调试Skill
这样日常对话不臃肿,关键时刻又能精准调用。
从"你觉得对吗"到"按清单验货"
Anthropic的三代理架构给我最大的启发是:评估不能是随口一问,得是结构化检查。我现在给复杂任务配验收清单,直接写进Skill文件里。
比如前端组件开发,清单包括:键盘导航是否完整、屏幕阅读器标签是否缺失、焦点陷阱是否处理、颜色对比度是否达标。Claude生成代码后,我让它逐项自检——不是问"这组件 accessibility 做好了吗",而是"Tab顺序是否逻辑、aria-label是否存在、焦点丢失后是否恢复"。
颗粒度变了,结果也变了。之前那种"看起来对"的代码,现在在清单里会卡住两三项。
有个细节很有意思:Anthropic的评估代理会主动提交bug报告,而不是简单打勾或打叉。我借鉴了这个——让Claude用固定格式输出评审意见,包括问题位置、严重程度、修复建议。这比"有bug"有用十倍。
重建后的第一个月
改完配置后,我故意观察了一个月的实际表现。最明显的变化是:Claude不再对每个实现都说"正确"了。
有次让它写数据迁移脚本,它自己停下来:「这段在空表测试会通过,但存量数据可能触发唯一约束冲突,需要加ON CONFLICT处理。」——这在以前是上线后报错才能发现的事。
另一次生成API端点,它主动列出:「未验证输入长度、未限制查询结果上限、未处理数据库连接超时。」然后逐条补全。
这些不是模型变聪明了,是评估机制逼着生成器往深里想。就像Anthropic实验里展现的:同一个Claude,有没有独立评估环节,输出质量差一档。
我的规则文件现在还在膨胀。上周刚加了一条:GraphQL resolver必须显式声明N+1查询风险。这是被DataLoader漏配坑过一次后的产物。
你现在的Claude Code配置里,有多少条规则是真正从生产故障里长出来的?又有多少"评估"环节,其实是在让生成器照镜子?
热门跟贴