AI创想

标题: LangGraph工作流人机交互 [打印本页]

作者: 创想小编    时间: 昨天 23:13
标题: LangGraph工作流人机交互
作者:CSDN博客
interrupt

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

整个状态(含历史消息、变量)在暂停期间持久化到 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内容为
(, 下载次数: 0)


第二次交互 command
直接进入到 human_node 即中断的那个节点,会从节点开头执行(非断点处执行)。
此时的Value=interrput(..) 接收到值就是Command传递进来的值 “编辑后的文本”
(, 下载次数: 0)


客服验证示例:
  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)
messages: list messages: Annotated[list, add_messages]

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




欢迎光临 AI创想 (https://www.llms-ai.com/) Powered by Discuz! X3.4