12.3 Hooks 与 Skills、提示层约束、测试闭环的分工
面向经管学生、研究者与从业者的 AI 智能体设计教材

同样一项要求,可能既能写进 CLAUDE.md,也能写进 Skill,还能在工具执行后用测试脚本检查。若不先分清职责,系统很快会变得重复、脆弱而难维护。
下面这张表是四类机制的核心分工:
| 机制 | 负责什么 | 最适合的问题 | 不适合承担什么 |
|---|---|---|---|
| 提示层约束 | 说明目标、风格、偏好 | 告诉模型”应该怎么做” | 保证动作一定发生 |
| Skills | 封装可复用流程与领域知识 | 组织复杂任务步骤 | 在生命周期节点自动触发 |
| Hooks | 在固定事件上拦截、检查、通知 | 让高频必做动作机制化 | 独立承担完整业务评估 |
| 测试闭环 | 验证结果是否达标 | 判断”做得对不对” | 替代执行阶段的触发机制 |
CLAUDE.md 适合写目标、风格、流程偏好和禁令。Hooks 配置落在 settings JSON 体系里(~/.claude/settings.json、.claude/settings.json、.claude/settings.local.json)。如果把所有约束都塞进 CLAUDE.md,系统会越来越依赖模型自行遵守;反过来把业务规则硬塞进 Hook,工作流则变得僵硬。
用一个具体场景对比。项目要求 data/ 目录只读。写在 CLAUDE.md 里:
## 约束
- data/ 目录为只读,禁止写入或修改模型多数情况下会遵守,但在长对话或高压力迭代中有可能忽略。写成 Hook 则是机器级拦截:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -q '\"file_path\":.*data/'; then echo 'BLOCK: data/ 为只读目录' >&2; exit 2; fi"
}
]
}
]
}
}退出码 2 告诉 Claude Code 阻止本次操作。CLAUDE.md 表达意图,Hook 执行意图,两者配合使用。
Skill 负责把复杂任务组织成清晰路径,但它本身不拥有生命周期触发能力。你可以把改写流程写成 Skill,再用 PostToolUse 在写文件后自动执行文档检查。成熟工作流是三层配合:提示层说明目标,Hooks 守住关键节点,测试闭环判断结果。
如果问题是”模型应该遵守什么原则”,先想提示词或 Skill。如果问题是”这个动作在某个节点绝不能漏”,优先考虑 Hook。如果问题是”结果到底好不好”,那是测试与评估层的任务。
Hook 能触发检查,但它不天然提供稳定测试集、跨版本对比、指标基线或长期回归分析。这些属于完整评估体系的内容。Hook 更像评估体系的入口和触发器,而不是评估体系本身。