LangGraph 到底是什么?

1. 先别急着写 Agent

很多人第一次接触 Agent,会想象成这样:

复制代码
用户提问 → LLM 思考 → 调工具 → 再思考 → 给答案

这在 demo 里够用。但真实系统里会马上遇到问题:

LLM 要调多个工具怎么办?

工具失败了要不要重试?

中间需要人类审批怎么办?

任务跑到一半服务重启怎么办?

Agent 前面做过的事要怎么记住?

下一步该走哪个分支,谁来决定?

LangGraph 解决的就是这些"Agent 运行时"问题。

2. Graph 是什么意思?

LangGraph 的核心思想很朴素:把一个 Agent 拆成一张图。

图里主要有两类东西:

node:一个步骤。比如调用 LLM、查数据库、调用搜索工具、人工审核。

edge:步骤之间的连接。比如 A 做完去 B,或者根据条件去 C / D。

你可以先把它想象成流程图:

复制代码
开始
 ↓
接收问题
 ↓
调用模型
 ↓
是否需要工具?
 ├─ 是 → 调用工具 → 回到模型
 └─ 否 → 输出答案

这就是 LangGraph 的基本世界观:Agent 不是一坨 while loop,而是一张显式的状态图。

3. State 是什么?

除了 node 和 edge,还有一个特别重要的概念:state

state 就是整个 Agent 当前知道的东西。比如:

复制代码
{
    "messages": [...],
    "user_id": "123",
    "tool_results": [...],
    "need_human_review": False
}

每个 node 读取 state,然后返回一部分更新。LangGraph 再把这些更新合并回 state,继续往下走。

这带来一个好处:流程不是黑盒。你可以知道 Agent 每一步看到了什么、改了什么、为什么走到下一步。

4. 最小 Hello World

官方 overview 给的最小例子大概是这个形状:

复制代码
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()

先不用纠结每个 API。你只需要看懂这件事:

复制代码
START → mock_llm → END

也就是:开始后执行一个 node,然后结束。

这就是 LangGraph 最小的图。

5. LangGraph 和 LangChain 是什么关系?

官方文档说得很清楚:LangGraph 可以独立使用,但经常和 LangChain 组件一起用。

我的理解是:

LangChain 更像"工具箱":模型、工具、prompt、retriever、agent loop。

LangGraph 更像"运行轨道":状态、分支、持久化、人类介入、长任务恢复。

如果你只是快速做一个常见工具调用 Agent,LangChain 的高层 agent 可能更快。

如果你要控制复杂流程、状态和恢复能力,LangGraph 更合适。