LangChain Agent 与 Deep Agent 深度解析
一、核心概念:两个函数的定位
1.1 create_agent --- 通用基础框架
create_agent 是 LangChain 官方提供的通用 Agent 创建函数,位于 langchain/agents/factory.py。它提供了最基础的 Agent 架构:
┌─────────────────────────────────────────────────────────┐
│ create_agent │
├─────────────────────────────────────────────────────────┤
│ • 创建 LangGraph StateGraph │
│ • 核心节点:model + tools(可选) │
│ • 支持 8 个中间件钩子接口 │
│ • 工具循环:model → tools → model → ... │
│ • 支持结构化输出 response_format │
└─────────────────────────────────────────────────────────┘
1.2 create_deep_agent --- 预置全家桶
create_deep_agent 是 deepagents 库的高级封装,基于 create_agent 构建,添加了大量开箱即用的企业级功能:
┌─────────────────────────────────────────────────────────┐
│ create_deep_agent │
├─────────────────────────────────────────────────────────┤
│ ✓ 调用 create_agent(底层实现) │
│ ✓ 预置 BASE_AGENT_PROMPT │
│ ✓ 注入 8 个内置中间件 │
│ ✓ 配置默认模型(Claude Sonnet 4.5) │
│ ✓ 支持子代理系统、Skill、Memory │
│ ✓ 支持后端抽象(开发/生产环境切换) │
└─────────────────────────────────────────────────────────┘
二、功能对比
| 特性 | create_agent |
create_deep_agent |
|---|---|---|
| 默认模型 | 无(需手动指定) | Claude Sonnet 4.5 |
| 内置工具 | 无 | ls, read_file, write_file, execute, task 等 |
| 内置中间件 | 无 | 8 个预置中间件 |
| 子代理系统 | 需手动实现 | subagents 参数直接配置 |
| 后端支持 | 无 | StateBackend / FilesystemBackend |
| 人工介入 | 需自己实现 | interrupt_on 参数 |
| System Prompt | 用户完全自定义 | 预置 BASE_AGENT_PROMPT |
三、预置全家桶的位置
3.1 基础 System Prompt
预置的 AI 行为指导 prompt,包含核心行为准则、专业客观风格、任务执行流程等。
3.2 内置中间件栈
┌──────────────────────────────────────────────────────────┐
│ deepagent_middleware 栈 │
├──────────────────────────────────────────────────────────┤
│ 1. TodoListMiddleware → Todo 列表管理 │
│ 2. MemoryMiddleware → 记忆加载 │
│ 3. SkillsMiddleware → Skill 能力扩展 │
│ 4. FilesystemMiddleware → 文件系统操作 │
│ 5. SubAgentMiddleware → 子代理调用 │
│ 6. SummarizationMiddleware → 消息压缩 │
│ 7. AnthropicPromptCachingMiddleware → 提示缓存 │
│ 8. PatchToolCallsMiddleware → 工具调用修补 │
└──────────────────────────────────────────────────────────┘
四、tools 参数的作用
4.1 工具来源对比
| 来源 | 工具类型 | 示例 |
|---|---|---|
| 内置 Middleware | 通用能力 | 文件操作、子代理、Shell 执行 |
tools 参数 |
业务自定义 | 天气查询、数据库查询、内部 API |
4.2 使用示例
python
from deepagents import create_deep_agent
# 业务自定义工具
def query_orders(order_id: str) -> dict:
"""查询订单信息"""
return {"order_id": order_id, "status": "shipped"}
def search_internal_docs(query: str) -> str:
"""搜索内部文档"""
return "搜索结果..."
# 使用内置能力 + 自定义业务工具
agent = create_deep_agent(
tools=[query_orders, search_internal_docs], # 你的业务工具
)
五、工具调用时机
5.1 调用流程(两者完全相同)
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Model │────▶│ ToolNode │────▶│ Model │────▶│ END │
│ invoke() │ │ 执行工具 │ │ 处理结果 │ │ │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
│ │ │
tool_calls ToolMessage tool_calls
无论工具来自 Middleware 还是 tools 参数,调用时机完全相同:
- Model 输出
tool_calls - ToolNode 执行对应工具
- 返回
ToolMessage给 Model - Model 继续处理
5.2 唯一的区别:注册时机
| 来源 | 注册时机 | 灵活性 |
|---|---|---|
tools 参数 |
静态 - agent 创建时确定 | 固定 |
| Middleware 工具 | 动态 - 可在运行时注册 | 更灵活 |
六、为什么用 Middleware 而非直接内置?
6.1 不仅仅只是"工具"
这些 Middleware 提供的远不止简单工具,而是带状态的复杂能力:
python
# 文件系统中间件 - 需要 backend 来确定如何执行
FilesystemMiddleware(backend=backend)
# 子代理中间件 - 不是简单工具,是复杂编排
SubAgentMiddleware(backend=backend, subagents=all_subagents)
# 记忆中间件 - 需要 backend 存储
MemoryMiddleware(backend=backend, sources=memory)
# Skill 中间件 - 运行时动态加载
SkillsMiddleware(backend=backend, sources=skills)
6.2 架构优势对比
| 方面 | 直接 tools=[] |
Middleware |
|---|---|---|
| 配置能力 | 固定 | 可传参数(backend、sources 等) |
| 状态管理 | 无 | 有自己的状态 |
| 后端解耦 | 硬编码 | 可切换执行后端 |
| 动态能力 | 静态 | 可运行时加载 |
| 编排逻辑 | 无 | 复杂流程控制 |
6.3 关键:后端抽象
┌─────────────────────────────────────────────────────────┐
│ Backend 抽象层 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ StateBackend │ │ FilesystemBackend │ │
│ │ (内存模拟) │ │ (真实文件系统) │ │
│ └──────────────┘ └──────────────────┘ │
│ ▲ ▲ │
│ │ backend │ │
│ └───────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────┐ │
│ │ FilesystemMiddleware / SubAgentMiddleware │ │
│ └──────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
通过 backend 参数,可以轻松切换:
- 开发环境 :用
StateBackend(内存模拟,安全快速) - 生产环境 :用
FilesystemBackend(真实文件系统)
七、总结
| 对比维度 | create_agent |
create_deep_agent |
|---|---|---|
| 定位 | 通用框架 | 预置全家桶 |
| 复杂度 | 低(需自己组合) | 高(开箱即用) |
| 适用场景 | 简单场景、定制化需求 | 复杂企业场景 |
| 工具来源 | 手动传入 | Middleware + tools 参数 |
| 后端支持 | 无 | 有(可切换) |
核心理解:
create_agent= 通用框架,你自己组合中间件和工具create_deep_agent= 预置全家桶,开箱即用的 AI 助手,适合需要文件操作、子代理、记忆等复杂场景
通过 Middleware 提供内置工具是为了 可配置、可替换、带状态 --- 工具不是孤立的函数,而是需要执行环境(backend)、需要动态加载能力(Skills、Memory)、需要复杂编排(SubAgent)。