【AI开发】LangGraph基础

在LangGraph中有三个重要元素

  • StateGraph
  • Node
  • Edge

StateGraph

首先stategraph是用来描述整个图的,图中的状态会随着多个agent的工作不断的更新,节点node就是用来更新状态的
如何来定义一张图中的状态
每个应用的状态可能不同,所以我们需要根据具体应用场景来决定状态

from langgraph.graph import StateGraph
from typing import TypedDict, List, Annotated
import operatorclass State(TypedDict):#该示例中状态定义了两个字段,输入input,allactioninput: strall_actions: Annotated[List[str], operator.add]graph = StateGraph(State)

Node

当我们创建好stategraph后,就可以向其中添加node(graph.add_node(name,value))

graph.add_node("model", model)
graph.add_node("tools",tool_executor)

同时node中还有个特殊的节点END,表示状态终止

Edge

先定义从哪个节点开始

graph.set_entry_point("节点名字")

分为normal edge 和conditional edge
normal edge定义了两个节点之间必然的先后关系
conditional edge通过条件来决定下一步的节点是哪里,需要三个东西:上游节点(upstream node)、判定函数、映射关系。
分别表示来自哪里、如何判断去哪、条件结果返回

graph.add_conditional_edge("model", #model是上游节点的名字should_continue,  #这是{"end":END,"continue":"tools"}
)

上述代码中,上游节点是model,判定条件是should_continue,如果should_continue返回end,那就是END节点,如果返回continue那就去tools节点

示例

我们来用一个具体的示例来展示langgraph
首先先定义stategraph

from langgraph.graph import StateGraph
from typing import TypedDict, List, Annotated,Union
import operator
from langchain_core.agents import AgentAction,AgentFinish
from langchain_core.messages import BaseMessage
####################################初始化一个stategraph
class AgentState(TypedDict):#定义一些初始化的功能#用户输入字符串input:str#对话中之前的消息列表chat_history:list[BaseMessage]#agent执行过后的结果,是要继续执行action还是完成finish,还是没有任何的状态Noneagent_outcom: Union[AgentAction,AgentFinish,None]#动作列表和相应的观察结果#operator.add表明对这个状态的操作是添加到现有值上而不是覆盖掉

再定义两个工具

##################外部的工具,应包含工具描述,工具输入内容的JSON模式,调用的函数
from langchain.tools import BaseTool, StructuredTool, Tool, tool
import random@tool("lower_case", return_direct=True)
def to_lower_case(input:str) -> str:"""返回全部小写的输入"""return input.lower()@tool("random_number",return_direct=True)
def random_number_maker(input:str) -> str:"""返回0-100之间的随机数"""return random.randint(0,100)tools = [to_lower_case,random_number_maker]to_lower_case.run('ROONIE')

最后就会输出roonie

现在我们来写一个完整的demo

from langgraph.graph import END, StateGraph
from langgraph.graph import StateGraph
from typing import TypedDict, List, Annotated,Union
import operator
from langchain_core.agents import AgentAction,AgentFinish
from langchain_core.messages import BaseMessage
from langchain_core.agents import AgentFinish
from langgraph.prebuilt.tool_executor import ToolExecutor
from langchain.tools.render import format_tool_to_openai_function####################################初始化一个stategraph##############################
class AgentState(TypedDict):#定义一些初始化的功能#用户输入字符串input:str#对话中之前的消息列表chat_history:list[BaseMessage]#agent执行过后的结果,是要继续执行action还是完成finish,还是没有任何的状态Noneagent_outcome: Union[AgentAction,AgentFinish,None]#动作列表和相应的观察结果#operator.add表明对这个状态的操作是添加到现有值上而不是覆盖掉intermediate_steps: Annotated[list[tuple[AgentAction, str]], operator.add]
#############定义一些自定义的tool##############################
@tool("lower_case", return_direct=True)
def to_lower_case(input:str) -> str:"""返回全部小写的输入"""return input.lower()@tool("random_number",return_direct=True)
def random_number_maker(input:str) -> str:"""返回0-100之间的随机数"""return random.randint(0,100)tools = [to_lower_case,random_number_maker]tool_executor = ToolExecutor(tools)####################################定义另一个stategraph################################
from typing import TypedDict, Annotated, Sequence
import operator
from langchain_core.messages import BaseMessage
#不需要中间步骤,全部都在message里面
class AgentState_chatmodel(TypedDict):message: Annotated[Sequence[BaseMessage], operator.add]###################################初始化节点#############################################定义agent
def run_agent(data):#调用agent可执行对象,并传入数据agent_outcome = agent_runnable.invoke(data)#返回代理的结果return {"agent_outcome":agent_outcome}#定义执行工具的函数
def execute_tools(data):#获取最近的代理结果 - 这是在上面的agent中添加的关键字agent_action = data['agent_outcome']#执行工具output = tool_executor.invoke(agent_action)#打印代理操作print(f"The agent action is {agent_action}")#打印工具结果print(f"The tool result is {output}")#返回输出return {"intermediate_steps": [(agent_action, str(output))]}#定义用于确定哪条conditional edge该走的逻辑
def should_continue(data):#如果代理结果是AgentFinish,那么返回“end”字符串#在设置图的流程时将使用这个if isinstance(data['agent_outcome'], AgentFinish):return "end"#否则,返回一个AgentAction#这里我们返回‘continue’字符串#在设置图的流程时也将使用这个else:return "continue"#######################################################定义一个新的图(工作流)##################################################workflow = StateGraph(AgentState)  #agentstate是上面初始化过的一个stategraph#定义两个节点,我们将在他们之间循环
workflow.add_node("agent", run_agent)
workflow.add_node("action", execute_tools) #agent输出不满足我们的要求,那就继续调用它的action#设置初始节点entrypoint
#将入口节点设为agent,表示这个节点是第一个被调用的
workflow.set_entry_point("agent")#添加一个conditional egde
workflow.add_conditional_edges(#首先定义边的起始节点,我们用‘agent’,表示在调用agent节点之后将采取这些边"agent",#接下来我们加载将决定下一个调用哪个节点的函数should_continue,#最后我们传入一个映射,key是字符串,value是其他节点#将会发生的是,我们调用“should_continue”,然后其输出将与此映射中的key匹配,根据匹配情况调用相应的节点{"continue": "action", #如果是“continue”,则调用工具节点"end": END #END是一个特殊节点,表示图的结束}
)#agent到action是需要conditional egde,但action到agent是不用的,因为action之后肯定要回到agent节点,所以加一个normal edge就行
workflow.add_edge('action', 'agent')#最后进行编译compile,将其编译成一个LangChain可运行对象
app = workflow.compile()

我们来总结一下一个简单的LangGraph怎么写

  1. 定义一个stateGraph的类,以及它的一些初始化的功能,比如用户输入、中间步骤、对话历史、agent执行后的结果等
  2. 自定义一些tool,不定义的话相当于直接让调用的LLM来完成。把tool放入executor里
  3. 初始化节点:包含定义agent、定义工具函数、定义条件边的逻辑(比如agent返回结果是continue就继续,返回finish就end
  4. 开始实例化一个workflow:定义agent和action节点、设置初始节点、添加agent起始的conditional edge,添加action到agent的normal edge
  5. compile

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/27461.shtml

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

相关文章

kettle实时增量同步mysql数据

** 本文主要介绍运用kettle实时增量同步mysql数据 ** Debezium介绍 官网地址:https://debezium.io/documentation/ Debezium是一个开源项目,为捕获数据更改(Capture Data Change,CDC)提供了一个低延迟的流式处理平台,通过安装配置Debeziu…

Aigtek高压功率放大器在超声电机中的应用

超声电机是一种先进的电机技术,常用于各种应用,如医疗成像、工业自动化和汽车技术。这些电机在高速、高精度和低噪音要求的领域中表现出色。在驱动这些超声电机时,高压功率放大器发挥着关键作用。本文将介绍高压功率放大器如何驱动超声电机&a…

腾讯元宝APP:AIGC大模型的新篇章

随着科技的飞速发展,人工智能(AI)技术已经渗透到我们生活的方方面面。腾讯作为国内科技巨头,近期推出的元宝APP更是为AIGC(人工智能生成内容)市场注入了新的活力。这款大模型产品的上线,不仅丰富…

【kyuubi-spark】从0-1部署kyuubi集成spark执行spark sql到k8s读取iceberg的minio数据

一、背景 团队在升级大数据架构 前端使用trino查询,对trino也进行了很多优化,目前测试来看,运行还算稳定,但是不可避免的trino的任务总会出现失败的情况。原来的架构是trino失败后去跑hive,而hive是跑mapreduce依赖于…

PostgreSQL:在CASE WHEN语句中使用SELECT语句

CASE WHEN语句是一种条件语句,用于多条件查询,相当于java的if/else。它允许我们根据不同的条件执行不同的操作。你甚至能在条件里面写子查询。而在一些情况下,我们可能需要在CASE WHEN语句中使用SELECT语句来检索数据或计算结果。下面是一些示…

c->c++(一):部分KeyWord

本文主要探讨c相关关键字的使用。 char char默认是unsigned/signed取决平台,wchar_t宽字符:用于Unicode编码(超过一个字节),用wcin和wcout输入输出,字符串为wstring char8_t(20),char16_t(11起),char32_t(11):指定占用字节数且是无符号,字符串类u8string,u16s…

Debian 安装 kubernets

Docker环境 添加 Docker 的官方 GPG 密钥 安装 apt 依赖包,用于通过 HTTPS 来获取仓库 sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg2 \software-properties-common -y添加秘钥 curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/li…

python之面向对象(一)

一.类与对象 1.1类和对象的创建 类提供了创建对象的蓝图。对象是类的实例,拥有类中定义的属性和方法。self 参数是对类实例自身的引用,用于访问类的属性和方法。 案例: 下面举一个“长方形”类的例子,包含长,宽属性…

关于对pagination.js源代码进行修改且引入项目使用

实现效果 使用定时器对组件进行每秒请求&#xff0c;每过固定时间之后&#xff0c;进行下一页项目请求&#xff0c;进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…

Python 中国象棋游戏【含Python源码 MX_011期】

简介&#xff1a; 中国象棋是一种古老而深受喜爱的策略棋类游戏&#xff0c;也被称为中国的国粹之一。它在中国有着悠久的历史&#xff0c;起源可以追溯到几个世纪以前。Python 中国象棋游戏是一个用Python编程语言编写的软件程序&#xff0c;旨在模拟和提供中国象棋的游戏体验…

CVE-2024-23692:Rejetto HFS 2.x 远程代码执行漏洞[附POC]

文章目录 CVE-2024-23692&#xff1a;Rejetto HFS 2.x 远程代码执行漏洞[附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 CVE-2024-23692&#xff1a;Rejetto HFS 2.x 远程代码执行漏洞[附POC] 0x01 前言 …

Elasticsearch:简化数据流的数据生命周期管理

作者&#xff1a;来自 Elastic Andrei Dan 今天&#xff0c;我们将探索 Elasticsearch 针对数据流的新数据管理系统&#xff1a;数据流生命周期&#xff0c;从版本 8.14 开始提供。凭借其简单而强大的执行模型&#xff0c;数据流生命周期可让n 你专注于数据生命周期的业务相关方…

干货!电脑如何录屏?6款win10录屏大师软件深度测评

电脑如何录屏&#xff1f;在2024年&#xff0c;截图或屏幕录制可以说是一种无价的工具。它是捕捉重要信息、与朋友和同事分享说明&#xff0c;或者只是存储您最喜爱的游戏和应用程序中的记忆的好方法。在 Windows 上录制屏幕非常简单。在本篇文章中&#xff0c;我们将讨论在win…

113.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-结构体数据更新思路分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

绘唐科技官网

绘唐科技AI工具是一系列经过训练的人工智能工具&#xff0c;旨在提供各种智能化的解决方案。这些工具可以应用于多个领域&#xff0c;包括自然语言处理、图像识别、语音识别、机器学习等。 其中&#xff0c;自然语言处理工具可以帮助用户处理和理解文本数据。它可以实现文本分类…

Spring 内置BeanFactoryPostProcessor的子孙们

同样的Spring 也 内置了 一些实现 BeanFactoryPostProcessor的类&#xff0c;各有各的用处。 spring-context AspectJWeavingEnabler 用来把ClassPreProcessorAgentAdapter注册到LoadTimeWeaver中ConfigurationClassPostProcessor 一个重要的类&#xff0c;用来处理Configurat…

3、matlab单目相机标定原理、流程及实验

1、单目相机标定流程及步骤 单目相机标定是通过确定相机的内部和外部参数&#xff0c;以便准确地在图像空间和物体空间之间建立映射关系。下面是单目相机标定的流程及步骤&#xff1a; 搜集标定图像&#xff1a;使用不同角度、距离和姿态拍摄一组标定图像&#xff0c;并确保标…

树莓派 sudo apt-get install python-smbus 报错

sudo apt-get install python-smbus 报错 sudo apt-get install python-smbus 报错 python-smbus : Depends: python (< 2.8)Depends: python (> 2.7~)Depends: python:any (< 2.8)Depends: python:any (> 2.7~) E: Unable to correct problems, you have held b…

泉州职业技术大学2024Java期末题库【基础题】

1.根据输入的表示星期几的数字&#xff0c;对应输出它的英文名称。 考察内容:Switch语句的掌握 public class test1 {public static void main(String[] args) {//switch语句复习//创建对象java.util.Scanner input new java.util.Scanner(System.in);//提示输入语句System.ou…

TF-IDF算法详细解析与应用

一、前言 在信息的海洋中&#xff0c;如何快速准确地找到我们需要的知识&#xff1f;搜索引擎给出了答案。而在搜索引擎背后&#xff0c;有一个核心算法无声地发挥着巨大作用——TF-IDF。本篇博客将为你揭开TF-IDF的神秘面纱&#xff0c;让你深入理解它的原理&#xff0c;并掌…