尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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)
RELATED

相关推荐

第 5 篇 · host→guest 内存共享:foreign 映射的用例(hmem)

第 5 篇 · host→guest 内存共享:foreign 映射的用例(hmem)

从这一篇起进入具体用例。第 3 篇讲了 foreign 映射——把另一个域的页装进本域 physmap。hmem 就是 foreign 映射的一个用例:host→guest 方向的共享——把 host(dom0)侧的内存映射进 guest 的物理地址空间,让 guest 与 host 共享同一份物理页(零拷贝)。 对称预告:反方…

📅 2026/9/24 17:50:30
论负载均衡技术

论负载均衡技术

摘要2024 年 3 月至 10 月,我作为系统架构师参与了某省级政务一体化服务平台项目的设计与开发工作。该平台面向省内千万居民,提供社保查询、不动产登记、企业办事等线上政务服务,项目采用微服务架构,用户访问存在明显的潮汐流量特…

📅 2026/9/24 17:50:30
AI论文工具真的有用吗?okbiye能帮你做什么?8大板块功能与作用全总结

AI论文工具真的有用吗?okbiye能帮你做什么?8大板块功能与作用全总结

做毕设要经历8个环节:选题开题、找文献、写论文、查重降重、格式排版、做答辩PPT、画科研图表、论文润色,每个环节都有痛点,每个环节都要花大量时间。很多同学被迫下载五六个工具搭配使用,写作一个、查重一个、排版一个、做PPT一个…

📅 2026/9/24 17:50:30
MORE NEWS

更多资讯

📰

JSP健身房管理系统拆解:从数据库设计到部署排障全流程

1. 项目概述与系统定位 1.1 这套健身房管理系统到底能干什么 很多技术社区的朋友最近都在问:拿到一套JSP健身房管理系统的源码之后,到底该怎么看、怎么改、怎么把它跑起来?今天我就以这套典型的课程设计项目为样例,把整个分析过程…

📰

无线网络仿真从入门到实战:信道建模与工具选型全解析

1. 仿真思路拆解:为什么无线网络离不开仿真做无线网络这么多年,我越来越觉得网络仿真不是“锦上添花”的选修课,而是必修课。真实环境里你不可能为了验证一个组网方案,专门去买几十台AP、搭一整套AC、再拉几条专线做测试&#xff…

📰

Spring Boot + Vue3 + MinIO 大文件分片上传实战:直传、断点续传与秒传

我接手过好几个类似需求的项目,从早期做后台管理系统开始就一直在跟文件上传打交道。以前用传统的MultipartFile整包上传,文件小的时候还行,一旦涉及到几百MB甚至几个GB的视频、压缩包、数据库备份文件,问题就全冒出来了&#xff…

📰

Linux命令行删除全攻略:从输入纠错到卸载软件一次讲透

说句实话,第一次在群里看到“在Linux中如何删除命令行?”这个问题的时候,我以为对方在开玩笑。毕竟命令行是Linux里最核心的交互入口,哪有人会想把它“删掉”?可后来聊了几句才明白,新手们说的“删除命令行…

📰

Java post 和 get 请求

get 请求/*** Get请求 带headers的get请求*/public String getResponse(String url, Map<String, String> headers) {try (CloseableHttpClient httpClient HttpClients.createDefault()) {HttpGet request new HttpGet(URI.create(url));if (headers ! null) {for (Ma…

📰

绝缘子缺陷识别数据集:YOLO格式标注与92.5% mAP复现指南

简介&#xff1a;本资源是面向电力系统智能巡检与计算机视觉初学者的绝缘子缺陷识别专用数据集&#xff0c;聚焦光盘损坏、绝缘子本体异常及污闪三类典型缺陷检测任务&#xff0c;适用于YOLOv11模型训练与工业质检场景验证。压缩包共2000个文件&#xff0c;含1598张标注图像&am…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬