研发协作
在 LangGraph 中实现人工介入(暂停审批、校验输入…
用 LangGraph 的 interrupt()/Command(resume=...) 暂停图执行、把数据交给人工审批或校验,再带着人工输入恢复运行。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 LangGraph 中实现人工介入(特定
解决思路
- 准备三项前提:编译图时传入 checkpointer(开发用 InMemorySaver(),生产用 PostgresSaver);每次 invoke/stream 都传 {"configurable": {"thread_id": "..."}};传给 interrupt() 的值必须可 JSON 序列化。
- 基础暂停/恢复:在节点中调用 interrupt(value) 暂停执行,暂停值会出现在结果的 __interrupt__ 字段中;用 graph.invoke(Command(resume=value), config) 恢复,resume 的值即成为 interrupt() 的返回值。
- 注意恢复语义:图恢复时该节点会从头重新执行,interrupt() 之前的所有代码都会重跑。
- 审批工作流:在 human_review 节点中先调用 interrupt({...}) 展示草稿与上下文,再根据人工决定返回 Command(update={...}, goto="send_reply") 或 Command(update={}, goto=END) 进行路由。
- 校验循环:在 while True 循环中调用 interrupt(prompt),校验人工输入,合法则 break 并返回结果,非法则更新 prompt 为更明确的提示后再次 interrupt 重新询问。
- 多个并行中断:当并行分支各自调用 interrupt() 时,收集结果中 __interrupt__ 里每个 Interrupt 对象的 id,构造 {id: resume_value} 映射,用一次 graph.invoke(Command(resume=resume_map), config) 恢复全部中断。
- 保证 interrupt() 之前的副作用幂等:使用 upsert 而非 insert、采用先检查再创建的模式、尽量把副作用放到 interrupt() 之后、或把副作用拆到独立节点中。
- 避免在 interrupt() 之前创建新记录或向列表追加元素,否则每次恢复都会产生重复数据。
- 注意子图重执行:当子图内包含 interrupt() 时,恢复会同时重新执行调用子图的父节点和调用 interrupt() 的子图节点,两处的代码都会重跑。
- 只用 Command(resume=...) 作为 invoke()/stream() 的输入;不要传入 Command(update=...),否则会从最新 checkpoint 恢复并表现为图卡住。
- 常见修复:编译图必须传 checkpointer(builder.compile(checkpointer=InMemorySaver()));恢复必须用 Command(resume=...) 而不是普通 dict;恢复必须使用相同的 thread_id,否则会新建线程而非恢复。
适用边界 · 注意事项
- 没有 checkpointer 时不要使用 interrupt,会直接失败。
- 恢复时不要省略或更换 thread_id,否则会创建新线程而不是恢复原执行。
- 不要在 interrupt() 之前执行非幂等副作用(如 insert、追加列表),恢复时会产生重复。