这是一个非常经典的问题。简单来说,LangChain 是“地基和组件”,而 LangGraph 是基于这些组件构建的“高级架构图”。
如果你只需要一条直线走到底的任务,用 LangChain;如果你需要循环、纠错、复杂的判断跳转(即智能体 Agent),用 LangGraph。
以下是详细的对比和使用指南:
一、 核心区别:直线 vs. 循环
| 核心逻辑 | DAG (有向无环图) | Cyclic Graph (有环图/循环图) |
| 形态 | 像一条流水线。步骤 A -> 步骤 B -> 步骤 C。 | 像一个流程图或状态机。可以 A -> B -> A -> C。 |
| 状态管理 | 状态通常在步骤间传递,比较隐式,难以在复杂步骤间保留全局记忆。 | 显式状态 (Shared State)。所有节点共享并修改同一个 State,就像一个全局黑板。 |
| 主要用途 | 简单的 RAG(检索增强生成)、聊天机器人、数据提取。 | AI Agent (智能体)、多步推理、人机交互(Human-in-the-loop)、自我修正。 |
| 控制流 | 主要是线性的(虽然有 RunnableBranch,但写循环很痛苦)。 | 原生支持循环 (Loops) 和条件跳转。 |
一句话总结:
LangChain 适合:先把大象放进冰箱(打开门 -> 放进去 -> 关门)。
LangGraph 适合:先把大象放进冰箱,如果冰箱满了,就拿出来整理一下再试,或者换个冰箱(观察 -> 思考 -> 行动 -> 观察...)。
二、 为什么 LangChain 官方要推 LangGraph?
在 LangChain 早期,有一个叫 AgentExecutor 的东西用来做智能体。但它是一个“黑盒”,很难定制。比如:你想让 AI 在重试 3 次失败后人工介入,用 AgentExecutor 很难写。
LangGraph 就是为了解决“定制化 Agent”而生的。 它把控制权交还给开发者,让你明确定义:
有哪些节点(Nodes)?
节点之间怎么流转(Edges)?
什么时候循环?什么时候结束?
三、 怎么用?(代码实战对比)
假设我们要实现一个简单的功能:模型生成内容,如果太短,就要求它重写。
1. 使用 LangChain (LCEL)用 LangChain 实现“循环重写”非常别扭,通常只能硬写几层,或者写递归函数。这里展示最擅长的线性链:
# LangChain: 线性流水线
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
model = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_template("讲一个关于{topic}的笑话")
# 就像插积木一样串联
chain = prompt | model | StrOutputParser()
# 只能一条路走到黑
result = chain.invoke({"topic": "程序员"})
print(result) 2. 使用 LangGraph用 LangGraph 实现“检查长度并循环重写”就非常清晰。你需要定义状态 (State)、节点 (Nodes) 和 边 (Edges)。
# LangGraph: 带循环的状态机
from typing import TypedDict, Literal
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
# 1. 定义状态(这是所有节点共享的内存)
class AgentState(TypedDict):
messages: list
retry_count: int
# 2. 定义节点函数
def generate_joke(state: AgentState):
print("--- 生成笑话中 ---")
messages = state['messages']
model = ChatOpenAI(model="gpt-4o")
response = model.invoke(messages)
# 更新状态
return {"messages": [response], "retry_count": state.get("retry_count", 0)}
def check_length(state: AgentState):
print("--- 检查长度 ---")
last_message = state['messages'][-1].content
# 模拟:如果笑话太短(小于50字),且重试次数少于3次,就重写
if len(last_message) < 50 and state['retry_count'] < 3:
return "retry"
return "end"
def rewrite_instruction(state: AgentState):
print("--- 太短了,让它重写 ---")
return {
"messages": [HumanMessage(content="这个笑话太短了,请扩充一点再讲一遍")],
"retry_count": state['retry_count'] + 1
}
# 3. 构建图
workflow = StateGraph(AgentState)
# 添加节点
workflow.add_node("generator", generate_joke)
workflow.add_node("rewriter", rewrite_instruction)
# 设置入口
workflow.set_entry_point("generator")
# 4. 添加条件边(核心逻辑:决定下一步去哪)
workflow.add_conditional_edges(
"generator", # 从 generator 出来后
check_length, # 运行这个判断函数
{
"retry": "rewriter", # 如果返回 retry,去 rewriter 节点
"end": END # 如果返回 end,结束
}
)
# 添加普通边:重写完后,必须回到生成器(形成了循环!)
workflow.add_edge("rewriter", "generator")
# 5. 编译运行
app = workflow.compile()
# 启动
inputs = {"messages": [HumanMessage(content="讲一个程序员笑话")]}
for output in app.stream(inputs):
pass # 可以在这里打印中间过程 四、 什么时候选哪个?
场景 1:简单的 RAG 问答需求:用户提问 -> 查向量库 -> 组装 Prompt -> LLM 回答。
选择:LangChain。这是一个标准的线性链,用 LangChain 的 RunnableSequence 实现最快。
场景 2:复杂的 ReAct Agent (如 AutoGPT 风格)需求:用户提问 -> LLM 思考 -> 调用 Google 搜索 -> 获取结果 -> 发现结果不对 -> 换个关键词搜 -> 总结回答。
选择:LangGraph。
这里涉及到了“观察工具结果后决定下一步做什么”(条件判断)。
涉及到了“搜索失败重试”(循环)。
LangChain 的老 AgentExecutor 也能做,但如果你想控制“最多重试 5 次”或者“如果搜索失败改查维基百科”,LangGraph 更加直观容易调试。
场景 3:多智能体协作 (Multi-Agent)需求:一个“产品经理”Agent 写需求,发给“程序员”Agent 写代码,发给“测试”Agent 找 Bug,如果有 Bug 退回给“程序员”。
选择:LangGraph。LangGraph 原生支持这种复杂的图结构流转。
总结
LangChain 是工具箱,提供了 LLM 开发的积木(Model, Prompt, Tool, VectorStore)。
LangGraph 是基于 LangChain 工具箱的流程编排引擎,专门用来解决循环和状态保持的问题。
新手建议:先学 LangChain 的基础(LCEL),跑通简单的对话和 RAG。一旦你发现需要 LLM 根据结果“回头”重做某些步骤,或者需要构建复杂的 Agent 时,立刻开始学习 LangGraph。
网友回复
有没有免费让ai自动帮你接管操作电脑的mcp服务?
mcp为啥用Streamable HTTP 替代 HTTP + SSE?
scratchjr有没有开源的前端html网页版本源代码?
多模态大模型能否根据ui交互视频来来模仿写出前端交互动画效果ui代码?
如何用阿里云oss+函数计算fc+事件总线EventBridge+消息队列+数据库+redis缓存打造一个高并发弹性系统?
阿里云函数计算 FC如何在海外节点搭建一个代理网络?
ai studio中gemini build的代码如何发布到github pages等免费网页托管上 ?
如何在cursor、qoder、trae中使用Claude Skills功能?
有没有不用u盘就能重装系统的开源工具?
python如何固定摄像头实时计算停车场停车位剩余数量?


