LangChain 把 agent 拆成模型、工具、提示词和中间件
LangChain 以 create_agent 为核心,把 agent 拆成模型、工具、提示词与中间件四部分;
一个 agent 框架最容易犯的错,是把「简单」做复杂。LangChain 这次反过来了:官网首页对它的定义只有一句——create_agent,一个最小、高度可配置的 agent harness,从模型、工具、提示词和中间件里,组合出你实际需要的那一个 agent。
这句话值得当真。它意味着 LangChain 不再把自己包装成「什么都能干的大而全框架」,而是承认:agent 的本质就是把四样东西拼起来,框架的职责是把拼接这件事做得可配置、可替换、可演进。
从一行模型调用开始的抽象层
README 的 Quickstart 短到有点反常:
bashuv add langchain
pythonfrom langchain.chat_models import init_chat_model model = init_chat_model("openai:gpt-5.5") result = model.invoke("Hello, world!")
两个动作:装包,初始化模型,调用。没有 chain,没有 agent,没有工具注册。这是刻意的——LangChain 的入口是「统一模型接口」,而不是「agent 编排」。
init_chat_model 接受的是 provider:model 形式的字符串。这个设计背后是 README 里反复强调的一条能力:model interoperability。团队在选型阶段会不断换模型,LangChain 的抽象层让换模型不打断工程节奏。字符串里换一个 provider 前缀,调用方式不变。
这条抽象线还延伸到了 embeddings、vector stores、retrievers、tools。README 把它们统称为「a standard interface」——标准接口是 LangChain 整个项目的骨架,agent 只是长在这副骨架上的东西。
四层结构:agent 是怎么被拼出来的
把 README 和官网描述对照着看,LangChain 的架构可以归纳成下面这几层。每一层的组件名都来自素材本身,不是外部推测。
| 层 | 组成 | 职责 |
|---|---|---|
| 接口层 | init_chat_model、chat & embedding models、vector stores、retrievers、tools & toolkits | 用统一接口屏蔽不同 provider 的差异,模型可换、工具可插 |
| 组合层 | create_agent(agent harness) | 把 model、tools、prompt、middleware 四要素组合成一个可运行的 agent |
| 编排层 | LangGraph | 低层 agent 编排框架,处理需要可靠执行复杂任务的场景 |
| 上层封装 | Deep Agents | 在 LangChain 之上,内置 planning、subagents、file system 使用等常见模式 |
| 运行与观测 | LangSmith、LangSmith Deployment | agent 的 eval、可观测性、调试,以及长时有状态 workflow 的部署与扩缩 |
这个分层有个清晰的意图:默认路径尽量短,复杂需求逐层下沉。
- 只想调模型?停在接口层,两行代码。
- 要一个能调工具的 agent?用
create_agent,在四要素上做配置。 - 要可控的、多步的、需要状态和分支的编排?交给 LangGraph。
- 要开箱即用的 planning、子 agent、文件系统?用 Deep Agents,它建在 LangChain 之上。
README 里那句「Flexible abstraction layers」说的就是这件事:从高层 chain 快速起步,到低层组件细粒度控制,抽象层级由你选,应用复杂度增长时框架跟着长。
数据流向上也顺着这个分层走:模型调用经接口层统一;工具调用由组合层的 harness 调度;需要跨步骤保持状态、做分支和循环时,下沉到 LangGraph;整个过程的事件与轨迹经 LangSmith 观测。
中间件:这次真正的差异点
官网描述里最不寻常的词是 middleware。
大多数 agent 框架的四要素是「模型、工具、提示词」,LangChain 多塞了一个中间件。这意味着 agent harness 不是把四样东西硬编码进一个循环,而是在循环的关键位置留了可插拔的钩子——你可以在不重写 agent 主体的前提下,改变它的行为。
素材没有展开中间件的具体接口和生命周期位置,这里不做猜测。但从「minimal, highly configurable」这个自我定位能读出取舍:主体保持最小,配置性交给中间件承担。这跟「堆功能进核心」是两条路。前者核心稳定、扩展在边缘;后者核心膨胀、每次改动都牵一发动全身。LangChain 选了前者。
生态不是附属品,是架构的一部分
README 把生态单独列了一节,并且明确说:框架可以独立使用,但也和 LangChain 产品无缝集成。列出的成员是:
- Deep Agents — 内置 planning、subagents、file system 的 agent
- LangGraph — 低层编排框架,面向可靠处理复杂任务
- Integrations — chat & embedding models、tools & toolkits 等
- LangSmith — agent 的 eval、observability、debugging
- LangSmith Deployment — 面向长时有状态 workflow 的部署与扩缩平台
这几个不是并列的产品清单,而是按「抽象高度」和「生命周期阶段」排布的:写 agent 用 LangChain / Deep Agents,编排用 LangGraph,调优用 LangSmith,上线用 LangSmith Deployment。一个项目从原型走到生产,路径是连续的。
和同主题项目比,它站在哪一格
| 项目 | 语言 | 定位 | 与 LangChain 的关系 |
|---|---|---|---|
| LangChain | Python | agent 开发平台,统一模型/工具/向量库接口 + create_agent harness | — |
| AutoGPT | Python | 给一个目标,自主规划步骤、调用工具、迭代执行 | 更偏「成品 agent 应用」,LangChain 更偏「造 agent 的底座」 |
| hermes-agent | Python | 把 prompt、工具调用、workflow 串起来,接自己的 LLM 调本地 CLI 或外部 SDK | 同为 agent 框架,LangChain 的差异在统一接口层与生态分层 |
| ECC | JavaScript | 给 Claude Code、Codex、Cursor 等现有 agent 加装 skills 与记忆层 | 不改 agent 本体,做外挂增强;LangChain 是从接口层开始搭 |
| firecrawl | TypeScript | 网页抓取解析成 Markdown / 结构化 JSON,喂给 LLM 与 RAG | 数据供给端,可作为 LangChain 的工具或检索数据源 |
| ollama | Go | 本地一条命令跑模型,提供 CLI 与 SDK | 模型供给端,与 LangChain 的模型抽象层互补 |
这张表能看出一件事:LangChain 的位置在「供给端」和「应用端」之间。Ollama 供模型,Firecrawl 供数据,AutoGPT 是跑起来的成品,ECC 是给成品加装能力。LangChain 做的是中间那层——把供给接进来,把应用搭出去。
这也解释了它为什么强调 model interoperability:它站在中间,上游的 provider 会变,下游的应用需求会变,唯一能稳定提供价值的就是那层标准接口。
仓库本身的事实
| 项 | 值 |
|---|---|
| 源码 | github.com/langchain-ai/langchain |
| 官网文档 | docs.langchain.com/langchain |
| 语言 | Python |
| 许可 | MIT |
| 星标 | 147986 |
| forks | 24837 |
| open issues | 657 |
| 创建时间 | 2022-10-17 |
| 最近推送 | 2026-10-17 |
| topics | agents, ai-agents, anthropic, chatgpt, deepagents, enterprise, framework, gemini, generative-ai, langgraph, llm, multiagent, openai, pydantic, python, rag, typescript |
topics 里同时出现 langgraph、deepagents、rag、multiagent、enterprise,和 README 的分层是对得上的:它不是单一用途的库,而是一个覆盖从 RAG 到多 agent 到企业部署的框架族。pydantic 出现在 topics 里,说明类型与结构化输出在它的设计里占位置——这一点 README 没有展开,但可以从 topics 读出方向。
怎么选:三条路径
如果你的需求是下面三种之一,路径不一样:
- 只想统一模型调用。停在接口层,
init_chat_model加invoke,不引入 agent 概念。这是 README 给的最小路径。 - 要一个能调工具的 agent。用
create_agent,在 model、tools、prompt、middleware 四个维度上配置。需要改行为时优先动中间件,而不是改 agent 主体。 - 要可控的多步编排,或开箱的 planning / 子 agent / 文件系统。往下走 LangGraph,往上走 Deep Agents。README 对这两者的定位写得很明确:LangGraph 是「controllable agent workflows」的低层框架,Deep Agents 是「higher-level package built on LangChain」。
还有一条不在代码里但 README 明确点出的路径:开发、调试、部署阶段接 LangSmith。观测和 eval 不是可选项,是这套分层的一部分。
一句话的取舍
LangChain 这次的核心主张可以压成一句:agent 框架的价值不在替你决定 agent 长什么样,而在让你能精确地组合出你要的那一个,并且在底层技术变化时不用推倒重来。
create_agent 是这句话的落点,中间件是它的弹性来源,统一接口层是它的稳定底座,LangGraph 与 Deep Agents 是它在两个方向上的延伸。至于这条路走不走得通,取决于中间件的表达能力够不够——素材里没给接口细节,这里不下结论。
想上手,从 README 那两行开始就够了:装包,init_chat_model,invoke。先把模型调通,再决定要不要往上加工具、加中间件、加编排。