快速开始 #

环境准备 #

安装 LangGraph #

bash
# 使用 pip 安装
pip install langgraph

# 或使用 uv 安装
uv pip install langgraph

# 安装 LangChain 集成(可选)
pip install langgraph langchain-openai

项目结构 #

text
my-langgraph-project/
├── .env                # 环境变量
├── main.py             # 主程序
└── requirements.txt    # 依赖

环境变量 #

bash
# .env 文件
OPENAI_API_KEY=your-api-key-here

第一个示例:Hello World #

让我们从一个最简单的例子开始,理解 LangGraph 的基本结构。

python
from langgraph.graph import StateGraph, MessagesState, START, END

def mock_llm(state: MessagesState):
    return {"messages": [{"role": "ai", "content": "hello world"}]}

graph = StateGraph(MessagesState)
graph.add_node(mock_llm)
graph.add_edge(START, "mock_llm")
graph.add_edge("mock_llm", END)
graph = graph.compile()

result = graph.invoke({"messages": [{"role": "user", "content": "hi!"}]})
print(result)

代码解析 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Hello World 示例解析                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 定义状态(MessagesState)                                │
│     - 预构建的消息状态类型                                   │
│     - 包含 messages 列表                                    │
│                                                             │
│  2. 定义节点(mock_llm)                                     │
│     - 接收状态,返回状态更新                                 │
│     - 这是 Agent 的核心逻辑                                 │
│                                                             │
│  3. 创建图(StateGraph)                                     │
│     - 使用状态类型初始化                                    │
│                                                             │
│  4. 添加节点和边                                             │
│     - START -> mock_llm -> END                              │
│                                                             │
│  5. 编译图                                                   │
│     - 验证图结构                                            │
│     - 生成可执行的应用                                      │
│                                                             │
│  6. 执行图                                                   │
│     - invoke() 方法执行                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

构建一个简单的 Agent #

现在让我们构建一个能够使用工具的真实 Agent。

步骤 1:定义工具 #

python
from langchain_core.tools import tool

@tool
def add(a: int, b: int) -> int:
    """Add two numbers together."""
    return a + b

@tool
def multiply(a: int, b: int) -> int:
    """Multiply two numbers together."""
    return a * b

tools = [add, multiply]

步骤 2:创建 LLM #

python
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")
llm_with_tools = llm.bind_tools(tools)

步骤 3:定义状态 #

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]

步骤 4:定义节点 #

python
def agent_node(state: State):
    """Agent 节点:调用 LLM"""
    return {"messages": [llm_with_tools.invoke(state["messages"])]}

步骤 5:定义工具节点 #

python
from langgraph.prebuilt import ToolNode

tool_node = ToolNode(tools)

步骤 6:定义条件边 #

python
from langgraph.graph import END

def should_continue(state: State):
    """判断是否需要调用工具"""
    messages = state["messages"]
    last_message = messages[-1]
    
    if last_message.tool_calls:
        return "tools"
    return END

步骤 7:构建图 #

python
from langgraph.graph import StateGraph, START

graph = StateGraph(State)

graph.add_node("agent", agent_node)
graph.add_node("tools", tool_node)

graph.add_edge(START, "agent")
graph.add_conditional_edges("agent", should_continue, ["tools", END])
graph.add_edge("tools", "agent")

app = graph.compile()

完整代码 #

python
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI

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

@tool
def add(a: int, b: int) -> int:
    """Add two numbers together."""
    return a + b

@tool
def multiply(a: int, b: int) -> int:
    """Multiply two numbers together."""
    return a * b

tools = [add, multiply]
llm = ChatOpenAI(model="gpt-4o-mini")
llm_with_tools = llm.bind_tools(tools)

def agent_node(state: State):
    return {"messages": [llm_with_tools.invoke(state["messages"])]}

tool_node = ToolNode(tools)

def should_continue(state: State):
    messages = state["messages"]
    last_message = messages[-1]
    if last_message.tool_calls:
        return "tools"
    return END

graph = StateGraph(State)
graph.add_node("agent", agent_node)
graph.add_node("tools", tool_node)
graph.add_edge(START, "agent")
graph.add_conditional_edges("agent", should_continue, ["tools", END])
graph.add_edge("tools", "agent")

app = graph.compile()

result = app.invoke({"messages": [{"role": "user", "content": "What is 3 + 4 * 5?"}]})
print(result["messages"][-1].content)

图可视化 #

LangGraph 支持将图结构可视化,帮助理解和调试。

在 Jupyter 中显示 #

python
from IPython.display import Image, display

display(Image(app.get_graph().draw_mermaid_png()))

生成 Mermaid 图 #

python
print(app.get_graph().draw_mermaid())

输出示例:

mermaid
graph
    START --> agent
    agent --> tools
    agent --> END
    tools --> agent

流式输出 #

LangGraph 支持流式输出,提供更好的用户体验。

流式 Token #

python
async for event in app.astream_events({"messages": [...]}, version="v2"):
    if event["event"] == "on_chat_model_stream":
        print(event["data"]["chunk"].content, end="", flush=True)

流式更新 #

python
for chunk in app.stream({"messages": [...]}, stream_mode="updates"):
    print(chunk)

流式模式对比 #

text
┌─────────────────────────────────────────────────────────────┐
│                    流式模式对比                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  stream_mode="values"                                       │
│  - 输出每个步骤后的完整状态                                  │
│  - 适合需要完整上下文的场景                                  │
│                                                             │
│  stream_mode="updates"                                      │
│  - 只输出节点的返回值(增量更新)                            │
│  - 更高效,适合大多数场景                                    │
│                                                             │
│  stream_mode="messages"                                     │
│  - 专门用于消息流                                            │
│  - 适合聊天应用                                              │
│                                                             │
│  astream_events()                                           │
│  - 最细粒度的流                                              │
│  - 可以流式输出 LLM token                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

添加记忆(Memory) #

让 Agent 能够记住之前的对话。

python
from langgraph.checkpoint.memory import MemorySaver

checkpointer = MemorySaver()
app = graph.compile(checkpointer=checkpointer)

config = {"configurable": {"thread_id": "conversation-1"}}

result1 = app.invoke(
    {"messages": [{"role": "user", "content": "My name is Alice"}]},
    config
)

result2 = app.invoke(
    {"messages": [{"role": "user", "content": "What's my name?"}]},
    config
)

print(result2["messages"][-1].content)

记忆机制说明 #

text
┌─────────────────────────────────────────────────────────────┐
│                    记忆机制                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Checkpointer(检查点):                                    │
│  - 自动保存每次执行的状态                                    │
│  - 通过 thread_id 区分不同会话                               │
│                                                             │
│  工作流程:                                                  │
│  1. 首次调用:创建新会话,保存状态                           │
│  2. 后续调用:加载历史状态,继续对话                         │
│                                                             │
│  支持的存储后端:                                            │
│  - MemorySaver:内存存储(开发测试)                         │
│  - SqliteSaver:SQLite 数据库                               │
│  - PostgresSaver:PostgreSQL 数据库                         │
│  - RedisSaver:Redis 存储                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

使用预构建 Agent #

LangGraph 提供了预构建的 Agent,可以快速开始。

ReAct Agent #

python
from langgraph.prebuilt import create_react_agent

agent = create_react_agent(llm, tools)

result = agent.invoke({"messages": [{"role": "user", "content": "What is 2 + 2?"}]})

带系统提示的 Agent #

python
agent = create_react_agent(
    llm,
    tools,
    state_modifier="You are a helpful math assistant."
)

调试技巧 #

打印执行步骤 #

python
for step in app.stream({"messages": [...]}):
    print(f"Step: {step}")

查看状态历史 #

python
config = {"configurable": {"thread_id": "debug-1"}}
app.invoke({"messages": [...]}, config)

history = app.get_state_history(config)
for state in history:
    print(state)

使用 LangSmith #

python
import os
os.environ["LANGSMITH_API_KEY"] = "your-key"
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_PROJECT"] = "my-project"

# 所有执行会自动追踪到 LangSmith

常见问题 #

1. 如何处理错误? #

python
from langgraph.errors import GraphRecursionError

try:
    result = app.invoke({"messages": [...]})
except GraphRecursionError:
    print("Reached recursion limit")

2. 如何限制递归深度? #

python
result = app.invoke(
    {"messages": [...]},
    config={"recursion_limit": 10}
)

3. 如何获取中间结果? #

python
for chunk in app.stream({"messages": [...]}, stream_mode="updates"):
    for node_name, node_output in chunk.items():
        print(f"Node {node_name}: {node_output}")

下一步 #

现在你已经学会了 LangGraph 的基本用法,接下来学习 核心概念,深入理解 LangGraph 的工作原理!

最后更新:2026-03-30