开启左侧

LangGraph工作流人机交互

[复制链接]
创想小编 发表于 昨天 23:13 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
作者:CSDN博客
interrupt

LangGraph 把“人机交互”当成 一等公民 来设计,核心思想只有一句话:
在图的任意节点先“暂停”,等人类给反馈后再继续运行
1. 核心机制:interrupt / Command 一对原语


  • interrupt("提示语")
            节点里调用它,图立即暂停并把提示语抛给上层(控制台/前端/业务系统)。
  • Command(resume=...)
            人类输入完成后,用这条命令把值重新塞回图,流程精准续跑
整个状态(含历史消息、变量)在暂停期间持久化到 Checkpoint,即使隔几天再恢复也不丢。
  1. from typing import TypedDict
  2. from langgraph.checkpoint.memory import MemorySaver
  3. from langgraph.constants import START
  4. from langgraph.graph import StateGraph
  5. from langgraph.types import interrupt, Command
  6. class State(TypedDict):
  7.    """图形状态。"""
  8.    some_text: str
  9. def human_node(state: State):
  10.    value = interrupt(
  11.       # 任何可序列化为 JSON 的值,供人类查看。
  12.       # 例如,一个问题、一段文本或状态中的一组键
  13.       {
  14.          "text_to_revise": state["some_text"]
  15.       }
  16.    )
  17.    return {
  18.       # 使用人类的输入更新状态
  19.       "some_text": value
  20.    }
  21. # 构建图形
  22. graph_builder = StateGraph(State)
  23. # 将人类节点添加到图形中
  24. graph_builder.add_node("human_node", human_node)
  25. graph_builder.add_edge(START, "human_node")
  26. # 使用中断功能需要一个检查点。
  27. checkpointer = MemorySaver()
  28. graph = graph_builder.compile(
  29.    checkpointer=checkpointer
  30. )
  31. thread_config = {"configurable": {"thread_id": "abc123"}}# 使用 stream() 直接展示 `__interrupt__` 信息。
  32. for chunk in graph.stream({"some_text": "原始文本"}, config=thread_config):
  33.    print(chunk)
  34. # 使用 Command 恢复
  35. for chunk in graph.stream(Command(resume="编辑后的文本"), config=thread_config):
  36.    print(chunk)
复制代码
graph.stream: 原始文本 执行然后进入到human_node节点,节点执行interrupt,直接返回
chunk内容为
LangGraph工作流人机交互-1.png


第二次交互 command
直接进入到 human_node 即中断的那个节点,会从节点开头执行(非断点处执行)。
此时的Value=interrput(..) 接收到值就是Command传递进来的值 “编辑后的文本”
LangGraph工作流人机交互-2.png


客服验证示例:
  1. from __future__ import annotations
  2. from typing import TypedDict
  3. from langgraph.checkpoint.memory import MemorySaver
  4. from langgraph.constants import START, END
  5. from langgraph.graph import StateGraph
  6. from langgraph.types import interrupt, Command
  7. from pyexpat.errors import messages
  8. # 1. 状态定义
  9. class State(TypedDict):
  10.     messages: list
  11.     customer_id: str | None
  12.     user_reply: str | None   # 用于接住中断回复
  13. # 2. 节点:未验证则中断
  14. def verify_info(state: State):
  15.     if state["customer_id"] is not None:
  16.         return state
  17.     reply = interrupt({"user_reply": "请输入手机号"})   # key 必须和 State 对应
  18.     return {"messages":"需要输入手机号","user_reply": reply, "customer_id": reply}
  19. # 3. 节点:根据手机号前缀决定回复
  20. def supervisor(state: State):
  21.     if state["customer_id"].startswith(("138", "188")):
  22.         return {"messages": ["超级碗"]}
  23.     else:
  24.         return {"messages": ["啥也不是"]}
  25. # 4. 构图
  26. builder = StateGraph(State)
  27. builder.add_node("verify", verify_info)
  28. builder.add_node("supervisor", supervisor)
  29. builder.add_edge(START, "verify")
  30. builder.add_edge("verify", "supervisor")
  31. builder.add_edge("supervisor", END)
  32. graph = builder.compile(checkpointer=MemorySaver())
  33. # 5. 第一次运行(中断前)
  34. thread = {"configurable": {"thread_id": "1"}}
  35. state1 = graph.invoke({"messages": [], "customer_id": None, "user_reply": None}, thread)
  36. print("中断前状态 ->", state1)
  37. # 6. 人工输入后续跑
  38. resume_cmd = Command(resume="13800138000")
  39. final_state = graph.invoke(resume_cmd, thread)
  40. print("最终状态 ->", final_state)
复制代码
扩展
graph = builder.compile(checkpointer=MemorySaver(),interrupt_before=["verify"]  )interrupt_before=["verify"] 是 LangGraph 在“图编译”阶段就声明的“断点”,含义一句话:
只要执行流即将进入名为 verify 的节点,就先暂停整个图,把控制权交回给调用方(或前端),等人手动输入后再继续。
invoke (vs stream)
    .invoke()只返回最终状态字典,不 yield 事件。
    中断/续跑逻辑完全一致,只是一次性拿结果,不再循环打印中间态。
messages: list messages: Annotated[list, add_messages]
    messages: list → 纯字段,节点返回什么就完全替换旧列表。
    messages: Annotated[list, add_messages] → 带 reducer,节点返回的新消息会被追加到旧列表,不会丢失历史

原文地址:https://blog.csdn.net/jianlee1991/article/details/155032086
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
阅读排行更多+

Powered by Discuz! X3.4© 2001-2013 Discuz Team.( 京ICP备17022993号-3 )