langchain 快速入门(五):Langgraph应用,执行流程由线转图
简介Langgraph是langchain框架提供的一个组件langgraph能够解决AI执行流程中迭代、循环或者根据结果返回上一步与之前讲的chain链相比能够实现更加复杂的AI执行流。langgraph从chain转到langgraph从数学的角度上来讲执行流从线性流程转到了流程图。langgraph的组成主要有三部分Langgraph节点边状态节点一个节点就是一个执行单元相当于一次函数的调用。可以是一次模型的调用一次搜索一次加密等等边边能够连接一个个节点它决定了下一个应该去到哪个节点执行状态实现数据共享是实现AI短期记忆的灵魂乍一看好像有些云里雾里的我打个比方玩家状态在玩一个大富翁每个节点和边组成地图玩家初始资金数据有1000块钱玩家每走一格可能会发生一些事件比如说后退一步被小偷偷300块钱买房子等等这些事件相当于节点走的方向相当于边最后玩家成功走到了终点END你可以得知玩家状态最后还有多少钱有多少资产。下面用一个示例来演示。改造RAG知识库示例这个是之前文章中构建知识库的相关代码本次用langgraph改造流程/* by 01130.hk - online tools website : 01130.hk/zh/htaccess2nginx.html */ import os import operator from typing import TypedDict, Annotated from langchain_community.chat_models.tongyi import ChatTongyi from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import FAISS from langchain_core.messages import ToolMessage from langchain_core.tools import tool from langchain_core.messages import HumanMessage, ToolMessage, BaseMessage from langchain_core.documents import Document from langchain_text_splitters import RecursiveCharacterTextSplitter from langgraph.graph import StateGraph, END from langgraph.prebuilt.tool_node import ToolNode os.environ[DASHSCOPE_API_KEY] sk-b07b9caab2144ff096002f81cb70b0af tool def calculator(expression: str) - str: 计算数学表达式。需要精确计算时使用。 参数: expression: 数学算式如 2 2 或 500 * 0.8。 返回: str: 计算结果如 4.0 或 400.0。 print(f[️ 工具调用] 计算器正在计算: {expression}) try: return str(eval(expression)) except Exception as e: return f计算错误: {e} tool def rag_search(query: str) - str: 从数据库中搜索与查询公司内部相关的文档包括公司计划名代号截止日期等详细信息。 参数: query (str): 要搜索的查询字符串。 返回: str: 与查询相关的文档内容。 # 从RAG数据库中检索文档 raw_text 【公司内部机密代号“深蓝计划”】 1. 项目目标开发一款能听懂猫语的翻译器。 2. 核心技术基于Transformer的“喵声波”分析算法。 3. 团队暗号如果有人问“今天天气怎么样”必须回答“我想吃鱼”。 4. 截止日期2026年12月31日。 5. 经费预算仅剩50元人民币主要用于购买猫条。 RAG_PATH faiss_index docs [Document(page_contentraw_text)] text_splitter RecursiveCharacterTextSplitter(chunk_size25, chunk_overlap5) split_docs text_splitter.split_documents(docs) embeddings DashScopeEmbeddings(modeltext-embedding-v1) if os.path.exists(RAG_PATH): print(公司内部数据库已存在) ragdb FAISS.load_local(RAG_PATH, embeddings, allow_dangerous_deserializationTrue) else: print(创建公司内部数据库) ragdb FAISS.from_documents(split_docs, embeddings) ragdb.save_local(RAG_PATH) return \n\n.join(doc.page_content for doc in ragdb.similarity_search(query, k2)) #构造agent流程图 def Init_Agent(): #初始化模型 tool_maps{ rag_search: rag_search, calculator: calculator } llm ChatTongyi(model_nameqwen-plus) tool_llm llm.bind_tools(toolslist(tool_maps.values())) #创建state class TaskState(TypedDict): messages: Annotated[list[BaseMessage], operator.add] #创建node def agent_node(state: TaskState): 节点思考 (Think) 接收当前状态调用 LLM返回新消息 messages state[messages] response tool_llm.invoke(messages) return {messages: [response]} #定义边 def condition_tools(state: TaskState): 节点工具 (Tool) 接收当前状态调用工具返回新消息 messages state[messages][-1] if messages.tool_calls: return tool_node else: return END #添加边 workflow StateGraph(TaskState) workflow.add_node(agent_node, agent_node) workflow.add_node(tool_node, ToolNode(tool_maps.values())) workflow.add_conditional_edges(agent_node, condition_tools, { tool_node: tool_node, END: END }) workflow.add_edge(tool_node, agent_node) workflow.set_entry_point(agent_node) return workflow.compile() if __name__ __main__: app Init_Agent() input 公司的经费预算是多少如果预算预算提高46%后多少 for event in app.stream({messages: [HumanMessage(contentinput)]}): for key, value in event.items(): print(f\n[{key}]) print(value[messages][-1].content)代码解释本次代码中重点讲langgraph的构建对于其他的细节请看前面文章。代码流程如下初始化工具集-定义状态定义条件边节点-构建节点-连接边-构建图-运行图初始化工具集这个前面文章有就不废话了。定义状态定义条件边节点状态/* by 01130.hk - online tools website : 01130.hk/zh/htaccess2nginx.html */ #创建state class TaskState(TypedDict): messages: Annotated[list[BaseMessage], operator.add]状态是TypedDict的子类字典。上面的BaseMessage是ToolMessage,AIMessage,HumanMessage等的父类这个list主要用于存放每个节点的历史消息短期记忆Annotated[..., operator.add]表示追加将节点返回的消息追加到后面而不是覆盖。格式如下可以创建多个自定义字段class StateName(TypedDict): fieldName: fieldType条件边def condition_tools(state: TaskState): 节点工具 (Tool) 接收当前状态调用工具返回新消息 messages state[messages][-1] if messages.tool_calls: return tool_node else: return END返回值END和tool_node表示定义的节点名称END默认是结束节点格式如下def EdgeName(state: StateClass) return NextNode节点tool def calculator(expression: str) - str: ...... tool def rag_search(query: str) - str: ...... def agent_node(state: TaskState): ......节点可以是工具函数也可以是普通函数普通函数需要用state传入构建节点workflow StateGraph(TaskState) workflow.add_node(agent_node, agent_node) workflow.add_node(tool_node, ToolNode(tool_maps.values()))StateGraph(TaskState)初始化图将刚刚创建的状态传入add_node方法是创建节点tool_node节点名称自定义用于标识节点agent_node创建的节点函数ToolNode是langchain提供的创建工具节点的函数帮我们完成了调用工具集更新状态的全过程不用这个需要我们自己手动创建工具循环节点比较麻烦参考之前文章连接边workflow.add_conditional_edges(agent_node, condition_tools, { tool_node: tool_node, END: END }) workflow.add_edge(tool_node, agent_node)add_conditional_edges创建条件边方法分支根据返回内容决定节点走向add_edge固定走向如上tool_node-agent_node构建图workflow.set_entry_point(agent_node) workflow.compile()set_entry_point确定图的入口compile构建图运行图if __name__ __main__: app Init_Agent() input 公司的经费预算是多少如果预算预算提高46%后多少 for event in app.stream({messages: [HumanMessage(contentinput)]}): for key, value in event.items(): print(f\n[{key}]) print(value[messages][-1].content)运行跟之前运行普通模型一样stream方法会返回每个节点中的状态上面定义的类invoke方法直接返回最终状态langgraph是实现多Agent协作的核心下一篇文章会讲如何多agent协作如果❤喜欢❤本系列教程就点个关注吧后续不定期更新~

相关新闻

2026必备!MBA必看!10款AI论文写作软件深度测评

2026必备!MBA必看!10款AI论文写作软件深度测评

2026必备!MBA必看!10款AI论文写作软件深度测评 2026年MBA论文写作工具测评:为什么你需要这份榜单 随着人工智能技术的不断进步,AI论文写作工具已经成为MBA学习与研究中不可或缺的辅助工具。然而,面对市场上琳琅满目的产…

2026/7/5 18:58:56 阅读更多 →
每天一个网络知识:什么是虚拟可扩展局域网 VXLAN?

每天一个网络知识:什么是虚拟可扩展局域网 VXLAN?

在传统的计算机网络中,我们常常使用**局域网(LAN)**来连接同一个办公区、机房或实验室内的设备。局域网中最常见的技术是 VLAN(虚拟局域网)。通过 VLAN,我们可以在同一台交换机或同一网络中,把不…

2026/7/3 19:07:25 阅读更多 →
WTAPI框架/微信个人号开发协议

WTAPI框架/微信个人号开发协议

在微信生态深度渗透社交与商业场景的今天,通过WTAPI框架快速搭建微信机器人已成为企业客户运营、用户触达的核心需求。以下基于主流技术方案与实操经验,整理微信机器人框架的接入指南与对接流程,并针对测试、消息收发、群管理等高频问题提供详…

2026/7/4 21:07:44 阅读更多 →

最新新闻

免费前端开发库认证终极指南:从零到专业的三步进阶法

免费前端开发库认证终极指南:从零到专业的三步进阶法

免费前端开发库认证终极指南:从零到专业的三步进阶法 【免费下载链接】freeCodeCamp freeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free. 项目地址: https://gitcode.com/GitHub_Trending/fr/free…

2026/7/7 0:47:42 阅读更多 →
结构化方法:自顶向下的“拆解术“

结构化方法:自顶向下的“拆解术“

结构化方法:自顶向下的"拆解术" 开篇:从拆快递中学到的智慧 你有没有这样的经历? 收到一个巨大的快递,打开一看,里面有无数个小包裹,每个小包裹里还有更小的包裹,层层嵌套。 这种"从大到小、层层分解"的方式,就是结构化方法的核心思想。 什么…

2026/7/7 0:43:41 阅读更多 →
并发编程核心概念辨析

并发编程核心概念辨析

一、背景:CPU 多级缓存架构为了读者在阅读后序章节时,有更清晰、更形象的认知,这里放上现代 CPU 缓存的典型结构。一图胜千言,不多赘述,仅陈述以下要点:一颗 CPU,往往有多个核心(cor…

2026/7/7 0:43:41 阅读更多 →
如何识别PARP14

如何识别PARP14

一、PARP14的基础概述聚腺苷二磷酸核糖聚合酶14(PARP14,Poly(ADP-ribose) polymerase 14),也被称为PARP-4,是PARP家族中的一个重要成员。PARP家族包括多个聚腺苷二磷酸核糖聚合酶,它们在细胞的多个关键过程…

2026/7/7 0:39:40 阅读更多 →
Java毕设选题推荐:基于 SpringBoot 的教学过程考核评价系统的设计与实现 基于 SpringBoot 的课程阶段性考核管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

Java毕设选题推荐:基于 SpringBoot 的教学过程考核评价系统的设计与实现 基于 SpringBoot 的课程阶段性考核管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/7 0:37:39 阅读更多 →
综合项目三:Web全栈应用从零部署

综合项目三:Web全栈应用从零部署

在当今的互联网时代,掌握全栈开发与部署能力是每一位后端开发者、DevOps 工程师乃至独立开发者的核心竞争力。然而,很多初学者在完成代码编写后,却在部署环节频频碰壁——服务器环境配置、域名解析、HTTPS 证书、负载均衡、日志监控……这些“最后一公里”的问题往往比写代码…

2026/7/7 0:35:38 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻