LangGraph快速入门与底层原理剖析
LangGraph以图的方式构建语言代理官方文档地址https://langchain-ai.github.io/langgraph/LangGraph 是一个用于构建具有 LLMs 的有状态、多角色应用程序的库用于创建代理和多代理工作流。与其他 LLM 框架相比它提供了以下核心优势循环、可控性和持久性。LangGraph 允许您定义涉及循环的流程这对于大多数代理架构至关重要。作为一种非常底层的框架它提供了对应用程序的流程和状态的精细控制这对创建可靠的代理至关重要。此外LangGraph 包含内置的持久性可以实现高级的“人机交互”和内存功能。LangGraph 是 LangChain 的高级库为大型语言模型LLM带来循环计算能力。它超越了 LangChain 的线性工作流通过循环支持复杂的任务处理。状态维护计算过程中的上下文实现基于累积数据的动态决策。节点代表计算步骤执行特定任务可定制以适应不同工作流。边连接节点定义计算流程支持条件逻辑实现复杂工作流主要功能循环和分支在您的应用程序中实现循环和条件语句。持久性在图中的每个步骤之后自动保存状态。在任何时候暂停和恢复图执行以支持错误恢复、“人机交互”工作流、时间旅行等等。“人机交互”中断图执行以批准或编辑代理计划的下一个动作。流支持在每个节点产生输出时流式传输输出包括令牌流式传输。与 LangChain 集成LangGraph 与LangChain和Langsmith无缝集成但不需要它们。安装pipinstall-Ulanggraph示例LangGraph 的一个核心概念是状态。每次图执行都会创建一个状态该状态在图中的节点执行时传递每个节点在执行后使用其返回值更新此内部状态。图更新其内部状态的方式由所选图类型或自定义函数定义。让我们看一个可以使用搜索工具的简单代理示例。langgraph_hello.pyfromtypingimportLiteralfromlangchain_core.messagesimportHumanMessagefromlangchain_core.toolsimporttoolfromlangchain_deepseekimportChatDeepSeek# 导入langgraph检查点用于持久化状态fromlanggraph.checkpoint.memoryimportMemorySaver# 导入状态图和状态fromlanggraph.graphimportEND,StateGraph,MessagesState# 导入工具节点普通节点调用函数、工具节点调用工具fromlanggraph.prebuiltimportToolNode# 定义工具函数用于代理调用外部工具tooldefsearch(query:str):模拟一个搜索工具if上海inquery.lower()orShanghaiinquery.lower():return现在30度有雾return现在是30度阳光明媚。# 将工具函数放入工具列表tools[search]# 创建工具节点tool_nodeToolNode(tools)# 1. 初始化模型和工具定义并绑定工具到模型modelChatDeepSeek(modeldeepseek-chat,temperature0).bind_tools(tools)# 定义函数决定是否继续执行# 路由函数# 它不是业务计算节点而是决定下一跳的条件判断器defshould_continue(state:MessagesState)-Literal[tools,END]:messagesstate[messages]last_messagemessages[-1]# 如果llm调用了工具则转到tools节点# last_message.tool_calls: 有值说明模型这轮不是直接回答而是发起工具调用意图# 无值说明模型已经给出最终自然语言答复iflast_message.tool_calls:returntools# 否则停止回复用户returnEND# 定义调用模型的函数defcall_model(state:MessagesState):messagesstate[messages]responsemodel.invoke(messages)# 返回列表因为这将被添加到现有列表中return{messages:[response]}# 2. 用状态初始化图定义一个新的状态图# MessagesState是一个预构建的状态模式它具有一个属性一个LangChain对象列表以及将每个节点的更新合并到状态中的逻辑workflowStateGraph(MessagesState)# 3. 定义图节点定义我们将循环的两个节点workflow.add_node(agent,call_model)# agent节点负责决定采取什么如果有行动workflow.add_node(tools,tool_node)# 调用工具的tools节点如果代理决定采取行动此节点将执行该行动# 4. 定义入口点和图边# 设置入口点为agent# 这意味着这是第一个被调用的节点workflow.set_entry_point(agent)# 添加条件边# 条件边调用代理后我们应该要么如果代理说要采用行动则运行工具如果代理没有要求运行工具则完成回复用户·workflow.add_conditional_edges(# 首先定义起始节点。我们使用agent# 这意味着这些边是在调用agent节点后采取的agent,# 接下来传递决定下一个调用节点的函数should_continue,)# 添加从tools到agent的普通边# 这意味着在调用tools后接下来调用agent节点# 普通边调用工具后图应该始终返回到代理以决定下一步操作workflow.add_edge(tools,agent)# 初始化内存以在图运行之间持久化状态checkpointerMemorySaver()# 可以存Redis、Mongodb# 5. 编译图# 这将其编译成一个LangChain可运行对象# 这意味着你可以像使用其他可运行对象一样使用它# 注意我们可选的在编译图时传递内存# 编译图将图转换为可运行对象这会自动启动使用您的输入调用.invoke()、.stream()、.batch()方法# 传递检查点对象在图运行之间持久化状态并启用内存、人机交互工作流、时间旅行等等本例中使用MemorySaver将状态存储在内存中appworkflow.compile(checkpointercheckpointer)# 6. 执行图使用可运行对象final_stateapp.invoke({messages:[HumanMessage(content北京的天气怎么样)]},config{configurable:{thread_id:42}})# 从 final_state 中获取最后一条消息的内容resultfinal_state[messages][-1].contentprint(result)print(*100)final_stateapp.invoke({messages:[HumanMessage(content我问的哪个城市)]},config{configurable:{thread_id:41}})resultfinal_state[messages][-1].contentprint(result)逐步分解1. 初始化模型和工具我们使用 ChatDeepSeek 作为我们的 LLM。注意我们需要确保模型知道可以使用哪些工具。我们可以通过将 LangChain 工具转换为 ChatDeepSeek 工具调用格式来完成此操作方法是使用 .bind_tools() 方法。我们定义要使用的工具——在本例中是搜索工具。创建自己的工具非常容易——请参阅此处的文档了解如何操作2. 用状态初始化图我们通过传递状态模式在本例中为MessagesState来初始化图StateGraphMessagesState 是一个预构建的状态模式它具有一个属性一个 LangChain Message 对象列表以及将每个节点的更新合并到状态中的逻辑。3. 定义图节点我们需要两个主要节点agent节点负责决定采取什么如果有行动。调用工具的 tools 节点如果代理决定采取行动此节点将执行该行动。4. 定义入口点和图边首先我们需要设置图执行的入口点——agent节点。然后我们定义一个普通边和一个条件边。条件边意味着目的地取决于图状态MessageState的内容。在本例中目的地在代理LLM决定之前是未知的。条件边调用代理后我们应该要么a. 如果代理说要采取行动则运行工具b. 如果代理没有要求运行工具则完成回复用户。普通边调用工具后图应该始终返回到代理以决定下一步操作。5. 编译图当我们编译图时我们将其转换为 LangChain Runnable这会自动启用使用您的输入调用 .invoke()、.stream()和.batch()。我们还可以选择传递检查点对象以在图运行之间持久化状态并启用内存、“人机交互”工作流、时间旅行等等。在本例中我们使用MemorySaver——一个简单的内存中检查点。6. 执行图LangGraph 将输入消息添加到内部状态然后将状态传递给入口点节点agentagent节点执行调用聊天模型。聊天模型返回AIMessage。LangGraph 将其添加到状态中。图循环以下步骤直到AIMessage上不再有tool_calls。如果AIMessage具有tool_calls则tools节点执行agent节点再次执行并返回AIMessage执行进度到特殊的 END 值并输出最终状态。因此我们得到所有聊天消息的列表作为输出。总结循环逻辑agent-router-tools-agent…循环直到某次返回END表示图完成真实场景should_continue常会更复杂比如限制最大工具调用轮数防死循环根据工具错误状态决定重试/降级按tool_name分流到不同子图引入人工审批human-in-the-loop在决定是否继续

相关新闻

如何在Apple Silicon Mac上轻松运行Windows应用:Whisky终极指南

如何在Apple Silicon Mac上轻松运行Windows应用:Whisky终极指南

如何在Apple Silicon Mac上轻松运行Windows应用:Whisky终极指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 想在Apple Silicon Mac上无缝运行Windows软件和游戏吗&am…

2026/7/5 4:51:39阅读更多 →
终极NBT编辑指南:3分钟掌握Minecraft数据修改秘籍

终极NBT编辑指南:3分钟掌握Minecraft数据修改秘籍

终极NBT编辑指南:3分钟掌握Minecraft数据修改秘籍 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 你是否曾因《我的世界》游戏存档损坏而束手无策&…

2026/7/5 4:51:39阅读更多 →
3分钟掌握PyInstaller打包文件提取:新手终极指南 [特殊字符]

3分钟掌握PyInstaller打包文件提取:新手终极指南 [特殊字符]

3分钟掌握PyInstaller打包文件提取:新手终极指南 🚀 【免费下载链接】pyinstxtractor PyInstaller Extractor 项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor 你是否曾面对一个PyInstaller打包的EXE文件,却无法查看其中…

2026/7/5 4:51:39阅读更多 →
AAA小学期第五周学习笔记

AAA小学期第五周学习笔记

完成了发射端pcb的绘制,并下单

2026/7/5 6:01:43阅读更多 →
如何在3分钟内配置专业级DeepL翻译浏览器扩展

如何在3分钟内配置专业级DeepL翻译浏览器扩展

如何在3分钟内配置专业级DeepL翻译浏览器扩展 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 还在为语言障碍而烦恼吗?想要像阅读母语一样轻松浏览外文…

2026/7/5 6:01:43阅读更多 →
AI For Everyone 课程 2024 版:非技术视角的 4 周 AI 项目实战路线图

AI For Everyone 课程 2024 版:非技术视角的 4 周 AI 项目实战路线图

AI For Everyone 课程 2024 版:非技术视角的 4 周 AI 项目实战路线图当零售业高管Sarah第一次听到董事会要求"全员拥抱AI"时,她盯着满屏的技术术语感到无所适从。这正是《AI For Everyone》课程要解决的核心痛点——在不需要理解神经网络架构的…

2026/7/5 6:01:43阅读更多 →
DeepL Chrome翻译插件:5分钟掌握专业级网页翻译工具

DeepL Chrome翻译插件:5分钟掌握专业级网页翻译工具

DeepL Chrome翻译插件:5分钟掌握专业级网页翻译工具 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 还在为阅读外文网页而烦恼吗?DeepL Chr…

2026/7/5 6:01:43阅读更多 →
Adobe-GenP 3.0完全指南:三步解锁Adobe全家桶专业功能

Adobe-GenP 3.0完全指南:三步解锁Adobe全家桶专业功能

Adobe-GenP 3.0完全指南:三步解锁Adobe全家桶专业功能 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 对于众多创意工作者来说,Adobe Creati…

2026/7/5 6:01:43阅读更多 →
错题本为什么常常没有效果

错题本为什么常常没有效果

很多孩子都有错题本,但真正因为错题本明显改善学习质量的并不多。原因很简单:很多错题本只是把错题抄了一遍,或者把答案改对了,并没有真正修复错因。孩子今天把这道题改会了,下次换一个条件、换一个问法,还…

2026/7/5 5:56:43阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/5 3:48:10阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/5 3:48:09阅读更多 →