你让模型修一个函数。它修了。还”顺便”重格式化了相邻两个函数、改了一个常量名、在文件顶部加了一段”应该说明模块用途”的注释。你 prompt 里一句没提。但也没明禁。模型扩 scope 是因为 RLHF 训练它”留下比拿到时更好的东西”,而”更好”在你没显式画边界时是无界的。修法不是事后骂模型——是在 prompt 里显式画边界,含 in-scope 和 out-of-scope 两个集合。
本文讲为什么模型默认扩 scope,以及怎么在代码编辑和内容任务里画出能守住的边界。
常见原因
1. 开放动词授权扩展
“改进”、“清理”、“润色”、“重构”全暗示”能改的地方都改”。模型按字面执行。
如何判断:你的动词开放。受限动词是”编辑函数 X”、“替换第 Y 行”、“改名变量 Z”。
2. 没显式 out-of-scope
你说了要做什么但没说要留什么。模型默认能看到的都公平猎物。
如何判断:你的 prompt 有 in-scope 没 out-of-scope。
3. 长上下文展示了相邻可修问题
你贴了整文件。模型看到目标 + 5 个看起来可修的东西。没边界就全修。
如何判断:scope 扩展落在 prompt 里可见的相邻代码或内容。
4. 多步任务每步没边界
第 1 步限定函数 X。第 2 步”现在改进这个模块”——边界蒸发。到第 3 步模型重写了文件。
如何判断:scope 漂移和步数相关(多步工作流里)。
5. Agent 有大范围写入权限
Cursor Composer、Claude Code、Codex 宽 scope——模型能动任何文件。“scope”机械上变成”它能读到的全部”。
如何判断:改动出现在你从未点名的文件里。
动手前先确认
- 标清楚什么该改(in-scope)。
- 标清楚什么不该改(out-of-scope)。
- 决定相邻问题是 flag 还是直接忽略。
- 多步工作每步规划边界。
- agent 运行收缩工具权限只覆盖目标目录。
需要收集的信息
- 当前 prompt。
- 越界输出(代码用
git diff)。 - 不该发生的改动清单。
- in-scope 和 out-of-scope 集合。
- 当时生效的模型、agent、工具权限。
最短修复路径
Step 1:开放动词换受限动词
差: "改进 user.py 文件。"
好: "只编辑 user.py 里的 `validate_email` 函数。
其他函数 byte 级保持。未改动行不要重新格式化。"
受限动词 + 显式对象消歧。
Step 2:声明 out-of-scope 清单
Out-of-scope(不许动):
- validate_email 之外任何函数。
- import 和 export。
- MAX_RETRIES 常量。
- 现有注释。
- 文件级 docstring。
正常会"顺便清理"的内容请写到 SUGGESTED_FOLLOWUPS 区块,
不要直接动。
SUGGESTED_FOLLOWUPS 模式让模型把观察浮出来不动手。
Step 3:用标记编辑区
只编辑下方标记之间的代码。标记之外原样保留。
# AI-EDIT-START
def validate_email(email: str) -> bool:
return "@" in email
# AI-EDIT-END
物理标记对 scope 漂移很鲁棒。
Step 4:要 diff 或结构化输出
按 unified diff 输出。只包含编辑区内改动 hunk。不要输出整文件。
diff 格式机械可见越界改动——模型自己知道。
Step 5:多步工作每步重申边界
Step 1:只编辑 validate_email。Out-of-scope:其他全部。
Step 2:第 1 步审过后,只编辑 send_email。Out-of-scope:validate_email(已冻结)+ 其他全部。
把”已冻结”清单往后传,让 scope 单调递增不累积。
Step 6:agent 收缩工具权限
Cursor Composer 里只开目标文件。Claude Code 里限定工作目录。Codex 把 scope 设到一文件或一 PR。机械权限 > prompt 级指令。
怎么确认已经修好
- diff 限在 in-scope 集合。
- out-of-scope 的文件 / 函数 / 段 byte 级一致。
- SUGGESTED_FOLLOWUPS(如果有)列了模型注意到但没动的相邻问题。
- 重跑 diff 形态相近。
- 同事审 diff 找不到惊讶改动。
如果还是没修好
- 模型可能无视边界——切到
Edit工具精确匹配模式,边界变机械。 - agent 权限可能比 prompt 暗示宽——在工具级收缩。
- 重复工作把边界锁进 system prompt / project 指令,不要写在 user message。
- 换更小 / 更便宜的模型——经常更严守 scope。
预防建议
- 默认动词:“edit”、“rename”、“replace”——
improve、refactor、polish不加 scope 永不用。 - 永远声明 out-of-scope;什么都不神圣就直说。
- 内容用标记编辑区;代码用精确匹配
Edit工具。 - agent 工作流机械收缩工具 scope。
- 用 SUGGESTED_FOLLOWUPS 模式:让模型报告观察而不动手。
- 每次都审 diff / 输出。不要信模型的自述总结。