LangGraph 学习
是什么?
LangGraph 是 LangChain 生态的底层工作流编排框架,用有向图结构管理复杂 AI Agent 系统
有什么优势?
- 持久执行:支持故障恢复,自动从断点继续执行,适合长期运行任务
- 可视化流程:与 LangSmith 集成,提供执行路径追踪和状态转换可视化
- 动态控制:条件分支、循环、并行执行,提供细粒度控制,开发者可精确设计和观察每一步行为
- 状态管理:内置状态持久化,支持短期和长期记忆,保持上下文一致性
- 人机协作:无缝集成人工干预,可在任意执行点检查和修改状态
核心组件
langgraph 的核心是有向图模型,由三个基本组件构成
节点(Node) → 边(Edge) → 状态(State)
- 节点 (Node):工作流中的基本处理单元,可代表 LLM 调用、工具执行或自定义逻辑,接收并处理状态,返回更新后的状态
- 边 (Edge):定义节点间的连接关系和执行路径,分为:
- 普通边:固定执行顺序
- 条件边:根据状态值决定下一步路径,实现动态决策
- 状态 (State):贯穿整个工作流的数据结构,在节点间流动并被修改,支持短期工作记忆和长期持久化存储
安装
# 必要依赖
pip install langchain langgraph langchain-community
# 可视化工具
pip install langsmith
Demo
from typing import List, Dict, Tuple
from pydantic import BaseModel
from langgraph.graph import StateGraph, END
from langchain_core.language_models import ChatOpenAI
# 1. 定义状态
class ChatState(BaseModel):
messages: List[Dict[str, str]] = []
current_input: str = ""
should_continue: bool = True
# 2. 定义节点函数
async def process_user_input(state: ChatState) -> ChatState:
"""处理用户输入"""
messages = state.messages + [{"role": "user", "content": state.current_input}]
return ChatState(
messages=messages,
current_input=state.current_input,
should_continue=True
)
async def generate_ai_response(state: ChatState) -> ChatState:
"""生成AI回复"""
llm = ChatOpenAI(temperature=0.7)
response = await llm.ainvoke(state.messages)
messages = state.messages + [{"role": "assistant", "content": response}]
return ChatState(
messages=messages,
current_input=state.current_input,
should_continue=True
)
def should_continue(state: ChatState) -> str:
"""决定是否继续对话"""
if "goodbye" in state.current_input.lower():
return "end"
return "continue"
# 3. 构建图
workflow = StateGraph(ChatState)
# 添加节点
workflow.add_node("process_input", process_user_input)
workflow.add_node("generate_response", generate_ai_response)
# 添加边
workflow.add_edge("process_input", "generate_response")
workflow.add_conditional_edges(
"generate_response",
should_continue,
{
"continue": "process_input",
"end": END
}
)
# 4. 编译图
app = workflow.compile()
# 5. 运行对话
async def chat():
state = ChatState()
while True:
user_input = input("You: ")
state.current_input = user_input
state = await app.ainvoke(state)
print("Bot:", state.messages[-1]["content"])
if not state.should_continue:
break
# 运行聊天
import asyncio
asyncio.run(chat())