人在环中(HITL)中间件允许你为智能体(Agent)的工具调用添加人工监督。 当模型提出一个可能需要审查的操作时——例如,写入文件或执行 SQL——该中间件可以暂停执行并等待决策。 它通过根据可配置的策略检查每个工具调用来实现这一点。如果需要干预,中间件会发出一个 interrupt 中断以暂停执行。图(Graph)状态会使用 LangGraph 的持久化层保存,因此执行可以安全暂停并稍后恢复。 随后,人工决策将决定接下来发生什么:操作可以原样批准(approve)、在运行前进行修改(edit)、附带反馈拒绝(reject),或者对于“询问用户”类工具,直接进行响应(respond)。

中断决策类型

该中间件定义了四种内置的人工响应中断的方式: 每个工具可用的决策类型取决于你在 interrupt_on 中配置的策略。 当多个工具调用同时被暂停时,每个操作都需要一个单独的决策。 决策必须按照中断请求中操作出现的顺序提供。 当人工拒绝所请求的操作时使用 respond。仅当人工作为工具本身(例如回答 ask_user 提示)时才使用 respond。不要使用 respond 来拒绝具有副作用的工具,因为其消息会被视为成功的工具结果。
编辑工具参数时,请谨慎更改。对原始参数进行重大修改可能会导致模型重新评估其方法,并可能多次执行工具或采取意外操作。

配置中断

要使用 HITL,请在创建智能体时将中间件添加到智能体的 middleware 列表中。 你通过一个将工具操作映射到每个操作允许的决策类型的配置来对其进行设置。当工具调用匹配映射中的操作时,中间件将中断执行。
你必须配置一个检查点(checkpointer)来在中断之间持久化图的状态。在生产环境中,使用像 AsyncPostgresSaver 或 MongoDBSaver 这样的持久化检查点保存器。对于测试或原型开发,使用 InMemorySaver。调用智能体时,传递一个包含线程 ID 的 config,以将执行与对话线程关联。 详见 LangGraph 中断文档。
object
required
工具名称到批准配置的映射
工具批准配置选项:
boolean
default:"false"
是否允许批准
boolean
default:"false"
是否允许编辑
boolean
default:"false"
是否允许响应/拒绝

条件中断

默认情况下,interrupt_on 中列出的每个工具调用都会暂停以供审查。要仅暂停部分调用,请在工具的 InterruptOnConfig 中添加一个 when 谓词。该谓词接收一个 ToolCallRequest 并返回 True 表示中断或 False 表示自动批准,因此你可以根据工具的参数进行门控。 条件中断目前仅在 Python 中可用。

响应中断

当你调用智能体时,它会运行直到完成或触发中断。当中断被触发时,工具调用与你在 interrupt_on 中配置的策略匹配。使用 version="v2" 时,结果是一个 GraphOutput,其 interrupts 属性包含需要审查的操作。然后,你可以将这些操作呈现给审查者,并在提供决策后恢复执行。

决策类型

使用 approve 来原样批准工具调用并执行,不做任何更改。

多个决策

当有多个操作正在审查时,请按照它们在中断中出现的顺序为每个操作提供一个决策:

结合人在环中进行流式处理

你可以使用 stream_events() 在智能体运行和处理中断时流式传输实时更新。使用 stream.messages 流式传输 LLM 令牌,使用 stream.values 检查智能体状态快照以获取中断。
关于流模式的更多细节,请参阅流式传输指南。

执行生命周期

该中间件定义了一个 after_model 钩子,它在模型生成响应之后但在任何工具调用执行之前运行:
  1. 智能体调用模型以生成响应。
  2. 中间件检查响应中的工具调用。
  3. 如果任何调用需要人工输入,中间件会构建一个包含 action_requests 和 review_configs 的 HITLRequest,并调用 interrupt。
  4. 智能体等待人工决策。
  5. 根据 HITLResponse 决策,中间件执行已批准或已编辑的调用,为被拒绝的调用合成 ToolMessage,将人工的回复直接作为 ToolMessage 返回(针对 respond 决策),并恢复执行。

自定义 HITL 逻辑

对于更专业的工作流,你可以直接使用 interrupt 原语和中间件抽象来构建自定义的 HITL 逻辑。 请查阅上面的执行生命周期,以了解如何将中断集成到智能体的操作中。