Featured image of post LangGraph Interrupt 机制:实现 Agent 的人工确认与安全监管

LangGraph Interrupt 机制:实现 Agent 的人工确认与安全监管

LangGraph 新增中断能力,支持 Agent 执行中暂停并等待人工确认。

一、核心事件:LangGraph 引入人工介入机制

LangGraph(LangChain 子项目)正式完善其 Interrupt 中断机制,允许 Agent 在执行流程中主动暂停、等待人工确认后再恢复执行。该功能无需等待额外版本发布,作为 LangGraph 核心能力已整合进当前主干版本,旨在解决 Agent 执行敏感操作时的安全 oversight 问题。

核心事实要点:

  • 功能依赖项:必须配合 Checkpointer(检查点)机制保存暂停现场
  • 恢复方式:通过 Command({ resume: "用户输入" }) 唤醒
  • 多用户支持:需通过 thread_id 区分不同用户的暂停任务
  • 无并发冲突:不同线程的中断状态互不干扰

二、技术原理与工作流解析

Interrupt 在 LangGraph 中并非普通函数返回,而是一个协作式暂停点。当 GRAPH 执行流到达 interrupt() 调用时,发生三件事:

  1. 当前 State(包括所有字段快照)与执行位置被持久化到 Checkpointer
  2. Graph 返回带 __interrupt__ 字段的响应对象,标注暂停原因与上下文
  3. 外部用户收到暂停提示(如终端交互提示),输入确认后触发恢复

恢复机制依赖 Command API,它允许调用方将外部输入注入原暂停位置:

1
2
3
4
5
// 恢复时注入确认信息
await graph.invoke(
  new Command({ resume: "确认" }),
  { configurable: { thread_id: "user-a" } }
);

这使得原 interrupt() 调用返回“确认”字符串,执行流得以继续。

关键设计哲学是“状态保存”而非普通函数暂停:过程中若系统崩溃或服务重启,恢复后仍能从断点继续,这是区别于传统 await input() 等异步暂停的核心优势。

三、典型应用场景与 State 设计

常见需人工介入的操作包括:转账、删除文件、发布文章、发送邮件、修改数据库。以转账案例为例,State 注解设计为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const StateAnnotation = Annotation.Root({
  actionSummary: Annotation({
    reducer: (prev, next) => next,
    default: () => ""
  }),
  userInput: Annotation({
    reducer: (prev, next) => next,
    default: () => ""
  })
});

典型三节点流程:

  1. showTransfer 节点生成 actionSummary: "向张三转账 $100"
  2. awaitConfirm 节点调用 interrupt({ actionSummary: state.actionSummary }) 暂停
  3. 用户输入确认后,Resume 节点接收 text="确认" 并完成状态更新

四、落地建议

立即适合使用的场景:

  • 金融操作类 Agent:需确认金额/账户/收款方的转账流程
  • 系统运维工具:涉及文件删除、服务重启等高风险操作
  • 内容管理系统:发布前需人工审核的文章流程

建议暂缓的场景:

  • 单次调用超时严格受限的在线交互(中断会阻塞当前会话)
  • 无持久化存储后端的轻量级 Agent 实现(Checkpointer 依赖存储介质)

写在最后

Interrupt 的引入标志着 LLM Agent 从“自动化优先”向“可控自动化”演进。当 Agent 不再默认执行所有操作,而是按风险等级触发人工校验,系统可靠性与用户信任度将同步提升——这正是生产级 Agent 安全架构的必经之路。