LangGraph 中的 interrupt 是一个人工介入(Human-in-the-loop)和流程暂停/恢复机制。它允许一个正在执行的 Agent 工作流在某个节点主动暂停,把当前状态暴露出来,等待外部输入,然后从暂停位置继续执行。
简单理解:
interrupt就像给 AI 工作流安装了一个“断点 + 等待输入”的能力。
它类似:
- 调试器里的 breakpoint
- 工作流引擎里的人工审批节点
- 操作系统里的 sleep + resume
- 分布式任务里的 checkpoint + recovery
1. 为什么需要 interrupt?
传统 Agent:
用户请求
|
v
LLM
|
v
调用工具
|
v
返回结果
问题:
如果 Agent 做了危险操作:
例如:
用户:
帮我删除 AWS 上所有测试服务器
Agent:
调用 delete_server()
执行完成
没有机会人工确认。
有了 interrupt:
用户请求
|
v
Agent 推理
|
v
准备调用 delete_server()
|
v
interrupt()
|
v
暂停
|
人工确认:
"是否真的删除?"
|
v
继续执行
|
v
delete_server()
2. interrupt 的基本使用
例如:
from langgraph.types import interrupt
def approval_node(state):
answer = interrupt(
{
"question": "是否允许执行删除操作?",
"action": "delete_user"
}
)
if answer["approved"]:
return {
"result": "执行删除"
}
return {
"result": "取消删除"
}
执行到:
interrupt(...)
流程暂停。
返回:
{
"question":"是否允许执行删除操作?",
"action":"delete_user"
}
外部系统展示:
是否允许执行删除操作?
[允许] [拒绝]
用户点击:
{
"approved":true
}
然后恢复执行。
3. interrupt 和普通 return 有什么区别?
普通 return:
def node(state):
return {
"status":"done"
}
生命周期:
node
|
return
|
结束
interrupt:
def node(state):
value = interrupt(
"需要确认"
)
print(value)
生命周期:
第一次:
node
|
interrupt
|
保存状态
|
暂停
第二次:
恢复
|
value = 用户输入
|
继续执行
4. interrupt 的设计原理
核心思想:
"可持久化的暂停点"
LangGraph 本质是一个:
有状态的有向图执行引擎
比如:
+-------+
| start |
+---+---+
|
v
+----+----+
| Agent |
+----+----+
|
v
+----+----+
| Tool |
+----+----+
|
v
END
每个节点执行:
State
|
Node
|
New State
状态不断变化:
例如:
{
"messages":[
"用户请求删除服务器"
],
"current_step":"tool_call"
}
当执行:
interrupt()
LangGraph 做:
1. 保存当前 state
类似:
checkpoint:
{
state:{
messages:[...],
current_node:"approval"
}
}
2. 保存执行位置
记录:
graph position:
node = approval_node
next_step =
after_interrupt
3. 抛出特殊异常
内部类似:
raise GraphInterrupt()
停止执行。
不是普通异常。
4. 等待 resume
外部调用:
Command(
resume={
"approved":True
}
)
5. 恢复执行
checkpoint
|
v
approval_node
|
v
interrupt返回值
|
v
继续执行
5. interrupt 为什么需要 checkpoint?
因为 Agent 可能运行很久。
例如:
Agent:
搜索网页
↓
分析数据
↓
调用数据库
↓
生成报告
↓
等待审批
↓
发送邮件
审批可能:
- 5分钟后
- 1天后
- 一个月后
不能:
while waiting:
sleep()
因为:
- 服务可能重启
- 机器可能挂掉
- 内存会丢失
所以 LangGraph 使用:
checkpoint storage
保存:
State
+
执行位置
+
线程ID
例如:
thread_id=abc123
checkpoint:
{
node:"approval",
state:{
order_id:10001,
amount:50000
}
}
6. interrupt 和消息队列有什么区别?
很多人会混淆。
MQ
例如:
Kafka
producer
|
v
topic
|
consumer
解决:
消息传递
interrupt
解决:
工作流暂停恢复
例如:
订单流程
创建订单
|
付款
|
interrupt
|
人工审核
|
发货
7. interrupt 在 Agent 中的典型场景
① 人工审批
最常见:
AI生成合同
|
|
interrupt
|
律师审核
|
继续签署
② 高风险工具调用
例如:
AI:
准备执行:
DELETE DATABASE
interrupt
等待确认
③ 信息补充
例如:
AI:
我要帮你订机票
缺少:
出发城市
interrupt:
请输入出发城市
④ 多 Agent 协作
例如:
Planner Agent
|
v
Research Agent
|
v
interrupt
专家审核
|
v
Writer Agent
8. interrupt 的核心设计理念
可以总结为:
① 图执行模型
不是:
函数调用链
而是:
State Machine
② 可恢复计算
类似:
数据库事务:
begin
执行
checkpoint
commit
③ 长生命周期 Agent
普通 LLM:
秒级
LangGraph:
小时
天
月
④ 人机协同
不是:
AI替代人
而是:
AI执行80%
人在关键节点决策
9. 和 LangChain Agent 的区别
传统 LangChain Agent:
while True:
思考
action
observation
状态主要在内存。
LangGraph:
State Graph
Node
|
Checkpoint
|
Interrupt
|
Resume
更适合:
- 企业 Agent
- 工作流自动化
- 审批流程
- 数据处理 Pipeline