别再指望靠写在 `CLAUDE.md` 里的规约来约束 AI 了

正则化加上870 新手 1天前 362 浏览 5 点赞 约 1 分钟

很多团队在推行 AI Agent 时都有个误区:觉得在配置文件里写句“提交前必须运行测试”或者“不要直接提交到 main 分支”就万事大吉了。

醒醒吧,那只是“建议”,不是“强制”。

在实际工程落地中,随着对话轮数增加,Token 长度暴涨,模型对几万字前的指令注意力会迅速衰减。哪怕你的规约写得再严谨,模型在执行任务时也可能因为“想表现得更聪明”而直接跳过逻辑,直接把代码怼到主分支上。

我们要区分两种逻辑:规约(Reminder)是用来影响模型“意图”的,而钩子(Hook)是用来约束模型“行为”的。

如果你想解决工程落地中的确定性问题,必须把那些涉及“不可逆后果”的操作从文档移到 Hook 里。Claude Code 提供了一套机制,通过监听生命周期事件(比如 PreToolUse)来执行 Shell 命令。

核心逻辑很简单:
1. 监听工具调用。
2. 通过 jq 解析传入的 JSON 命令。
3. 如果不符合预期,直接返回 exit 2

最关键的细节是:当 Hook 返回非零状态码时,它的 stderr 输出会直接变成模型可见的反馈。这意味着模型不是死机了,而是“读到了报错并被纠正了”。

我给团队配的第一个落地场景就是拦截 Git 操作。配置在 .claude/settings.json 里:

{
"hooks": {
"PreToolUse": {
"matcher": "bash",
"command": "if echo '$INPUT_JSON' | jq -e '.command | contains(\"git commit\")' > /dev/null; then CURRENT_BRANCH=$(git branch --show-current); if [ \"$CURRENT_BRANCH\" = \"main\" ] || [ \"$CURRENT_BRANCH\" = \"master\" ]; then echo \"Blocked: direct commit to main. Create a branch first.\" >&2; exit 2; fi; fi"
}
}
}

这种硬性拦截比任何文档都管用。规约负责让 AI 变聪明,Hook 负责让 AI 变守规矩。

工作流aiautomationAI落地devtools

全部回复 (3)

批次调小了 新手 1天前
确实,我后来改用在Prompt里加动态示例,比写死规约管用多了。
0 回复
A
API调不通564 新手 1天前
那这种长上下文下的指令漂移,你一般是通过增加Few-shot频率来纠偏,还是靠CI阶段的自动化校验来兜底?
0 回复
E
embedding查750 新手 1天前
我之前也踩过这个坑,上下文一长模型就开始乱搞,还是得靠Pre-commit Hook这种硬约束才稳。
0 回复

发表回复

支持 Markdown 格式