这份文档将 LangGraph 的核心理论与实战代码整合在一起,旨在帮助你从零构建一个具备推理、行动、回溯能力的智能体。
LangGraph 入门全指南:从概念到实战
1. 为什么需要 LangGraph?
传统的 LangChain 只能处理线性序列(DAG)。但在复杂的 AI 应用中,我们往往需要:
循环(Loops): 模型发现结果不对,能折返回去重新思考。
状态(State): 在多次往返中精准管理上下文。
持久化(Persistence): 随时保存对话进度,支持断点续传。
2. 核心三要素
构建一个 LangGraph 应用就像在画一张流程图:
State (状态): 整个图的共享数据库,通常是一个 Python 字典。
Nodes (节点): 负责干活的函数。输入当前状态,输出更新后的状态。
Edges (边): 连接节点的线。分为“普通边”(直接跳转)和“条件边”(根据逻辑判断跳转)。
3. 实战示例:构建一个 ReAct 搜索智能体
这个智能体如果遇到不知道的问题,会主动调用“搜索工具”,拿到结果后再总结回答。
A. 环境配置
Bash
pip install -U langgraph langchain_openai
B. 核心代码实现
Python
import os
from typing import Annotated, Literal, TypedDict
from langchain_openai import ChatOpenAI
from langchain_core.messages import BaseMessage, HumanMessage
from langchain_core.tools import tool
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode
# 1. 定义工具 (Tools)
@tool
def search(query: str):
"""当需要查询天气或实时新闻时调用。"""
if "天气" in query:
return "北京今天晴朗,25°C。"
return "LangGraph 是 LangChain 推出的用于构建状态化多智能体应用的框架。"
tools = [search]
tool_node = ToolNode(tools)
# 2. 定义状态 (State)
class State(TypedDict):
# add_messages 确保新消息是“追加”而非“覆盖”
messages: Annotated[list[BaseMessage], add_messages]
# 3. 定义逻辑节点 (Nodes)
model = ChatOpenAI(model="gpt-4o").bind_tools(tools)
def call_model(state: State):
"""调用 LLM 并返回回复"""
response = model.invoke(state['messages'])
return {"messages": [response]}
# 4. 定义条件路由 (Conditional Edges)
def should_continue(state: State) -> Literal["tools", END]:
"""根据模型是否调用了 Tool 决定下一步路径"""
last_message = state['messages'][-1]
if last_message.tool_calls:
return "tools"
return END
# 5. 编排工作流 (The Graph)
workflow = StateGraph(State)
# 添加节点
workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)
# 设置逻辑连线
workflow.add_edge(START, "agent") # 从开始进入 agent
workflow.add_conditional_edges("agent", should_continue) # 判断是去工具还是结束
workflow.add_edge("tools", "agent") # 工具执行完后,必须回到 agent 总结
# 编译应用
app = workflow.compile()
4. 运行与观察
你可以通过以下方式运行并观察它的“思考过程”:
Python
inputs = {"messages": [HumanMessage(content="北京今天天气怎么样?")]}
for output in app.stream(inputs, stream_mode="values"):
last_msg = output["messages"][-1]
print(f"[{type(last_msg).__name__}]: {last_msg.content}")
预期的执行流程:
START -> agent: LLM 收到问题,意识到需要查天气,生成
tool_calls。agent -> tools: 根据
should_continue判断,进入工具节点。tools -> agent: 工具执行完,带着“25°C”的数据回到 LLM。
agent -> END: LLM 总结信息,给出最终回答,判断不再需要工具,流程结束。
5. 进阶学习路线图
6. 开发者工具推荐
可视化图表: 在 Notebook 中使用
app.get_graph().draw_mermaid_png()可以导出流程图。LangGraph Studio (推荐): 这是一个专门的可视化 IDE(目前支持 macOS),可以直接看到节点运行的动态轨迹和 State 的实时变化。
评论