人机协同,设计成系统能力
一、人机协同,就是把“什么时候叫人”设计成系统能力
人机协同,英文常叫 Human-in-the-Loop,简称 HITL。
用一句人话讲:
不是 AI 不会了才临时喊人,而是系统提前规定好:哪些事 AI 可以自己做,哪些事必须让人看,哪些事人只需要监控,哪些事人只负责制定规则。
很多人第一次做 Agent,会写出这样的逻辑:
如果 AI 觉得自己不确定,就转给人工。听起来合理,但在真实系统里不够可靠。AI 最危险的时候,未必会说“我不确定”,它可能很自信地给出错误答案。所以,生产级 Agent 不能把“要不要叫人”完全交给 AI 自己判断。
由业务规则、风险等级、操作后果和合规要求,共同决定是否需要人工介入。更可靠的做法,是由业务规则、风险等级、操作后果和合规要求共同决定是否需要人工介入。人机协同要解决的,就是把人的判断设计成系统能力。
二、为什么需要它:不是所有事情都适合 AI 自己决定
先用一个生活场景理解。
你去医院看病,门口通常会有分诊台。分诊护士不会自己完成所有诊断,也不会把所有人都直接送进急诊。她会判断:
- 普通感冒,去普通门诊;
- 胸痛、呼吸困难,立刻走急诊;
- 症状复杂,交给专科医生;
- 情况稳定,排队等待。
这套机制的重点不是“护士会不会看病”,而是:系统要知道什么时候该让谁接手。Agent 也是一样。
一个客服 Agent 可以自动回答“怎么修改地址”;但如果用户要退款、改合同、处理大额交易、删除数据,系统就不能只靠 AI 的自信程度来决定。
比如:
用户:请帮我把这笔 5 万元的退款直接打回原账户。
AI:好的,已为你处理。没有审批,这可能就是一次严重事故。更稳妥的流程应该是:
用户提出请求
↓
Agent 理解任务并生成拟执行动作
↓
系统检查风险规则
↓
低风险:自动处理
中风险:记录并进入监控
高风险:暂停,交给人工审批
↓
审批通过后再继续执行三、人机协同在做什么:判断、暂停、交接、恢复
人机协同通常包含四个关键动作。
| 动作 | 解决的问题 | 关键要求 |
|---|---|---|
| 判断 | 这件事要不要人介入 | 依据规则、风险、权限、后果,而不是只看模型自信度 |
| 暂停 | Agent 能不能在关键节点停住 | 先审批后执行,不能事后通知 |
| 交接 | 人能不能快速做决定 | 给出摘要、原因、证据、选项、时限和追踪编号 |
| 恢复 | 人决定后系统怎么继续 | 从断点恢复,避免重复发邮件、重复扣款、重复提交 |
判断依据可以很朴素:
普通查询:AI 自动处理
修改收货地址:AI 自动处理,保留日志
大额退款:必须人工审批
删除用户数据:必须人工确认
异常登录封禁:高风险用户需要人工复核暂停这一步尤其重要。很多 Agent 的错误,不是因为它不会思考,而是因为它太顺滑了:理解任务、调用工具、执行操作,一路跑完。如果系统只是在执行后发通知,那就不是人机协同,而是“事后告知”。
Agent 准备执行高风险动作
↓
系统发现需要审批
↓
暂停当前流程并保存上下文
↓
等待人工决定交接给人工时,也不要只丢一句“AI 不确定,请人工处理”。好的交接应该像一份清晰的“决策包”:
{
"type": "approval_request",
"action_summary": "为用户办理 5 万元退款",
"why_escalated": "退款金额超过自动审批阈值",
"risk_level": "high",
"evidence": ["订单已支付", "用户 30 天内已有 3 次退款记录"],
"alternatives": ["批准", "拒绝", "修改金额后批准"],
"deadline_minutes": 10,
"trace_id": "refund-20260623-001"
}人做完决定后,Agent 也不应该从头重跑,而应该从暂停点恢复:
Agent 暂停
↓
人工审批
↓
系统记录审批结果
↓
Agent 从断点继续
↓
执行后续动作
↓
写入审计日志四、用一张图看懂基本流程
这张图的重点是:
人不是随机插进来的,而是被策略规则请进来的。五、三种人机关系:不是所有场景都要逐条审批
很多人一听到人机协同,就以为是“每一步都要人工确认”。这其实不现实。生产环境里,人机协同通常分成三种关系。
| 类型 | 人的角色 | 适合场景 | 举例 |
|---|---|---|---|
| 人在决策中 | 审批者、复核者 | 高风险、不可逆操作 | 大额退款、合同变更、医疗建议 |
| 人在监控中 | 监督者 | 中风险、大批量任务 | 客服质检、内容审核、异常告警 |
| 人在策略层 | 规则制定者 | 高频、规则明确任务 | 设置自动退款阈值、制定风控规则 |
一个退款系统里,这三种关系可以同时存在:小额退款自动处理,大额退款人工审批,整体退款率由运营和风控团队长期监控。
六、常见实现方式:从按钮到生产级机制
最简单的是加一个人工确认按钮:
AI 生成结果
↓
展示给用户
↓
用户点击确认
↓
系统执行适合 Demo 或低复杂度系统。缺点是没有风险分级、完整审计和暂停恢复机制。
更可靠的方式是“规则引擎 + 审批队列”:
Agent 生成拟执行动作
↓
规则引擎判断风险
↓
需要人工的任务进入审批队列
↓
人工审批后继续执行风险路由要写成明确规则,而不是让 AI 自己猜:
type RiskLevel = 'auto' | 'notify' | 'approve' | 'urgent';
function routeAction(action: Action, context: Context): RiskLevel {
if (action.type === 'delete_user_data') return 'approve';
if (action.type === 'refund' && action.amount > 10000) return 'approve';
if (context.userRiskScore > 0.8) return 'urgent';
if (context.userRiskScore > 0.4) return 'notify';
return 'auto';
}生产级系统还要能暂停、持久化、恢复、审计。因为你必须回答一个问题:
如果 Agent 暂停后,服务重启了怎么办?可以用伪代码表示:
async function approvalGate(state: AgentState) {
const risk = evaluateRisk(state.proposedAction, state.context);
if (risk.requiresHuman) {
const decision = await interruptAndWait({
type: 'approval_request',
summary: state.proposedAction.summary,
reason: risk.reason,
options: ['approve', 'reject', 'modify'],
traceId: state.traceId
});
return { ...state, humanDecision: decision };
}
return { ...state, humanDecision: 'auto_approved' };
}这里的关键不是 interruptAndWait 这个函数名,而是它背后的机制:保存状态、按任务 ID 恢复、从断点继续,并避免重复执行副作用。
七、完整案例:一个智能退款 Agent 应该怎么设计
下面用一个“智能退款 Agent”的案例,把人机协同串起来。不加人机协同的危险流程可能是这样:
这个流程太顺了:金额、用户风险、特殊订单、审批记录都没有进入系统边界。
加入人机协同后,可以这样设计:
风险规则可以这样拆:
| 分流 | 规则示例 | 系统动作 |
|---|---|---|
| 自动处理 | 金额小于 200 元,订单状态正常,历史退款率低 | 直接退款并记日志 |
| 进入监控 | 金额 200 到 1000 元,最近有少量退款记录 | 自动退款,进入抽检 |
| 人工审批 | 金额超过 1000 元,短时间多次退款,订单信息不完整 | 暂停并生成审批卡片 |
| 紧急升级 | 金额特别高,疑似欺诈,涉及投诉或法律风险 | 升级给高级处理人 |
给人工的审批卡片不要写成“用户申请退款,请处理”。它应该让人一眼看清发生了什么、为什么升级、证据是什么、现在要做什么决定。
{
"title": "退款审批请求",
"summary": "用户申请退还订单金额 5000 元",
"reason": "退款金额超过自动审批阈值,且用户 30 天内已有 3 次退款记录",
"evidence": [
"订单已支付,物流显示已签收",
"用户申请理由为商品质量问题",
"该商品近期同类投诉较多"
],
"ai_recommendation": "建议人工复核后部分退款或要求补充凭证",
"options": ["批准全额退款", "批准部分退款", "要求补充材料", "拒绝退款"],
"trace_id": "refund-20260623-001"
}审批后还要写入日志:
{
"trace_id": "refund-20260623-001",
"decision": "partial_refund",
"approver_id": "operator-007",
"rationale": "用户提供了部分质量问题证据,但商品已使用,批准部分退款",
"final_amount": 3000,
"model_version": "agent-policy-2026-06",
"created_at": "2026-06-23T11:03:50"
}这就是可追溯的人机协同。
八、生产级 HITL 必须注意什么
| 设计点 | 常见错误 | 更稳妥的做法 |
|---|---|---|
| 升级触发 | 如果 AI 没信心,就叫人 | 如果命中高风险规则,就叫人 |
| 执行顺序 | 先执行操作,再请求审批 | 准备执行 → 风险判断 → 暂停 → 审批 → 执行 |
| 副作用 | 恢复两次就退款两次 | 用任务 ID、幂等键和状态机控制副作用 |
| 审批质量 | 人只机械点“同意” | 高风险请求必须填理由,关键请求可二次确认 |
| 告警颗粒度 | 每个异常都通知人工 | 把相关事件合成一个链路或故事 |
比如安全系统里,不要分别推送“登录失败、异地登录、权限提升、下载大量文件”,而是合成一个事件:
某用户在异常地点登录失败多次,随后成功登录,并在短时间内下载大量敏感文件。人机协同不是“找个人坐在那里”。真正的人机协同,要求人能理解、干预、停止和覆盖系统决策。
九、把 HITL 做成学习闭环
很多团队把人工介入看成成本。但换个角度看,人工决策其实是高质量数据。每一次人工审批,都能告诉系统:
AI 的判断哪里对?
哪里错?
什么情况应该自动化?
什么情况必须升级?
哪些规则需要调整?可以把 HITL 数据分成几类。
| 数据 | 用途 |
|---|---|
| 人工批准 | 说明 AI 的建议可能是合理的 |
| 人工拒绝 | 暴露 AI 的风险判断不足 |
| 人工修改 | 说明 AI 方案方向对,但细节需要改 |
| 拒绝理由 | 可以沉淀成新规则 |
| 决策耗时 | 判断哪些升级其实没必要 |
长期至少看三个指标:
| 指标 | 计算方式 | 需要警惕什么 |
|---|---|---|
| 升级率 | 需要人工处理的任务数 / 总任务数 | 一直不降,说明 Agent 或规则没有变好 |
| 平凡升级率 | 很快被批准且没有修改的升级 / 总升级 | 太高,说明很多任务不该打扰人 |
| 关键否决率 | 人工否决 AI 建议且事后证明人工正确的比例 | 长期接近 0,可能说明人变成橡皮图章 |
人工介入不只是兜底,它还应该回流到规则、评估和训练数据里。
十、和上一篇、下一篇模式的关系
人机协同不是孤立存在的。它和“容错与恢复”关系很近:
容错与恢复:Agent 出错、崩溃、工具失败时,怎么恢复?
人机协同:Agent 遇到高风险、不可自动决策的情况时,怎么让人接手?两者经常一起出现。因为一旦 Agent 暂停等人工,就必须有状态保存和断点恢复能力。它和“知识检索”也有关:
知识检索:Agent 不知道外部知识时,怎么查资料?
人机协同:Agent 即使查了资料,也不能自己决定高风险动作时,怎么请人判断?一个常见组合是:
十一、一个实用的设计检查表
设计人机协同时,可以用下面这份清单自查。
1. 哪些操作 AI 可以自动执行?
2. 哪些操作必须人工审批?
3. 哪些操作只需要进入监控?
4. 哪些规则由人提前制定?
5. 升级条件是否写成明确规则?
6. 是否有结构化审批信息?
7. 是否能暂停和恢复任务?
8. 是否保存了完整审计日志?
9. 人工是否能修改、拒绝或终止任务?
10. 高风险操作是否先审批后执行?
11. 是否防止重复执行副作用?
12. 是否监控人工疲劳和橡皮图章问题?
13. 人工反馈是否回流到规则和评估系统?这份清单的核心不是“多加几个按钮”,而是确认:
人是否真的能在关键时刻影响系统行为。人机协同不是让 AI 不会时才喊人,而是提前把“谁能决定什么、什么时候必须暂停、人工如何接手、结果如何追溯”设计进 Agent 系统里。