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 更合适。