最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
LangGraph 人工介入机制:用 Interrupt 暂停 Agent 并等待确认
时间:2026-09-14 10:46:01 编辑:袖梨 来源:一聚教程网
当 Agent 开始调用真实工具,自动化就不再只是流程效率问题。、发送邮件、删除文件等操作一旦判断失误,往往难以撤回。LangGraph 提供的 Interrupt 可以在关键节点暂停工作流,保存当前状态并等待人工输入,随后再从原位置继续执行。
前面我们已经解决了:
- Graph 如何组织 Agent 流程
- State 如何在节点之间流转
- Conditional Edge 如何动态选择路径
- Checkpointer 如何保存 State
但是实际 Agent 还有一个重要问题:
不是所有事情都应该让 Agent 自动完成。
有些操作需要人确认。
例如:
- 删除文件
- 发布文章
- 发送邮件
- 修改数据库
这时候就需要:
Human-in-the-loop(人在循环中)
1. 为什么 Agent 需要人工介入?
假设一个自动 Agent:
用户:
帮我给张三100元
Agent:
调用工具
完成
如果 Agent 判断错误:
转错账户
转错金额
后果很严重。
所以更合理:
用户
↓
Agent准备执行
↓
暂停
↓
用户确认
↓
继续执行
2. Interrupt 是什么?
LangGraph 提供:
interrupt()
它的作用:
暂停当前 Graph 执行,并等待外部输入。
例如:
const awaitConfirm = (state)=>{
const input = interrupt({
action:"向张三100元"
});
}
执行:
Node
↓
interrupt()
↓
暂停
3. Interrupt 发生了什么?
注意:
interrupt 不是普通函数返回。
它不会:
return "等待"
而是:
暂停 Graph
此时:
当前 State
+
当前执行位置
需要保存。
所以:
interrupt
必须依赖
checkpointer
4. 一个 Demo
State:
const StateAnnotation = Annotation.Root({
actionSummary:Annotation({
reducer:(prev,next)=>next,
default:()=> ""
}),
userInput:Annotation({
reducer:(prev,next)=>next,
default:()=> ""
})
});
保存两个数据:
actionSummary
用户要确认的动作
userInput
用户输入
第一个节点
const showTransfer = ()=>({
actionSummary:
"向张三 $100"
});
执行:
State:
{
actionSummary:
"向张三 $100"
}
第二个节点
const awaitConfirm=(state)=>{
const text=interrupt({
actionSummary:
state.actionSummary
});
return {
userInput:text
}
}
读取:
state.actionSummary
得到:
向张三 $100
然后:
interrupt()
暂停。
5. Graph 暂停之后发生什么?
第一次:
await graph.invoke({},config)
执行:
START
↓
showTransfer
↓
awaitConfirm
↓
interrupt暂停
返回:
类似:
{
__interrupt__:[
{
value:{
actionSummary:
"向张三 $100"
}
}
]
}
此时:
Agent 等待用户。
例如:
终端:
是否确认?
> 确认
6. 如何恢复?
恢复需要:
Command
例如:
await graph.invoke(
new Command({
resume:"确认"
}),
config
);
含义:
告诉 LangGraph:
上次暂停的位置继续执行,并把这个值交给 interrupt。
恢复后:
原来的:
const text = interrupt(...)
会得到:
text="确认"
然后继续:
return {
userInput:"确认"
}
最终:
{
actionSummary:
"向张三 $100",
userInput:
"确认"
}
流程结束。
7. 为什么一定需要 thread_id?
因为可能有很多用户同时暂停:
例如:
用户A:
等待确认
用户B:
等待确认删除文件
LangGraph 必须知道:
恢复哪个任务。
所以:
{
configurable:{
thread_id:"user-a"
}
}
表示:
恢复 user-a 的那一次执行。
8. Interrupt 完整流程
用户请求
↓
Agent执行
↓
准备执行危险操作
↓
interrupt()
↓
保存 State + 执行位置
↓
等待用户
↓
Command(resume)
↓
恢复 Graph
↓
继续执行
↓
结束
9. Interrupt 和普通函数暂停的区别
普通代码:
function test(){
console.log("开始");
await input();
console.log("继续");
}
如果程序关闭:
状态没了。
LangGraph:
interrupt
↓
checkpointer保存现场
↓
之后恢复
它保存的是:
- State
- 当前节点
- 执行路径
所以它适合长流程 Agent。
10. LangGraph 到这里形成完整 Agent 工作流
现在完整模型:
State
↓
START
↓
Node
↓
Edge
↓
Conditional Edge
↓
Loop
↓
Checkpointer
↓
Interrupt
↓
Resume
↓
END
总结
一句话:
Interrupt 让 LangGraph 支持人工介入,它可以暂停 Agent 工作流,保存当前状态,等待用户输入后继续执行,是构建安全可靠 Agent 系统的重要能力。