[大模型架构] LangGraph AI 工作流编排(15)

一、LangGraph 核心概念拆解(理解工作流的 “骨架”)

视频首先系统讲解 LangGraph 的核心组件与设计思想,避免开发者因概念模糊导致后续开发踩坑,核心围绕 “状态(State)、节点(Node)、边(Edge)、图(Graph)” 四大核心要素展开:

(一)核心组件定义与作用
组件定义与核心作用关键特性
状态(State)工作流数据流转的 “载体”,存储工作流执行过程中的所有数据(输入、中间结果、配置参数)1. 基于类 / 数据结构定义,支持任意字段扩展;2. 节点间通过修改 State 传递数据;3. 支持状态持久化与回溯
节点(Node)工作流的 “执行单元”,封装具体业务逻辑(如数据处理、模型调用、工具调用)1. 输入输出均为 State 实例;2. 支持同步 / 异步函数;3. 可复用、可组合,支持自定义节点与内置节点
边(Edge)节点间的 “连接关系”,定义数据流转路径(如 “节点 A 执行完成→节点 B”)1. 分为 “普通边”(固定流转)与 “条件边”(动态流转);2. 支持单节点→多节点、多节点→单节点连接
图(Graph)工作流的 “容器”,整合 State、Node、Edge,形成完整的执行逻辑1. 需指定 “入口节点”(Entry Point)与 “结束节点”(Finish Point);2. 编译后生成可执行的 App 实例
(二)核心设计思想:“状态驱动的有向图”
  1. 状态驱动:所有节点的执行逻辑围绕 State 展开,节点通过读取 State 中的数据进行计算,执行完成后修改 State 并传递给下一个节点,确保数据流转的一致性;
  2. 有向图结构:工作流的执行路径由 Edge 明确定义,支持线性、分支、循环等复杂结构,可视化程度高,便于理解与调试;
  3. 可扩展性:组件化设计允许灵活新增 Node、Edge,或扩展 State 字段,适配不同业务场景。
二、线性工作流开发实操(入门必学)

视频以 “文本处理工作流” 为例,演示线性工作流(无分支、无循环,节点按固定顺序执行)的完整开发流程,步骤清晰可复刻:

(一)开发步骤:从定义到执行
  1. 步骤 1:定义 State(数据载体)

    • 基于 LangGraph 的State类,定义工作流所需的所有数据字段,示例:

      python

      运行

      from langgraph.graph import State from typing import Optional class TextProcessState(State): # 输入数据 raw_text: str # 原始文本(必填) # 中间结果 cleaned_text: Optional[str] = None # 清洗后的文本(可选,默认None) summarized_text: Optional[str] = None # 摘要文本(可选,默认None) # 配置参数 summary_length: int = 50 # 摘要长度(默认50字)
    • 关键说明:字段需明确类型注解,可选字段设置默认值,确保数据类型一致性。
  2. 步骤 2:编写 Node 函数(执行单元)

    • 每个 Node 函数接收State实例作为输入,修改后返回新的State,示例实现两个节点(文本清洗、文本摘要):

      python

      运行

      # 节点1:文本清洗(去除空格、特殊字符) def clean_text_node(state: TextProcessState) -> TextProcessState: # 读取State中的原始文本 raw_text = state.raw_text # 执行清洗逻辑 cleaned = raw_text.strip().replace("\n", " ").replace(" ", " ") # 修改State并返回 state.cleaned_text = cleaned return state # 节点2:文本摘要(基于简单规则生成摘要) def summarize_text_node(state: TextProcessState) -> TextProcessState: # 读取State中的清洗后文本与配置参数 cleaned_text = state.cleaned_text summary_length = state.summary_length # 执行摘要逻辑(实际场景可替换为LLM调用) if len(cleaned_text) <= summary_length: summary = cleaned_text else: summary = cleaned_text[:summary_length] + "..." # 修改State并返回 state.summarized_text = summary return state
    • 关键说明:Node 函数必须返回State实例,不可直接返回原始数据;逻辑需围绕 State 中的字段展开。
  3. 步骤 3:构建 Graph(整合节点与边)

    • 创建 Graph 实例,添加节点并定义流转顺序(线性:入口→清洗节点→摘要节点→结束):

      python

      运行

      from langgraph import Graph # 1. 创建Graph实例(指定State类型) graph = Graph(TextProcessState) # 2. 添加节点(参数:节点ID,节点函数) graph.add_node("clean_text", clean_text_node) graph.add_node("summarize_text", summarize_text_node) # 3. 定义边(固定流转顺序) graph.add_edge("clean_text", "summarize_text") # 清洗节点→摘要节点 # 4. 指定入口与结束节点 graph.set_entry_point("clean_text") # 入口:清洗节点 graph.set_finish_point("summarize_text") # 结束:摘要节点
  4. 步骤 4:编译与执行工作流

    • 将 Graph 编译为可执行的 App 实例,传入初始 State 执行,获取结果:

      python

      运行

      # 1. 编译Graph app = graph.compile() # 2. 定义初始State(仅传入必填字段) initial_state = TextProcessState( raw_text=" 这是一段需要处理的原始文本,包含多余的空格和换行符。\n\n 下面是第二段内容,我们需要对其进行清洗和摘要生成。 ", summary_length=80 # 自定义摘要长度(覆盖默认值) ) # 3. 执行工作流(invoke方法接收初始State,返回最终State) final_state = app.invoke(initial_state) # 4. 查看结果 print("清洗后文本:", final_state.cleaned_text) print("生成摘要:", final_state.summarized_text)
  5. 步骤 5:执行结果验证

    • 预期输出:

      plaintext

      清洗后文本: 这是一段需要处理的原始文本,包含多余的空格和换行符。 下面是第二段内容,我们需要对其进行清洗和摘要生成。 生成摘要: 这是一段需要处理的原始文本,包含多余的空格和换行符。 下面是第二段内容,我们需要对其进行清洗和摘要生成。...
(二)关键注意事项
  1. 节点函数必须接收并返回State实例,不可遗漏;
  2. 边的连接必须存在对应的节点(避免节点 ID 拼写错误);
  3. 初始 State 需包含所有必填字段,可选字段可按需覆盖默认值。
三、分支工作流开发实操(进阶入门)

视频在 linear 工作流基础上,扩展至分支工作流(根据 State 中的数据动态选择执行路径),以 “数据类型判断工作流” 为例,演示条件边的使用:

(一)核心新增组件:条件边(ConditionalEdge)
  1. 作用:根据 State 中的数据,动态选择下一个执行节点,实现 “一进多出” 的分支逻辑;
  2. 核心依赖:需定义 “分支判断函数”,输入 State,返回目标节点 ID。
(二)开发步骤:分支工作流实现
  1. 步骤 1:扩展 State(增加分支判断字段)

    python

    运行

    class DataProcessState(State): data: str # 输入数据 data_type: Optional[str] = None # 数据类型(text/image/other) result: Optional[str] = None # 处理结果
  2. 步骤 2:编写分支判断函数

    python

    运行

    def route_by_data_type(state: DataProcessState) -> str: """根据数据类型选择下一个节点""" data = state.data # 简单判断数据类型(实际场景可替换为更复杂的识别逻辑) if data.startswith("text:"): state.data_type = "text" return "process_text" # 文本处理节点ID elif data.startswith("image:"): state.data_type = "image" return "process_image" # 图像处理节点ID else: state.data_type = "other" return "process_other" # 其他类型处理节点ID
  3. 步骤 3:编写分支节点函数

    python

    运行

    # 文本处理节点 def process_text_node(state: DataProcessState) -> DataProcessState: state.result = f"文本处理完成:{state.data[5:]}" # 截取"text:"后的内容 return state # 图像处理节点 def process_image_node(state: DataProcessState) -> DataProcessState: state.result = f"图像处理完成:{state.data[6:]}" # 截取"image:"后的内容 return state # 其他类型处理节点 def process_other_node(state: DataProcessState) -> DataProcessState: state.result = f"其他类型数据处理完成:{state.data}" return state
  4. 步骤 4:构建分支 Graph

    python

    运行

    graph = Graph(DataProcessState) # 添加所有节点 graph.add_node("route", route_by_data_type) # 分支判断节点(可选,也可直接用条件边) graph.add_node("process_text", process_text_node) graph.add_node("process_image", process_image_node) graph.add_node("process_other", process_other_node) # 定义条件边(入口→分支判断→目标节点) graph.add_conditional_edges( source="route", # 源节点ID(分支判断节点) condition=route_by_data_type, # 分支判断函数 # 映射:判断函数返回值→目标节点ID mapping={ "process_text": "process_text", "process_image": "process_image", "process_other": "process_other" } ) # 指定入口节点(分支判断节点) graph.set_entry_point("route") # 所有分支共享同一个结束节点(可选,也可分别设置) graph.set_finish_point("process_text") graph.set_finish_point("process_image") graph.set_finish_point("process_other")
  5. 步骤 5:执行与验证

    python

    运行

    app = graph.compile() # 测试文本类型数据 text_state = DataProcessState(data="text:这是一段文本数据") text_result = app.invoke(text_state) print(text_result.result) # 预期输出:文本处理完成:这是一段文本数据 # 测试图像类型数据 image_state = DataProcessState(data="image:这是一张图片的路径") image_result = app.invoke(image_state) print(image_result.result) # 预期输出:图像处理完成:这是一张图片的路径
四、调试与优化技巧(提升开发效率)

视频针对 LangGraph 开发中的调试痛点,提供了 3 个核心技巧:

(一)日志输出与状态查看
  1. 启用详细日志:通过logging模块输出节点执行顺序、State 变化,便于定位问题:

    python

    运行

    import logging logging.basicConfig(level=logging.INFO) # 输出INFO级别日志
    • 执行后会打印节点执行日志(如 “Entering node 'clean_text'”“Exiting node 'clean_text'”)。
  2. 中间状态查看:在节点函数中添加print语句,实时查看 State 的变化:

    python

    运行

    def clean_text_node(state: TextProcessState) -> TextProcessState: print("清洗前State:", state.raw_text) # 清洗逻辑... print("清洗后State:", state.cleaned_text) return state
(二)节点执行耗时分析
  1. 添加耗时统计:在节点函数中记录执行时间,识别低效节点:

    python

    运行

    import time def summarize_text_node(state: TextProcessState) -> TextProcessState: start_time = time.time() # 摘要逻辑... end_time = time.time() print(f"摘要节点执行耗时:{end_time - start_time:.2f}s") return state
(三)错误处理与容错
  1. 节点内异常捕获:在节点函数中添加try-except,避免单个节点报错导致整个工作流中断:

    python

    运行

    def process_image_node(state: DataProcessState) -> DataProcessState: try: # 图像处理逻辑... state.result = f"图像处理完成:{state.data[6:]}" except Exception as e: state.result = f"图像处理失败:{str(e)}" return state
五、常见问题与避坑指南
问题现象核心原因解决方案
节点函数执行后 State 字段未更新忘记修改 State 或未返回 State 实例确保节点函数中修改 State 字段后,返回该实例(return state
条件边分支判断失效判断函数返回值与mapping中的键不匹配检查返回值类型(需为字符串)与键名一致性,避免拼写错误
工作流执行提示 “节点 ID 不存在”添加边时使用了未定义的节点 ID确保add_edge/add_conditional_edges中的节点 ID 已通过add_node注册
状态字段类型错误初始 State 传入的字段类型与定义不一致严格按照 State 类的类型注解传入数据(如raw_text需为字符串)
异步节点执行卡顿未使用异步函数或未等待异步操作异步节点需定义为async def,并在执行时使用await app.ainvoke()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1155762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开题答辩全过程】以 基于Java的健身俱乐部管理系统的设计与开发为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

【大数据毕设推荐】基于Spark的大学排名数据可视化系统,Python+Hadoop技术栈详解 毕业设计 选题推荐 毕设选题 数据分析 机器学习

✍✍计算机毕设指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡有什么问题可以…

【开题答辩全过程】以 基于Web技术的知识付费平台为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

深度解读.NET中ConcurrentDictionary:高效线程安全字典的原理与应用

深度解读.NET中ConcurrentDictionary&#xff1a;高效线程安全字典的原理与应用 在多线程编程场景下&#xff0c;数据的并发访问控制是确保程序正确性和性能的关键。.NET中的ConcurrentDictionary提供了一种线程安全的字典实现&#xff0c;允许在多个线程同时访问和修改字典时&…

在外如何用手机像翻相册一样查看其他设备里所有文件?

在外急需调取家里NAS、电脑的资料&#xff1f;别再折腾U盘和复杂的远程设置了。今天就教你用节点小宝&#xff0c;像翻看自己手机相册一样&#xff0c;随时随地、直观地访问你所有设备里的文件。一把钥匙 打开所有设备的“文件抽屉”节点小宝的“远程文件”功能就是一把钥匙。它…

智能电商客服:AI工具驱动的服务价值链重构与行业突围

一、行业核心矛盾&#xff1a;全渠道割裂与价值创造乏力的双重瓶颈当前电商服务场景已呈现“多触点、碎片化、高并发”特征&#xff0c;传统客服模式难以适配行业发展需求。一方面&#xff0c;消费者分散于抖音、小红书、电商平台等多渠道&#xff0c;人工客服需频繁切换操作界…

C++跨平台开发的核心挑战平台差异性处理操作系统AP

C跨平台开发的核心挑战平台差异性处理 硬件架构差异&#xff08;x86/ARM&#xff09;、操作系统API&#xff08;Windows/Linux/macOS&#xff09;、编译器行为&#xff08;GCC/Clang/MSVC&#xff09;带来的兼容性问题。需要抽象系统调用&#xff0c;处理字节序、内存对齐等底层…

Linux网络编程-UDP 广播原理与实战

一、UDP 广播核心概念 UDP 广播是指一台主机向所在子网&#xff08;同一局域网&#xff09;内的所有主机发送数据的通信方式&#xff0c;是 UDP 无连接特性的典型应用场景。 1.1 广播地址分类 类型格式 / 示例特点受限广播地址255.255.255.255① 不会被路由器转发&#xff1…

从机械傀儡到具身智能:机器人控制模型的演变实录

大众往往容易被波士顿动力早期的机器人视频误导&#xff0c;认为机器人技术的进步主要源于液压系统或机械结构的优化。这种观点忽略了问题的本质。机器人进化的核心始终在于控制算法的迭代&#xff0c;即“大脑”的处理逻辑如何从简单的指令执行转变为对物理世界的复杂理解。 确…

Java性能优化实战技术文章大纲性能优化的基本原则

Java性能优化实战技术文章大纲性能优化的基本原则理解性能优化的核心目标&#xff1a;减少资源消耗、提高响应速度、增强系统稳定性 避免过度优化&#xff0c;基于实际业务场景和数据驱动决策 采用可量化的指标评估优化效果&#xff08;如TPS、RT、GC频率等&#xff09;JVM层优…

基于STM3251单片机的草坪培育智能控制系统设计(程序源码+实物+原理图+PCB+论文+答辩稿)

博主介绍 &#x1f497;CSDN从事毕设辅导第一人&#xff0c;本着诚信、靠谱、质量在业界获得优秀口碑&#xff0c;在此非常希望和行业内的前辈交流学习&#xff0c;欢迎成考学历咨询老师、大学老师前来合作交流&#x1f497; 我们可以做什么&#xff1f; &#x1f31f;拥有的…

Linux网络编程-UDP 组播原理与实战

一、UDP 组播核心概念UDP 通信有三种典型模式&#xff0c;组播是单播和广播的中间形态&#xff0c;能精准向指定一组主机通信&#xff0c;大幅节省网络带宽&#xff1a;通信模式特点适用场景单播一对一&#xff08;两台主机端对端通信&#xff09;精准的点对点数据传输&#xf…

深入解析 VPC:云端网络架构的核心基石

在云计算的世界里&#xff0c;VPC&#xff08;Virtual Private Cloud&#xff0c;虚拟私有云&#xff09;并非一个单纯的技术术语&#xff0c;它是构建安全、可靠云基础设施的根本前提。许多初学者在接触云服务时&#xff0c;往往直接跳过网络配置去启动虚拟机或数据库&#xf…

基于STM3251单片机的多功能垃圾桶控制系统(程序源码+实物+原理图+PCB+论文+答辩稿)

博主介绍 &#x1f497;CSDN从事毕设辅导第一人&#xff0c;本着诚信、靠谱、质量在业界获得优秀口碑&#xff0c;在此非常希望和行业内的前辈交流学习&#xff0c;欢迎成考学历咨询老师、大学老师前来合作交流&#x1f497; 我们可以做什么&#xff1f; &#x1f31f;拥有的…

Linux命令创意组合大赛技术文章大纲组合的灵活性和强大功能

Linux命令创意组合大赛技术文章大纲引言介绍Linux命令组合的灵活性和强大功能创意组合大赛的目的和意义激发开发者探索命令行工具的潜力比赛规则与评判标准参赛作品需基于常见Linux命令组合需解决实际问题或展示创新思维评判标准&#xff1a;实用性、创意性、效率提升经典命令组…

基于STM3251单片机的两轮平衡车设计(程序源码+实物+原理图+PCB+论文+答辩稿)

博主介绍 &#x1f497;CSDN从事毕设辅导第一人&#xff0c;本着诚信、靠谱、质量在业界获得优秀口碑&#xff0c;在此非常希望和行业内的前辈交流学习&#xff0c;欢迎成考学历咨询老师、大学老师前来合作交流&#x1f497; 我们可以做什么&#xff1f; &#x1f31f;拥有的…

基于AI的智能化学术写作流程,7个平台集成格式规范验证与LaTeX模板库功能

工具快速对比排名&#xff08;前7推荐&#xff09; 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达、维普 askpaper AIGC率个位数优化 ~20分钟 高校检测规则通…

SecurityBridge宣布首席执行官更迭,以加速全球扩张

领先的SAP网络安全解决方案供应商SecurityBridge今日宣布任命Jesper Zerlang为首席执行官&#xff0c;2026年1月1日起生效。Zerlang此前担任董事会主席一职&#xff0c;任期12个月。此次任命正值公司进入下一阶段全球扩张之际&#xff0c;BU Bregal Unternehmerkapital (BU) 将…

超越想象:揭秘外星飞碟的“零质量”飞行与时空操控技术

超越想象&#xff1a;揭秘外星飞碟的“零质量”飞行与时空操控技术 在众多关于不明飞行物&#xff08;UFO&#xff09;的目击报告中&#xff0c;碟形飞行器总是最引人注目。它们能悬停、直角转弯、瞬间加速&#xff0c;甚至凭空消失&#xff0c;这些特性挑战着人类现有的物理认…

子数列求积【牛客tracker 每日一题】

子数列求积 时间限制&#xff1a;1秒 空间限制&#xff1a;256M 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取相应奖品&#xff01;助力每日有…