如果你让一个 AI Agent 直接管理真金白银的交易,你敢让它全自主执行吗?我最近看到一个工程复盘,核心场景是这个:一个 AI Agent 因为误读了一个风险信号,直接把 120 万美元的交易单推了出去。事故发生后,团队没有放弃 Agent,反而构建了一套专门防止这类事故的安全机制。这个案例让我想到一个更普遍的问题——AI Agent 的风险,从来都不是“模型不够聪明”,而是我们给了它太多自主权,却没给它足够的护栏。
如果你也在做 Agent 开发,或者正准备把一个 AI Agent 接到核心业务里,这篇文章会比较适合你。我会从一次误读事故说起,拆解 Agent 为什么会犯错,再把一套分层安全执行框架、五条设计原则、真实项目里的踩坑排查链路完整展开。重点不是教你做一个更强壮的 Agent,而是让你明白:真正能落地的 Agent,是一个被约束和控制过的系统。
1. 一次误读风险信号,真正暴露的是 Agent 的信任边界
1.1 事故为什么会发生:Agent 的行为链路
先来看一个典型的 Agent 工作链路:接收外部信号,理解信号,做决策,调用工具,然后执行动作。
在这个案例里,Agent 接收的可能是某个风险监控系统输出的信号,比如一条 JSON 数据、一段日志分析结果,或者一封解析后的邮件。它需要根据这个信号判断是否触发交易。问题在于,“信号”本身是有歧义的。
比如同一个字段,在不同环境里可能代表不同含义:
- 单位是美元还是美分;
- 时间是 UTC 还是本地时区;
- 阈值是“超过即触发”还是“低于才触发”;
- 值是当前值,还是历史累计值;
- 信号是原始数据,还是已经被上个版本模型加工过的结果。
这些歧义对普通程序来说当然也可以通过类型定义来规避,但对 Agent 来说,它是要在大模型驱动的上下文里自主理解的。模型不是严格按照枚举定义来 parse 字段,它是“读”这个信号。一旦 prompt 里的描述不够精确,或者历史对话里出现了类似字段的干扰,模型就可能把“风险信号”理解成“安全信号”,然后把交易推出去。
这就是事故的第一层原因:Agent 的输入没有被硬性校验。
但更值得问的是:为什么一个 Agent 能直接移动 120 万美元的交易?难道没有额度限制?没有二次确认?没有审批?没有账单系统兜底?
答案很可能是:这个 Agent 被赋予了太大的自主权。它也许在测试环境里表现优秀,于是团队把它接到了真实交易接口,并且给了交易工具权限。模型本身在这个时间点恰好也没有发现异常,于是错误被放大了。
1.2 这不是“模型不聪明”,而是“自主权过大”
很多人会习惯性地归因于模型能力不行。但实际上,即使换成更强的模型,只要 Agent 具备“自主决策 + 直接执行”这条通路,就仍然存在误操作的风险。
我见过很多 Agent 项目,开发者的思路是这样的:
- 先让 Agent 调 API,把单次任务跑通;
- 然后给它工具,让它能调用更多 API;
- 最后给它更多权限,让它直接改数据、发请求、执行交易。
每一步看起来都很自然,但每一步都在扩大信任边界。等到某一天突然发现 Agent 做了一个不可逆的决策时,问题已经不再是“模型能不能理解”,而是“为什么我们没有在中间加一个人工确认点”。
从工程经验看,适合 Agent 自主执行的任务,通常是:低风险、高重复、可回滚。比如自动给工单打标签、自动生成周报、自动解析日志。
而高风险、影响大、不可回滚的任务,比如资金交易、删除生产数据、对外发送关键请求,就不应该让 Agent 在无人确认的情况下直接执行。
可以把任务的“自主程度”分成几个等级:
| 等级 | 任务类型 | AI Agent 可执行程度 |
|---|---|---|
| L1 | 信息查询、内容生成 | 完全自主,人为抽查 |
| L2 | 系统自动化操作,有回滚能力 | 自主执行,但记录完整审计 |
| L3 | 业务决策,影响范围有限 | Agent 给出方案,人工确认 |
| L4 | 资金交易、重大变更 | Agent 只能建议,不能直接执行 |
回到这个案例,如果团队一开始就把 Agent 放在 L2 或 L3,就有机会在风险信号被误读时拦住它。可惜的是,这个 Agent 被直接放在了 L4 的执行层。
这里要补一句:不是所有 Agent 都需要“高自主性”。很多时候,Agent 的价值不在于替你做决定,而在于把重复的调研、分析、方案生成流程固定下来,让你只需要在最关键的一步按下确认键。
核心判断:AI Agent 在金融等高风险场景落地的关键,不是让模型更聪明,而是给它设定清晰的自主边界,并建立多层防护。
2. 我们构建了一套分层的 Agent 安全执行框架
如果事故已经发生,接下来就应该想办法避免它再次发生。那个团队选择构建一套安全框架。从常见的工程实践来看,这套框架至少要包含四个层次:输入校验、动作预检、分级审批、审计回滚。
2.1 第一层:输入信号校验
任何一个 Agent,只要它在跟外部系统交互,就必须有一个独立的信号校验层。不能直接把原始数据丢给模型去理解,而是先用传统代码去校验字段的合法性。
具体可以这样做:
- 定义信号模型,明确字段类型、单位、取值范围;
- 对时间戳做校验,避免过期信号被当成实时信号;
- 对数值字段做阈值校验,比如金额超过某个上限时直接打上“异常”标签;
- 对来源字段做校验,只有来自可信来源的信号才能进入 Agent 决策链路;
- 对信号格式做校验,解析失败时直接报错,而不是让模型猜测。
比如,一个 Agent 需要通过 ES REST API 做日志分析,那么日志查询返回的字段解析就需要先经过这一层的校验。字段是否齐全、时间范围是否合理、返回条数是否超限,都可以在这里用普通代码判断。模型只负责基于解析后的结构化数据做方案生成,而不是直接看原始 JSON 猜含义。
2.2 第二层:动作预检与沙盒模拟
当 Agent 想要调用某个工具时,不应该直接执行。合理的做法是让 Agent 先生成一个“动作计划”,包含:要调用哪个 API、传什么参数、预期影响是什么、有没有风险。
然后这个计划进入一个预检模块。预检模块可以包含:
- 参数合法性检查;
- 目标系统权限检查;
- 影响范围估算;
- 是否与当前目标一致;
- 是否与近期其他操作冲突。
更进一步,在真正进入生产环境之前,可以把 Agent 放在沙盒环境里,用历史数据回放来验证它的决策输出是否合理。比如,用过去三个月的市场数据重新喂给同一个 Agent,看它会生成什么交易信号,这些信号和真实的策略是否一致。
这里的关键是:沙盒环境必须尽量接近生产环境,否则验证效果会打折扣。很多团队在测试环境跑通了 Agent,但生产环境的接口权限、数据形态、网络延迟都不一样,Agent 的行为也会跟着变化。
2.3 第三层:金额阈值与分级审批
针对金融交易这类场景,无论如何都应该设置金额阈值,并根据阈值决定是否需要人工审批。
比如:
- 小于 1 万美元的交易,Agent 可以自动执行,但要有强校验;
- 1 万到 10 万美元的交易,必须触发人工审批;
- 超过 10 万美元的交易,还需要额外的风控复核。
这个阈值体系不是拍脑袋定的,而是基于你对业务风险的承受能力。如果错误交易会造成 120 万美元的损失,那应该把自动执行阈值设得非常保守,甚至可以设为 0,也就是所有交易都先走人工确认。
在实现上,这通常不是靠提示词让 Agent“自己判断要不要审批”,而是通过代码层面的拦截。Agent 可以生成交易请求,但执行前必须经过一个审批服务,这个服务判断金额、风控标签、对方账号等信息,然后阻塞请求并通知人工。
2.4 第四层:全程审计与回滚
一旦 Agent 可以调用外部工具,就必须全程记录它的决策理由、工具调用时间、输入输出摘要、最终执行结果。这些日志不能只写“Agent 执行了某操作”,还要能回溯到它为什么这么做。
审计日志至少要包含:
- Agent 收到的输入信号原文;
- 输入经过校验后的结构化数据;
- prompt 或模型输入的摘要;
- 模型输出的决策理由;
- 动作计划里的参数和预期影响;
- 审批判断结果;
- 实际执行结果和返回内容;
- 异常信息或失败堆栈。
没有这些日志,一旦出了事故,基本无法定位是模型理解错了,还是参数传错了,还是审批逻辑漏了。
另外还要有回滚机制。对交易系统来说,回滚通常意味着“撤销交易”或“补偿操作”。对普通业务系统来说,回滚可能是恢复上一个版本、删除新增记录、重新执行一遍幂等操作。
建议:在任何涉及自动化的系统中,都要为 Agent 的每个关键动作设计一个反向操作。做不到自动回滚,就至少做到人工可回滚。
3. 为什么单次跑通不等于能放手让 Agent 执行真实交易
3.1 先跑通,再仿真,最后灰度
很多团队的开发节奏是:在一个 notebook 里跑通 Agent 调用模型的流程,然后把它包装成服务,再连几个 API 就开始试运行。这样做的最大问题是,单次跑通只说明从输入到输出没有断,并不能说明 Agent 在长时间、多方交互、异常信号下仍然可靠。
更稳妥的节奏应该是:
- 单条样本验证:输入一条已知结果的数据,看 Agent 的输出是否符合预期。
- 测试集验证:准备一批历史数据,覆盖正常、边界、异常场景,批量跑一遍,对比准确率。
- 影子模式:Agent 仍然接收真实输入并生成决策,但这些决策只记录、不执行。你可以比较 Agent 的决策和真实系统的决策差异。
- 灰度执行:选择低风险的小额交易或低频任务开放给 Agent,并设置人工抽查比例。
- 全量运行:只有前几步都稳定后,才放开更大的执行权限。
在实际项目里,很多人会跳过影子模式,直接进入灰度,甚至是直接全量。原因通常是“时间紧张”“数据量大”“人工审核不过来”。但越是这样,越要谨慎,因为 Agent 很容易在固定模式下表现良好,一遇到非结构化输入就出现意外。
3.2 慢比错好:如何控制执行速度与批量
AI Agent 的一个危险特性是它可以“快速连续犯错”。假设 Agent 误读了一个信号,而且它还有循环调用的能力,那么它可能在几秒钟内触发多次交易,直到额度耗尽。
为了避免这种情况,可以从几个维度做限制:
- 并发上限:同时最多允许几个 Agent 实例执行任务。
- 单次任务频率:一个任务最少间隔多少秒。
- 每日自动执行上限:当天 Agent 自动执行的总次数或总金额。
- 冷却机制:当 Agent 连续失败或触发异常时,自动熔断,停止后续操作。
这些限制最好放在代码层,而不是放在 prompt 里。prompt 只是引导模型行为的软约束,不可靠。真正的硬约束要在代码层面强制生效。
比如,一个 Agent 申请调用“执行交易”工具,在进入工具函数之前,先检查当前时间、当期累计金额、费率、冷却时间,如果超过限制就直接返回“熔断:今日自动执行额度已用尽”。
注意:不要一上来就把批量数和并发数拉满,先用一条样例确认输入、输出和日志都正常,再逐步放开限制。
4. 给 Agent 装上五条安全设计原则
从这次事故中可以提炼出一套可复用的设计原则。无论你是做一个简单的客服 Agent,还是财务自动化 Agent,下面五条原则都适用。
4.1 最小权限
Agent 只应该拿到完成当前任务所需的最小权限。如果一个 Agent 只需要读取日志,就不要给它写入权限;如果只需要查询订单状态,就不要给它修改订单状态的权限。
权限应该包括三部分:
- 模型侧:Agent 只能使用预设的工具列表,不能自己注册新工具。
- 平台侧:API 密钥要配置独立的账号,限制 IP 白名单和调用范围。
- 数据侧:Agent 只能访问任务相关的数据集,不能读取全局数据。
很多团队为了方便,会让 Agent 直接用数据库管理员账号,这样一旦 prompt 被注入或者模型误操作,损失面就非常大。
4.2 强制校验
在 Agent 做出每个关键动作之前,都应该有一个独立的校验步骤。这个校验不能由大模型自己完成。否则模型会沿着原有的错误思路继续判断下去。
强制校验应该包括:
- 动作类型是否被允许;
- 参数是否满足约束;
- 动作是否来自已授权的流程;
- 是否达到人工审批阈值。
比如 Agent 要发送一封邮件,强制校验模块需要检查收件人、主题、附件大小、是否包含敏感词。哪怕 Agent 输出了一大段理由,只要校验不过就拦截。
4.3 分级审批
分级审批的本质是让不同影响级别的动作走不同流程。你的业务可以有:
- 自动通过;
- 单人审批;
- 双人审批;
- 风控会议审批。
分级审批的规则要写清楚,并且要让 Agent 的调用方知道“这个动作不会被自动执行”。否则用户在界面上看到 Agent 表示“已完成”,但实际上还卡在审批中,会引起混淆。
在实现上,审批动作本身也可以由另一个 Agent 来做预审,但最终确定权还是要给人。不能把两个 Agent 串起来然后告诉系统“已经有人审批了”。
4.4 全程审计
审计日志不仅是为了追溯事故,更是为了持续优化。通过审计日志,你可以发现哪些输入容易让 Agent 误判,哪些工具容易引发失败,哪些操作超出了预期范围。
审计日志要有状态机:创建、待审批、已批准、执行中、成功、失败、已回滚。这样你才能快速知道某个任务当前处于什么阶段。
建议在日志里加上请求 ID 和 trace_id,用于关联 Agent 的整个调用链。如果 Agent 调用了外部服务,外部服务的调用 ID 也要记录下来。
4.5 可回滚
每一个自动化操作都应该有一个反向操作。这听起来像废话,但在真实项目里,很多 Agent 只考虑了正向流程,没有考虑失败后怎么回滚。
比如:
- 如果 Agent 创建了一笔订单,回滚可以是取消订单。
- 如果 Agent 发送了一封通知邮件,回滚可以是再发送一封更正邮件。
- 如果 Agent 修改了数据库记录,回滚可以是恢复旧值。
可回滚并不一定要求自动回滚,但至少要保证有办法在最短时间内执行恢复。如果连回滚方案都没有,那就应该设置更严格的人为审批。
5. 在实际项目里接入 Agent,最容易踩的坑
5.1 环境与依赖:版本不一致导致行为漂移
Agent 的模型版本、工具版本、依赖库版本,任何一个变化都可能导致行为改变。你上个月测试通过的 Agent,这个月基础模型升级了,可能输出格式就变了。
环境配置里最容易踩的坑包括:
- 模型版本没有锁定,导致结果不可复现;
- 工具库版本不一致,导致参数解析错误;
- 不同环境(开发、测试、生产)的 API 密钥权限不同;
- Python 或 Node 版本不一致,导致中文编码、时间处理差异。
比较好的做法是:在 Agent 的配置中固定模型版本和 prompt 版本,并用 CI 流程跑一遍回归测试。这样每次升级模型或 prompt 时,都能知道有没有影响。
5.2 日志缺失:出问题无法定位
很多 Agent 项目的早期版本根本没有日志。当 Agent 在线下能跑通,但线上偶发异常时,你会没有任何线索。
我见过一个日志记录很少的 Agent 集成:它只是把最终结果写进数据库,但中间调了哪些工具、每次调用用了什么参数,完全没有记录。结果某天 Agent 删除了一条不该删除的数据,团队最后只能从数据库 binlog 里手动捞数据,花了一整天。
所以,在设计 Agent 时,第一件事就是把审计日志的 schema 定义好。不要等功能开发完再补日志,到时候你会漏掉最关键的信息。
5.3 提示词里的隐形矛盾:让模型既灵活又严格
提示词经常被赋予太多任务。既要求模型“充分发挥创造力”,又要求“严格按规则执行”。这两个要求本身就存在张力。
比如在金融场景里,你写:“你是资深交易员,可以灵活判断风险信号。”模型就可能真的“灵活”起来,把某些模棱两可的信号往好的方向解释。更稳妥的写法是:“你只能基于给定字段判断,禁止推测字段以外的信息,当信号无法判断时直接拒绝执行。”
但光靠提示词还不够,还是要用代码校验。提示词的作用是让模型理解任务,不是让它替代工程约束。
5.4 排查链路:从现象到根因的顺序
当 Agent 出现问题时,不要急着改 prompt。先按照下面的顺序排查:
- 看现象:是报错、卡住、无输出、输出异常、速度慢,还是执行了错误动作?
- 看输入:原始输入是否完整,有没有编码问题、时区问题、字段缺失。
- 看环境:依赖版本、权限、网络、模型版本是否与预期一致。
- 看参数:批量数、并发数、超时时间、审批阈值是否被错误配置。
- 看日志:决策链路里哪一步开始偏离预期。
- 看工具边界:模型本身是否支持该任务,工具是否有限制。
这套排查顺序可以帮你避免最典型的错误——先怀疑模型,结果发现是上游数据字段没解析对。
6. AI Agent 的可靠性,最终是系统工程
6.1 技术可以演进,但失控的代价由制度兜底
大模型的能力会不断提升,Agent 的理解能力也会越来越强。但即使模型再强,也不可能保证 100% 不犯错。尤其在真实业务里,一个 Agent 往往会面对无穷无尽的边界情况,这些情况很难全部被训练数据覆盖。
所以,可靠性的核心不是消灭错误,而是控制错误的影响范围。一个设计良好的系统,允许 Agent 犯错,但不会允许它一次就造成 120 万美元的损失。
这也是为什么我一直强调“人在回路”——让 Agent 做建议、做初稿、做预判,但在关键节点上保留人的确认权。这样虽然放弃了部分自动化效率,却保住了最终的可控性。
6.2 给开发者的建议:先把自己逼到“假设会出错”
如果你现在正准备开发一个 AI Agent,我的建议是:不要先想“它能做什么”,先想“如果它错了会怎样”。
然后针对这个“如果”,设计防护措施。具体来说,可以从这三个问题开始:
- Agent 能调用哪些工具?这些工具的权限边界是什么?
- Agent 的哪些动作是不可回滚的?这些动作有没有审批机制?
- 当 Agent 出错时,我们多快能发现?发现后多快能恢复?
把这三个问题想清楚,再开始写代码,你会省下非常多的返工时间。
回到最初那个案例:那个团队在事故后构建了完整的安全框架,不是为了证明 Agent 不会犯错,而是为了让它在犯错时不会失控。这才是 AI Agent 真正成熟的表现——不是让它像人类一样聪明,而是让它像工程系统一样可靠。
如果你也打算在项目里接入 AI Agent,不妨把它当成一个需要持续运维和治理的系统,而不是一个一次性交付的脚本。模型负责能力,你负责边界。两条线都守住,Agent 才能真正为你创造价值。