news 2026/7/19 1:51:36

【langgraph 从入门到精通graphApi 篇】LangGraphAPI 方式调用 - 初识与核心概念

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【langgraph 从入门到精通graphApi 篇】LangGraphAPI 方式调用 - 初识与核心概念

文章目录

    • 第 1 章:LangGraph 初识与核心概念
      • 1.1 本章目标
      • 1.2 核心概念
        • LangGraph 是什么?
        • LangGraph 在 AI 生态中的位置
        • 第一个 Graph 的内部结构
      • 1.3 实战:你的第一个 LangGraph 程序
      • 1.4 API 速查
      • 1.5 错误与避坑指南
        • 坑 1:忘记导入 START 和 END
        • 坑 2:节点函数返回 None 而非 dict
        • 坑 3:返回的 key 不在 State 中
        • 坑 4:混淆 invoke() 的参数
      • 1.6 最佳实践总结

第 1 章:LangGraph 初识与核心概念

1.1 本章目标

学完本章你将能够:

  1. 理解 LangGraph 在 AI 开发生态中的定位
  2. 掌握 State、Node、Edge、Graph 四大核心概念
  3. 独立编写并运行第一个 LangGraph 程序

1.2 核心概念

LangGraph 是什么?

在计算机科学中,图(Graph)由节点(Node)和边(Edge)组成。节点是执行任务的单元,边是连接节点的线,决定了任务执行的先后顺序。就像地铁线路图——每个站点是节点,连接站点的轨道是边。

LangGraph 是一个有状态的多步骤 AI 应用编排框架。你可以把它想象成一个智能工厂的流水线:

概念比喻(工厂流水线)技术定义
Graph(图)整个工厂的布局图定义了所有节点和边的有向图结构
State(状态)在流水线上流转的零件在节点间共享的数据结构,每个节点可以读取和修改
Node(节点)每个工位执行具体操作的函数(LLM 调用、工具执行、数据处理)
Edge(边)连接工位的传送带定义节点间的执行顺序和条件

核心公式Nodes 做工作,Edges 决定流程,State 是纽带

LangGraph 在 AI 生态中的位置

基础设施

模型层

编排层

AI 应用层

你的 AI 应用

LangGraph
状态编排 + 流程控制

LangChain
模型调用 + 工具集成 + 提示词

LLM 模型
OpenAI / Claude / DeepSeek / ...

持久化
Checkpoint / Store

外部工具
搜索 / 计算 / API

第一个 Graph 的内部结构

开始

完成

START

greet 节点
生成问候语

END

1.3 实战:你的第一个 LangGraph 程序

让我们从一个最简单的例子开始:输入一个人的名字,输出一句问候语。

# ============================================# 第 1 步:导入必要的模块# ============================================fromtypingimportTypedDictfromlanggraph.graphimportStateGraph,START,END# ============================================# 第 2 步:定义 State(状态)—— 图中流转的数据结构# ============================================classState(TypedDict):""" State 是图中所有节点共享的数据结构。 使用 TypedDict 定义,提供类型安全和 IDE 提示。 这里定义了两个字段: - name: 用户输入的名字 - greeting: 生成的问候语(初始为空) """name:strgreeting:str# TypedDict 是 Python 的类型提示工具,它定义了字典中每个键对应的值类型。# LangGraph 用 TypedDict 来声明 State 的结构,这样 IDE 可以自动补全字段名,# 也能在编写代码时检查类型错误。# ============================================# 第 3 步:定义 Node(节点)—— 执行具体操作的函数# ============================================defgreet(state:State)->dict:""" 节点函数签名规则: - 参数:接收当前 State 作为输入 - 返回值:返回一个 dict,包含要更新的 State 字段 注意:只需返回要更新的字段,不需要返回完整 State! LangGraph 会自动将返回值合并到当前 State 中。 """print(f" [greet 节点] 收到名字:{state['name']}")# 从 State 中读取 name,生成问候语,返回更新return{"greeting":f"你好,{state['name']}!"}# ============================================# 第 4 步:构建 Graph(图)—— 把节点和边组合起来# ============================================# 创建 StateGraph 构建器,传入 State 类型builder=StateGraph(State)# 注册节点:给 greet 函数起名为 "greet"builder.add_node("greet",greet)# 添加边(流程控制):# START → greet → END# 表示从图入口开始,执行 greet 节点,然后结束builder.add_edge(START,"greet")builder.add_edge("greet",END)# 编译图:将构建器"冻结"为可执行的图对象graph=builder.compile()# ============================================# 第 5 步:运行 Graph# ============================================print("=== 执行 Graph ===")# invoke() 方法传入初始状态,返回最终状态result=graph.invoke({"name":"小明"})print(f"=== 结果:{result['greeting']}")# ============================================# 运行输出:# === 执行 Graph ===# [greet 节点] 收到名字: 小明# === 结果: 你好, 小明!# ============================================

代码执行流程解析:

  1. graph.invoke({"name": "小明"})— 传入初始 State(只有namegreeting为默认值""
  2. 图从START出发,找到第一条边START → greet
  3. 执行greet节点函数,传入当前 State,函数返回{"greeting": "你好, 小明!"}
  4. 图将返回值合并到 State 中,State 变为{"name": "小明", "greeting": "你好, 小明!"}
  5. 找到下一条边greet → END,图结束
  6. invoke()返回最终的完整 State

1.4 API 速查

API完整签名入参说明返回值说明
StateGraph(state_schema)StateGraph(state_schema: Type[StateT])state_schema: State 类型(TypedDict/dataclass/Pydantic)StateGraph构建器对象创建状态图构建器
.add_node(name, action)add_node(node: str, action: Callable)node: 节点名(str);action: 节点函数Self(支持链式调用)注册一个节点
.add_edge(start, end)add_edge(start_key: str, end_key: str)start_key: 源节点名;end_key: 目标节点名Self添加一条普通边
.compile()compile(checkpointer, interrupt_before, interrupt_after, ...)可选参数见后续章节CompiledStateGraph编译图使之可执行
.invoke(input)invoke(input: dict, config: dict = None)input: 初始 State 字典;config: 运行配置(可选)dict最终 State同步执行图

1.5 错误与避坑指南

坑 1:忘记导入 START 和 END
# ❌ 错误写法fromlanggraph.graphimportStateGraph# 只导入了 StateGraphbuilder=StateGraph(State)builder.add_edge(START,"my_node")# NameError: name 'START' is not defined# ✅ 正确写法fromlanggraph.graphimportStateGraph,START,END# 同时导入 START 和 END
坑 2:节点函数返回 None 而非 dict
# ❌ 错误写法defbad_node(state:State):print("处理中...")# 忘记返回值,隐式返回 None# → LangGraph 收到 None,无法更新 State,可能报错或静默失败# ✅ 正确写法defgood_node(state:State)->dict:print("处理中...")return{"some_field":"new_value"}# 必须返回 dict
坑 3:返回的 key 不在 State 中
classState(TypedDict):name:strgreeting:str# ❌ 错误写法defbad_node(state:State)->dict:return{"message":"hello"}# "message" 不在 State 中定义,运行时报错# ✅ 正确写法defgood_node(state:State)->dict:return{"greeting":"hello"}# "greeting" 在 State 中定义
坑 4:混淆 invoke() 的参数
# ❌ 错误写法graph.invoke("hello")# 传入字符串而非 dict# ✅ 正确写法graph.invoke({"name":"小明"})# 传入 dict,key 对应 State 的字段

1.6 最佳实践总结

  1. 使用 TypedDict 定义 State:类型安全,IDE 有完整提示,出错时容易定位问题
  2. 节点函数保持单一职责:一个节点只做一件事(如"搜索"、“生成回复”、“调用工具”),不要在一个节点里做太多事
  3. 始终从 START 到 END 形成完整路径:确保每个节点都有入口和出口,避免"死胡同"
  4. 节点返回值只包含变更字段:不需要返回完整 State,LangGraph 自动合并,减少冗余代码
  5. 先画图再写代码:复杂流程先用 Mermaid 画出图结构,再着手实现,思路更清晰

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 1:50:43

MySQL 8.0.35 二进制包安装笔记

MySQL 8.0.35 二进制包安装笔记 — 192.168.195.141 环境信息项目值主机IP192.168.195.141操作系统Kylin Linux Advanced Server V10 (Halberd)内核4.19.90-89.11.v2401.ky10.x86_64glibc2.28内存2.8GMySQL版本8.0.35(二进制包,glibc2.17) 1.…

作者头像 李华
网站建设 2026/7/19 1:48:43

javascript练习

练习1:在数组里面添加一个方法,删除其中重复的元素这里用到了原型链,在Array的方法里面添加删除重复元素的Array.prototype.distinct function(){let array []for(value of this){if(array.indexOf(value)-1){array.push(value)}}return arr…

作者头像 李华
网站建设 2026/7/19 1:48:15

Android项目文件结构与模块化架构详解

1. Android项目文件结构深度解析作为一名从Eclipse时代就开始接触Android开发的老兵,我见证了Android项目结构的多次演变。很多新手开发者面对Android Studio中复杂的目录树时常常感到困惑,今天我就带大家彻底拆解这个"黑匣子"。在Android Stu…

作者头像 李华
网站建设 2026/7/19 1:48:02

AM62L硬件安全实战:CBASS防火墙与DTHE加密引擎寄存器配置详解

1. 项目概述与核心价值在嵌入式系统,尤其是像TI AM62L这样的高性能Sitara处理器中,安全不再是“锦上添花”的功能,而是系统设计的基石。无论是防止固件被恶意篡改、保护关键数据(如加密密钥)不被窃取,还是确…

作者头像 李华
网站建设 2026/7/19 1:47:06

C++编译器优化选项全解析:从-O0到-O3的性能提升实战指南

1. 项目概述:为什么编译优化是C性能的“魔法开关”?如果你写过C,肯定有过这样的经历:代码逻辑明明已经绞尽脑汁优化了,循环也展开了,算法也换了,但程序跑起来还是感觉差那么点意思,性…

作者头像 李华
网站建设 2026/7/19 1:46:30

知网查重加AIGC双检测怎么过?同时降重降AI到红线内

知网查重加AIGC双检测怎么过?同时降重降AI到红线内 现在知网不只查你重复率了,还多了一道 AIGC 检测。这就意味着你的论文要过两道红线:一道是查重,看你和别人重不重;一道是 AI 检测,看你写得像不像 AI。两…

作者头像 李华