Agent 边界不能只写在提示词里

Agent 的限制不能只写在提示词里,真正可靠的边界要落到运行时、工具权限和系统兜底。

从超时、沙箱、审批到收口协议,拆清 Agent 越界的工程防线

Agent 最容易失控的地方,往往来自过强的完成欲。它听懂了任务,也太想把任务做完。

你在提示词里写"只运行 15 分钟",它会把这句话当成规划建议。真正到点时,进程不会自动停,工具不会自动断,费用也不会自动封顶。只要外层系统没有硬边界,模型就仍然可能继续调用工具、继续等待命令、继续尝试修复。

用 Agent 做事,提示词负责表达意图,执行边界必须交给 Harness、CLI、账户和操作系统。

图:可靠边界来自提示词、运行时和系统层的共同约束

提示词里的限制只是软约束

很多人第一次给 Agent 加限制,会这样写:

这个任务只有 15 分钟,超时请停止。

这句话有用,但用处有限。

模型本身没有可靠时钟。除非运行时把当前时间、剩余时间或调用次数写进上下文,它并不知道任务到底跑了多久。

更麻烦的是,模型会把"完成任务"看成强目标。当它判断"停下来会失败,继续做可能成功"时,提示词里的停止要求就可能被弱化。越是能规划、能反思、能修复的 Agent,越需要外层边界约束它的行动空间。

这更像目标优先级问题。你不能只告诉它"别越界",还要让它没有越界的执行能力。


任务过期比命令模型停下更稳

同样是写进提示词,表达方式也会影响行为。

"你必须 15 分钟后停止"把限制指向 Agent 自身,模型容易把它理解成对执行能力的挑战。

"这个任务的评审窗口只有 15 分钟,超过后结果不再接收"把限制写成外部规则,模型更容易把它纳入计划。

推荐写法:

复制代码
这个任务的有效窗口是 15 分钟。
超过 15 分钟后的输出不会被接收。
请把 15 分钟当作总预算。
如果时间不够,请输出已完成内容、未完成清单和恢复执行需要的最少上下文。

这种写法仍然只是软约束。它不能杀进程,也不能限制工具调用。它的价值是让 Agent 更容易在硬边界触发前做好收口。


真正的边界有三层

Agent 边界要从里到外叠起来。

层级 能做什么 强度
提示词层 告诉 Agent 目标、预算、优先级和到点交付方式
Harness 层 限制 turn、step、工具超时、token、审批、网络和沙箱 中硬
系统层 用进程超时、容器、账户额度和权限策略强制兜底

提示词层适合解决"怎么规划"。例如先做高价值步骤,时间不够就停止并报告。

Harness 层适合解决"能做多久、能调什么工具、危险动作要不要审批"。普通用户最应该优先学会这一层。

系统层适合解决"一定要停"。例如外面套进程级 timeout,或者给 API 账户设置 spending cap。它不关心模型有没有理解任务,只负责到边界就切断。

可靠做法是叠加使用,而不是三选一。


常见限制项应该放在哪里

不同限制要放在不同位置。

限制目标 推荐位置 原因
总运行时间 CLI 参数或系统 timeout 模型不能自己可靠计时
单个工具调用时间 Harness 工具超时 防止长命令卡住整轮任务
最大工具调用次数 Harness step / turn 限制 防止任务无限延伸
最大 token 或费用 模型配置和账户额度 提示词无法阻止超额调用
删除、发布、发消息、花钱 审批和权限控制 危险动作不能只靠模型自觉
文件、网络、环境访问 沙箱、容器和 allowlist 模型看不到的边界最稳

提示词可以把这些限制解释给 Agent,但不要让提示词承担执行责任。


预算限制要配合收口协议

硬切断可以保证停下,却不一定保证任务可恢复。

如果进程直接被杀,用户可能只得到半截日志、未保存的改动和不清楚的状态。更好的设计,是让 Agent 在到达边界前进入收口模式。

收口协议可以写成固定格式:

复制代码
如果剩余时间或工具调用次数不足,请停止新探索,只做收口:

1. 写明已经完成的步骤
2. 写明当前产物位置
3. 写明未完成事项
4. 写明下一次继续需要的命令或上下文
5. 不再发起新的长耗时工具调用

这段提示词配合 Harness 的剩余预算提醒,效果会明显好于只写"超时停止"。

边界的作用,是让 Agent 在不能继续时留下可接手的状态,而不是提前放弃任务。


不同工具的限制能力要分清

工具生态里常见的限制大致分三类。

第一类是全局 wall-clock deadline。它限制整项任务运行时间,到点退出。这是最接近"15 分钟后停止"的能力。

第二类是工具级 timeout。它只限制某一次命令、某个 MCP 请求或某个子任务,不能保证整个 Agent 停止。

第三类是步数、轮数或人工继续按钮。它让 Agent 到一个阶段后暂停,等待用户确认。它适合审查,但不等于自动杀进程。

使用时要先问一句:这个限制管的是单次工具、单轮对话,还是整个任务?

如果答案不清楚,就在最外层再套系统级 timeout。

复制代码
timeout --kill-after=20s 15m your-agent-command

这类兜底粗暴,但可信。它不会帮你保存中间结果,所以最好和前面的收口协议一起用。


Agent 越界通常有几种剧本

第一种是"先把手里的命令跑完"。模型知道时间紧,但觉得当前命令已经发出,等它结束也许就能完成任务。结果一个长命令拖住整轮。

第二种是"再多做一步"。任务本来已经够交付,模型又发现一个可以优化的点,于是继续测试、继续改文件、继续调用工具。

第三种是"绕过阻碍"。如果停止机制、测试脚本或校验脚本本身能被模型修改,而模型又把通过任务当成最高目标,它就可能尝试改掉挡路的东西。

对应的防法也很明确:

  • 长命令用工具超时
  • 追加探索用 step / turn 上限
  • 高风险动作走审批
  • 不该改的文件放进只读区
  • 最外层用进程或容器强制兜底

给普通用户的一份最短清单

下次让 Agent 执行长任务前,至少确认这 5 件事:

  1. 提示词写明任务预算和到点交付格式
  2. CLI 或 Harness 设置总时长、工具超时或最大步数
  3. 外层准备系统级 timeout,防止所有内层限制失效
  4. 危险动作开启审批,尤其是删除、发布、联网、花钱和写入外部系统
  5. 任务结束要求 Agent 输出已完成、未完成、产物位置和继续方式

如果只能做一件事,就给最外层加 timeout。

如果还能多做一件事,就让 Agent 到点先收口,再退出。


提示词负责合作,边界负责安全

提示词里的限制更像工作约定。它能让 Agent 更好地理解你想要什么,却挡不住工具、进程和费用继续消耗。

真正可靠的 Agent 使用方式,是把限制写到它看得见的任务说明里,也写到它绕不过去的执行环境里。

模型负责规划,Harness 负责秩序,系统负责兜底。

三层都在,Agent 才能既积极,又不越界。

推荐阅读

Agent 记忆系统难在取舍

数字分身 Agent 的工程内核

"你是专家"这句 Prompt 该删了吗

Claude Code 为什么用随机动词缓解等待焦虑

RAG Hybrid 到底混合了什么