跳转到内容

反模式与坑

社区在这两年里踩出来的坑,集中收录在这里。每条都有具体错例与修法,按出现频率从高到低排序。

#1 description 讲了过程

症状:Skill 被触发了,但 agent 用粗糙的方式自己做完了任务,没有按 SKILL.md 正文里的 SOP 执行。

原因:description 把"怎么做"已经讲清了,agent 觉得不读正文也行。

坏例

yaml
description: >
  审查代码改动,按 logic / style / security / coverage 四个维度分别走一遍,
  对每条问题生成 conventional comment 格式的反馈,最后输出 markdown 报告。

好例

yaml
description: >
  Use when reviewing code changes, pull requests, or diffs.
  Handles multi-pass review with security, style, and test coverage checks.

详见 写好 description · 规则 1

#2 同目录放 README.md

症状:skill 目录下既有 SKILL.md 又有 README.md,agent 行为变得不可预测。

原因:Anthropic 官方明确要求"所有面向 AI 的文档都在 SKILL.md 或 references/ 里"。同目录 README 会让 agent 困惑哪份是真相。

坏例

text
my-skill/
├── README.md       ❌
├── SKILL.md
└── scripts/

好例

text
my-skill/
├── SKILL.md        ← 唯一面向 AI 的入口
├── references/
│   └── usage.md    ← 详细文档放这
└── scripts/

如果一定要给人类读者写说明(例如分发到 GitHub),把 README.md 放在仓库根而不是 skill 目录内。

#3 Windows 反斜杠路径

症状:本地写脚本调用没问题,部署到 Linux/macOS 直接报错。

原因:agent 通常运行在 Linux 容器,反斜杠不被识别为路径分隔符。

坏例

text
执行 scripts\helper.py    ❌
读取 references\guide.md  ❌

好例

text
执行 scripts/helper.py    ✅
读取 references/guide.md  ✅

TIP

即使你的开发环境是 Windows,路径写法也要 Unix 风格。Windows 自己也支持正斜杠,跨平台兼容性最高。

#4 给 agent 太多选项

症状:agent 在多个备选方案之间反复横跳,结果输出不稳定。

原因:description 或 SOP 里写了「option A 或 option B」,agent 没有明确决策依据。

坏例

markdown
## 第 3 步:生成报告

可以用以下任一方式:

- **方式 A**:调用 `scripts/markdown.py` 生成 Markdown
- **方式 B**:调用 `scripts/pdf.py` 生成 PDF
- **方式 C**:直接在对话里返回 HTML

根据情况自行选择。

好例(用 Conditional Workflow Pattern):

markdown
## 第 3 步:生成报告

判断输出格式:

- 用户**明确说**「PDF」/「打印」/「正式报告」 → 调用 `scripts/pdf.py`
- 用户**明确说**「网页」/「在线」 → 直接返回 HTML
- **其它默认情况** → 调用 `scripts/markdown.py`(Markdown 是最通用的中间格式)

TIP

如果场景真的需要让用户选择,让 agent 主动询问("您希望输出 PDF 还是 Markdown?"),而不是让它自己赌。

#5 假设包/工具已安装

症状:脚本在你机器上跑没问题,到 agent 那里报 ModuleNotFoundError

原因:agent 运行环境是干净容器,没装你本地的依赖。

坏例

markdown
直接调用 `from pypdf import PdfReader` 处理。

好例

markdown
## 前置依赖

\`\`\`bash
pip install pypdf
\`\`\`

确认安装后再使用:

\`\`\`python
from pypdf import PdfReader
\`\`\`

IMPORTANT

即使是 Python 标准库以外的常见包(如 requests、pandas),也要在 SKILL.md 里显式声明依赖

#6 引用 MCP 工具不带 server 前缀

症状:在多 MCP 服务器并存的环境,工具调用报 "tool not found"。

原因:MCP 工具名按 ServerName:tool_name 全限定命名,省略前缀会冲突。

坏例

markdown
使用 `bigquery_schema` 拉取表结构。
使用 `create_issue` 创建 Jira 工单。

好例

markdown
使用 `BigQuery:bigquery_schema` 拉取表结构。
使用 `Jira:create_issue` 创建 Jira 工单。

#7 时间敏感信息混在主流程里

症状:Skill 在某段时间后失效,agent 仍在使用过期的 API / endpoint / 字段。

原因:SKILL.md 主体里写了「截至 2026 年 5 月,X API 的 endpoint 是 ...」之类的时效信息。

坏例

markdown
## 第 2 步:调用 API

POST https://api.example.com/v3/users  (v3 是当前版本,2025-08 以后才上线)

好例

markdown
## 第 2 步:调用 API

POST {API_BASE}/users  (endpoint 见 references/api-endpoints.md)

## 历史信息(仅供回滚参考)

> [!NOTE]
>
> 如果遇到旧版 v2 endpoint,注意 ...

把所有时效信息外移到 references/ 或单独的"old patterns"段落,让主流程描述保持稳定。

#8 Frontmatter 的 description 超长

症状:Skill 元数据被截断,agent 看到的不完整。

原因:description 超过 1024 字符上限。

修法

  • 只保留触发条件(一两句话)
  • 任何"做什么 / 怎么做"全部移到 SKILL.md 正文
  • 触发关键词可以列表化但要克制,10 个以内为好

#9 SKILL.md 正文超过 500 行 / 5,000 token

症状:Skill 加载后剩余上下文窗口被吃光,agent 无法处理实际任务。

原因:把所有内容(参考文档、长示例、API schema)都塞进 SKILL.md 主体。

修法

text
my-skill/
├── SKILL.md             ← 只保留每次都需要的核心 SOP
├── references/
│   ├── api-schema.md    ← 详细 schema 按需读取
│   └── edge-cases.md    ← 罕见边界场景
└── assets/
    └── report.template.md  ← 长输出模板

并在 SKILL.md 中明确告知何时读:

当响应非 200 状态码时,读取 references/api-errors.md。 不要泛泛指向 references/,要明确何时读哪份。

#10 description 中包含 claude / anthropic

症状:Skill 被部分平台拒绝加载。

原因:Anthropic 把这两个词作为保留字防止 prompt injection。

修法:用其它名字,例如 ai-helperagent-router

检查清单

发布 Skill 前,跑一遍 checklist:

元数据

  • [ ] name ≤ 64 字符,kebab-case,与目录名一致
  • [ ] name 不含 claude / anthropic 保留词
  • [ ] description ≤ 1024 字符,只说触发不说过程
  • [ ] description 含至少 3 个触发关键词 + 1 个隐式触发场景

内容

  • [ ] SKILL.md < 500 行 / < 5,000 token
  • [ ] 同目录内没有 README.md
  • [ ] 路径全部用正斜杠 /
  • [ ] 引用其它文件只一层深scripts/x.py ✅,scripts/sub/x.py ⚠️)
  • [ ] 时效信息外移到 references/ 或独立段落
  • [ ] 多 MCP 时工具名用全限定 ServerName:tool_name
  • [ ] 第三方依赖显式声明 pip install xxx

代码与脚本

  • [ ] 脚本真的解决问题,不只是回调 Claude("Solve, don't punt")
  • [ ] 脚本有清晰的错误处理与帮助输出
  • [ ] 没有"voodoo constants"——所有硬编码值都有注释说明

测试

  • [ ] 至少 3 条真实 query 隔离测试通过
  • [ ] 在 Haiku / Sonnet / Opus(或你的目标模型)上分别跑过
  • [ ] 与团队成员对评 description 与 SOP

下一步

避开了所有反模式,下一步:

Released under the MIT License.