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.pswp.cn/web/88310.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88310.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88310.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前缀和|差分

题目:MT2047距离平方和你有𝑛n个点,请编写一个程序,求这𝑛n个点的距离的平方和。格式输入格式:第一行:一个整数𝑛(0≤𝑛≤100000)n(0≤…

x86架构CPU市场格局

x86架构的CPU市场是全球处理器市场的核心,涵盖PC(桌面端与移动端)、服务器和超算等领域,主要玩家为英特尔(Intel)和AMD。以下基于最新数据分析市场格局及各领域份额,辅以国产厂商动态。 1. 总体…

【Swift开发】屏蔽NSSecureCoding频繁警告

解决 iOS 开发中 NSSecureCoding 警告的最佳实践 问题背景 在开发 Mac 应用时,我遇到了一个令人困扰的问题:Xcode 控制台不断输出 NSSecureCoding allowed classes list contains [NSObject class] 相关的警告信息。这些警告虽然不影响应用功能&#xff…

SpringBoot实现MCP

前言 之前的文章都是各种使用MCP,自从有了MCP我们立马感受到大模型真的可以帮我们干活了,实际上当我们想把企业内部的业务向AI方向转型的话主要就是实现MCP,另外加上多Agent在流程上的控制和自有的知识库这就可以满足企业80%的需求了,剩下的2…

windows对\和/敏感吗?

在Windows系统中,路径分隔符\和/的敏感性需要分情况来看: 1. 文件系统层面 Windows文件系统(如NTFS、FAT32)不区分\和/。 例如,以下路径是等效的: C:\Users\Documents\file.txt C:/Users/Documents/file.tx…

缓存穿透与击穿多方案对比与实践指南

缓存穿透与击穿多方案对比与实践指南 问题背景介绍 在高并发的分布式系统中,缓存是提升读写性能的重要组件。但在实际生产环境中,经常会遇到两类问题: 缓存穿透:客户端频繁请求不存在的数据,导致请求直达数据库&#x…

【音视频】HTTP协议介绍

参考博客:https://cloud.tencent.com/developer/article/2183902 一、HTTP协议概述 HTTP(HyperText Transfer Protocol) 即 超文本传输协议,它是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是万维网&#xff08…

神经网络基础及API使用详解

一、神经网络概述神经网络是一种模仿生物神经网络结构和功能的计算模型,它由大量的人工神经元相互连接构成,能够通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。1.1 神经网络的基本组成输入层:接收原始数据隐藏…

分桶表的介绍和作用

一、分桶表的基本介绍1、什么是分桶表?分桶表主要是用于分文件的,在建表的时候,指定按照那些字段执行分桶操作,并可以设置需要分多少个桶,当插入数据的时候,执行MR的分区的操作,将数据分散各个分…

HighReport报表工具开始支持BS报表设计器

HighReport报表工具同时支持c/s报表设计器和b/s报表设计器,大部分情况下使用c/s报表设计器,在某些业务场景或者用户自己简单修改报表模板,可以用b/s报表设计器。b/s报表设计器和c/s报表设计器操作一样b/s报表设计器免费下载免费使用(c/s报表设…

数据结构--堆的实现

目录 一、堆的概念及结构 二、小根堆的实现 2.1 堆的数据结构 2.2 堆的初始化HeapInit 2.3 堆的销毁HeapDestory 2.4 堆的插入HeapPush ​2.4.1 插入代码HeapPush 2.4.2 向上调整代码AdjustUp 2.4.3 交换数据代码Swap 2.5 堆的删除HeapPop 2.5.1 删除代码HeapPop 2…

evo轨迹评估工具

文章目录evo参数设置evo_traj指标度量evo_apeevo_rpe结果比较evo工具主要有如下六个常用命令: evo_ape - 用于评估绝对位姿误差;evo_rpe- 用于评估相对位姿误差;evo_traj - 这个主要是用来画轨迹、输出轨迹文件、转换数据格式等功能&#xf…

Django+DRF 实战:自定义异常处理流程

文章目录一、DRF 异常处理流程DRF 默认异常处理流程源码二、实战DRF 自定义异常处理流程应用自定义异常处理流程一、DRF 异常处理流程 DRF 默认异常处理流程 DRF默认的异常处理流程如下: 当异常发生时,会自动调用rest_framework.views.exception_hand…

Spring MVC 1

什么是Spring Web MVC 官方对Spring MVC的描述是这样的:Spring Web MVC 是基于Severlet API构建的原始Web框架,从一开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它…

一个基于若依(ruoyi-vue3)的小项目部署记录

一、背景 收到朋友的求助,他拿到了一个项目的源代码,说需要我帮助部署。部署要求是需要域名访问。 因为没有文档和其他资料以及帮助,我先清理了源收到的资料: 1.后端:是java代码,一看就是若依框架。心里大大…

【实战总结】WMIC在HW行动中的4类关键应用

WMIC命令完全指南:网络安全运维工程师的深度实践手册 关键词:WMIC命令、Windows管理、网络安全运维、系统信息收集、进程分析、自动化审计 【实战总结】WMIC在HW行动中的4类关键应用 1. 前言 在Windows环境下的网络安全运维中,WMIC&#x…

LKT4304稳定可靠高兼容性国产安全加密芯片

随着 IOT 的飞速发展,智能家居,智能汽车,智能工控等物联网设备和云服务的安全问题成为IOT普及的关键障碍。在设计之初就为物联网产品配备正确的安全解决方案,是帮助预防措施的关键所在。LKT4304是凌科芯安专为物联网应用场景而推出…

Android 网络开发核心知识点

Android 网络开发核心知识点 一、基础网络通信 1. HTTP/HTTPS 协议 HTTP方法:GET、POST、PUT、DELETE等状态码:200(成功)、404(未找到)、500(服务器错误)等HTTPS加密:SSL/TLS握手过程报文结构:请求头/响应头、请求体/响应体 2. 网…

DVWA靶场通关笔记-弱会话IDs(Weak Session IDs Medium级别)

目录 一、Session ID 二、代码审计(Medium级别) 1、配置security为Medium级别 2、源码分析 (1)index.php (2)Medium.php (3)对比分析 (4)渗透思路 三…

编辑器Vim的快速入门

如大家所了解的,Vim是一个很古老的编辑器,但是并没有随着时间的流逝消失在编辑器/IDE 的竞争中,Vim 独创的模式机制和 hjkl 移动光标方式使得使用者在编辑文件时可以双手不离开键盘,极大地提升了工作效率。由于 Vim 学习曲线极为陡…