LLM 面试备考
首页/Agent 架构

人在环中与可控性 Human-in-the-Loop & Controllability

所属:01-fundamentals / 04-agent-architecture
面试权重:★★
来源:通用领域知识(B站「AI Agent 八股」合集高频);未做一手考证
相关项目:Writing Copilot —— 写作前的大纲确认环节(HITL 的核心实践) → 见 02-interview/projects/writing-copilot.md

一句话#

Human-in-the-loop(HITL) 是在 agent 流程的关键节点插入人工确认、编辑或审批,用一部分自动化程度换取可控性;企业落地的硬要求不是「全自动」,而是「可控制、可审计、可追责」。

为什么重要(面试角度)#

这是一道★★题,但它是政企 / 金融 / 医疗类岗位的必答题,也是区分「demo 思维」和「生产思维」的分水岭。面试官想看的是:

  • 你会不会按成本结构选择检查点的位置(不是随便插一个人工确认)
  • 你知不知道 HITL 的代价(打断自动化、阻塞、人力不可扩展、审批疲劳)
  • 你说不说得清 interrupt / resume 的工程要点(状态持久化、幂等、超时)
  • 你理解责任归属才是企业要 HITL 的根本原因

Writing Copilot 里「写作前确认大纲」就是教科书式的 HITL 设计,这题必须结合它答。

核心内容#

为什么需要 HITL#

四类动机,按优先级:

  1. 不可逆的副作用:发邮件、下单、写数据库、对外发布 —— 做错了无法回滚(或回滚代价极高)
  2. 责任归属:出错了谁签字?政企/金融/医疗场景里,「谁批准的」必须有答案。这是很多企业不能全自动的根本原因 —— 技术能力够,但责任链条不成立
  3. 高成本下游:错误会触发昂贵且耗时的下游工作(写作是最贵的一步,见下文)
  4. 模型能力边界:低置信、需要领域知识、或涉及主观偏好(「这个方向对不对」模型无法替用户决定)

检查点位置:按成本结构选#

这是 HITL 设计里最重要的一个判断,也是 Writing Copilot 的核心决策。

思路是:在最便宜的检查点拦截最贵的浪费。

检索(中成本) → 大纲(极低成本:几十个 token) → 写作(高成本:长上下文 + 检索 + 生成) → 发布(不可逆)
                    ↑
              确认点放在这里
  • 大纲错了 → 下游全部重做,浪费的是最贵的那一步
  • 大纲对了 → 下游基本可控
  • 而确认大纲本身的成本极低(用户看几行字)

所以「写作前确认」不是保守,而是成本最优。 反过来,如果放在成文之后确认,你付出的是完整一轮的高成本生成,只为让用户说一句「不对,重来」。

一般原则:检查点应放在**「错误成本开始急剧上升之前」的那个位置。识别它的方法是问:「如果这里错了,后面要重做多少?」**

交互模式#

模式 做什么 适用
Approve / Reject(门禁) 人工批准或拒绝,拒绝则退回 危险动作前的硬门禁
Edit(编辑后继续) 人工修改中间产物,agent 基于修改继续 大纲、SQL、代码草稿
Review(事后审核) 先执行,人工事后检查 低风险、追求吞吐
Tool-level approval(工具级审批) 只对特定危险工具要求批准,其余自动 精细平衡,最常见的生产形态
Confidence-triggered(置信度触发) 只在低置信时询问,高置信时自动 兼顾吞吐与安全
Time-travel / 回滚 回到某个历史状态重新走 配合状态持久化

生产上最实用的组合是「工具级审批 + 置信度触发」:高频低风险的主路径保持全自动,只有危险动作或低置信节点才打断人。

Interrupt / Resume 的工程要点#

HITL 在实现上就是「暂停 → 等待输入 → 恢复」,工程上比看上去难:

  1. 状态必须可持久化:暂停时整个执行状态要落到存储里(LangGraph 的 checkpoint 机制就是干这个的)。进程不能一直挂着等用户 —— 用户可能几分钟后才回来,也可能明天才回来。
  2. 恢复后状态必须一致:恢复时的上下文、工具结果、已产生的副作用都不能丢也不能重复。这是最容易出错的地方。
  3. 幂等性:中断前后同一个步骤不能被执行两次。如果一个写操作在中断前已经执行、恢复后又执行一次,就是重复副作用。所有会产生副作用的步骤都要有幂等设计。
  4. 超时策略:用户不回来怎么办?必须有明确策略 —— 超时后按默认值继续、还是中止并保留草稿、还是升级通知。没有超时策略的 HITL 会把流程永久卡死,这是生产事故的常见来源。
  5. 并发中断的管理:多个请求同时等待人工时,需要一个待办队列与状态机,而不是多个挂起的进程。
  6. 中断点的可序列化:中断要发生在状态边界上(例如「工具执行前」),而不是任意位置。这要求图/流程的设计阶段就把中断点规划进去 —— 中断是架构问题,不是后期能随便加的功能。

代价:HITL 不是免费的#

面试里主动说代价很加分:

  • 打断自动化:用户不在(夜间、休假)时流程阻塞
  • 延迟:端到端时间从秒级变成「等人」的分钟/小时级
  • 人力成本不可扩展:人工审核量随请求量线性增长,规模上去后成为瓶颈
  • 审批疲劳(approval fatigue):这一点最被低估 —— 如果什么都问,用户会形成「无脑点同意」的习惯,HITL 就变成了形式主义,比没有还糟(因为它给了你虚假的安全感)。所以HITL 必须少而关键。
  • 工程成本:状态持久化、幂等、超时、待办 UI、审计日志 —— 都需要额外建设
  • 体验:频繁打断会显著降低用户对「智能」的感知

结论:HITL 的放置点是精度与吞吐的取舍。正确的方向是「少量、关键、不可逆的节点人工把关,其余全自动」,而不是到处插确认。

什么时候不该用 HITL#

  • 高频低风险:会造成审批疲劳,收益为负
  • 正确性可以被自动校验保证:例如格式校验、SQL 可执行性检查、实体白名单比对 —— 能自动兜住的就别麻烦人
  • 延迟敏感且失败可回滚:那就用事后审核而不是事前门禁

判据:只对人能判断且必须判断的环节设检查点。人看得出「这个大纲方向对不对」,但看不出「这个 SQL 有没有语法错误」—— 后者交给自动校验。

与企业落地#

  • 审计日志:谁在什么时候批准了什么、看到的是什么、改了什么 —— 这是合规的硬要求,也是事故复盘的依据
  • 让审批者看得懂:展示具体的工具名与参数,而不是让模型用自然语言转述它要做什么。模型转述可能美化或遗漏(而 prompt injection 正希望如此)。「看到将要执行的真实动作」是 HITL 的安全价值所在 —— 它是间接注入的最后一道人工防线(见 tool-use.md)
  • 权限模型:谁能批准什么,不能人人可批;高风险动作需要更高权限
  • 可解释:给出「为什么建议这样做」的依据(检索到哪些来源),审批者才可能做出有意义的判断
  • 与降级配合:HITL 是 agent 失败时的兜底 —— 重试耗尽、置信度过低、预算超支时转人工,比硬给一个错答案好

与「可控性」的关系#

可控性(controllability) 是企业部署的一等公民,HITL 只是实现它的一种手段。可用的手段还有:

  • 约束解码 / 结构化输出:保证格式可控(见 tool-use.md)
  • 外部校验器:把正确性从模型能力问题变成工程可保证问题(如 Writing Copilot 里的实体校对模块 —— 人名职务用知识库 + 规则引擎兜住,不指望模型自己写对)
  • 工具权限:危险工具默认不可用,或需授权
  • 流程显式化:固定编排比自主 agent 更可控(见 agent-react.md)
  • 可观测与回放:能追溯每一步,才能事后纠正

面试里可以这样收束:HITL 不是「不信任模型」的妥协,而是把责任放回组织里的正确位置。可自动保证的用工程手段兜(校验器、约束解码、权限),必须由人判断的才交给人。

常见面试问法#

Q:为什么政企客户需要 HITL?不能全自动吗? A:核心是责任归属。政企内容出错有实际后果,需要有人对结果负责,而「模型自己决定的」不构成一个可追责的责任链。技术能力够不等于可以全自动 —— 组织需要的是一条「谁批准、批准了什么」的审计链。此外还有不可逆副作用、高成本下游、以及模型能力边界三类技术动机。所以 HITL 是把责任放回组织正确位置的设计,而不是对模型能力的不信任。

Q:你把确认点放在哪一步?为什么? A:放在成本结构上最划算的位置 —— 在「错误成本开始急剧上升之前」。Writing Copilot 里放在大纲阶段:写作是最贵的一步(长上下文 + 检索 + 生成),大纲是最便宜的检查点(几十个 token),大纲错了下游全部重做。所以用最小成本拦截最大浪费。判断方法是问「如果这里错了,后面要重做多少」。

Q:HITL 有什么代价? A:打断自动化(用户不在时流程阻塞,所以必须有超时策略)、延迟从秒级变成等人、人力成本随请求量线性增长不可扩展、以及最被低估的审批疲劳 —— 什么都问会让人养成无脑点同意的习惯,HITL 就退化成形式主义,还会带来虚假的安全感。所以 HITL 必须少而关键,只在不可逆、高风险或低置信的节点设,能自动校验兜住的就交给自动校验。

Q:中断恢复怎么实现? A:本质是「暂停 → 等待输入 → 恢复」,工程上四个要点:① 状态必须可持久化,进程不能挂着等人(用户可能明天才回来);② 恢复后状态要一致,已产生的副作用既不能丢也不能重复;③ 所有有副作用的步骤必须幂等,否则中断前后各执行一次就是重复操作;④ 必须有超时策略,否则流程会永久卡死。另外中断点要在流程设计阶段就规划好 —— 它应落在状态边界上,属于架构问题而不是后期能随手加的功能。

Q:HITL 会不会让系统变得不好用? A:会,如果放错地方。所以正确做法是「工具级审批 + 置信度触发」:主路径保持全自动,只有危险工具或低置信节点才打断。而且不能什么都问 —— 审批疲劳会让 HITL 形式化。另一个提升体验的关键是让审批者看懂:展示具体的工具名与参数,而不是让模型用自然语言转述它要做什么。

易错点#

  • ❌ 把 HITL 说成「对模型不信任」的妥协 —— 它的核心是责任归属与不可逆风险。
  • ❌ 检查点乱放:插在人看不出问题的地方(如让用户确认 SQL 语法),或者放在最贵的一步之后。
  • ❌ 不提代价:不谈超时、阻塞、审批疲劳,说明没上过生产。
  • ❌ 忘记幂等:中断前后同一副作用被执行两次。
  • ❌ 没有超时策略,用户不回来流程就永久卡死。
  • ❌ 把 HITL 当成「越多越安全」—— 审批疲劳会让它失效,还会制造虚假安全感。
  • ❌ 让模型用自然语言转述「我接下来要做什么」,而不是展示真实的工具名与参数。
  • ❌ 用 HITL 替代本可以用自动校验解决的问题(格式、可执行性、白名单比对)。

自测#

1. 你的 agent 要在「大纲 → 检索 → 写作 → 发布」四个阶段设一个确认点,放哪?用成本结构解释。

答案

放在大纲之后、检索与写作之前。理由是把这个检查点放在「错误成本急剧上升之前」:写作是整条链最贵的一步(长上下文、检索加生成),而大纲的检查成本极低(用户看几十个 token)。方向对了下游基本可控;方向错了下游全部重做。反过来若放在成文之后确认,等于先付出完整一轮高成本生成,再让用户说「重来」。判断检查点位置的通法是问一句「如果这里错了,后面要重做多少」。

2. HITL 的四个主要代价是什么?哪一个最容易被忽略,为什么它危险?

答案

① 打断自动化 —— 用户不在时流程阻塞,所以必须有超时策略;② 延迟 —— 端到端时间从秒级变成等人的分钟/小时级;③ 人力成本不可扩展 —— 审核量随请求量线性增长,规模上来后成为瓶颈;④ 审批疲劳 —— 最容易被忽略也最危险。如果什么都问,用户会形成无脑点同意的习惯,HITL 退化为形式主义,比没有 HITL 更糟,因为它提供了虚假的安全感:你以为有人在把关,实际上没有。因此 HITL 应当少而关键,只在不可逆、高风险或低置信的节点设置。

3. 实现 interrupt / resume 时必须解决哪些工程问题?

答案

① 状态持久化:暂停时执行状态要落到存储(如 checkpoint),进程不能挂着等用户,因为人可能几分钟甚至隔天才回来;② 状态一致性:恢复后上下文、工具结果、已发生的副作用既不能丢也不能重复;③ 幂等性:所有有副作用的步骤必须幂等,否则中断前后各执行一次会产生重复操作;④ 超时策略:用户不回来时按默认值继续、中止并保留草稿、还是升级通知 —— 没有策略会导致流程永久卡死,是常见的生产事故;⑤ 并发管理:多个请求同时等待人工时要有待办队列与状态机;⑥ 中断点规划:中断应发生在状态边界上(例如工具执行前),这要求流程设计阶段就把中断点考虑进去,属于架构决策而非可后补的功能。

4. 什么情况下你会明确不用 HITL?

答案

① 高频低风险的环节 —— 会造成审批疲劳,收益为负;② 正确性可以靠自动校验保证的场景 —— 格式校验、SQL 可执行性检查、实体白名单比对等,能自动兜住的就不要麻烦人;③ 延迟敏感且失败可回滚的场景 —— 改用事后审核而不是事前门禁。判据是:只对人能判断且必须判断的环节设检查点。人看得出「大纲方向对不对」,但看不出「这段 SQL 语法是否正确」,后者应交给自动校验。把 HITL 当成默认选项会把系统变得又慢又不可靠。

5. 为什么说「展示真实的工具名与参数」比「让模型说明它要做什么」更安全?

答案

因为让模型用自然语言转述它将要执行的动作,等于让待审查的对象自己撰写审查材料:它可能遗漏关键细节、美化表述,或者在遭到 prompt injection 时故意误导审批者,从而让 HITL 这道防线失效。展示真实的工具名与参数,是让审批者直接看到将要发生的副作用(「调用 send_email,收件人 X,附件 Y」),也就是让「必须由人判断」这件事真正成立。这也是 HITL 在安全上的核心价值 —— 它是间接 prompt injection 的最后一道人工防线。工程上还要求审批记录可追溯:谁批准的、批准时看到的是什么、最终执行了什么。