我第一次认真考虑 AI 的权限问题,不是在做 Agent,而是在用 AI Coding 的时候。

现在的模型改代码已经很厉害了,可一旦让它连续改很多文件,偶尔还是会改错、改乱。即使项目有 Git,知道随时可以回退,看着它动手的时候也会心惊。

代码改坏了还能看 diff、退版本。如果同样的事情发生在数据库、文件库或者外部服务里,处理起来就没那么轻松了。特别是删除、重复写入和脏数据,有些影响当时根本看不出来,过一段时间才会在别的业务里暴露。

所以后来做 Agent 项目时,我很早就确定了一件事:模型可以参与判断,但不能直接拿到底层系统的权限。

不能只在提示词里写“禁止操作”

最简单的办法当然是在系统提示词里写规则:不能删数据,不能越权,不能在没有确认时写入。

这些规则有用,但我不敢只靠它们。

模型再强也会有幻觉,也可能没有完全遵从指令。用户说得不清楚、工具返回异常、上下文太长,都可能让它理解错。模型本身没有恶意,可它也不用承担执行错误的后果。只要权限已经给出去,一次错误判断就可能真的进入事实库。

Agent 和普通聊天最大的不同也在这里。聊天回答错了,影响通常还停留在文字上;Agent 会调用工具,它的判断可以继续传到数据库、文件系统和外部服务。能影响的范围越大,越不能把安全全压在一句 Prompt 上。

我在 Dify 版本里做了 Tool Gateway,到了 LangGraph 版本,又把内部数据和外部工具分成 DataCenter、ToolCenter。具体实现不完全一样,思路是一致的:Agent 不直接碰底层资源,只能调用系统暴露给它的能力。

我把“理解”和“执行”分开了

用户会怎么提问,很难提前列完。让模型判断用户意图、选择专业 Agent、决定还缺什么资料,这些正是它擅长的事情。如果都写成代码里的 if,系统很快就会变成一堆补不完的分支。

但执行不能跟着一起放开。

Agent 需要内部数据时,只能调用已经登记的查询能力。接口允许传哪些参数、会返回什么内容,都提前定义好。它可以决定要查什么,却不能临时拼一条 SQL,也不能要求系统执行一个从来没有开放过的动作。

外部 MCP 工具也有一层 ToolCenter。不同厂商的工具参数差别很大,返回格式也不一样。如果直接全部丢给 Agent,它既要理解用户问题,还要记住每家工具的调用细节。ToolCenter 把这些差异收在里面,对 Agent 暴露相对统一的方式。

这样做也方便处理一些实际问题。比如调用超时、结果为空、数据时间不一致,到底是工具坏了,还是数据源本来就没有结果,需要明确区分。否则到了模型手里,很容易都被解释成一句“没有查到相关数据”。

只读分析的过程大概是这样:

用户提问
  -> 总控判断要做什么
  -> 调用相应的功能 Agent
  -> 通过 DataCenter / ToolCenter 取得事实
  -> 功能 Agent 返回分析
  -> 总控决定直接回答,还是继续补查

这里没有要求模型每一步都按固定流程走。它可以决定调用谁、查什么、是否需要再来一轮。真正访问数据和工具时,才落到代码规定的范围内。

写入时必须停一下

查询选错了,可以重查。写入一旦错了,后面的分析可能会一直把错误数据当成事实。

所以写入结构化数据、修改用户画像这类操作,我都要求二次确认。Agent 先生成一个候选,告诉用户准备写什么;用户或管理员确认后,再由固定代码执行。执行完成还要看真实结果,并重新查询事实源核对。

生成候选 -> 人工确认 -> 固定代码执行 -> 返回结果 -> 再次核对

这一步不能相信模型自己说“已经完成”。模型只能转述执行结果,不能证明数据真的写进去了。后台日志、真实返回值和事实源中的变化,至少要有可以核对的证据。

还有一种情况更麻烦:写入请求超时了,暂时不知道成功还是失败。

这时我不会让系统自动再试一次。如果第一次其实已经成功,重试可能造成重复写入。更稳妥的做法是停下来,把它记成待处理的风险事项,由人查看日志和事实源,再决定后面怎么处理。

这样会让流程多一步,但比“系统看起来很顺,数据却不知道被改了几次”好得多。

护栏带来的不只是安全

所有调用都经过固定入口以后,Agent 的行为也更容易查清楚。

它调用了哪个能力、传了什么参数、拿到什么结果、写入有没有确认,这些都能留下记录。出了问题可以往回查,测试时也不必只盯着最后一段回答。

我后来在 LangGraph 项目中把这类检查写进了自动化测试:该查数据时有没有真的调用工具,资料不够时有没有明确说出来,涉及写入时有没有绕过确认,都有对应的断言。模型每次生成的文字可能不同,但这些边界不应该跟着漂。

所以我不觉得护栏是在和 Agent 作对。

它更像刚学自行车时装的辅助轮。辅助轮不是让人骑得更慢,而是先避免摔倒。现在的 DataCenter、ToolCenter、人工确认和运行记录,作用也差不多。先把容易出问题的地方托住,Agent 才能更放心地参与理解、规划和调度。

我当然期待真正的 AGI 到来。到了那一天,AI 对意图、责任和后果的理解可能完全不同,今天这种逐项确认、处处设防的方式也许会显得笨重。

不过外部系统的权限和责任应该还会存在。人操作生产系统也不是想做什么就做什么。将来可能消失的是为了防止模型犯低级错误而加上的僵硬围栏,不是所有边界。

至少在现在,我愿意把线画得清楚一点:模型去理解那些列举不完的问题,代码守住不能出错的事实和操作。

护栏不是不让 Agent 影响外部世界,而是让它的影响更可靠一些。