LangChain vs LangGraph 实战指南:Agent 框架如何选,一篇讲清楚
从实际项目需求出发,告诉你该用哪个框架
LangChain vs LangGraph 实战指南:Agent 框架如何选,一篇讲清楚
从实际项目需求出发,告诉你该用哪个框架
LangChain 和 LangGraph 同出一门,但定位已经完全不同。本文通过实际代码对比,讲解两者的核心差异、各自擅长的场景,以及 2026 年构建生产级 AI Agent 的推荐技术栈。
LangChain 在 2023 年几乎成了 AI 应用开发的代名词。但到了 2026 年,很多人已经从 LangChain 迁移到 LangGraph——因为 LangGraph 更适合构建真正的生产级 Agent。
这两个框架该怎么选?
一、核心定位差异
LangChain:AI 应用开发的工具箱
LangGraph:有状态的 Agent 工作流框架
简单说:LangChain 帮你快速开始,LangGraph 帮你走到生产。
二、代码对比:同一个任务,两种实现
任务:根据用户问题,自动选择搜索或计算工具
#### LangChain 实现(简洁但控制少)
python
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.tools import tool@tool
def search(query: str) -> str:
"""搜索互联网获取最新信息"""
return web_search(query)
@tool
def calculator(expression: str) -> str:
"""计算数学表达式"""
return eval(expression)
llm = ChatOpenAI(model="gpt-4o")
agent = create_react_agent(llm, tools=[search, calculator], prompt=...)
executor = AgentExecutor(agent=agent, tools=[search, calculator])
result = executor.invoke({"input": "苹果公司最新股价是多少,乘以 100 是多少?"})
#### LangGraph 实现(复杂但可控)
python
from langgraph.graph import StateGraph, END
from typing import TypedDict, Listclass AgentState(TypedDict):
messages: List[dict]
tool_calls: List[dict]
final_answer: str
def call_llm(state: AgentState) -> AgentState:
"""调用 LLM 决策下一步"""
response = llm.invoke(state["messages"])
return {"messages": state["messages"] + [response]}
def execute_tools(state: AgentState) -> AgentState:
"""执行工具调用"""
results = []
for tool_call in state["messages"][-1].tool_calls:
result = tools[tool_call["name"]].invoke(tool_call["args"])
results.append({"role": "tool", "content": result})
return {"messages": state["messages"] + results}
def should_continue(state: AgentState) -> str:
"""决定是继续调用工具还是结束"""
last_message = state["messages"][-1]
if last_message.tool_calls:
return "tools"
return END
构建图
graph = StateGraph(AgentState)
graph.add_node("llm", call_llm)
graph.add_node("tools", execute_tools)
graph.add_edge("tools", "llm")
graph.add_conditional_edges("llm", should_continue)
graph.set_entry_point("llm")app = graph.compile()
result = app.invoke({"messages": [{"role": "user", "content": "..."}]})
LangGraph 的代码更多,但你对每一步都有完全的控制。
三、什么时候选哪个
选 LangChain 的情况
选 LangGraph 的情况
2026 年推荐的组合
四、LangGraph 核心概念
状态(State)
python
class MyState(TypedDict):
messages: List[BaseMessage] # 对话历史
next_step: str # 下一步要做什么
attempts: int # 重试次数
result: Optional[str] # 最终结果
状态是 LangGraph 最核心的概念——整个 Agent 的执行都围绕状态的变化进行。
条件边(Conditional Edges)
python
def route(state) -> str:
if state["attempts"] > 3:
return "give_up"
elif state["has_tool_calls"]:
return "execute_tools"
else:
return "end"graph.add_conditional_edges("llm_node", route)
条件边让你可以实现复杂的分支逻辑,比简单的 if-else 更清晰。
五、持久化和断点续传
LangGraph 支持把中间状态存到数据库,允许 Agent 被中断后继续:
python
from langgraph.checkpoint.sqlite import SqliteSaver把 checkpoint 存到 SQLite
memory = SqliteSaver.from_conn_string("checkpoints.db")
app = graph.compile(checkpointer=memory)第一次运行
thread = {"configurable": {"thread_id": "task_001"}}
result = app.invoke(input_data, config=thread)下次继续(从上次中断的地方)
result = app.invoke(None, config=thread)
这对长时间运行的 Agent(如自动化研究、批量处理)非常重要。
延伸阅读
相关工具