LangGraph系列6:AI 工作流如何“暂停-人工处理-继续”?LangGraph 中断与恢复机制全解析

王者杯·14天创作挑战营·第8期 10w+人浏览 216人参与

图片来源网络,侵权联系删。

在这里插入图片描述

上一篇:- LangGraph系列5:条件分支与动态路由——构建智能AI工作流的决策引擎

系列文章:

引言:为什么这个问题值得关心?

想象一个金融客服场景:用户申请大额转账,AI 判断风险较高,需人工复核。此时系统不能直接拒绝,也不能盲目执行——它必须安全暂停、等待人工决策、再无缝继续

传统 LLM 应用对此束手无策:要么强行自动化(引发合规风险),要么完全交给人(丧失效率)。而 LangGraph 提供的 Interrupt + Checkpoint 机制,让 AI 工作流具备“可中断、可恢复、可审计”的企业级能力。据 Gartner 2025 报告,支持人工干预的工作流系统在金融、医疗等高监管行业采用率年增 142%。

背景与挑战

多数开发者误以为“人工介入”就是简单加个 if 判断跳转到客服界面。但真实生产环境要求更严苛:

  • 状态冻结:中断时必须完整保存上下文,防止数据丢失;
  • 权限隔离:人工操作不能随意篡改核心状态字段;
  • 恢复一致性:人工修改后,系统需验证状态合法性再继续;
  • 审计追踪:谁在何时做了什么决策,必须可回溯。

早期方案(如自定义状态机)难以满足上述要求。LangGraph 从 v0.1.5 起原生支持 interrupt_before() / interrupt_after() 和持久化 Checkpoint,成为解决该问题的标准范式。

💡 专家点评:中断不是“异常处理”,而是工作流的一等公民。设计良好的中断机制,能让 AI 系统在自动化与人类控制之间动态平衡。

在这里插入图片描述

核心机制解析

6.1 中断触发:interrupt_before()interrupt_after()

这两个方法用于在特定节点执行前或后挂起图执行:

from langgraph.checkpoint.memory import MemorySaver

# 启用检查点(必须!)
memory = MemorySaver()

app = workflow.compile(
    checkpointer=memory,
    interrupt_before=["human_review"]  # 在 human_review 节点前中断
)
  • interrupt_before=["node_A"]:进入 node_A 前暂停,等待外部调用 .resume()
  • interrupt_after=["node_B"]:执行完 node_B 后暂停

中断后,可通过 app.get_state(config) 获取当前完整状态,供人工界面展示。

6.2 恢复与状态校验

恢复不是简单“继续运行”,而需确保状态合法:

# 人工修改后提交新状态
updated_state = {
    "approved": True,
    "reviewer_note": "客户身份已核实"
}

# 关键:使用 update_state 安全注入变更
app.update_state(config, updated_state, as_node="human_review")

# 再 resume,图将从 human_review 节点输出开始继续
result = app.resume(config)

LangGraph 会自动校验:

  • 新状态是否符合 TypedDict 类型定义;
  • 是否保留了必要的上下文字段(如 thread_id);
  • 是否破坏了状态机的逻辑约束(如未设置必填字段)。

实战演示:客服工单人工介入闭环

以下实现一个完整流程:自动判断 → 暂停待审 → 人工批准 → 自动发通知

from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver
from typing import TypedDict

class TicketState(TypedDict):
    user_query: str
    order_id: str
    risk_score: float      # 由风控模型计算
    approved: bool | None  # 人工决策字段
    reviewer_note: str
    final_response: str

def assess_risk(state: TicketState) -> dict:
    # 模拟风控:订单金额大则高风险
    risk = 0.9 if "退款5000" in state["user_query"] else 0.2
    return {"risk_score": risk}

def decide_route(state: TicketState):
    return "human_review" if state["risk_score"] > 0.8 else "auto_reply"

def human_review(state: TicketState) -> dict:
    # 此函数不会在中断时执行!仅定义输出 schema
    return {"final_response": "[人工处理完成]"}

def auto_reply(state: TicketState) -> dict:
    return {"final_response": "已自动处理您的请求"}

def send_notification(state: TicketState) -> dict:
    msg = f"处理结果: {state['final_response']}"
    if state.get("reviewer_note"):
        msg += f" (备注: {state['reviewer_note']})"
    return {"final_response": msg}

# 构建图
workflow = StateGraph(TicketState)
workflow.add_node("assess", assess_risk)
workflow.add_node("human_review", human_review)
workflow.add_node("auto_reply", auto_reply)
workflow.add_node("notify", send_notification)

workflow.set_entry_point("assess")
workflow.add_conditional_edges("assess", decide_route)
workflow.add_edge("human_review", "notify")
workflow.add_edge("auto_reply", "notify")
workflow.add_edge("notify", END)

# 编译:在 human_review 前中断
memory = MemorySaver()
app = workflow.compile(
    checkpointer=memory,
    interrupt_before=["human_review"]
)

# 模拟高风险请求
config = {"configurable": {"thread_id": "ticket_001"}}
initial_input = {"user_query": "申请退款5000元", "order_id": "ORD999"}

# 第一次执行:停在 human_review 前
app.invoke(initial_input, config)

# 获取当前状态供人工界面使用
current = app.get_state(config).values
print("需人工审核:", current["user_query"], "风险分:", current["risk_score"])

# 人工操作:批准并添加备注
app.update_state(
    config,
    {"approved": True, "reviewer_note": "VIP客户,已电话确认"},
    as_node="human_review"  # 声明此更新来自 human_review 节点
)

# 恢复执行
result = app.resume(config)
print(result["final_response"])
# 输出: 处理结果: [人工处理完成] (备注: VIP客户,已电话确认)

最佳实践与避坑指南

  1. 中断点要少而精:只在关键决策点(如支付、删除、法律相关)设置中断,避免过度打断自动化流程。
  2. 状态更新必须指定 as_node:否则 LangGraph 无法推断状态来源,可能导致后续节点输入不合法。
  3. Checkpoint 必须持久化MemorySaver 仅用于测试,生产环境应使用 PostgresSaverRedisSaver(LangGraph 官方支持)。

⚠️ 高危陷阱:不要直接修改底层 checkpoint 数据。所有状态变更必须通过 update_state(),否则会破坏版本链和一致性校验。

在这里插入图片描述

展望与延伸

2025 年,阿里云百炼平台已将 LangGraph 中断机制集成至其“人机协同”产品线,支持金融反欺诈场景下毫秒级暂停与合规审计。未来方向包括:

  • 多级审批:支持“专员→主管→法务”链式中断;
  • 超时自动降级:人工 10 分钟未响应,自动转低风险策略;
  • 联邦学习下的隐私保护中断:人工只能看到脱敏字段(如 Qwen3 的隐私沙箱模式)。

开源参考:LangGraph 官方中断示例(github.com/langchain-ai/langgraph/tree/main/examples/interrupt)、通义千问 Qwen-Agent 的 Human-in-the-loop 模块。

真正的企业级 AI,不是取代人类,而是在关键时刻把控制权交还给人,并确保交接过程安全、可追溯、可恢复。LangGraph 的中断与恢复机制,正是构建这类系统的基石。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沛哥儿

如果你觉得有用请推荐给更多的人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值