LangChain 生态四件套关系与作用

前言

接触 LangChain 生态时,常见困惑是:LangChain 和 LangGraph 都要装吗?
Deep Agents 是不是又一套框架?
LangSmith 不开源能不能不用?
本文不展开具体 API,只说明四者在 Agent 开发栈 里的位置、各自解决什么问题,以及怎样组合选型。
下文示例依赖用 uv 管理 Python 环境与包;概念与版本以官方 2025~2026 文档为准。

总览

官方把 Agent 相关开源组件分为三层,LangSmith 作为横切平台叠在上面。

截屏2026-08-14 18.09.16

依赖方向可以概括为:

  1. LangGraph 负责「怎么跑、怎么存状态、怎么中断与恢复」。
  2. LangChain 怎么快速拼 Agent」的抽象与集成。
  3. Deep Agents 提供开箱即用的复杂 Agent 能力。
  4. LangSmith 不参与执行逻辑,贯穿开发与上线,负责可观测与质量保障。

分层说明

LangGraph

LangGraph 是 Agent Runtime(运行时 / 编排引擎),关注「工作流如何执行」,而不是「提示词怎么写」。

它提供的能力包括:

  • 持久化执行:任务失败或中断后可从检查点恢复,适合长时运行。
  • 流式输出:按节点或 token 推送中间结果。
  • Human-in-the-loop:在任意节点暂停,人工审阅或改写状态后继续。
  • 状态图编排:用 StateGraph 把确定性步骤与 LLM 决策步骤混在同一张图里。

你可以 不依赖 LangChain 单独使用 LangGraph,直接定义节点与边。
但当需求只是标准「模型 + 工具循环」时,手写图往往成本偏高。

LangChain

LangChain 是 Agent Framework(框架层),关注「用什么抽象把模型、工具、提示词拼成应用」。

LangChain 1.x 主包已收敛到 Agent 构建所需核心能力,典型入口是 create_agent
它封装了模型初始化(init_chat_model)、工具(@tool)、中间件(Middleware)等,让常见 Agent 不必从零画 LangGraph 图。

重要关系:LangChain 1.0 的 Agent 构建在 LangGraph 之上
因此使用 create_agent 时,你已经在间接使用 LangGraph 的持久化、流式等运行时能力,只是不必手写图结构。

适合场景:

  • 快速搭一个可调工具、可插 Middleware 的 Agent。
  • 团队需要统一模型与工具接入方式。
  • 编排逻辑相对标准,暂不需要完全自定义状态机。

Deep Agents

Deep Agents 是 Agent Harness(.harness / 开箱即用套件),在 LangGraph 与 LangChain Agent 之上,预置了复杂任务常见能力。

内置能力包括:

  • 任务规划:可选 todo 列表,拆解多步目标。
  • 子 Agent:把子任务委派给独立上下文窗口中的子 Agent。
  • 虚拟文件系统:读写、检索大段工具结果,避免主上下文被撑爆。
  • 上下文管理:摘要历史、卸载超大工具输出。
  • Skills:按场景加载领域知识与操作指引。

入口是 create_deep_agent,API 形态与 create_agent 相近,但默认「电池更满」。
适合场景:

  • 研究型、编码型、文档分析等 多步、非确定性 任务。
  • 希望少写 Middleware 和文件管理逻辑,尽快跑通复杂 Agent。
  • 需要子 Agent 并行、大结果落盘后再 grep / 分析。

若任务只是单次问答或简单工具调用,Deep Agents 可能过重;此时 LangChain create_agent 更轻。

LangSmith

LangSmith 是 平台层(Platform),由 LangChain 公司提供,与上面三个开源包 正交
无论你用 LangChain、LangGraph 还是 Deep Agents,都可以(也建议在生产前)接入 LangSmith。

主要作用:

  • Tracing(追踪):记录每次调用的输入、工具调用、状态迁移与延迟,便于调试「Agent 为什么选了这个工具」。
  • Evaluation(评估):对数据集跑批量评测,对比不同提示词或模型版本。
  • Prompt 管理:集中维护与版本化提示词(团队协同时有用)。
  • Deployment(部署):将 Agent 部署到托管环境,配合监控与扩缩容。

接入方式通常只需环境变量,例如开启追踪:

1
2
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY="lsv2_xxx"

LangSmith 不是运行 Agent 的必需依赖;本地开发可以完全不装。
但一旦进入联调、压测或上线,缺少可观测性会让 Agent 问题极难定位。

如何选型

按「控制粒度 vs 开箱能力」从低到高排列:

组件 抽象层级 典型诉求
LangGraph 最低 自定义编排、混合确定性步骤与 Agent 步骤、完全掌控状态机
LangChain 中等 标准 Agent 循环、Middleware 扩展、快速集成多厂商模型
Deep Agents 较高 长时复杂任务、规划与子 Agent、内置文件系统与上下文工程
LangSmith 横切 追踪、评测、监控,与选用哪一层框架无关

可参照下面的决策顺序:

  1. 只需聊天 + 少量工具 → LangChain create_agent
  2. 需要精细控制每一步流转、或工作流含大量非 LLM 节点 → LangGraph 直接构图。
  3. 任务步骤多、上下文大、常要拆子任务 → Deep Agents
  4. 任何非玩具项目 → 尽早接 LangSmith(或同类 APM),至少打开 Tracing。

三者并非互斥:Deep Agents 内部用 LangChain Agent 与 LangGraph;LangChain Agent 内部用 LangGraph 运行时。
选型本质是「你愿意自己实现多少 harness 能力」。

依赖

跑下文示例前,在项目目录用 uv 初始化并安装对应包。
按需安装,不必一次装齐。

LangChain 与 LangGraph 示例:

1
2
3
uv init
uv venv --python 3.12
uv add "langchain>=1.0,<2.0" langgraph

Deep Agents 示例额外安装:

1
uv add deepagents

运行脚本时使用 uv run python your_script.py,会自动使用当前项目的虚拟环境与锁文件。

协作示例

下面用极简代码说明三层如何嵌套,以及 LangSmith 如何旁路接入。
示例省略 API 密钥,模型名请按环境替换;保存为 .py 文件后通过 uv run python 执行。

LangChain 层:最小 Agent,底层已是 LangGraph 运行时。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from langchain.agents import create_agent

def get_weather(city: str) -> str:
"""查询城市天气(示例)。"""
return f"{city} 晴,25°C。"

agent = create_agent(
model="openai:gpt-4o-mini",
tools=[get_weather],
system_prompt="你是 helpful 助手,查天气时调用工具。",
)

result = agent.invoke({
"messages": [{"role": "user", "content": "北京天气如何?"}]
})
print(result["messages"][-1].content)

Deep Agents 层:同样声明模型与工具,但 harness 自带规划、文件系统等能力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from deepagents import create_deep_agent

def get_weather(city: str) -> str:
"""查询城市天气(示例)。"""
return f"{city} 晴,25°C。"

deep_agent = create_deep_agent(
model="openai:gpt-4o-mini",
tools=[get_weather],
system_prompt="你是 helpful 助手。",
)

result = deep_agent.invoke({
"messages": [{"role": "user", "content": "对比北京和上海的天气"}]
})
print(result["messages"][-1].content)

LangGraph 层:完全手写状态图,适合自定义节点逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
from langgraph.graph import END, START, MessagesState, StateGraph

def mock_llm(state: MessagesState):
last = state["messages"][-1]["content"]
return {"messages": [{"role": "ai", "content": f"收到:{last}"}]}

graph = StateGraph(MessagesState)
graph.add_node("mock_llm", mock_llm)
graph.add_edge(START, "mock_llm")
graph.add_edge("mock_llm", END)
app = graph.compile()

print(app.invoke({"messages": [{"role": "user", "content": "hi"}]}))

LangSmith 层:在运行上述任意代码前设置环境变量,即可在控制台看到 Trace,无需改业务代码。

1
2
3
4
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY="你的密钥"
# 可选:指定项目名,便于在控制台分组
export LANGSMITH_PROJECT="my-agent-demo"

常见误解

  1. LangChain 与 LangGraph 二选一?
    不是。
    LangChain 1.x Agent 已基于 LangGraph;选 LangChain 不等于抛弃 LangGraph,而是使用封装好的运行时。

  2. Deep Agents 替代 LangChain?
    不是替代,是更高层的 harness。
    Deep Agents 仍构建在 LangChain Agent 与 LangGraph 之上;简单场景用 LangChain 即可。

  3. 不用 LangSmith 就不能用 LangChain?
    可以。
    LangSmith 是可选平台;开源三件套本地可独立运行。

  4. LangGraph 只能做 Agent?
    不限于 Agent。
    任何有状态、可持久化的 LLM 工作流(含纯链式、含人工审核节点)都适合用 LangGraph 编排。

总结

  1. LangGraph 管运行时:持久化、流式、中断、状态图编排,抽象层级最低。
  2. LangChain 管框架:模型 / 工具 / Middleware / create_agent,适合标准 Agent 快速落地。
  3. Deep Agents 管复杂任务 harness:规划、子 Agent、文件系统与上下文工程,适合多步自主任务。
  4. LangSmith 管可观测与质量:追踪、评估、部署监控,与框架选型独立,上线前强烈建议接入。
  5. 实际项目常从 LangChain 或 Deep Agents 起步,需要精细控制时再下沉到 LangGraph;LangSmith 贯穿全程。