AI AgentTechnical Deep Dive

LangChain 与 LangGraph:什么时候该用高层封装,什么时候该自己编排

发布时间2026/01/24
分类AI Agent
预计阅读9 分钟
作者吴长龙
*

它们不是竞争关系。LangChain 更像快速起步层,LangGraph 更像底层编排层,关键是别在不需要的时候把问题做复杂。

01.先说结论:LangChain 和 LangGraph 不是二选一

很多入门文章把这两个框架讲成“新版替旧版”的关系,这其实容易把人带偏。

按当前官方文档的口径:

  • LangChain 负责高层 agent 抽象和模型、工具集成
  • LangGraph 负责更底层的编排、状态、持久化和流程控制
  • LangChain 的 agent 本身就是构建在 LangGraph 之上的

所以更准确的理解是:

LangChain 解决“怎么更快开始构建 Agent 应用”,LangGraph 解决“当流程复杂后,怎么把 Agent 变成可控系统”。

如果一开始把这层关系理解错了,选型时就很容易走两个极端:

  • 明明只需要一个高层 agent,却上来就自己画图编排
  • 明明已经是复杂工作流了,还想用高层封装硬顶到底

02.LangChain 更适合什么

LangChain 适合“先做出一个能工作的 agent 应用”,尤其是在这些场景里:

  • 你想快速接入不同模型和工具
  • 你更关注应用层能力,而不是底层流程图
  • 任务主要是常见的 tool-calling 循环
  • 你希望少写编排样板代码

官方 overview 也明确提到,LangChain 提供的是 prebuilt agent architecture 和模型、工具集成能力,适合快速开始。

最简单的例子如下:

python snippetpython
from langchain.agents import create_agent


def get_weather(city: str) -> str:
    """查询城市天气。"""
    return f"{city} 当前天气晴。"


agent = create_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[get_weather],
    system_prompt="你是一个简洁可靠的天气助手。",
)


result = agent.invoke(
    {
        "messages": [
            {"role": "user", "content": "上海天气怎么样?"}
        ]
    }
)

这类写法最大的优点就是起步非常快。对于 demo、内部助手、原型验证,LangChain 往往就够用了。

03.LangGraph 更适合什么

LangGraph 的优势出现在“流程已经不再是一个简单 agent loop”的时候。当前官方文档对它的描述很明确:它是一个 low-level orchestration framework and runtime,重点是长运行、有状态、可恢复的 agent 系统。

更适合上 LangGraph 的场景通常包括:

  • 一个任务由多个离散步骤组成
  • 有分支、循环、暂停、恢复
  • 需要显式状态管理
  • 需要 human-in-the-loop
  • 需要 durable execution 和 checkpoint

一个简化后的 LangGraph 骨架大概长这样:

python snippetpython
import operator
from typing import Literal
from typing_extensions import Annotated, TypedDict
from langchain.messages import AnyMessage
from langgraph.graph import StateGraph, START, END


class State(TypedDict):
    messages: Annotated[list[AnyMessage], operator.add]
    classification: str | None


def classify(state: State) -> dict:
    return {"classification": "search"}


def should_continue(state: State) -> Literal["search_docs", END]:
    if state["classification"] == "search":
        return "search_docs"
    return END


def search_docs(state: State) -> dict:
    return {"messages": []}


builder = StateGraph(State)
builder.add_node("classify", classify)
builder.add_node("search_docs", search_docs)
builder.add_edge(START, "classify")
builder.add_conditional_edges("classify", should_continue, ["search_docs", END])
builder.add_edge("search_docs", END)
graph = builder.compile()

看上去代码更多,但换来的能力是:

  • 状态显式可见
  • 流程路径清晰
  • 节点可单独观察和重试
  • 中途暂停和恢复更自然

04.选型时最实用的判断方式

不要先问“哪个框架更强”,而要先问任务本身是什么形状。

用 LangChain 就够的情况

  • 目标是尽快起一个可用助手
  • 主流程就是“模型决定是否调用工具”
  • 没有复杂状态迁移
  • 不需要恢复到中间步骤

更适合 LangGraph 的情况

  • 任务包含明确阶段,比如分类、检索、执行、审核、回写
  • 不同步骤需要不同错误处理策略
  • 流程里要插人工确认
  • 任务可能中断,之后还要从原地继续

这也是为什么官方文档建议:如果只是快速构建 agent,就先从 LangChain 起步;只有在需要更多 deterministic + agentic workflow 组合和重度定制时,再进入 LangGraph。

05.最常见的误区不是“选错框架”,而是“把问题复杂化”

误区一:刚入门就直接上 LangGraph

如果你只是想做一个 FAQ 助手或简单工具调用 demo,直接写 LangGraph 往往会把大量时间花在状态和边上,而不是先验证任务有没有价值。

误区二:把 LangChain 当成万能上层

当你的系统已经出现:

  • 多阶段分支
  • 强状态依赖
  • 审批暂停
  • 多次恢复

这时如果还坚持用高层封装硬撑,最终会把控制逻辑散落在各种 callback、middleware 和业务分支里,维护成本反而更高。

误区三:以为用了框架就自动生产可用

无论是 LangChain 还是 LangGraph,都不会替你自动解决:

  • 工具权限
  • 数据质量
  • 观测与回放
  • 成本治理
  • 人工兜底

框架能帮你搭骨架,但系统是否可靠,仍然取决于工程设计。

06.一个更稳妥的演进路径

如果你在做个人项目或业务原型,我更推荐下面这个顺序:

  • 先用 LangChain 跑通最小 agent
  • 明确哪些环节开始变复杂
  • 只把复杂部分迁到 LangGraph
  • 最后再补持久化、人工审核和观测

这个路径的好处是,你不会在一开始就背上过重的编排成本,也不会在流程复杂后继续被高层封装限制。

07.总结

LangChain 和 LangGraph 更像同一技术栈里的两个层级:

  • LangChain 负责快速构建 agent 应用
  • LangGraph 负责把复杂 agent 流程变成可编排、可恢复、可治理的系统

选型最重要的不是“跟不跟新”,而是任务是否真的需要更强的控制力。对个人站点和真实工程文章来说,这个判断比背 API 名字重要得多。

08.参考资料