Skip to content
ApprovalUXDesignSecurity

审批队列设计:Human-in-the-Loop 的工程化实践

为什么需要人工审批

AI Agent 的自主性是一把双刃剑。当 Agent 尝试执行以下操作时,自动放行风险极高:

  • 删除生产数据库
  • 向外部域名发送 HTTP 请求
  • 执行未知来源的 shell 命令
  • 修改系统配置文件

Vigils 的策略是:默认 Deny,升级需要显式授权。人工审批是升级路径中的关键节点。

审批状态机

[CREATED] → [PENDING] → [APPROVED] → [EXECUTED]
                    ↓
              [DENIED] / [EXPIRED] / [CANCELLED]
  • CREATED:防火墙判定风险分超过阈值,创建审批记录
  • PENDING:等待用户决策,默认 5 分钟超时
  • APPROVED:用户批准,记录授权范围,进入执行
  • DENIED:用户拒绝或策略拒绝
  • EXPIRED:超时未处理,自动拒绝
  • CANCELLED:用户主动取消

授权范围设计

用户批准时可以选择三种范围:

范围含义适用场景
Once仅放行本次请求一次性高危操作
ThisSession同 Session 内自动放行连续调用同一工具
ForTool相同参数自动放行重复执行相同查询

ThisSession 是用户体验和安全之间的平衡点。它避免了用户连续点击"批准"的疲劳,同时限制了自动放行的作用域。

用户体验优化

  1. 风险透明:审批卡片展示具体风险因素(如"文件系统写操作 + 超出项目目录范围")
  2. Payload 预览:用户可以查看操作的具体参数,但不暴露原始 secret
  3. 快捷操作:支持键盘快捷键(A 批准、D 拒绝、Esc 取消)
  4. 批量处理:同类型的多个审批可以一键批量批准

性能设计

审批队列基于 SQLite + 内存缓存:

  • 创建延迟:<5ms
  • 查询延迟:<1ms
  • 并发支持:单表锁,但审批操作是低频的

对于需要毫秒级响应的场景,ThisSession 快路径绕过审批队列直接放行。

审计价值

每一条审批记录都是合规审计的关键证据:

  • 谁在什么时间批准了什么操作
  • 授权范围是什么
  • 风险因素有哪些
  • 最终执行结果如何

这些记录写入 SHA256 哈希链,不可篡改。