如果你用过 Claude Code、Cursor 或其他 AI 编程助手,你一定见过或创建过这样的文件:
CLAUDE.mdAGENT.md.cursorrulesAGENTS.md但最近一项研究和 Theo 的实测,却指向了一个反直觉的结论:
这些文件可能正在损害你的 AI 编程体验。
一项针对 AI Agent 指令文件的最新研究发现:
| 场景 | 效果 |
|---|---|
| **开发者提供的指令文件** | 仅能微增性能(边际收益递减) |
| **AI 生成的主动文件** | 增加 20%+ 成本和错误率 |
| **无指令文件** | AI 自主探索,性能相当甚至更优 |
关键发现:
Theo 审计了自己的项目库,发现典型的 agent.md 存在这些问题:
# 典型的问题 AGENT.md
## 技术栈
- 使用 React 18(实际已升级到 19)
- 状态管理用 Redux(实际已迁移到 Zustand)
- 测试用 Jest(实际已改用 Vitest)
## 目录结构
- src/components/(实际已重构到 app/)
- src/utils/(实际已删除)
结果: AI 被这些过时信息带偏,反复尝试不存在的路径和废弃的技术。
要理解为什么指令文件可能有害,需要了解 AI 系统的上下文层级:
┌─────────────────────────────────────────┐
│ 第一层:系统提示词 (System Prompt) │
│ - 由平台/工具提供 │
│ - 定义 AI 的基本行为和能力 │
│ - 用户无法直接修改 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 第二层:开发者消息 (Developer Message) │
│ - CLAUDE.md / AGENT.md 所在层级 │
│ - 项目级上下文 │
│ - 每次请求都会携带 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 第三层:用户指令 (User Instruction) │
│ - 当前对话的具体请求 │
│ - 优先级最高 │
│ - 动态变化 │
└─────────────────────────────────────────┘
CLAUDE.md 的问题在于它处于"中间层":
成本角度:
原则:仅在模型反复犯错时才放入
| 场景 | 建议 |
|---|---|
| 模型总是用错某个 API | ✅ 加入简短的纠偏说明 |
| 项目有特殊的命名约定 | ✅ 添加一行规则 |
| 模型能自己探索出结构 | ❌ 不需要文档 |
| 信息可能随时间变化 | ❌ 不要写死 |
好的 agent.md:
# 项目规则
## 必须遵守
- 所有 API 调用必须经过 src/lib/api.ts 的封装
- 不要直接使用 fetch
## 常见错误
- ❌ 不要在组件中直接调用数据库
- ✅ 使用 server actions
坏的 agent.md:
# 项目文档
## 技术栈(可能过时)
- React 18.2.0
- Next.js 14.1.0
- TypeScript 5.3.0
## 目录结构(可能已重构)
- src/components/ - 组件
- src/utils/ - 工具函数
- src/hooks/ - 自定义 hooks
## 开发流程(可能已变更)
1. 创建分支
2. 编写代码
3. 运行测试
4. 提交 PR
...
Theo 在自己的真实项目 Lawn 中做了对比测试:
测试 A:启用 CLAUDE.md
令人惊讶的发现:
AI 本身非常擅长:
package.json 了解依赖tsconfig.json 理解路径映射app/layout.tsx)理解框架定期审计你的 agent.md,删除:
有时候,与其写复杂的指令,不如重构代码让 AI 更容易理解:
// 重构前:AI 容易困惑
export const handler = async (req, res) => {
const data = await db.query(...)
const transformed = data.map(...)
const validated = schema.parse(transformed)
return res.json(validated)
}
// 重构后:AI 一眼看懂
export const getUsersHandler = async (req, res) => {
const users = await fetchUsersFromDatabase()
const formattedUsers = formatUsersForApi(users)
return res.json(formattedUsers)
}
核心洞察:让代码自解释,比写文档解释代码更有效。
不要:
// AI 总是忘记检查 null
function getUserName(user) {
return user.name // AI 经常漏掉 ?.
}
// 方案 A:添加规则(坏)
// "总是检查 user 是否为 null"
// 方案 B:重构代码(好)
function getUserName(user: User | null) {
return user?.name ?? 'Anonymous'
}
// TypeScript 强制处理,AI 不会犯错
AGENT.md 应该像急救包,而不是百科全书:
- 只在必要时使用
- 内容精简到最少
- 定期清理过期内容
- 优先重构代码而非添加规则
用动态上下文替代静态文档:
| 静态文档 | 动态替代 |
|---|---|
| 技术栈列表 | 让 AI 读取 package.json |
| 目录结构 | 让 AI 运行 tree 或 ls |
| API 文档 | 让 AI 阅读源码中的类型定义 |
| 开发流程 | 让 AI 查看 scripts 和 CI 配置 |
在添加内容到 agent.md 前,问自己:
Theo 的视频标题是《Delete your CLAUDE.md》,但真正的信息不是"不要写文档",而是:
"不要过度工程化你的 AI 工作流。"
AI 比我们想象的更擅长探索和理解代码。我们的工作是:
你使用过 CLAUDE.md 或类似的指令文件吗?体验如何?欢迎在评论区分享。
还没有人回复