闪电疯狂赛车
91.44M · 2026-03-23
LangGraph 提供了两种构建 Agent 的方式:
create_react_agent 快速搭建StateGraph 自定义状态机本文深入解析 StateGraph 的实现原理,通过构建一个聊天机器人,掌握 LangGraph 的核心概念。
┌─────────────────────────────────────────────────────────┐
│ StateGraph │
├─────────────────────────────────────────────────────────┤
│ State (状态) │ 应用在某个时刻的数据快照 │
│ Node (节点) │ 执行特定任务的函数 │
│ Edge (边) │ 定义节点之间的流转关系 │
└─────────────────────────────────────────────────────────┘
| 维度 | create_react_agent | StateGraph |
|---|---|---|
| 灵活性 | 固定 ReAct 模式 | 完全自定义 |
| 复杂度 | 低 | 高 |
| 可控性 | 受限 | 细粒度控制 |
| 适用场景 | 快速原型 | 复杂工作流 |
"""
LangGraph 教程 - 构建一个基本聊天机器人
本示例演示如何使用 StateGraph 构建一个基础聊天机器人。
官方教程地址:
"""
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("nn 再见!")
break
except Exception as e:
print(f"发生错误: {e}")
break
if __name__ == "__main__":
main()
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 函数,控制状态更新行为def chatbot(state: State) -> dict:
"""
节点函数签名规范:
- 输入:当前 state
- 输出:状态更新字典 {状态键: 更新值}
"""
return {"messages": [llm.invoke(state["messages"])]}
for event in graph.stream(initial_state):
for node_name, value in event.items():
# event = {"节点名": {状态更新}}
process(value)
stream() vs invoke():
stream():迭代器,实时返回每个节点结果invoke():阻塞式,直接返回最终结果pip install langgraph langchain langchain-openai pydantic python-dotenv typing-extensions
python 02构建一个基本聊天机器人.py
LangGraph 聊天机器人已启动!
==================================================
提示:输入 'quit'、'exit' 或 'q' 退出对话
用户: 什么是 StateGraph?
助手: StateGraph 是 LangGraph 的核心抽象,用于构建状态机...
用户: quit
再见!
┌─────────┐ ┌─────────────┐ ┌─────────┐
│ START │────▶│ chatbot │────▶│ END │
└─────────┘ └─────────────┘ └─────────┘
│
▼
┌─────────────┐
│ State │
│ messages │
└─────────────┘
User Input
│
▼
┌─────────────────┐
│ Initial State │
└─────────────────┘
│
▼
┌─────────────────┐
│ graph.stream() │
└─────────────────┘
│
├──▶ Node: chatbot
│ │
│ ▼
│ LLM.invoke()
│ │
│ ▼
│ Update State
│ │
◀───────┘
│
▼
Extract Response
│
▼
Print Output
本文通过实战代码展示了 StateGraph 的核心机制:
TypedDict + Annotated 定义状态结构add_node + add_edge + compilegraph.stream() 实时获取节点输出add_conditional_edges 实现分支逻辑