当前位置: 首页 > ai >正文

LangGraph-2-interrupt 流程中断

  interrupt 是 LangGraph 中一个强大的流程控制机制,允许在状态机执行过程中根据特定条件中断当前流程并跳转到其他节点。这种机制特别适用于处理异常情况、用户中断或特定业务规则的触发。

        在 LangGraph 中,interrupt_before 和 interrupt_after 是两个强大的流程控制机制,允许在节点执行前或执行后插入中断检查。这些机制提供了更精细的流程控制能力,特别适合需要精确管理执行顺序和条件的复杂工作流。

        interrupt_before 一般用于指定在执行某个特定操作或者步骤之前中断流程。这一机制可以让开发者在关键操作执行前对条件进行检查,若不满足条件,就提前终止流程,避免不必要的计算或者操作。

        interrupt_before 一般用于指定在执行某个特定操作或者步骤之前中断流程。这一机制可以让开发者在关键操作执行前对条件进行检查,若不满足条件,就提前终止流程,避免不必要的计算或者操作。

#在tools节点执行前中断
graph = graph.compile(checkpointer=memory_checkpointer, interrupt_before=["tools"])

流程恢复执行:

graph.invoke(None, config=config)

案例,在调用外部工具前,进行人工确认,如果输入y或者yes流程恢复执行:

import os
from typing import Annotated, TypedDict
from langchain_tavily import TavilySearch
from langgraph.checkpoint.memory import MemorySaver
from langgraph.constants import START, END
from langgraph.graph import add_messages, StateGraph
from langgraph.prebuilt import ToolNode, tools_condition
from model.deepseek import deepseek_llmclass ChatSate(TypedDict):# messages:状态中保存数据的keymessages: Annotated[list, add_messages]graph = StateGraph(ChatSate)# 定义一个互联网搜索工具
os.environ["TAVILY_API_KEY"] = ""
search_tool = TavilySearch(max_result=5)
runnable = deepseek_llm.bind_tools([search_tool])# 定义第一个节点
def chatbot(state: ChatSate) -> ChatSate:resp = runnable.invoke(state["messages"])return {"messages": resp}# 定义第二个节点工具节点
too_node = ToolNode([search_tool])# 添加边
graph.add_node("agent", chatbot)
graph.add_node("tools", too_node)
# 根据智能体自主决定是否调用工具
graph.add_conditional_edges("agent",#条件变量,根据智能体的回答决定是否调用工具tools_condition
)
graph.add_edge("tools", "agent")  # 流程从tools 到 chatbot
graph.add_edge(START, "agent")  # 流程从start 到 chatbot
graph.add_edge("agent", END)  # 流程从chatbot 到 END
graph.set_entry_point("agent")  # 设置入口节点
#保存对话记录到内存中
memory_checkpointer = MemorySaver()
graph = graph.compile(checkpointer=memory_checkpointer, interrupt_before=["tools"])# png = graph.get_graph().draw_mermaid_png()
# with open("graph2.png", "wb") as f:
#    f.write(png)
config={"configurable": {"thread_id": "1234"}}
def loop_graph_invoke(user_input: str):if user_input:result = graph.invoke({'messages': [('user', user_input)]}, config=config)if type(result['messages']) is list:print('AI:', result['messages'][-1].content)else:print('AI:', result['messages'].content)else:result = graph.invoke(None, config=config)if type(result['messages']) is list:print('AI:', result['messages'][-1].content)else:print('AI:', result['messages'].content)while True:user_input = input('User:')if user_input.lower() in ['q', 'exit', 'bye', 'quit']:print('AI:', 'Bye')breakelse:loop_graph_invoke(user_input)state = graph.get_state(config)if "tools" in state.next:an = input('是否允许调用外部工具?(y/n)')if an.lower() in ['y', 'yes']:#继续执行流程loop_graph_invoke(None)else:#退出当前流程pass

测试验证:

http://www.xdnf.cn/news/14997.html

相关文章:

  • Language Models are Few-Shot Learners: 开箱即用的GPT-3(二)
  • MacOS 终端(Terminal)配置显示日期时间
  • 亚矩阵云手机破解Maio广告平台多账号风控:从“生存焦虑”到“规模化增长”的终极方案
  • OneFileLLM:一键聚合多源信息流
  • AI探索 | 豆包智能助手跟扣子空间(AI办公助手)有什么区别
  • [Meetily后端框架] AI摘要结构化 | `SummaryResponse`模型 | Pydantic库 | vs marshmallow库
  • Qt Creator控件及其用途详细总结
  • CH9121T电路及配置详解
  • AI驱动的业务系统智能化转型:从非结构化到结构化的智能转换
  • 【深度学习新浪潮】什么是持续预训练?
  • 从零开始搭建深度学习大厦系列-2.卷积神经网络基础(5-9)
  • C++类对象多态底层原理及扩展问题
  • Excalidraw:一款轻量、高效、极具手感的在线白板工具
  • 18th Day| 654.最大二叉树, 617.合并二叉树, 700.二叉搜索树中的搜索,98.验证二叉搜索树
  • 微算法科技的前沿探索:量子机器学习算法在视觉任务中的革新应用
  • 虚拟储能与分布式光伏协同优化:新型电力系统的灵活性解决方案
  • Mac自定义右键功能
  • ThinkBook 14s IWL(20RM)OEM系统镜像原厂Win10系统
  • @Schema是什么?
  • C++之string类的实现代码及其详解(下)
  • Flowable21条件事件------------持续更新中
  • 【Linux手册】从接口到管理:Linux文件系统的核心操作指南
  • 《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
  • 访问Windows服务器备份SQL SERVER数据库
  • AI【应用 03】Windows环境部署 TTS CosyVoice2.0 详细流程记录(Matcha-TTS、spk2info.pt等文件分享)
  • 从品牌附庸到自我表达:定制开发开源AI智能名片S2B2C商城小程序赋能下的营销变革
  • iOS 抓包详细教程:从零搭建、操作到实战调试的全流程指南
  • Fiddler中文版全面评测:功能亮点、使用场景与中文网资源整合指南
  • 网安系列【15】之Docker未授权访问漏洞
  • 微信小程序控制空调之EMQX服务器安装与配置