Skip to main content
人机交互(HITL)在智能体执行工具调用前暂停,以便人工审核。审核者可以批准调用、编辑其参数、使用反馈拒绝调用,或代替工具进行响应。适用于难以撤销或需要批准的操作,例如删除记录、发送邮件或写入文件。 :::python 您通过 @[HumanInTheLoopMiddleware] 在 LangChain中添加审核,或通过 Deep Agents中的 interrupt_on 参数添加。中间件以两种模式之一暂停: ::: :::js 您通过 @[humanInTheLoopMiddleware] 在 LangChain中添加审核,或通过 Deep Agents中的 interruptOn 参数添加。中间件以两种模式之一暂停: :::
  • 按调用暂停:每个需要审核的工具调用暂停一次。
  • 批量暂停:每个模型回合暂停一次,涵盖该回合中的所有工具调用。批量模式是当前默认模式。
:::python
按调用模式需要 langchain>=1.4.6。Deep Agents 使用批量模式。
::: :::js
按调用模式需要 langchain>=1.5.18。Deep Agents 使用批量模式。
:::

从暂停到恢复的审批流程

无论哪种模式,每个审批都遵循相同的步骤: :::python
  1. 模型提出一个或多个工具调用。
  2. 中间件根据您的 interrupt_on 政策检查每个调用。需要审核的调用会暂停智能体并使用 @[interrupt]。
  3. checkpointer 保存智能体的状态,以便运行可以停止并在稍后(甚至另一个进程中)恢复。
  4. 您的应用程序向审核者展示待处理的调用,并收集每个调用的决策。
  5. 您使用 Command(resume=...) 恢复智能体。中间件应用每个决策,智能体继续执行。 :::
:::js
  1. 模型提出一个或多个工具调用。
  2. 中间件根据您的 interruptOn 政策检查每个调用。需要审核的调用会暂停智能体并使用 @[interrupt]。
  3. checkpointer 保存智能体的状态,以便运行可以停止并在稍后(甚至另一个进程中)恢复。
  4. 您的应用程序向审核者展示待处理的调用,并收集每个调用的决策。
  5. 您使用 new Command({ resume }) 恢复智能体。中间件应用每个决策,智能体继续执行。 :::
决策有四种类型: 本页的示例使用一个具有三个工具的智能体。write_file 允许所有决策类型。execute_sql 仅允许 approve 和 reject。read_data 无需审核运行。在一个回合中,模型调用所有三个工具。

分别审核每个工具调用

在按调用模式下,每个需要审核的工具调用在开始时独立暂停: 每个中断值描述一个调用,并具有 type: "tool_approval"。execute_sql 中断如下所示: :::python
::: :::js
::: 每个中断还携带一个 response_schema,即调用接受的答案的 JSON 架构。对于 execute_sql,架构允许 approve 和 reject。对于 write_file,它还允许 respond 和 edit。edit 分支包含 write_file 自身的参数架构。客户端可以从架构渲染表单,而不是硬编码决策类型。LangChain 指南 显示每种决策类型的架构。 您使用中断的 ID 作为键,对每个中断进行一个决策: :::python
::: :::js
::: LangGraph 在保存无效答案之前拒绝它,以便审核者可以更正并再次回答。未回答的中断保持待处理状态,允许审核者逐个回答。

一次性审核整个回合

:::python 在批量模式下,中间件在模型响应后、任何工具运行前暂停一次。read_data 等待审核,即使它不受限制。一个中断在 action_requests 中列出所有受限制的调用,并在单独的 review_configs 列表中列出每个调用的允许决策:
您使用与 action_requests 相同顺序的一个决策列表进行回答:
::: :::js 在批量模式下,中间件在模型响应后、任何工具运行前暂停一次。read_data 等待审核,即使它不受限制。一个中断在 actionRequests 中列出所有受限制的调用,并在单独的 reviewConfigs 列表中列出每个调用的允许决策:
您使用与 actionRequests 相同顺序的一个决策列表进行回答:
::: 中断没有 response_schema。中间件仅在应用决策后、LangGraph 保存答案时检查每个决策。

对比批量模式问题

批量模式通过位置匹配答案与调用,并在保存答案后检查每个答案。每一行显示示例智能体在批量模式下遇到的问题,以及按调用模式如何避免这些问题: :::python :::js

选择中断模式

:::python :::js 为新智能体使用单次调用模式。LangChain 计划在下一个主要版本中将此模式设为默认。 在您的审批 UI 读取批量格式(例如使用 useStream 审批模式 构建的格式)时保持批量模式。 单次调用模式也会改变中间件顺序和多响应续传的行为。切换前,请阅读 为单次调用审核排序中间件 和 按 ID 续传每个调用。

参考文档


官方原文:src/oss/concepts/human-in-the-loop.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026