夜雨聆风学习资料网

ARTICLE · 1237368

AI Agent 乱调工具怎么办?4 层工程防线,把误删误改挡在执行之前

AI Agent 乱调工具怎么办?4 层工程防线,把误删误改挡在执行之前

用 AI 帮你干活的次数越多,你越可能撞上这种场面:

前一天还在夸它好用,今天你说「帮我把测试环境那台机器清理一下」,它回一句「好的,已完成」。然后你发现,它清的是生产库里的表。

还有一种更隐蔽的:你只是随口问「这个订单现在什么状态」,它却顺手调了个「取消订单」的工具,还一本正经地告诉你「已经为您取消了」。

这两种事的根子是一样的:问题不在 AI 变笨了,而在我们把「做决定」的权力整个交给了它。

这篇文章讲怎么防。不聊「提示词怎么写得更凶」——那顶多算初级方案;真正管用的,是在 AI 和真实操作之间架起四层工程防线。看完你会拿到三样东西:一张全局地图、一份可以直接抄的配置、一份上线前的自查清单。

01 先看清问题的形状

把 AI Agent 想成一个刚入职的实习生:记性一般,特别想表现,嘴上永远说「好的没问题」。

他坐在你的工位上,桌上摆着公司系统的钥匙——能查数据、能改配置、能删记录、能直接给客户发消息。

你交代一句「把测试环境清理一下」,在他的理解里,这等于「我可以自由决定删什么」。剩下的就交给运气了。

已经发生过的翻车,大概逃不出这四类:

· 删错:把「清理测试数据」理解成「清空数据库」

· 改错:用户问价格,它顺手调了「修改价格」的工具

· 发错:把内部草稿当成正式通知,发给外部客户

· 死循环:一个工具报错,它换个参数再来一次,一轮对话调了两百次接口

这四类的共同点是:造成损失的不是 AI 理解得「不够好」,而是它犯错的那一刻没人拦。

02 为什么 AI 一定会乱调工具

想防住,先得承认四件事。

第一,模型是概率机器,不是规则机器。

它输出的是「最像答案的那句话」,不是「经过判断的那句话」。你说「清理」,它脑子里最顺的搭配可能是「删除」。它不会真的去判断你的业务规则。

第二,信息不全的时候,它会自己补全。

用户没说是哪个环境、哪台机器、哪张表,它不停下来问,而是自己挑一个最可能的填进去。它填得越自信,越危险。

第三,工具一多,它认不出谁是谁。

update_user、update_user_profile、patch_user、set_user_status,四个工具穿着同一件衣服站在它面前。工具从 5 个涨到 50 个的时候,选错的概率不是翻倍,是失控。

第四,没人校验,它就会随便填。

没有规则约束的时候,参数就是个自由填空:日期写成「昨天」、ID 写成「最新那个」、金额写成负数。接口只能报错,或者更糟——默默执行了。

结论只有一句:模型永远会犯错。工程体系的任务不是「让它不犯错」,而是「让它犯了错也伤不到人」。

▲ 模型一定会犯错,所以要在它和真实操作之间架起四层防线

03 第一层 · 把「口头交办」变成「填表」

公司不怕员工报销,怕的是「随口说一句就给你打钱」。所以有了报销单:金额、日期、事由、发票,少一项都走不下去。

工具定义就该是这张报销单。

技术上的名字叫 JSON Schema,人话就是「一份给工具写的填写规范」:这个工具要几个参数、每个参数是什么类型、哪些必填、能填哪些值、最长多少字。

具体做三件事。

第一件,把模糊参数改成枚举。 不要让它自由填写「删除原因」,而是给它三个选项:用户主动申请 / 重复账号 / 测试数据清理。它只能在里面挑一个,猜都不给机会。

第二件,把关键参数设成必填,并且规定格式。 用户 ID 必须长成 U 加八位数字的样子,金额必须是正数,时间必须是标准格式。格式不对,就在业务逻辑外面被拦住。

第三件,每个字段都写清楚说明和例子。 说明写给谁看?写给模型看。你写得越具体,它填得越准,这是投入产出比最高的一件事。

最常见的三个坑:所有参数都写成字符串(等于没约束);给了枚举,但说明里写「其他情况自行判断」(等于白给);工具描述写得像诗歌,模型读完还是不知道它能干什么、不能干什么。

04 第二层 · 给工具装门禁

先把工具按「危险程度」分成四类,一类一道门:

类别
典型工具
谁来调用
默认策略
查询类
查订单、查余额、查日志
所有场景
自动执行,仅记日志
修改类
改资料、改配置、改状态
有权限的会话
自动执行,必须留痕
删除类
删记录、撤单、删文件
单独授权
强制人工确认
高危类
批量操作、清空数据、对外发消息、动钱
管理员
二次确认 + 可回滚

隔离的意思是:普通问答场景只加载查询类工具。不是「加载了但不许用」,而是根本不在它的工具箱里。模型看不见的工具,它不可能误调。

白名单的意思是:同一个系统,运营账号看到 8 个工具,管理员看到 30 个。权限不是提示词里写一句「你只能查」就算数的,那靠的是自觉;真正的权限,是列表里有没有这个工具。

就像公司的门禁卡:前台能进大厅,能进机房的人一定在名单上。你不会发一张万能卡,然后口头叮嘱他「别进机房」。

▲ 越往下越危险,能碰到的人越少

05 第三层 · 调用链路上的三道闸门

工具定义管的是「能不能填对」,闸门管的是「这一步该不该发生」。一共三道。

闸门一:前置意图校验。

调用之前先问一句:用户刚才那句话,和这个工具的能力对得上吗?用户问「订单什么状态」,意图是查询;这时候去调「取消订单」,方向就不对,直接拒绝。这道闸门不用多聪明,它只要挡住方向性错误。

闸门二:调用频次限流。

给单轮任务设上限:最多调 12 次工具、同一个工具最多重复 3 次、超时就终止。这一条能砍掉大部分死循环。真实场景里,「AI 疯狂重试把下游接口打崩」比「AI 删错数据」更常发生。

闸门三:结果后置校验。

工具返回空数据、报错、超时的时候,不允许模型拿着这份结果继续编答案。要么让它带着错误信息重试一次,要么直接停掉任务,把失败原因告诉用户。

三道闸门都不判断「AI 想不想」,只判断「这一步合不合法」。这就是工程兜底和提示词约束的区别。

▲ 左边一路裸奔到执行,右边每一步都被拦一次

06 第四层 · 高危操作,AI 只能申请不能执行

前面三层都是自动的,这一层必须有人。

规则很硬:AI 无权自主执行高危操作。它只能生成一份「操作预览」,由人来按下执行键。

预览里必须写清四件事:

· 要做什么:删除 user_id = U00012345 这个账号

· 为什么:用户在对话里明确要求注销

· 影响范围:该账号名下 3 个订单、2 份文件会被一并归档

· 能不能退:7 天内可以从归档里恢复

❌ 不给预览直接执行:出事之后你只能翻日志复盘,损失已经造成

✅ 预览 + 确认 + 执行:AI 负责准备,人负责拍板。哪怕 AI 判断错了,也是人眼看到的错,而不是系统自己捅出来的错

一句话记住四层的分工:查询自动跑,修改留痕迹,删除要确认,高危要双签。

▲ AI 只负责生成预览,按下执行键的永远是人

07 可以直接抄走的一段配置

上面四层落到代码里,其实就是两份东西:一份写清楚每个工具长什么样,一份写清楚每类工具怎么管。

先看「删除账号」这个工具的定义。注意最后那个 confirm_token——它必须由用户在确认之后产生,AI 拿不到也编不出来,这是整段配置里最关键的一笔。

{  "name": "delete_user",  "description": "删除用户账号。仅当用户在对话中明确要求删除时使用,禁止用于测试数据清理。",  "parameters": {    "type": "object",    "properties": {      "user_id": {        "type": "string",        "pattern": "^U[0-9]{8}$",        "description": "用户 ID,形如 U00012345"      },      "reason": {        "type": "string",        "enum": ["user_request", "duplicate", "test_cleanup"],        "description": "删除原因,只能从这三个值里选"      },      "confirm_token": {        "type": "string",        "description": "用户二次确认后拿到的令牌,模型不得自行生成"      }    },    "required": ["user_id", "reason", "confirm_token"]  }}

再看风控那一侧。每类工具的默认策略、限流阈值、结果异常怎么处理,全写在一个地方:

tools:  query:  { auto: true,  log: true }  write:  { auto: true,  audit: true, max_per_turn: 3 }  delete: { auto: false, require_confirm: true }  danger: { auto: false, require_confirm: true, min_role: admin }loop_guard:  max_tool_calls_per_turn: 12  max_repeat_same_tool: 3  on_timeout: abortresult_guard:  empty: retry_once_then_abort  error: stop_and_report  timeout: stop_and_report

上面这份配置里,没有一行在「教育模型」。它做的是:把危险的工具挡住、把重复的调用掐断、把错误的结果拦住。

这不是提示词,这是护栏。

08 上线前的自查清单

十项,逐条过一遍:

☐ 每个工具都有 JSON Schema,没有「自由填空」的参数

☐ 所有写操作、删除操作都有审计日志,能查到「谁在什么时候让 AI 做了什么」

☐ 工具按查询 / 修改 / 删除 / 高危分了四类,分类落在配置里,不靠自觉

☐ 普通问答场景只加载查询类工具,高危工具根本没进工具箱

☐ 不同角色看到的工具列表不同,权限写在白名单里

☐ 单轮任务有调用次数上限,同一个工具的重复调用也有上限

☐ 空结果、报错、超时三种情况,都有明确的处理策略

☐ 所有高危操作都需要人工确认,确认信息里写清了影响范围

☐ 有一个「一键刹车」的总开关,出事时能立刻停掉全部工具调用

☐ 上线前用真实场景做过一次「故意让它乱来」的演练

最后提醒三个常见误区。

误区一:把提示词写得足够严厉,就安全了。 提示词管的是「倾向」,工程管的是「边界」。靠自觉和靠制度,是两回事。

误区二:只防删除,不防「发出去」。 给客户群发错消息、把内部草稿推到公网,同样收不回来。凡是不可撤回的动作,都算高危。

误区三:觉得「我们量小,不会出事」。 事故概率和业务量成正比,但和「有没有护栏」成反比。

▲ 十项过完,再让它碰真实数据

09 结语:让 AI 犯错,但别让它造成事故

回到开头那个实习生。

你不会因为不信任他,就不让他干活。你只是不会把公章交到他手上,也不会让他一个人签字打款。

AI Agent 的管理逻辑是一样的:把它的能力用在效率上,把它的权限关在制度里。

初级方案是反复叮嘱它「别乱来」,高级方案是让它根本没有乱来的机会。

今天就可以做一件事:打开你的工具清单,给每一个工具按「查询 / 修改 / 删除 / 高危」标个颜色。标完你就会知道,哪几个工具现在正光着站在那儿。

官方文档

JSON Schema 官网:https://json-schema.org/

MCP 官方文档:https://modelcontextprotocol.io/

OpenAI 函数调用指南:https://platform.openai.com/docs/guides/function-calling

往期推荐

本地大模型部署避坑:先算清这 3 个数,再决定下载哪个模型

· 7 种 API 一次讲清:REST、gRPC、WebSocket 到底差在哪

K8s 控制器怎么选:一张决策图讲清 6 个控制器,附抄走即用的 YAML

相关学习资料