Skip to main content
并非每个智能体操作都应该无人监督地运行。当智能体即将发送邮件、删除记录、执行金融交易或执行任何不可逆操作时,你需要人工先审核并批准该操作。人机协作(HITL)模式让你的智能体暂停执行,将待处理的操作呈现给用户,并仅在获得明确批准后才恢复执行。

中断的工作原理

LangGraph 智能体支持中断,即智能体将控制权交还给客户端的显式暂停点。当智能体触发中断时:
  1. 智能体停止执行并发出中断载荷
  2. useStream hook 通过 stream.interrupt 暴露中断信息
  3. 你的 UI 渲染一个带有批准/拒绝/编辑选项的审核卡片
  4. 用户做出决定
  5. 你的代码使用恢复命令调用 stream.submit()
  6. 智能体从中断处继续执行

为人机协作设置 useStream

定义一个与你的智能体状态 schema 匹配的 TypeScript 接口,并将其作为类型参数传递给 useStream,以获得类型安全的状态值访问。在以下示例中,将 typeof myAgent 替换为你的接口名称:

中断载荷

当智能体暂停时,stream.interrupt 包含一个具有以下结构的 HITLRequest

决策类型

人机协作模式支持四种决策类型:

批准

用户确认操作应按原样执行:

拒绝

用户拒绝操作并可提供可选的原因:
当操作被拒绝时,智能体会收到拒绝原因,并可以决定如何处理。它可能会重新措辞、提出澄清问题,或完全放弃该操作。

编辑

用户在批准前修改操作的参数:

回复

用户为”询问用户”类型的工具提供直接回复。message 成为工具结果,工具本身不会被执行:
当工具有意作为人工输入的占位符时使用 respond——例如,一个 ask_user 工具用于提示智能体从用户那里收集信息。

构建审批卡片

以下是一个处理所有四种决策类型的完整审批卡片组件:

恢复流程

用户做出决定后,完整的流程如下:
  1. 调用 stream.submit(null, { command: { resume: hitlResponse } })
  2. useStream hook 将恢复命令发送到 LangGraph 后端
  3. 智能体接收 HITLResponse 并继续执行。HITL 响应可以是以下之一:
    • "approve":智能体继续执行下一个操作
    • "reject":智能体收到拒绝原因并决定下一步
    • "edit":智能体使用编辑后的参数运行工具
    • "respond":人工的消息直接作为工具结果返回,而不执行工具
  4. 当智能体恢复流式输出时,interrupt 属性重置为 null
你可以在单次智能体运行中链接多个人机协作检查点。例如,智能体可能先请求批准搜索,然后在发送包含结果的邮件之前再次请求批准。每个中断都是独立处理的。

常见用例

处理多个待处理操作

一个中断可以包含多个 actionRequests,当智能体想要同时执行多个操作时。为每个操作渲染一张卡片,并在恢复前收集所有决策:

最佳实践

在实现人机协作工作流时,请牢记以下准则:
  • 显示清晰的上下文。始终展示智能体想做什么以及为什么。包含操作描述和完整参数。
  • 让批准成为最简单的路径。如果操作看起来正确,批准应该只需单击。将多步流程保留给拒绝/编辑。
  • 验证编辑后的参数。当用户编辑操作参数时,在发送前验证 JSON 结构。对格式错误的输入显示内联错误。
  • 持久化中断状态。如果用户刷新页面,中断应仍然可见。useStream 通过线程的检查点处理此问题。
  • 记录所有决策。为审计追踪,记录每个批准/拒绝/编辑决策的时间戳和做出决策的用户。
  • 合理设置超时。长时间运行的智能体不应无限期地等待人工审核。考虑显示智能体已等待多长时间。