首页/新闻资讯/正文详情

langgraph -- 从0构建ReAct agent

发布时间:2026/9/24 17:55:32 来源:云帆数科 栏目:资讯中心
langgraph -- 从0构建ReAct agent
文章目录基础介绍简单案例基础介绍单一的LLM的只能通过提示词来生成答复内容自身不能执行任何行为相当于人的大脑仅限于思考与回答问题能力有限单一Agent将LLM Tools 组合不仅可以思考还可以通过工具调用完成某种行为相当于给大脑加上了手臂可以完成稍微复杂一点的任务ReAct agent 即 Reason and Act 推理一步执行一步再推理再执行流程来完成一个目标任务pip install -U langgraph 安装最新的版本简单案例importosfromlanggraph.graphimportStateGraph,MessagesState,START,ENDfromlanggraph.graph.messageimportadd_messagesfromtypingimportAnnotated,TypedDict,Listfromlangchain_core.messagesimportBaseMessage,AIMessage,HumanMessage,ToolMessagefromlangchain_openaiimportChatOpenAI# tool 装饰器fromlangchain_core.toolsimporttool,Toolfromlangchain_core.promptsimportChatPromptTemplate# 定义工具tool(description这是一个加法运算工具用于完成两个数值的相加)defadd(p1,p2): :param p1: :param p2: :return: p1p2 returnp1p2## prompt ChatPromptTemplate.from_messages([# (system, 你是一个数学科学家可以帮助用户进行数学计算),# (user, {question}) # 占位符字符串# ])# 创建LLM访问并关联工具llmChatOpenAI(# 环境变量中需要配置调用LLM的密钥base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1,modelqwen-plus,api_keyos.environ.get(OPENAI_API_KEY),temperature0.3,# 越大越具有创造性)tools[add]llm_with_toolsllm.bind_tools(toolstools)# llm_chain prompt | llm_with_tools# agent中的状态数据classMyState(TypedDict):# 同 MessageState# 各种消息的列表# Annotated 类型注解[类型 metadata, ...]messages:Annotated[List[BaseMessage],add_messages]# 在每个节点返回字典后langgraph底层通过metadata 更新字典# 若没有add_messages 元数据则会直接覆盖原始数据# LLM调用并返回数据defreason_llm(state:MyState):# state 表示状态数据messagesstate[messages]# 获取到所有的Message对象# 得到AIMessageresponsellm_with_tools.invoke(messages)# 返回一个MyState同结构的字典或者 key子集字典return{messages:[response]}deftool_call(state:MyState):# LLM 推理返回的文本中只是包含了需要调用的工具名称及参数# 并不会真正的自己去调用工具 只是将调用工具的逻辑封装了messagestate[messages][-1]ifhasattr(message,tool_calls)andmessage.tool_calls:# 说明需要调用工具# 这里实现调用工具的逻辑# [{name: add, args: {p1: 3, p2: 5}, id: call_c1daa4d2e4d74c4f85da5e, type: tool_call}]print(工具调用,message.tool_calls)cur_toolmessage.tool_calls[0]cur_tool_namecur_tool.get(name)cur_tool_argscur_tool.get(args)cur_tool_idcur_tool.get(id)else:...# 将工具调用的结果封装为ToolMessagemessageToolMessage(contenttool result,tool_call_idcur_tool_id)return{messages:[message]}defshould_exit(state:MyState):messagestate[messages][-1]ifhasattr(message,tool_calls)andmessage.tool_calls:returntoolreturnend# 创建状态图graphStateGraph(MyState)# 添加推理节点 (名称 函数)graph.add_node(reason_llm,reason_llm)# 添加工具节点graph.add_node(tool_call,tool_call)# 添加有向边graph.add_edge(START,reason_llm)graph.add_conditional_edges(reason_llm,should_exit,{tool:tool_call,end:END})graph.add_edge(tool_call,reason_llm)# 编译图graphgraph.compile()# 调用图并传入MyState 实例result_stategraph.invoke({messages:[(user,帮我计算35等于多少)]})# 从 end 节点中输出state对象 messages属性中包含了所有的Message对象print(result:,result_state)# ipynb中可以通过Ipython查看图# from IPython.display import Image, display# display(Image(graph.get_graph().draw_mermaid()))img_bytesgraph.get_graph().draw_png()# pip install pygraphviz 绘制图片返回字节数据withopen(ReAct-agent.png,wb)asf:f.write(img_bytes)

相关推荐

OpenFOAM二次开发教程(08):物性与热物性模型扩展——thermophysicalProperties 解剖
OpenFOAM二次开发教程(08):物性与热物性模型扩展——thermophysicalProperties 解剖

OpenFOAM二次开发教程(08):物性与热物性模型扩展——thermophysicalProperties 解剖 版本与事实声明 hConst 的字典项(Cp、Hf、Tref、Href 等)与 janaf 的字典项(Tlow、Thigh、Tcommon、lowCpCoeffs、highC… · 2026/9/24 17:55:32

OpenFOAM二次开发教程(12):函数对象开发——coded 与编译型 functionObject
OpenFOAM二次开发教程(12):函数对象开发——coded 与编译型 functionObject

OpenFOAM二次开发教程(12):函数对象开发——coded 与编译型 functionObject版本与事实声明 functions 条目的结构与继承项(region、enabled、log、timeStart、timeEnd、executeControl、executeInterval、writeControl、writeInte… · 2026/9/24 17:55:32

RL-赵-(五)-不基于模型1:MC算法05【MC ε-Greedy】【把只能从(s,a)对开始的条件去掉】【软策略:每个动作都有可能;通过ε平衡exploitation与exploration】
RL-赵-(五)-不基于模型1:MC算法05【MC ε-Greedy】【把只能从(s,a)对开始的条件去掉】【软策略:每个动作都有可能;通过ε平衡exploitation与exploration】

四、MC ε-Greedy(MC without exploring starts ) 1、Soft Policies(软策略) 什么是Soft policies?如果一个策略采取的每一个action的概率是positive,也就是这些action都有可能被采取,那么这个策略就称为soft policy。 为什么要引入软策略? 使用软策略,一些足够长的… · 2026/9/24 17:55:32

Flutter for OpenHarmony单元测试:用mocktail实现无代码生成的Mock方案
Flutter for OpenHarmony单元测试:用mocktail实现无代码生成的Mock方案

在 Flutter for OpenHarmony 这类适配型工程里做单元测试,最让人头疼的往往不是业务逻辑本身,而是环境依赖。我最早在一个鸿蒙设备的 Flutter 项目里跑flutter test,第一轮测试就全被MissingPluginException淹没——原因很简单:测… · 2026/9/24 18:29:50

医院信息系统Word导入组件选型与Java集成实战指南
医院信息系统Word导入组件选型与Java集成实战指南

在医院信息化行业摸爬滚打这些年,我被人问得最多的一句话就是:医生那边拿过来的Word,到底怎么才能干净地弄进咱们系统里。问这话的,有信息科刚入职的年轻人,也有集成商里天天被项目追着跑的实施工程师。这句话往深了挖… · 2026/9/24 18:29:50

若依整合AI实战:SSE流式响应与Docker部署压测
若依整合AI实战:SSE流式响应与Docker部署压测

接手这个“若依整合AI”的实战改造前,我心里很清楚:业务方说“就加个聊天窗口”,实际意味着模型接口对接、流式响应、权限控制、异常兜底、部署压测这五件事一个都不能少。这篇文章是若依整合AI系列的第二篇,上一篇把大模型API选型… · 2026/9/24 18:29:50

Python+Pygame游戏开发:从AABB到像素级碰撞检测全解析
Python+Pygame游戏开发:从AABB到像素级碰撞检测全解析

我刚开始用Python做游戏的那阵子,最爱看别人炫耀炫酷的特效和流畅的动画,可自己上手才发现,最磨人的不是画面,而是碰撞检测。明明角色已经走到金币面前,却愣是没触发得分;子弹看似打中了敌人,敌… · 2026/9/24 18:29:50

跨平台终端文件管理器 Yazi 实测:从安装到美化,彻底告别 Windows 资源管理器
跨平台终端文件管理器 Yazi 实测:从安装到美化,彻底告别 Windows 资源管理器

"Windows 自带的文件资源管理器,说句难听的,我忍它很多年了。它倒也不是不能用,但你一旦开始批量整理照片、快速在两个目录间搬运文件、同时要看十几个不同类型的文件预览时,那种迟钝又局促的交互,总会让你觉得这… · 2026/9/24 18:29:50

Shell循环语句实战指南:for、while、until与循环控制全解析
Shell循环语句实战指南:for、while、until与循环控制全解析

天天在Linux命令行里摸爬滚打的人,大概都有过这么一段经历:写Shell脚本时,凡是遇到重复操作就复制粘贴,几十台服务器要检查就贴几十遍命令,最后脚本比裹脚布还长。直到你真正把循环语句用起来,才算是从&quo… · 2026/9/24 18:29:44

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码