这份文档将 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}")

预期的执行流程:

  1. START -> agent: LLM 收到问题,意识到需要查天气,生成 tool_calls

  2. agent -> tools: 根据 should_continue 判断,进入工具节点。

  3. tools -> agent: 工具执行完,带着“25°C”的数据回到 LLM。

  4. agent -> END: LLM 总结信息,给出最终回答,判断不再需要工具,流程结束。


5. 进阶学习路线图

阶段

技术要点

目标

基础

StateGraph, Nodes, Edges

能跑通简单的 Tool-use 循环

进阶

MemorySaver (持久化)

让 Agent 拥有跨会话的记忆

高级

Human-in-the-loop

在模型调用敏感工具(如转账)前设置人工审批点

专家

Multi-Agent

让多个不同的 Agent (如代码专家、测试专家) 在一张图中协作


6. 开发者工具推荐

  • 可视化图表: 在 Notebook 中使用 app.get_graph().draw_mermaid_png() 可以导出流程图。

  • LangGraph Studio (推荐): 这是一个专门的可视化 IDE(目前支持 macOS),可以直接看到节点运行的动态轨迹和 State 的实时变化。