langgraph学习--创建基本的agent执行器

本文介绍如何使用langgraph创建一个基本的Agent执行器,主要包括下面几个步骤:
1、定义工具
2、创建langchain Agent(由LLM、tools、prompt三部分组成)
3、定义图形状态
传统的LangChain代理的状态有几个属性:
(1) ’ input ‘:这是一个输入字符串,表示来自用户的主要请求,作为输入传入。
(2)’ chat_history ‘:这是以前的对话消息,也作为输入传入。
(3) ’ intermediate_steps ‘:这是代理在一段时间内采取的操作和相应观察的列表。这在代理的每次迭代中都会更新。
(4)’ agent_outcome’:这是代理的响应,可以是AgentAction,也可以是AgentFinish。当这是一个AgentFinish时,AgentExecutor应该完成,否则它应该调用所请求的工具。
4、定义节点
现在我们需要在图中定义几个不同的节点。在’ langgraph '中,节点可以是函数或可运行的。
我们需要两个主要节点:
(1)代理:负责决定采取什么(如果有的话)行动。
(2)调用工具的函数:如果代理决定采取操作,则该节点将执行该操作。
5、定义边
其中一些边可能是有条件的。它们是有条件的原因是,基于节点的输出,可能会采取几个路径中的一个。在运行该节点之前,所采取的路径是未知的(由LLM决定)。
(1)条件边:在代理被调用后,我们应该:
a.如果代理说要采取行动,那么应该调用调用工具的函数
b.如果代理说完成了,那就应该完成
(2) 正常边:在工具被调用后,它应该总是回到代理来决定下一步做什么
6、编译

代码实现如下

from langchain import hub
from langchain.agents import create_openai_functions_agent
from langchain_openai.chat_models import ChatOpenAI
import os
os.environ["OPENAI_API_KEY"]="sk-XXXXXXXXXX"
os.environ["SERPAPI_API_KEY"] = 'XXXXXXXXXXXXXXXXXXXXX'
from langchain.agents.tools import Tool
from langchain_community.utilities import SerpAPIWrapper
search = SerpAPIWrapper()search_tool = Tool(name = "Search",func=search.run,description="useful for when you need to answer questions about current events")tools = [search_tool]#### Create the LangChain agent
# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/openai-functions-agent")
llm = ChatOpenAI(model="gpt-3.5-turbo-1106", streaming=True)
# Construct the OpenAI Functions agent
agent_runnable = create_openai_functions_agent(llm, tools, prompt)"""
from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent_runnable, tools=tools)
response = agent_executor.invoke({"input": "weather in San Francisco"})
"""#### Define the graph state
from typing import TypedDict, Annotated, List, Union
from langchain_core.agents import AgentAction, AgentFinish
from langchain_core.messages import BaseMessage
import operator
class AgentState(TypedDict):# The input stringinput: str# The list of previous messages in the conversationchat_history: list[BaseMessage]# The outcome of a given call to the agent# Needs `None` as a valid type, since this is what this will start asagent_outcome: Union[AgentAction, AgentFinish, None]# List of actions and corresponding observations# Here we annotate this with `operator.add` to indicate that operations to# this state should be ADDED to the existing values (not overwrite it)intermediate_steps: Annotated[list[tuple[AgentAction, str]], operator.add]####  Define the nodes
from langchain_core.agents import AgentFinish
from langgraph.prebuilt.tool_executor import ToolExecutor# It takes in an agent action and calls that tool and returns the result
tool_executor = ToolExecutor(tools)# Define the agent
def run_agent(data):agent_outcome = agent_runnable.invoke(data)return {"agent_outcome": agent_outcome}# Define the function to execute tools
def execute_tools(data):# Get the most recent agent_outcome - this is the key added in the `agent` aboveagent_action = data['agent_outcome']output = tool_executor.invoke(agent_action)return {"intermediate_steps": [(agent_action, str(output))]}# Define logic that will be used to determine which conditional edge to go down
def should_continue(data):if isinstance(data['agent_outcome'], AgentFinish):return "end"else:return "continue"#### Define the graphfrom langgraph.graph import END, StateGraphworkflow = StateGraph(AgentState)workflow.add_node("agent", run_agent)
workflow.add_node("action", execute_tools)
workflow.set_entry_point("agent")workflow.add_conditional_edges("agent",should_continue,{# If `tools`, then we call the tool node."continue": "action",# Otherwise we finish."end": END}
)workflow.add_edge('action', 'agent')# This compiles it into a LangChain Runnable, meaning you can use it as you would any other runnable
app = workflow.compile()inputs = {"input": "what is the weather in sf", "chat_history": []}
for s in app.stream(inputs):print(list(s.values())[0])print("----")

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

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

相关文章

centos7 linux 不小心把根目录的内容移到别的目录了

在根目录不小心执行了如下命令,然后发现大部分常用命令不能用了。都在报错 mv * /data/software从网上找了好多帖子,命令都不好使。有的是用/data/software/lib64/ld-linux-x86-64.so.2,/data/software/lib64就不是个目录,只是个软连接&…

git将项目的某次签入遴选(Cherry-Pick)另一个项目

需求&#xff1a;将项目Product&#xff0c;分支feature/platform&#xff0c;签入959294ce6b75ee48c5cb22c46d7398654628a896&#xff0c;遴选到项目BRP&#xff0c;分支dev 第一步&#xff1a;使用原签入生成patch文件&#xff08;git format-patch -1 <commit_hash>&a…

OpenCV学习记录——边缘检测

文章目录 前言一、边缘检测原理二、Canny边缘检测算法三、具体应用代码 前言 在做某些图像处理时&#xff0c;通常需要将识别到的物体边界提取出来&#xff0c;从而帮助我们实现目标检测&#xff0c;这就需要用到边缘检测&#xff0c;例如人脸识别和运动目标的检测都需要先进行…

pdf怎么转成高清图?pdf在线转换器推荐分享

在日常的工作或者学习中&#xff0c;有时候会需要将编辑好的pdf转高清图片&#xff0c;这样更方便我们后续使用&#xff0c;那么怎么将pdf转图片&#xff08;https://www.yasuotu.com/pdftopic&#xff09;还能保持清晰呢&#xff1f;下面介绍一款pdf转换工具&#xff0c;支持p…

使用SPM_batch进行批量跑脚本(matlab.m)

软件&#xff1a;spm8matlab2023bwin11 数据格式&#xff1a; F:\ASL\HC\CBF\HC_caishaoqing\CBF.nii F:\ASL\HC\CBF\HC_caishaoqing\T1.nii F:\ASL\HC\CBF\HC_wangdonga\CBF.nii F:\ASL\HC\CBF\HC_wangdonga\T1.nii clear spmdirD:\AnalysisApps\spm8; datadirF:\ASL\HC\CBF…

Profinet转CANopen主站网关与堡盟编码器通讯案例

Profinet转CANopen主站网关(XD-COPNm20)为CPU与堡盟编码器的通讯提供了CANopen协议向Profinet协议转换互通的桥梁。CANopen是一种基于CAN总线的通讯协议&#xff0c;它被广泛应用于工业自动化领域&#xff0c;而Profinet是一种以太网协议&#xff0c;其优点是高速传输和广泛的可…

【iOS ARKit】手动配置环境探头

在上节中我们已经了解了环境探头以及如何使用自动环境探头&#xff0c;这节一起了解如何使用手动配置环境探头。 在使用自动环境反射时&#xff0c;开发人员无须进行有关环境反射的任何操作&#xff0c;只需要设置自动环境反射即可&#xff0c;其余工作完全由 RealityKit 自动完…

【django】建立python虚拟环境-20240205

1.确保已经安装pip3 install venv 2.新建虚拟环境 python -m venv myenv 3.安装虚拟环境的依赖包 pip install … 4.激活虚拟环境 cd myenv cd Scripts activate 激活activate.bat并进入虚拟环境 进入虚拟环境后&#xff0c;命令行前面显示&#xff08;myenv&#xff0…

如何以管理员身份删除node_modules文件

今天拉项目&#xff0c;然后需要安装依赖&#xff0c;但是一直报错&#xff0c;如下&#xff1a; 去搜这个问题会让把node_modules文件先删掉 再去安装依赖。我在删除的过程中会说请以管理员身份来删除。 那么windows如何以管理员身份删除node_modules文件呢&#xff1f; wi…

SQL语句创建数据库

要创建一个新的数据库&#xff0c;你可以使用以下的SQL语句&#xff1a; sql CREATE DATABASE database_name; 其中&#xff0c;database_name是你希望创建的数据库的名称。例如&#xff0c;如果你想创建一个名为my_database的数据库&#xff0c;你可以使用以下SQL语句&#…

走入SQL世界

目录 一、SQL的定义 二、SQL 的用途 三、创建发布数据库中数据的网站 四、RDBMS 五、数据库表 六、SQL 语句 七、SQL 语句后面的分号 八、SQL中的DML 和 DDL 一、SQL的定义 SQL 是用于访问和处理数据库的一种 ANSI 标准计算机语言&#xff0c;也是结构化查询语言。用来…

某赛通电子文档安全管理系统 44处 反序列化RCE漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

HomeAssistant系统添加HACS插件商店与远程控制家中智能家居

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant&#xff0c;通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店&#xff0c;将米家&#xff0c;果家设备接入 Home Assistant。 基本条件…

2024年2月CCF-全国精英算法大赛题目

第一次参加这种比赛&#xff0c;虽然是c类赛事&#xff0c;但是是ccf主办的&#xff0c;难度还是有点的&#xff0c;主要是前面签到题主要是思想&#xff0c;后面的题目难度太高&#xff0c;身为力扣只刷了一百多道题目的我解决不了&#xff0c;这几道我只做了B,C题,E题超时了&…

您的Google Play开发者账户的Google付款资料已被暂停!——你是否收到这封邮件?

2023年8月&#xff0c;google play政策更新&#xff0c;为保障 Google Play 用户的安全&#xff0c;您必须确保开发者帐号信息准确无误。否则&#xff0c;您在 Google Play 上的开发者资质和应用供应情况可能会受到影响。 2023年10月开始&#xff0c;Google Play开始正式逐步施…

2.5作业

一 、程序阅读题 1、给出下面程序输出结果。 #include <iostream.h> class example {int a; public: example(int b5){ab;} void print(){aa1;cout <<a<<"";} void print()const {cout<<a<<endl;} }; void main() {example x; const e…

大数据分析|大数据分析的十大应用领域

有许多技术可用于分析大数据。这项工作介绍了BDA适用的各种分析技术领域如下。 &#xff08;1&#xff09;社会分析 社交分析是实时数据分析中一个重要且不断发展的分析方法。它分为社交网络(例如&#xff0c;Facebook和LinkedIn)&#xff0c;博客(例如&#xff0c;Blogger和W…

thinkphp6入门(16)-- 缓存cache用法总结

在ThinkPHP 6中&#xff0c;缓存功能被集成到框架中&#xff0c;可以通过Cache类来使用。以下是一些在ThinkPHP 6中使用缓存的基本用法&#xff1a; 配置缓存驱动&#xff1a; 打开 config/cache.php 文件&#xff0c;选择合适的缓存驱动&#xff0c;并配置相应的参数&#xff…

Linux命令基础学习 (2月4日打卡

1. ls - 列出目录内容 命令格式&#xff1a;ls [选项] [文件/目录] 常用选项&#xff1a; -l&#xff1a;以详细列表格式显示-a&#xff1a;显示所有文件&#xff0c;包括以.开头的隐藏文件 2. mkdir - 创建新目录 命令格式&#xff1a;mkdir [选项] 目录名 常用选项&…

100天精通Python(实用脚本篇)——第115天:基于selenium实现反反爬策略之隐藏浏览器指纹特征

文章目录 专栏导读1. 什么是浏览器指纹?2. 爬虫隐藏浏览器指纹特征的好处?3. 手动打开浏览器指纹情况4. 无界面模式打开浏览器5. 脚本隐藏浏览器指纹特征专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一…