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 是用户体验和安全之间的平衡点。它避免了用户连续点击"批准"的疲劳,同时限制了自动放行的作用域。
用户体验优化
- 风险透明:审批卡片展示具体风险因素(如"文件系统写操作 + 超出项目目录范围")
- Payload 预览:用户可以查看操作的具体参数,但不暴露原始 secret
- 快捷操作:支持键盘快捷键(A 批准、D 拒绝、Esc 取消)
- 批量处理:同类型的多个审批可以一键批量批准
性能设计
审批队列基于 SQLite + 内存缓存:
- 创建延迟:<5ms
- 查询延迟:<1ms
- 并发支持:单表锁,但审批操作是低频的
对于需要毫秒级响应的场景,ThisSession 快路径绕过审批队列直接放行。
审计价值
每一条审批记录都是合规审计的关键证据:
- 谁在什么时间批准了什么操作
- 授权范围是什么
- 风险因素有哪些
- 最终执行结果如何
这些记录写入 SHA256 哈希链,不可篡改。