北京高端网站定制公司,四平市住房和畅想建设局网站,怎样在建设厅网站查询安全员证,外地人在海南注册公司对于刚入门大模型开发的程序员来说#xff0c;LangGraph 绝对是值得深耕的框架——它不是简单的工具封装#xff0c;而是一套能让你“编程式构建智能体”的强大体系。这篇文章作为 LangGraph1.0 系列的开篇#xff0c;会用最直观的方式拆解核心概念#xff0c;再通过完整代…对于刚入门大模型开发的程序员来说LangGraph 绝对是值得深耕的框架——它不是简单的工具封装而是一套能让你“编程式构建智能体”的强大体系。这篇文章作为 LangGraph1.0 系列的开篇会用最直观的方式拆解核心概念再通过完整代码带你吃透“状态、节点、边”这三大基石小白也能轻松跟上建议收藏慢慢练一、先搞懂LangGraph 为什么这么香LangGraph 的核心设计理念可以概括为它是专为智能体而生的“编程语言”。就像我们用 Python 写脚本时需要“变量、函数、流程控制”一样LangGraph 也提供了对应的抽象组件让你能用声明式的方式编排复杂的智能体工作流。很多人刚接触时会混淆这些概念这里直接用“编程语言类比表”帮你一次性理清楚编程语言核心要素LangGraph 对应概念大白话说明数据 (Data)状态 (State)工作流里“流转的信息包”所有节点都能读取和更新它函数 (Function)节点 (Node)干活的“小工人”接收状态后执行具体操作调模型/跑工具控制逻辑 (Control Flow)边 (Edge)节点间的“指挥棒”决定哪个节点先跑、哪个后跑支持分支和并行存储 (Storage)检查点/记忆 (Checkpointing)给状态“存个档”就算程序断了也能接着跑实现长期记忆中断 (Interrupt)人在回路 (Human-in-the-Loop)关键步骤“喊停”让人工审核后再继续避免智能体乱决策二、状态State和节点Node2.1 状态StateLangGraph是一个状态图状态可以理解为图的数据。在定义图之前首先应该定义一个状态作为初始值在图的更新过程中状态值是可以被图更新并返回给用户的。图本身是无状态的在定义图时首先要定义图将操作的状态。这个状态由图中的所有节点共享。状态通常是一个Python数据结构。定义状态的方式可以采用类型化字典。比如下面代码就定义了包含名为nList字符串列表的状态值。当图被调用时状态会被初始化LangGraph运行时会选择一个节点来执行然后它会提供当前状态运行节点最后更新状态再到结束。class State(TypedDict): nlist: List[str]2.2 节点在LangGraph中节点的本质是一个函数。节点函数的输入参数是状态输出则是对状态的更新。举例如下def node_a(state: State): ... return ({nlist:[note]})以上节点函数执行完成后会对字符串列表进行更新。State 可以被持久化通过 Checkpointing 机制。这意味着如果节点执行失败或工作流被中断可以从上一个检查点恢复状态重新运行保证了工作流的鲁棒性。2.3 使用LangGraph构建简单图下面笔者通过一个完整的代码示例将 State 和 Node 的概念串联起来构建一个最简单的单节点图。在开始之前请大家确保已经安装了langgraph相关环境。如未安装可以运行pip install -U langgraph命令。导入依赖库from langgraph.graph import START, END, StateGraph创建图表的第一步是定义一个State类类型是字典。它包含一个字符串类型的列表,状态可以是一个Python数据类也可以是一个Pydantic基类模型class State(TypedDict): nList: List[str]定义节点节点实际上就是Python函数该函数接收状态打印信息然后返回状态的更新。def node_a(state): print(fnoda_a接收到{state[nList]}) note Hello, 我是节点a return(State(nList[note]))编译状态图将节点加入到图中定义为a节点同时添加从START节点到a节点的边然后添加从a到END的边。这里的START和END都是LangGraph定义的常量节点仅包含语义信息。最后编译图。builder StateGraph(State) builder.add_node(a, node_a) builder.add_edge(START, a) builder.add_edge(a, END) graph builder.compile()以上代码构建了一个如下的简单图。接下来测试这个图首先使用State初始化一个状态变量然后通过.invoke方法运行图。可以看到节点A接收了初始状态然后当调用图完成后返回了更新后的状态。initial_state State( nList[Hello Node a, how are you?] ) print(graph.invoke(initial_state))通过以上案例大家应该可以理解在定义图和状态时图中所有节点可以共享相同的状态。三、边在定义了“数据”State和“操作”Node之后笔者接下来介绍边。边 (Edge)是 LangGraph 中定义工作流执行逻辑的核心。它决定了节点之间的连接关系与执行顺序是实现串行、并行、条件分支等复杂逻辑的关键。3.1 普通边普通边静态边用于连接两个节点指定了确定无误的执行顺序。它是最简单的控制流定义了工作流中“下一步该执行谁”。串行执行通过连续的普通边连接多个节点形成一个线性的执行链。例如START - A - B - C - END。并行执行一个节点可以同时拥有多个出边outgoing edges指向不同的后续节点。LangGraph 运行时会在当前节点完成后同时触发所有后续节点执行。3.2 条件边除普通边外LangGraph还有另一种条件边。条件边允许工作流根据运行时状态动态决定下一步的执行路径。它需要一个路由函数该函数接收当前状态并选择下一个要执行的节点。下图左侧根据条件选择将状态传递给下一级左侧节点进行处理。条件边还有一个特殊情况是MapReduce, 它可以创建可变数量的下游节点并且每个节点都传递了一个唯一值笔者之后也会讲到。3.3 Reducer详解当一个节点拥有多个出边即触发了并行执行时多个后续节点可能同时更新 State 中的同一个字段。此时就会产生冲突以谁的更新为准默认情况下节点的更新是覆盖式的。如果节点B和节点C并行执行都尝试更新state[‘messages’]后完成的节点会覆盖先完成节点的结果导致数据丢失。为了更精确的控制这时就需要用到Reducer归约器来解决解决此问题。它是一个合并函数定义了当多个更新同时作用于同一个状态字段时应如何合并这些更新。下面的状态定义中的operator.add就是一个Reducer它指定了列表状态应该是合并而不是覆写import operatorfrom typing import TypedDict, Annotatedclass State(TypedDict): nList: Annotated[list[str], operator.add]LangGraph 提供了一些开箱即用的 Reducer下表列出了最常见的几种Reducer 函数导入来源适用数据类型主要行为典型应用场景operator.addoperator(Python标准库)int,float数值累加计数器、计分器operator.extendoperator(Python标准库)List[T]列表扩展(list.extend)收集多项结果如搜索条目operator.or_operator(Python标准库)Set[T]集合取并集自动去重收集标签、唯一ID集合update_dictlanggraph.utilsDict合并字典新值覆盖旧键更新配置或元数据除了使用内置的Reducer外开发者甚至可以自定义reducer进行处理。Reducer就是一个合并函数该函数接收当前值和新传入值作为参数并在函数中定义处理逻辑。以下是一个自定义Reducer的代码示例该函数合并新值和旧值并返回去重后结果。from typing import TypedDict, List, Annotated from langgraph.graph import START, END, StateGraph def deduplicate_merge(old_list: List[str], new_list: List[str]) - List[str]: 自定义Reducer合并列表并去重 combined old_list new_list return list(dict.fromkeys(combined)) # 保持顺序的去重 class MyState(TypedDict): unique_items: Annotated[List[str], deduplicate_merge] from typing import TypedDict, List, Annotated class State(TypedDict): unique_items: Annotated[List[str], deduplicate_merge] def node_a(state: State) - State: print(fAdding A to {state[unique_items]}) return State(unique_items[A]) def node_A_extra(state: State) - State: print(fAdding A to {state[unique_items]}) return State(unique_items[A]) builder StateGraph(State) builder.add_node(a, node_a) builder.add_node(a_extra, node_A_extra) builder.add_edge(START, a) builder.add_edge(a, a_extra) builder.add_edge(a_extra, END) graph builder.compile() initial_state State( unique_items [Initial String] ) print(graph.invoke(initial_state))上面代码的图结构如下所示按理说列表中应该有两个“A”但是因为添加时会去重所以最后列表中只有这一个“A”了。最后的结果如下3.4 探索LangGraph边的并行与数据共享笔者接下来将构建下图所示的工作流来帮助大家直观理解并行执行与全局状态共享。第一步同样的需要定义状态不同的是这里的状态需要用reducer来指明列表的状态是累加而不是覆盖原来的值。import operator from typing import TypedDict, List, Annotated class State(TypedDict): nList: Annotated[List[str], operator.add]下一步来定义节点函数每个节点都接收状态并返回对nList字段的更新。def node_a(state: State) - State: print(fAdding A to {state[nList]}) return State(nList[A]) def node_b(state: State) - State: print(fAdding B to {state[nList]}) return State(nList[B]) def node_c(state: State) - State: print(fAdding C to {state[nList]}) return State(nList[C]) def node_bb(state: State) - State: print(fAdding BB to {state[nList]}) return State(nList[BB]) def node_cc(state: State) - State: print(fAdding CC to {state[nList]}) return State(nList[CC]) def node_d(state: State) - State: print(fAdding D to {state[nList]}) return State(nList[D])用状态实例化StateGraph然后添加定义好的节点并按照参考图中的边将不同的节点连接起来最后编译图。builder StateGraph(State) builder.add_node(a, node_a) builder.add_node(b, node_b) builder.add_node(c, node_c) builder.add_node(bb, node_bb) builder.add_node(cc, node_cc) builder.add_node(d, node_d) builder.add_edge(START, a) builder.add_edge(a, b) builder.add_edge(a, c) builder.add_edge(b, bb) builder.add_edge(c, cc) builder.add_edge(bb, d) builder.add_edge(cc, d) builder.add_edge(d, END) graph builder.compile()提供一个初始状态来调用图表大家先来思考一下最后的运行结果。initial_state State( nList [Initial String] ) print(graph.invoke(initial_state))并行与合并节点B和C在同一步骤中并行执行它们都接收到了来自节点A更新后的状态[‘Initial‘ ‘A’]。它们的更新”B”和”C”通过Reducer被追加到了nList中。全局状态共享节点BB和CC运行时它能“看到”的状态包含了其上游节点B的更新(‘B’)也包含了并行分支节点C的更新(‘C’)。这是因为LangGraph的状态是全局共享的边只控制执行顺序不隔离数据。3.5 条件边对于条件边笔者这里直接通过代码讲解使用条件边实现下图结构下图中的虚线表示条件边实线表示普通边。定义状态from langgraph.graph import START, END, StateGraph import operator from typing import TypedDict, List, Annotated class State(TypedDict): nList: Annotated[List[str], operator.add]定义节点函数def node_a(state: State): return def node_b(state: State): return State(nList[B]) def node_c(state: State): return State(nList[C])定义图首先添加实线普通边builder StateGraph(State) builder.add_node(a, node_a) builder.add_node(b, node_b) builder.add_node(c, node_c) builder.add_edge(START, a) builder.add_edge(b, END) builder.add_edge(c, END) graph builder.compile()学习条件边的定义方法条件边需要定义条件路由函数该函数接受状态并返回一个值这个值代表想要分支到的下一节点。笔者下面定义的函数接收图最近一次写入的状态然后返回一个值。def conditional_edge(state: State) - Literal[b, c, END]: select state[nList][-1] if select b: return b elif select c: return c elif select q: return END else: return END在构建图时使用添加条件边的语法来添加条件边builder.add_conditional_edges(a, conditional_edge)测试条件边的逻辑。下面代码笔者从用户那里获取输入作为初始输入状态然后用该状态调用图表user input(b, c or q to quit:) input_state State( nList[user] ) graph.invoke(input_state)可以看到当用户输入b, 会走到b节点在b节点中添加字符串’B’, 当用户输入c, 会走到c节点在c节点中添加字符串‘C’输入q 则会直接到结束节点这就是条件边的控制逻辑。完整代码大家可以关注笔者的微信公众号大模型真好玩并私信:LangChain智能体开发免费获取。以上就是今天的全部内容啦内容篇幅较长大家消化一下~四、总结本期分享笔者为大家介绍了LangGraph 1.0LangGraph1.0是构建智能体的编程语言。它通过状态State管理数据节点Node作为处理函数边Edge定义串行、并行或条件执行逻辑。借助Reducer处理并行写入冲突并支持人在回路控制。这使其成为搭建复杂、可编排AI工作流的强大底座如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2025 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取