LangChain 1.0 之后:为什么我劝你把旧教程删了
LangChain 1.0 之后:为什么我劝你把旧教程删了
系列:《代码的江湖》LangChain 系列 · 第 1 篇
建议阅读时间:12 分钟
一、一段跑不通的代码
如果 2026 年你还在学 LangChain,有一件事必须先知道:市面上大量的 LangChain 教程,正在教你一个已经废弃的 API。
前几天我在 GitHub 上看到一个刚开源的项目,README 里贴的代码是这样的:
from langchain.agents import initialize_agent, AgentType
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)
这段代码在三年前是对的。现在运行,你会看到一屏幕的 DeprecationWarning,或者直接 ImportError。
作者不是不懂技术,他只是照着 2023 年的教程学了一遍。而 2023 年的 LangChain,和 2026 年的 LangChain,已经是两个东西。
二、版本断层:1.0 到底改了什么
2025 年 10 月,LangChain 和 LangGraph 同时发布了 1.0 版本。这次重构对整个代码库做了彻底重组,官方在同月完成 1.2 亿美元融资,估值超 12 亿美元。
LangChain 官方首次给出 API 稳定承诺:在 2.0 版本之前,不会再有破坏性变更。这对企业级项目来说,是决定性的信号。
2.1 最直观的变化:Agent 构建方式
| 维度 | v0.3(旧) | v1.x(新) |
|---|---|---|
| Agent 入口 | initialize_agent + AgentExecutor |
create_agent(底层 LangGraph) |
| 结构化输出 | JSON Parser + 正则,不稳定 | Structured Output 一等公民,绑定 Pydantic 类 |
| 输出解析 | 纯文本手动解析 | 标准化的 content_blocks |
| 工具定义 | Tool 类,类型校验弱 | Pydantic Schema,类型安全 |
| 扩展机制 | 改源码或提示词 | Middleware 中间件系统 |
| 异步性能 | 一般 | 优化后提升 30%+ |
老教程里教的那套 AgentExecutor 心智,已经被官方废弃,维护到 2026 年 12 月就停止。现在学它,等于学一个即将下架的东西。
2.2 更深的变化:包结构和心智模型
v1.x 把包结构重新梳理了一遍:
- langchain-core:核心 API,比如 Runnable、BaseMessage
- langchain-classic:0.x 时代的经典 API 迁移到这里,v1 不再直接支持
- langchain-community:第三方集成,按需安装,避免全家桶臃肿
- langgraph:图式编排引擎,1.0 深度整合
比包结构更重要的是心智模型:从链式拼装,到图式编排。
旧时代的写法是把组件一个个串成 chain,prompt 进、结果出,线性执行。流程一旦需要循环、分支、回退,chain 就会变得非常别扭。
LangGraph 的做法是把执行过程建模成一张有向图。节点是你要执行的步骤,边是流转条件,流程怎么走、状态怎么变一目了然。
1.0 还有一个更底层的设计变化:执行状态可以被持久化。LangGraph 会在每一步自动做 checkpoint,进程中断、等待人工审核、服务商故障重试,都会从断点继续,而不是从头再来。
这套心智现在也成了 Agent 框架的共同语言。Google 的 ADK 在 2026 年也收敛到了同样的抽象。
三、组件地图:LangChain 生态的四大支柱
搞清楚 1.0 改了什么,再看 2026 年的 LangChain 到底由哪些部分组成。截至 2026 年,它已经从一个开发框架,长成一个覆盖智能体全生命周期的技术生态,核心是四大支柱:
| 支柱 | 定位 | 一句话理解 |
|---|---|---|
| LangChain | 能力抽象层 | 统一模型、工具、消息的接口,负责"有什么能力" |
| LangGraph | 执行编排层 | 有向图编排工作流,负责"怎么跑" |
| Deep Agent | 智能体抽象层 | Agent Harness,规划、子 Agent、虚拟文件系统 |
| LangSmith | 监控评估层 | 全链路追踪、评测,让 Agent 可观测 |
3.1 LangChain:智能体开发的基石
LangChain 是整个生态的起点,提供三块核心能力:
- 统一的模型抽象层:屏蔽不同模型提供商(OpenAI、Anthropic、DeepSeek、Ollama)的接口差异,一套 API 调用所有模型
- 高度模块化:Message、Tool、Agent、Middleware 等组件灵活组合
- 丰富的集成生态:预置大量数据源和 API 集成
官方文档有一句话说得直接:快速起步用 LangChain,复杂控制用 LangGraph,二者并行协同。
3.2 LangGraph:复杂工作流的编排引擎
LangGraph 的核心思想是把智能体内部抽象成一张有向图:
- 节点(Node):独立的功能单元或决策点
- 边(Edge):节点间的流转条件与路径
- 状态(State):共享上下文,在节点间传递并持久化
需要多步、有状态、带人工审核的复杂工作流,就是 LangGraph 的舞台。
3.3 Deep Agent:智能体的执行框架
Deep Agent 是 2026 年推出的新组件,定位是 Agent Harness(智能体执行框架)。它构建在 LangChain 和 LangGraph 之上,增加了显式规划、虚拟文件系统、子智能体、长期记忆等能力,让开发者可以快速构建具备深度规划的复杂智能体。
3.4 LangSmith:可视化监控与测试
当智能体越来越复杂,靠 print 调试已经不现实。LangSmith 提供全链路追踪、调试优化、评测质控和团队协作,让 Agent 的运行过程透明、可评估。
四个支柱合在一起,正好覆盖从技术验证到生产部署的完整闭环。后面整个系列,都会沿着这条线展开。
四、何时上框架:裸调 API 与 LangChain 的边界
理解了生态全貌,一个现实的问题摆在面前:我到底要不要用 LangChain?
这个问题值得认真回答,因为 LangChain 一直有"过度封装"的争议。我的判断标准很简单:看你的应用复杂度到了哪一档。
4.1 复杂度分级
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 单次问答、一个 prompt | 直接调 SDK | 裸写几行代码,无框架开销 |
| 多轮对话 + 系统提示 | 裸写 + 手动管理 messages | 可控,心智负担小 |
| 需要多模型切换、结构化输出 | init_chat_model + LangChain | 统一接口的价值开始体现 |
| 工具调用、Agent 循环 | LangChain + create_agent | 复用成熟实现,别重复造轮子 |
| 多步、分支、人工审核、持久化 | LangGraph StateGraph | 图式编排是唯一合理选择 |
4.2 一个算账式的判断
裸调 API 的成本是显性的:每一行胶水代码(重试、日志、token 统计、模型切换)都要自己写,写多了就是重复劳动。
LangChain 的成本是隐性的:抽象层学习曲线、版本演进、依赖管理。你花时间学它的抽象,换来的是不需要自己维护胶水代码。
我的经验是:从第三个场景开始,LangChain 的价值就超过了它的成本。一旦你的应用要接多个模型、要做结构化输出、要接工具,裸写的维护成本会快速超过框架的抽象成本。
五、动手:从第一个模型调用开始
纸上谈兵结束,开始写代码。这个系列全程使用 LangChain 1.x 的新 API,不碰任何旧写法。
5.1 环境准备
# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate # Windows 用 .venv\Scripts\activate
# 安装依赖
pip install langchain langchain-openai python-dotenv
5.2 配置密钥
在项目根目录创建 .env 文件,把 API Key 放进去。这里以 DeepSeek 为例(国产模型,注册送额度,国内直连):
# .env
DEEPSEEK_API_KEY=sk-你的密钥
DEEPSEEK_BASE_URL=https://api.deepseek.com
密钥放 .env,而不是硬编码在代码里。加进 .gitignore,避免泄露。
5.3 用 init_chat_model 创建模型
init_chat_model 是 LangChain 1.x 推出的统一模型入口。只要改一行模型名,就能切换不同的模型提供商:
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
load_dotenv(override=True)
model = init_chat_model(
model="deepseek:deepseek-chat", # 提供商:模型名
temperature=0.7,
)
对比一下,如果你不用 init_chat_model,切换模型要写完全不同的类:
# 不用 init_chat_model 的写法:每家模型一个类
from langchain_deepseek import ChatDeepSeek
deepseek_llm = ChatDeepSeek(model="deepseek-chat")
from langchain_openai import ChatOpenAI
openai_llm = ChatOpenAI(model="gpt-4o")
from langchain_ollama import ChatOllama
ollama_llm = ChatOllama(model="qwen3:14b")
init_chat_model 的好处就是统一:改一行字符串,模型随便换。
5.4 调用模型:invoke
response = model.invoke("用一句话解释什么是 Agent")
print(response.content)
# 输出:Agent 是一个能自主规划并调用工具完成复杂任务的大模型应用。
invoke 返回的不只是文本,而是一个 AIMessage 对象,里面带着 token 消耗和元数据:
print(response.content) # 模型生成的文本
print(response.usage_metadata) # token 统计(input/output/total)
print(response.response_metadata) # 模型名、结束原因等原始元数据
生产环境里,token 统计是成本核算的基础,这个对象设计得很实用。
5.5 多轮对话:messages 列表
单次调用不需要记忆,但多轮对话需要把历史传回去。用字典列表构建消息,是生产环境推荐的做法:
messages = [
{"role": "system", "content": "你是一个专业的搜索架构师。"},
{"role": "user", "content": "RAG 的召回阶段要注意什么?"},
]
resp1 = model.invoke(messages)
print(resp1.content)
# 把 AI 的回答追加进对话,形成多轮
messages.append({"role": "assistant", "content": resp1.content})
messages.append({"role": "user", "content": "那精排阶段呢?"})
resp2 = model.invoke(messages)
print(resp2.content)
如果不把历史传回去,模型就会"失忆":你上一轮刚说过的话,它这轮完全不知道。
5.6 流式输出:stream
聊天的体验要靠流式。stream 返回一个迭代器,可以逐 token 输出,用户不用等整段生成完:
for chunk in model.stream("写一段 100 字的商品文案"):
print(chunk.text, end="", flush=True)
在聊天机器人、长文本生成场景,这个接口是提升体感的关键。
六、动手:从对话到 Agent
模型调用是地基,Agent 才是 LangChain 真正发力的地方。1.x 里构建 Agent 的标准入口是 create_agent。
6.1 定义一个工具
先用 @tool 装饰器定义一个工具。1.x 支持 Pydantic Schema 定义参数,类型安全:
from langchain.tools import tool
@tool
def get_stock_price(symbol: str) -> str:
"""查询股票的实时价格。"""
# 这里接你的行情 API
return f"{symbol} 当前价格: 128.5 元"
6.2 创建 Agent
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
model = init_chat_model("deepseek:deepseek-chat")
agent = create_agent(
model=model,
tools=[get_stock_price],
system_prompt="你是一个专业的金融助手,回答要简洁准确。",
)
response = agent.invoke({"messages": [{"role": "user", "content": "帮我查一下宁德时代的价格"}]})
for message in response["messages"]:
print(f"{message.type}: {message.content}")
注意这里的 Agent 和旧版 AgentExecutor 的关键区别:底层是 LangGraph 驱动的,工具调用、多轮推理、状态流转都是显式的。想看到 Agent 内部怎么思考,response["messages"] 里每一步都有记录。
6.3 什么时候升级到 LangGraph
create_agent 解决的是"够用"的问题。当你的流程出现这些需求时,就该上 LangGraph 的 StateGraph 自己画图了:
- 需要人工审核节点(human-in-the-loop)
- 需要条件分支和循环
- 需要跨进程的状态持久化(checkpoint)
- 需要多个 Agent 协作
这些是后续系列第 7 篇的重点,这里先留个印象:从 create_agent 到 StateGraph,是 LangChain 学习路径上的第二道分水岭。
七、过期教程鉴别清单
最后给你一个判断标准,帮你避开市面上的坑:
| 判断线索 | 结论 |
|---|---|
| 出现 AgentExecutor 或 initialize_agent | 旧内容,跳过 |
| 出现 LLMChain、PromptTemplate 链式写法 | 0.x 时代的写法,对照官方文档甄别 |
| import 来自 langchain.agents 旧式入口 | 1.0 前的写法 |
| 文章发布于 2025 年 10 月之前 | 需要对照新文档甄别 |
| 教你 init_chat_model、create_agent、StateGraph | 新内容,放心学 |
八、系列地图与结语
回到开头那段报错。那个作者后来把代码换成了 create_agent,半小时就通了。其实把代码换成新 API 就好,真正拦人的,是压根不知道旧路已经废弃。
2026 年学 LangChain,先忘掉旧教程。这种变化恰恰说明框架还在快速进化,值得投入时间。
这个系列会沿着四大支柱展开,排成 12 篇 4 个阶段:筑基、核心功、进阶、产线。每篇一张架构图、一张决策表、一段能跑的代码。
筑基:组件地图(本篇)→ 模型 I/O → 结构化输出
核心功:RAG 实战 → Agent 循环 → 工具定义
进阶:LangGraph 状态机 → MCP 接入 → 多 Agent 演进
产线:LangSmith 评测 → 生产部署 → 收官 Demo
下一篇,我们来拆模型 I/O 和结构化输出:怎么让 AI 稳定返回你想要的 JSON,而不是一段自由发挥的文字。
关注我,跟着一个在产线上跑过 Search Agent 的老后端,把 LangChain 学明白。