5. langgraph中的react agent使用 (从零构建一个react agent)

news/2024/11/22 2:42:01/

1. 定义 Agent 状态

首先,我们需要定义 Agent 的状态,这包括 Agent 所持有的消息。

from typing import (Annotated,Sequence,TypedDict,
)
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messagesclass AgentState(TypedDict):messages: Annotated[Sequence[BaseMessage], add_messages]

2. 初始化模型和工具

接下来,我们初始化一个 ChatOpenAI 模型,并定义一个工具 get_weather

from langchain_openai import ChatOpenAI
from langchain_core.tools import toolmodel = ChatOpenAI(temperature=0,model="glm-4-plus",openai_api_key="your_api_key",openai_api_base="https://open.bigmodel.cn/api/paas/v4/"
)@tool
def get_weather(location: str):"""Call to get the weather from a specific location."""# This is a placeholder for the actual implementation# Don't let the LLM know this though 😊if any([city in location.lower() for city in ["sf", "san francisco"]]):return "It's sunny in San Francisco, but you better look out if you're a Gemini 😈."else:return f"I am not sure what the weather is in {location}"tools = [get_weather]model = model.bind_tools(tools)

3. 定义工具节点和模型调用节点

我们需要定义工具节点和模型调用节点,以便在 Agent 工作流中使用。

import json
from langchain_core.messages import ToolMessage, SystemMessage
from langchain_core.runnables import RunnableConfigtools_by_name = {tool.name: tool for tool in tools}def tool_node(state: AgentState):outputs = []for tool_call in state["messages"][-1].tool_calls:tool_result = tools_by_name[tool_call["name"]].invoke(tool_call["args"])outputs.append(ToolMessage(content=json.dumps(tool_result),name=tool_call["name"],tool_call_id=tool_call["id"],))return {"messages": outputs}def call_model(state: AgentState,config: RunnableConfig,
):system_prompt = SystemMessage("You are a helpful AI assistant, please respond to the users query to the best of your ability!")response = model.invoke([system_prompt] + state["messages"], config)return {"messages": [response]}def should_continue(state: AgentState):messages = state["messages"]last_message = messages[-1]# If there is no function call, then we finishif not last_message.tool_calls:return "end"# Otherwise if there is, we continueelse:return "continue"

4. 构建工作流

使用 StateGraph 构建工作流,定义节点和边。

from langgraph.graph import StateGraph, ENDworkflow = StateGraph(AgentState)workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)workflow.set_entry_point("agent")workflow.add_conditional_edges("agent",should_continue,{"continue": "tools","end": END,},
)workflow.add_edge("tools", "agent")graph = workflow.compile()from IPython.display import Image, displaytry:display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:pass

在这里插入图片描述

5. 运行工作流

最后,我们定义一个辅助函数来格式化输出,并运行工作流。

# Helper function for formatting the stream nicely
def print_stream(stream):for s in stream:message = s["messages"][-1]if isinstance(message, tuple):print(message)else:message.pretty_print()inputs = {"messages": [("user", "what is the weather in sf")]}
print_stream(graph.stream(inputs, stream_mode="values"))

输出结果如下:

================================[1m Human Message [0m=================================
what is the weather in sf
================================[1m Ai Message [0m==================================
Tool Calls:get_weather (call_9208187575599553774)Call ID: call_9208187575599553774Args:location: San Francisco
================================[1m Tool Message [0m=================================
Name: get_weather"It's sunny in San Francisco, but you better look out if you're a Gemini 😈."
================================[1m Ai Message [0m==================================It's sunny in San Francisco, but you better look out if you're a Gemini 😈.

参考链接:https://langchain-ai.github.io/langgraph/how-tos/react-agent-from-scratch/


http://www.ppmy.cn/news/1548918.html

相关文章

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (三)

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (三) 一、前言 目前鸿蒙最新系统,经过测试还有两个BLE相关Bug正在修复: 1.获取本地设备蓝牙名称,会为空,只有点击到设置蓝牙中查看后,该接口才能…

STM32低功耗设计NFC与无线距离感应智能钥匙扣-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 智能钥匙扣作为一种小巧而实用的智能设备,凭借其便携性…

el-table常用知识点1

实现在一个表格某一行数据的上方浮动一个图片 <el-table :data"tableData" borderheight"90%":style"{width: 100%}" ><el-table-column prop"startDate" label"开始日期" align"center"><templa…

【C++进阶实战】打砖块小游戏

游戏规则 玩家控制底部的一个挡板&#xff0c;反弹球击碎上方排列的砖块。如果球掉到底部&#xff0c;则游戏结束。如果所有砖块都被击碎&#xff0c;则玩家胜利。 安装 EasyX 为了更好的视觉效果&#xff0c;我们将使用 EasyX 图形库。EasyX 是一个适用于 Windows 平台的轻…

git使用流程梳理

之前觉得git比较麻烦&#xff0c;还是习惯本地使用而没有推送至远程&#xff0c;自从不小心rm -rf清空所有代码后&#xff0c;幡然醒悟。后续梳理一下相关使用方法 整体过程 1 建立库&#xff0c;建立远程连接 2 本地创建分支并查看分支 (假定本地分支名字为test) git che…

高级网络安全——IP 安全(week5)

加粗样式 文章目录 一、前言二、重点概念IP 安全概述IPSec的应用IPSec概述:典型场景IPSec安全协议AH与ESP的功能对比IPSec协议与加密算法IPSec模式AH协议:传输模式与隧道模式完整性检查值(ICV)AH协议的ICV计算封装安全载荷(ESP)协议IPSec的策略导向方法IPSec策略IPSec策略…

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情&#xff0c;将它与表白结合在一起&#xff0c;会创造出别具一格的惊喜效果。使用Python的turtle模块&#xff0c;我们可以轻松绘制出动态的烟花特效&#xff0c;再配合文字表白&#xff0c;打造一段专属的浪漫体验。 接下来&#xff0c;让…

基于YOLOv8深度学习的医学影像肝病检测系统研究与实现(PyQt5界面+数据集+训练代码)

本研究提出了一种基于YOLOv8深度学习算法的医学影像肝病检测系统&#xff0c;旨在通过先进的图像处理与深度学习技术提高肝病的检测效率和准确性。系统采用YOLOv8作为核心算法模型&#xff0c;其具备快速高效的物体检测能力&#xff0c;能够精确定位肝脏区域&#xff0c;并对可…