LangGraph StateGraph 实战:状态机聊天机器人构建指南

背景

LangGraph 提供了两种构建 Agent 的方式:

  1. 高层 APIcreate_react_agent 快速搭建
  2. 底层 APIStateGraph 自定义状态机

本文深入解析 StateGraph 的实现原理,通过构建一个聊天机器人,掌握 LangGraph 的核心概念。


实现原理

StateGraph 核心概念

scss 复制代码
┌─────────────────────────────────────────────────────────┐
│                    StateGraph                           │
├─────────────────────────────────────────────────────────┤
│  State (状态)  │  应用在某个时刻的数据快照               │
│  Node (节点)   │  执行特定任务的函数                     │
│  Edge (边)     │  定义节点之间的流转关系                 │
└─────────────────────────────────────────────────────────┘

对比:create_react_agent vs StateGraph

维度 create_react_agent StateGraph
灵活性 固定 ReAct 模式 完全自定义
复杂度
可控性 受限 细粒度控制
适用场景 快速原型 复杂工作流

代码实现

完整代码

python 复制代码
"""
LangGraph 教程 - 构建一个基本聊天机器人

本示例演示如何使用 StateGraph 构建一个基础聊天机器人。
官方教程地址:https://langchain-ai.github.io/langgraph/tutorials/introduction/
"""

import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
warnings.filterwarnings("ignore", category=UserWarning)

from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os

load_dotenv()


# ==================== 1. 定义状态 ====================
class State(TypedDict):
    """定义图的状态结构。"""
    messages: Annotated[list, add_messages]


# ==================== 2. 创建图构建器 ====================
graph_builder = StateGraph(State)


# ==================== 3. 初始化模型 ====================
llm = ChatOpenAI(
    model="Qwen/Qwen3-Next-80B-A3B-Instruct",
    openai_api_key=os.getenv("SILICONFLOW_API_KEY"),
    openai_api_base="https://api.siliconflow.cn/v1",
    temperature=0.7
)


# ==================== 4. 定义节点 ====================
def chatbot(state: State):
    """聊天机器人节点函数。"""
    return {"messages": [llm.invoke(state["messages"])]}


graph_builder.add_node("chatbot", chatbot)


# ==================== 5. 定义边 ====================
graph_builder.add_edge(START, "chatbot")


# ==================== 6. 编译图 ====================
graph = graph_builder.compile()


# ==================== 7. 运行 ====================
def stream_graph_updates(user_input: str):
    """流式处理图更新。"""
    for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):
        for value in event.values():
            print("助手:", value["messages"][-1].content)


def main():
    """主函数 - 运行交互式聊天机器人。"""
    print("🤖 LangGraph 聊天机器人已启动!")
    print("=" * 50)
    print("提示:输入 'quit'、'exit' 或 'q' 退出对话\n")
    
    while True:
        try:
            user_input = input("用户: ")
            if user_input.lower() in ["quit", "exit", "q"]:
                print("\n👋 再见!")
                break
            stream_graph_updates(user_input)
            print()
        except KeyboardInterrupt:
            print("\n\n👋 再见!")
            break
        except Exception as e:
            print(f"发生错误: {e}")
            break


if __name__ == "__main__":
    main()

核心代码解析

状态定义

python 复制代码
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph.message import add_messages

class State(TypedDict):
    messages: Annotated[list, add_messages]

技术要点

  • TypedDict:结构化类型定义
  • Annotated:类型元数据注解
  • add_messages:reducer 函数,控制状态更新行为

节点函数规范

python 复制代码
def chatbot(state: State) -> dict:
    """
    节点函数签名规范:
    - 输入:当前 state
    - 输出:状态更新字典 {状态键: 更新值}
    """
    return {"messages": [llm.invoke(state["messages"])]}

流式执行机制

python 复制代码
for event in graph.stream(initial_state):
    for node_name, value in event.items():
        # event = {"节点名": {状态更新}}
        process(value)

stream() vs invoke()

  • stream():迭代器,实时返回每个节点结果
  • invoke():阻塞式,直接返回最终结果

运行效果

执行

bash 复制代码
pip install langgraph langchain langchain-openai pydantic python-dotenv typing-extensions
python 02构建一个基本聊天机器人.py

输出

arduino 复制代码
🤖 LangGraph 聊天机器人已启动!
==================================================
提示:输入 'quit'、'exit' 或 'q' 退出对话

用户: 什么是 StateGraph?
助手: StateGraph 是 LangGraph 的核心抽象,用于构建状态机...

用户: quit

👋 再见!

架构图解

状态流转

sql 复制代码
┌─────────┐     ┌─────────────┐     ┌─────────┐
│  START  │────▶│  chatbot    │────▶│   END   │
└─────────┘     └─────────────┘     └─────────┘
                      │
                      ▼
              ┌─────────────┐
              │   State     │
              │  messages   │
              └─────────────┘

执行时序

sql 复制代码
User Input
    │
    ▼
┌─────────────────┐
│  Initial State  │
└─────────────────┘
    │
    ▼
┌─────────────────┐
│  graph.stream() │
└─────────────────┘
    │
    ├──▶ Node: chatbot
    │       │
    │       ▼
    │   LLM.invoke()
    │       │
    │       ▼
    │   Update State
    │       │
    ◀───────┘
    │
    ▼
Extract Response
    │
    ▼
Print Output

总结

本文通过实战代码展示了 StateGraph 的核心机制:

  1. 状态定义 :使用 TypedDict + Annotated 定义状态结构
  2. 节点编写:输入 state,返回状态更新字典
  3. 图构建add_node + add_edge + compile
  4. 流式执行graph.stream() 实时获取节点输出

进阶方向

  • 条件边:add_conditional_edges 实现分支逻辑
  • 持久化:集成检查点器实现状态持久化
  • 多节点:构建复杂的多步骤工作流
  • 人机协作:Human-in-the-loop 节点

参考


📌 本文首发于掘金,作者:AI探索者 🔗 转载请注明出处

💡 如果觉得有帮助,欢迎点赞、评论、收藏! 🎯 你的支持是我持续创作的动力!

相关推荐
leisoo80977 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
WangYan20227 小时前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别
python·机器学习·xgboost
金銀銅鐵9 小时前
[Python] 借助 turtle 逐字展示唐诗《金缕衣》
python
Python大数据分析@11 小时前
使用大模型MCP采集数据,爬虫已经无门槛
python·网络爬虫
quantdash_cc11 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
65岁退休Coder12 小时前
LangChain v1.3.4 笔记 - 07 补充:链式调用 LCEL
后端·python·langchain
卷无止境12 小时前
FastAPI 部署在 Nginx 后面到底该怎么配
后端·python
半亩码田12 小时前
C#转Python第3.1篇:Python 的 class 没有访问修饰符?面向对象的另一条路
开发语言·python·c#
Wzx19801213 小时前
python沙箱和docker沙箱你选对了吗?
开发语言·python·docker
Python私教13 小时前
签名 URL 刷新导致审批失效?别急着删掉所有 query
python·安全