我给 AI Agent 接了删数据、发退款这种高危工具还让它全自动跑,结果它判断失误自主执行了一个不可逆操作、造成真实损失,我对着这次没有人能拦一下的事故复盘

我为了让 Agent 更自动化,给它接了一整套工具,包括删除数据、发起退款、群发通知这类高风险且不可逆的操作,还让它全自动跑、自己决定调哪个。大部分时候又聪明又高效,可有一次它基于错误理解自主调用了删除工具误删了数据、又有一次错误地给一批用户发起退款——都是不可逆的、在我不知情下悄悄执行的,造成真实损失,而且从决定到完成中间没有任何人能拦一下。深挖才懂:我把高风险不可逆的操作权毫无保留地完全交给了会犯错的 Agent,没有任何人在环路的确认门禁。AI Agent 本质是会犯错、不确定的决策者,把会犯错的决策者和会造成不可逆后果的危险工具无门禁连在一起还放手全自动,等于把可能走火的枪上膛还取消所有保险。这篇从自主权要和犯错代价匹配讲起,到工具按风险分级+人工确认门禁+权限最小化+dry-run+审计+可回滚的正解、Agent 安全分层设计、操作风险分级策略、人在环路的几种形态、带门禁的执行器,以及那句最戳心的——给会犯错的智能体行动能力就同时揽下为它错误负责的担子,能力和责任必须匹配,衡量标准不只是它多强大多自动,更是它犯错时后果是否可控可拦可挽回。

我给 AI Agent 接了删数据、发退款这种高危工具还让它全自动跑,结果它判断失误自主执行了一个不可逆操作、造成真实损失,我对着这次没有人能拦一下的事故复盘

这是一个让我对"给 AI Agent 多大的权力"深刻反思的故事。我做了一个能自主决策、调用工具的 AI Agent,为了让它"更强大、更自动化",我给它接了一整套工具——其中不乏"删除数据""发起退款""群发通知"这类高风险、且不可逆的操作。然后,我让它全自动地跑,自己决定调用哪个工具。大部分时候,它表现得又聪明又高效。可有一次,它判断失误了——基于一个错误的理解,它自主地调用了那个"删除数据"的工具,误删了一批本不该删的数据;还有一次,它错误地给一批用户发起了退款这些操作,都是不可逆的;它们在我毫不知情的情况下,被 Agent 悄悄、自动地执行了,造成了实实在在的损失;而最让我后怕的是——从它决定执行,到操作完成,中间没有任何一个环节、任何一个人,能拦它一下

我顺着这次事故反思,才终于揭开真相,补上了我对 AI Agent 工程一个最关键、却最容易被"追求自动化"冲昏头脑而忽视的认知漏洞:问题的核心,是我把"高风险、不可逆"的操作权,毫无保留地、完全交给了 Agent 去自主决定和执行,而没有设置任何"人在环路(human-in-the-loop)"的确认门禁。我一直想当然地以为,"Agent 越自动、越省人力,就越好";可真相是:AI Agent,本质上是一个"会犯错的、不确定的"决策者(它会幻觉、会误解、会被误导);而把一个"会犯错的决策者",和一堆"会造成不可逆后果的危险工具",直接、无门禁地连在一起、还放手让它全自动跑,本身就是一个极其危险的设计——它等于把一把"可能走火的枪",上了膛、还取消了所有保险正确的做法,绝不是"追求 100% 的全自动",而是要根据操作的"风险等级",来分级地决定给 Agent 多大的自主权:低风险、可逆的操作(如查询、读取),可以放手让它自主执行;但对高风险、不可逆的操作(删数据、发钱、对外发送),则必须设置"人工确认"的门禁——Agent 只能"提议"要执行这个危险操作,而最终的"批准执行",必须由一个来点头我这才痛彻地明白:给 AI Agent 设计能力时,"它能做什么"和"它能自主做什么",是两个必须分开的问题;自主权,要和"犯错的代价"匹配——代价越大、越不可逆的操作,就越要收紧它的自主权、越要让人来把最后一道关。在 Agent 的能力边界上,"人在环路"不是对自动化的倒退,而是在"自动化的效率"和"风险的可控"之间,一道必不可少的安全阀

故障现场:危险工具无门禁,Agent 自主执行不可逆操作

我把这次"没人能拦"的事故,用伪代码摊开给你看:

# ✗ 灾难: 危险工具直接给 Agent 全自动调用, 无任何确认门禁
TOOLS = {
    "query_orders": query_orders,       # 低风险(只读)
    "delete_data": delete_data,         # ✗ 高风险! 不可逆! 却和只读工具一样平等地给了 Agent
    "issue_refund": issue_refund,       # ✗ 高风险! 涉及钱! 不可逆!
    "send_notification": send_all,      # ✗ 高风险! 对外群发, 发出去收不回!
}

def agent_loop(task):
    while not done:
        action = llm.decide_next_action(context)   # ✗ Agent 自主决定调哪个工具
        # ✗ 不管是查询还是删库, 一律直接执行, 没有任何拦截!
        result = TOOLS[action.tool](action.args)   # ✗ 危险操作也就这么执行了
        context.append(result)

# 事故是怎么发生的:
#   1. Agent 基于一个错误的理解(幻觉/误解上下文)。
#   2. 它自主决定: "我应该调用 delete_data 删掉这批数据" / "给这些人退款"。
#   3. 代码无条件执行了 → 不可逆操作完成 → 数据没了 / 钱退了。
#   4. 全程无人知晓、无人能拦, 等发现已造成损失。

# 根本问题:
#   - 把"会犯错的 Agent" + "不可逆的危险工具" 直接无门禁连在一起。
#   - 没有按风险分级: 查询和删库, 被同等对待、都全自动。
#   - 没有 human-in-the-loop: 危险操作没有人来批准。
#   - 没有 dry-run / 审计 / 回滚: 出了事难补救、难追溯。

# 类比: 给一个"聪明但偶尔会犯糊涂"的实习生, 直接开通了生产数据库的删除权限
#       和财务的退款权限, 还让他自己看着办、不用任何人审批 —— 迟早出事。

# 根因: 高风险不可逆操作完全交给 Agent 自主执行, 无人工确认门禁/无权限分级,
#   Agent 一旦判断失误就酿成不可逆的真实损失, 且无人能拦。

看着这段"把删库和查询一视同仁地全自动"的代码,我才算彻底想明白了这次事故的根源。问题的核心,是我把"会犯错的 Agent"和"不可逆的危险工具",直接无门禁地连在了一起事故是这么发生的:Agent 基于一个错误的理解(幻觉/误解上下文),自主决定"调用 delete_data 删数据"/"给这些人退款",代码无条件执行,不可逆操作就这么完成了,全程无人知晓、无人能拦根本问题有四:把"会犯错的 Agent"+"不可逆的危险工具"直接无门禁连在一起;没有按风险分级(查询和删库被同等对待、都全自动);没有 human-in-the-loop(危险操作没人批准);没有 dry-run/审计/回滚(出事难补救难追溯)打个比方:这就像给一个"聪明但偶尔犯糊涂"的实习生,直接开通了生产数据库的删除权限和财务退款权限,还让他自己看着办、不用任何人审批——迟早出事。归根结底:高风险不可逆操作完全交给 Agent 自主执行,无人工确认门禁/无权限分级,Agent 一旦判断失误就酿成不可逆的真实损失,且无人能拦——这,就是根源。

第一件事:搞懂为什么自主权要和风险匹配

定位到根源,我必须把"Agent 的自主权该如何设计"从根上彻底搞清楚:

Agent 是会犯错的决策者; 自主权必须和"犯错代价"匹配

# 大前提: Agent 是"会犯错、不确定"的
#   - 它会幻觉、会误解上下文、会被诱导、会判断失误(见幻觉/盲信篇)。
#   - 即: 它的每一个决定, 都有"出错"的概率。

# 风险来自两个维度:
#   - 操作的"危害程度": 删数据/发钱/对外发送 >> 只读查询。
#   - 操作的"可逆性": 不可逆(删了/发了收不回) >> 可逆(改了能改回)。
#   → 高危害 + 不可逆 = 最高风险, 一旦错了无法挽回。

# 核心原则: 自主权 与 犯错代价 匹配
#   - 低风险可逆操作(查询/读取): 放手让 Agent 全自动。
#   - 中风险: 自动执行但记录、可回滚、有告警。
#   - 高风险不可逆(删/钱/对外): 必须 human-in-the-loop, 人来批准。
#   → "能力"和"自主执行的权限"要分开: 给它能力, 但收紧危险操作的自主权。

# human-in-the-loop(人在环路):
#   - Agent 只"提议"危险操作, 给出理由和将影响的范围。
#   - 由人审核、确认后, 才真正执行。
#   - 是"效率"和"可控"之间的安全阀, 不是对自动化的倒退。

# 还要配套的安全机制:
#   - 权限最小化: 只给 Agent 完成任务必需的工具/权限。
#   - dry-run(预演): 危险操作先"模拟"出"将做什么", 给人/Agent 自检。
#   - 审计日志: 谁(哪个Agent)在何时调了什么工具、做了什么, 全程可追溯。
#   - 可回滚/软删除: 尽量让操作可逆(软删而非硬删、可撤销的退款)。
#   - 限额/限频: 危险操作设上限(如单次退款金额上限)。

# 关键认知: 给 Agent 自动化, 但别在"高危不可逆"的地方, 放弃人的最终把关。

# 核心: Agent 会犯错, 自主权要和犯错代价匹配; 高危不可逆操作必须人在环路;
#   配合权限最小化+dry-run+审计+可回滚+限额, 在效率和可控间设安全阀。

原理终于清晰了。大前提:Agent 是"会犯错、不确定"的——它会幻觉、误解上下文、被诱导、判断失误,每个决定都有"出错"的概率风险来自两个维度:操作的"危害程度"(删数据/发钱 >> 只读查询)和"可逆性"(不可逆 >> 可逆);高危害 + 不可逆 = 最高风险,一旦错了无法挽回由此引出核心原则:自主权 与 犯错代价 匹配——低风险可逆操作(查询)放手全自动、中风险自动但记录可回滚有告警、高风险不可逆(删/钱/对外)必须 human-in-the-loop 人来批准;"能力"和"自主执行的权限"要分开:给它能力,但收紧危险操作的自主权human-in-the-loop:Agent 只"提议"危险操作、给出理由和影响范围,由人审核确认后才执行;它是效率和可控之间的安全阀,不是对自动化的倒退还要配套安全机制:权限最小化(只给必需的工具)、dry-run 预演(危险操作先模拟出"将做什么")、审计日志(全程可追溯)、可回滚/软删除、限额限频由此,我刻下一个关键认知:给 Agent 自动化,但别在"高危不可逆"的地方,放弃人的最终把关。归根结底:Agent 会犯错,自主权要和犯错代价匹配;高危不可逆操作必须人在环路;配合权限最小化+dry-run+审计+可回滚+限额,在效率和可控间设安全阀。

第二件事:正解——风险分级 + 人工确认门禁 + 配套安全机制

搞懂了原理,正解就清晰了:给工具按风险分级,低风险放手、高风险设人工确认门禁;再配上权限最小化、dry-run、审计、可回滚

# ✓ 正解: 工具按风险分级, 危险操作走人工确认门禁
TOOL_RISK = {
    "query_orders": "low",       # 只读, 可逆
    "update_status": "medium",   # 可逆, 自动但记录+告警
    "delete_data": "high",       # ✗→✓ 高风险: 不可逆, 必须人工确认
    "issue_refund": "high",      # 涉及钱: 必须人工确认
    "send_notification": "high", # 对外: 必须人工确认
}

def execute_action(action):
    risk = TOOL_RISK.get(action.tool, "high")   # ✓ 默认按最高风险(白名单思维)

    if risk == "low":
        return TOOLS[action.tool](action.args)   # ✓ 低风险: 自动执行

    if risk == "medium":
        result = TOOLS[action.tool](action.args)
        audit_log(action, result)                # ✓ 记录审计 + 发告警
        return result

    if risk == "high":
        # ✓ 高风险: 不直接执行! 走人工确认门禁
        preview = dry_run(action)                 # ✓ 先 dry-run: 算出"将影响什么"
        approval = request_human_approval(        # ✓ 请人审批
            tool=action.tool, args=action.args,
            reason=action.reason, preview=preview, # 给人看清: 要做什么、影响范围
        )
        if approval.granted:
            result = TOOLS[action.tool](action.args)
            audit_log(action, result, approver=approval.who)  # ✓ 记下谁批的
            return result
        else:
            return f"操作被拒绝: {approval.reason}"   # ✓ 没批准就不执行

# 配套安全机制:
#   ✓ 权限最小化: Agent 只拿到完成任务"必需"的工具(别一股脑全给)。
#   ✓ dry-run: 危险操作先模拟, 输出"将删除 N 条/将退款 X 元", 给人确认。
#   ✓ 审计日志: 每步谁(哪个Agent)、何时、调了什么、做了什么, 全可追溯。
#   ✓ 可回滚: 软删除(标记而非物理删)、可撤销的操作, 尽量让"不可逆"变"可逆"。
#   ✓ 限额限频: 危险操作设上限(单次退款≤X元, 单次删除≤N条, 超了强制人工)。

# 核心: 工具按风险分级, 低风险自动、中风险自动+审计、高风险走 dry-run+人工确认门禁;
#   配合权限最小化、审计、可回滚、限额, 给 Agent 装好刹车和安全带。

修复的方向,是给 Agent 的能力"装上刹车和安全带"。核心是 按风险给工具分级、分级处理:低风险(只读)自动执行;中风险(可逆)自动但记审计、发告警;高风险(不可逆/涉及钱/对外)绝不直接执行,而是走"人工确认门禁"高风险的处理流程是:先 dry-run(预演),算出"将影响什么"(将删除 N 条/将退款 X 元);再 request_human_approval(请人审批),给人看清"要做什么、影响范围、理由";只有人批准了才真正执行,并记下"谁批的";没批准就不执行这里有个重要细节:风险等级默认按"最高风险"处理(TOOL_RISK.get(tool, "high"))——白名单思维,没明确标为低风险的,一律当高风险对待,宁可保守还要配上一整套安全机制:权限最小化(只给必需的工具)、dry-run(危险操作先模拟)、审计日志(全程可追溯)、可回滚(软删除而非物理删,尽量让"不可逆"变"可逆")、限额限频(危险操作设上限,超了强制人工)归根结底:工具按风险分级,低风险自动、中风险自动+审计、高风险走 dry-run+人工确认门禁;配合权限最小化、审计、可回滚、限额,给 Agent 装好刹车和安全带。

第三件事:Agent 安全设计的几个层次

这次踩坑后,我把 Agent 安全/可控设计的几个层次,系统梳理了一遍——人工确认只是其中一环:

Agent 安全可控设计的几个层次

# 1. 权限层: 最小权限原则
#   - Agent 只拿完成任务"必需"的工具和数据权限, 别一股脑全开。
#   - 不同任务/场景, 给不同的工具集(别给只读任务删除权限)。

# 2. 决策层: 风险分级 + 人在环路
#   - 低风险自动, 高风险(不可逆/涉钱/对外)人工确认(本文)。
#   - 关键决策让人把关, Agent 提议、人批准。

# 3. 执行层: 预演 + 限额 + 可回滚
#   - dry-run 预演影响; 危险操作设限额/限频; 尽量可回滚(软删)。

# 4. 观测层: 全程审计 + 告警
#   - 记录每步: 谁、何时、调了什么、参数、结果、谁批的 → 可追溯可复盘。
#   - 危险操作/异常行为 → 实时告警, 出事能第一时间发现。

# 5. 兜底层: 熔断 + 人工接管
#   - Agent 行为异常(频繁失败/触碰红线)→ 熔断停止, 转人工。
#   - 永远保留"一键停止 Agent / 人工接管"的能力。

# 6. 测试层: 红队 + 对抗测试
#   - 主动测试: 诱导 Agent 做危险操作, 看防线扛不扛得住。

# 关键认知: Agent 越自主, 越要有"层层防护"; 给它能力的同时, 给它边界。
#   - 不是"信任 Agent 不犯错", 而是"假设它会犯错, 并让犯错的代价可控"。

# 核心: Agent 安全是分层的 —— 权限最小化+风险分级人在环路+预演限额可回滚
#   +审计告警+熔断人工接管+对抗测试; 给能力的同时给边界。

这套分层防护,让我对"如何让 Agent 安全可控"有了体系化的认识。权限层(最小权限):只给必需的工具和数据权限、不同任务给不同工具集;决策层(风险分级+人在环路):低风险自动、高风险人工确认(本文);执行层(预演+限额+可回滚):dry-run 预演、危险操作设限额、尽量可回滚;观测层(审计+告警):每步全程记录可追溯、危险操作实时告警;兜底层(熔断+人工接管):行为异常就熔断转人工、永远保留"一键停止 Agent"的能力;测试层(红队+对抗测试):主动诱导 Agent 做危险操作、测防线。由此,我刻下一个关键认知:Agent 越自主,越要有"层层防护";给它能力的同时,要给它边界——不是"信任 Agent 不犯错",而是"假设它会犯错,并让犯错的代价可控"。归根结底:Agent 安全是分层的——权限最小化 + 风险分级人在环路 + 预演限额可回滚 + 审计告警 + 熔断人工接管 + 对抗测试;给能力的同时给边界。

下面这张图,是这次"危险操作无门禁"的成因与解法:

第四件事:操作风险分级与对应策略

这次踩坑后,我把"操作按风险分级、对应不同自主权策略"整理成一张表,设计 Agent 工具时照着分。

风险等级 典型操作 可逆性 Agent 自主权策略
查询/读取/搜索 无副作用 放手全自动
更新状态/写日志 可逆/影响小 自动 + 审计 + 告警
高(数据) 删除/批量修改 不可逆/影响大 人工确认 + 软删 + 限量
高(资金) 退款/付款/扣费 涉及钱 人工确认 + 限额 + 双重审批
高(对外) 群发/发邮件/发布 发出收不回 人工确认 + 预览 + 小范围灰度
极高 删库/改权限/上线 灾难性不可逆 禁止 Agent 自主, 强制人工

这张表,把"给 Agent 多大自主权"变成了"对号入座"。核心逻辑是:风险越高、越不可逆,Agent 的自主权就越要收紧、人的把关就越要加强低风险(查询读取)放手全自动;中风险(更新状态)自动但加审计告警;高风险数据操作(删除)人工确认 + 软删 + 限量;高风险资金操作(退款)人工确认 + 限额 + 双重审批;高风险对外操作(群发)人工确认 + 预览 + 小范围灰度;而极高风险(删库/改权限/上线)则直接禁止 Agent 自主、强制人工。它给我的启发是:"给 Agent 自主权",不是一个"给/不给"的二元选择,而是一个沿着"风险等级"精细分级光谱;真正成熟的 Agent 设计,是在这个光谱上,为每一类操作,都精准地匹配上"恰当的自主权和把关力度"——该放手的放手(享受自动化效率),该收紧的收紧(守住风险底线)

第五件事:人在环路的几种形态

"人在环路"不是只有"每步都问人"一种,它有多种形态,各有适用。我梳理了一下。

形态 做法 适用
事前审批(human-in-the-loop) 危险操作执行前必须人批准 高风险不可逆操作(本文核心)
事中监督(human-on-the-loop) Agent 自动跑, 人实时监控可随时干预 中风险/需要速度但要可控
事后审计(human-after-loop) Agent 自动执行, 人事后审查日志 低风险/可回滚, 重效率
抽样审核 随机抽一部分让人复核 量大、单个风险不高
阈值触发 超过某阈值(金额/数量)才要人审 大部分自动, 大额才把关
双人复核 极高风险需两个人都批准 资金/删库等灾难级操作

这张表,让我看到"人在环路"是个有弹性的谱系,而非只有"事事问人"这一种笨办法。事前审批(执行前必须人批准):用于高风险不可逆操作(本文核心);事中监督(自动跑、人实时盯、可随时干预):用于需要速度但要可控的;事后审计(自动执行、人事后查日志):用于低风险可回滚、重效率的;抽样审核(随机抽查):用于量大、单个风险不高的;阈值触发(超过金额/数量才要人审):大部分自动、大额才把关;双人复核:用于资金/删库等灾难级操作它给我的最大启发是:"引入人的把关"和"追求自动化效率",并不是非此即彼的对立,而是可以通过这些灵活的形态,巧妙地平衡:大部分情况让 Agent 自动跑(效率),只在"真正需要"的关键节点(高风险、大额、异常)把人请进来(可控)好的 Agent 系统,不是"要么全自动、要么全人工"的极端,而是"该自动时自动、该有人时有人",在效率和安全之间,找到那个最适合业务的、动态的平衡点

第六件事:给 Agent 接一个工具时,我现在会怎么决策

现在,每当我准备给 Agent 接入一个工具,脑子里都会过一遍这张决策图——核心就一问:这个操作错了,代价多大、能挽回吗?

这张图的灵魂,是接入工具前的那个必问的问题:这个操作错了,代价多大、能挽回吗?第一问:是只读/无副作用吗?——是,低风险,放手全自动。有副作用,再追问:出错代价大吗?可逆吗?——可逆/影响小,中风险(自动+审计+告警);不可逆/涉钱/对外,高风险(必须人在环路:dry-run 预演 + 人工确认门禁 + 权限最小化 + 限额 + 软删可回滚);灾难级(删库/改权限),直接禁止 Agent 自主、强制人工而贯穿始终的,是全程审计日志、永远保留"一键停止 Agent"的能力,以及用对抗测试主动诱导它做危险操作、验证防线这套判断,让我给 Agent 接工具时,不再"图自动化省事就全放开"——核心始终是:自主权要和"犯错代价"匹配,越不可逆越要有人把关。

我立下的几条规矩

这场"没人能拦"的事故,换来了我做 AI Agent 时,刻进骨子里的几条铁律:

  1. Agent 是会犯错的决策者,自主权要和犯错代价匹配。越不可逆、代价越大的操作,越要收紧它的自主权。
  2. 高风险不可逆操作必须人在环路。删数据、发钱、对外发送——Agent 只能提议,人批准才执行。
  3. 工具按风险分级,默认按最高风险。没明确标为低风险的,一律当高风险对待(白名单思维)。
  4. 权限最小化。只给 Agent 完成任务必需的工具和权限,别一股脑全开。
  5. 危险操作要 dry-run + 限额 + 可回滚。先预演影响、设上限、尽量软删可撤销,让不可逆变可逆。
  6. 全程审计 + 一键停止。每步可追溯,永远保留人工接管和紧急停止 Agent 的能力。
  7. 做对抗测试。主动诱导 Agent 做危险操作,验证防线扛不扛得住,别等真出事。

附:一个带风险分级+人工确认门禁的 Agent 执行器

把风险分级、dry-run、人工确认、审计、限额揉到一起,这是我现在封装"Agent 工具执行器"的骨架,可以直接参照:

from enum import Enum

class Risk(Enum):
    LOW = 1; MEDIUM = 2; HIGH = 3; CRITICAL = 4

# 工具注册: 声明每个工具的风险、是否可 dry-run、限额
TOOL_REGISTRY = {
    "query":        {"fn": query,    "risk": Risk.LOW},
    "update":       {"fn": update,   "risk": Risk.MEDIUM},
    "delete_data":  {"fn": delete,   "risk": Risk.HIGH, "dry_run": dry_delete, "limit": 100},
    "issue_refund": {"fn": refund,   "risk": Risk.HIGH, "dry_run": dry_refund, "limit": 1000},
    "drop_table":   {"fn": drop,     "risk": Risk.CRITICAL},   # 禁止自主
}

def execute(action, agent_id):
    meta = TOOL_REGISTRY.get(action.tool)
    if meta is None:
        raise PermissionError(f"未授权的工具: {action.tool}")   # ✓ 白名单
    risk = meta["risk"]

    audit_log("attempt", agent_id, action)        # ✓ 先记一笔"尝试"

    if risk == Risk.CRITICAL:                      # ✓ 极高风险: 禁止 Agent 自主
        raise PermissionError(f"{action.tool} 禁止 Agent 自主执行, 需人工操作")

    if risk == Risk.LOW:                           # ✓ 低风险: 直接执行
        return _run(meta, action, agent_id)

    if risk == Risk.MEDIUM:                        # ✓ 中风险: 执行 + 告警
        result = _run(meta, action, agent_id)
        alert("medium-risk action", agent_id, action)
        return result

    # HIGH: dry-run 预演 + 限额检查 + 人工确认
    if "limit" in meta and action.affected_count() > meta["limit"]:
        raise PermissionError(f"超过限额 {meta['limit']}, 强制人工处理")  # ✓ 限额
    preview = meta["dry_run"](action.args) if meta.get("dry_run") else None  # ✓ 预演
    approval = request_human_approval(action, preview, agent_id)             # ✓ 人工确认
    if not approval.granted:
        audit_log("rejected", agent_id, action, approval.who)
        return f"操作被 {approval.who} 拒绝"
    return _run(meta, action, agent_id, approver=approval.who)

def _run(meta, action, agent_id, approver=None):
    result = meta["fn"](action.args)
    audit_log("executed", agent_id, action, approver, result)   # ✓ 记下结果+谁批的
    return result

# 核心: 工具白名单+风险分级, CRITICAL禁止自主、HIGH走dry-run+限额+人工确认、
#   MEDIUM自动+告警、LOW直接执行; 全程审计, 把"能力"和"自主权"分开管控。

这个执行器,把前面所有的安全原则,固化成了一道"每个工具调用都必经的关卡"它的几个关键设计:第一,工具白名单——不在 TOOL_REGISTRY 里的工具,直接拒绝(未授权);第二,每个工具声明自己的风险等级、dry-run 函数、限额;第三,按风险分级处理——CRITICAL(删库)直接禁止 Agent 自主、HIGH(删数据/退款)走"限额检查 + dry-run 预演 + 人工确认"、MEDIUM 执行+告警、LOW 直接执行;第四,全程审计——从"尝试"到"执行/拒绝",每一步都记下"哪个 Agent、什么操作、谁批的、结果如何"这一道关卡,把"能力"(Agent 能调哪些工具)和"自主权"(它能不经人就调哪些)清晰地分开管控了。这,正是我想用这段骨架,留给每一个做 Agent 的人的最后一课:"安全可控",不该是散落在各处、靠每次调用时自觉去判断的事,而该收敛成一个统一的、强制的"执行器关卡"——让每一个工具调用,都必须穿过这道关卡的风险审查;把"风险分级、人工确认、限额、审计"这些安全机制,内建进 Agent 的基础设施,而不是依赖开发者在每个调用点的"小心"当"安全"成了架构的默认行为,而非个人的自觉时,你的 Agent 才真正可以放心地、自动地跑起来

写在最后

回头看,这场由"给 Agent 太大权力"引发的、不可逆操作失控的事故,真正教给我的,是一个比"加人工确认"本身更深的道理:当我们把"行动的能力"赋予一个"会犯错的智能体"时,我们就同时,把"为它的错误后果负责"的担子,也揽到了自己身上;而"能力"和"责任(后果)"必须匹配——你给它多大的、能造成多大后果的能力,就必须为它配上多强的、能约束这种后果的"缰绳"我之前的错误,是陶醉于"赋予 Agent 强大能力、实现全自动"的兴奋,却忘了同时,为这份强大的能力,配上与之匹配的约束;我给了它一匹烈马,却没给它套上缰绳。这让我深刻地领悟到:在 AI Agent 这个"赋予机器以行动力"的时代,一个负责任的设计者,衡量自己工作的标准,不该只是"我的 Agent 有多强大、多自动",更应该是"当我的 Agent 犯错时,后果是否可控、是否能被及时拦住和挽回""自动化"很诱人,但"可控"才是底线;尤其是当 Agent 的手,伸向了那些"会造成真实、不可逆后果"的操作时,那道"人的把关",绝不能省给 Agent 能力的同时,给它与能力匹配的缰绳——这,是我用一次"没人能拦"的事故,换来的、关于 AI Agent、也关于"如何驾驭强大而不确定的力量"的、最朴素也最深刻的领悟。如果这篇复盘,能让你在下一次给 Agent 接入危险工具时,先为它装好那道"人工确认"的门禁,那我对着那次不可逆的损失复盘的这大半天,就值了。

—— 别看了 · 2026
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理 邮箱1846861578@qq.com。
技术教程

我图省事在一处用了 any,结果它像病毒一样扩散、把一整条链路的类型检查全废了,拼错属性名都不报错,我排查了大半天的复盘

2026-6-2 4:45:59

技术教程

我在 Python 里拷贝了一个嵌套列表,以为是独立副本,结果改副本的内层元素原列表也跟着变了,我对着浅拷贝只复制一层排查了大半天的复盘

2026-6-2 4:59:35

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索