+
65
-

回答

这是一个非常经典的问题。简单来说,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。

网友回复

我知道答案,我要回答