DeepAgents 深入学习指南:生产级 AI 智能体开发

Cosolar 83 阅读 AI Agent

基于 deepagents v0.6.8 | 最后更新:2026-06-10


目录


第一章:项目概览与核心概念

1.1 什么是 Deep Agents?

在当今的 AI 智能体开发领域,开发者面临一个核心问题:如何在构建简单智能体和打造生产级智能体之间找到平衡。LangChain 生态为此提供了分层解决方案,而 Deep Agents 正是这个分层体系中处于最上层的关键组件。

要真正理解 Deep Agents 的定位,需要先理解它所在生态中的三个层次:

LangGraph 是最底层的图运行时引擎。它提供了构建有状态智能体的基础设施——流式输出、持久化存储、检查点机制、并发控制和优雅的中断恢复。但 LangGraph 的设计哲学是"提供砖块,但不提供房子"。如果你要构建一个需要多步推理、条件分支和状态管理的智能体,LangGraph 是基础,但它没有预设任何智能体行为模式——你需要自己定义图结构、工具循环、状态管理策略。

LangChain 的 create_agent 是在 LangGraph 之上构建的轻量级智能体框架。它为你搭了一个"能跑的基础框架"——智能体接收消息,决定调用哪个工具,获取工具结果,继续推理。但它的设计哲学是"极简主义"——刻意不做太多默认假设。它没有内置的对话压缩(长对话会溢出上下文窗口)、没有子代理概念(无法委托任务)、没有文件系统抽象(每个开发者的文件操作方式都不同)。

Deep Agents 是在 create_agent 之上构建的"装配齐全的整车"。它在保留 LangGraph 全部能力的同时,提供了一套"有主见"(opinionated)的完整方案——内置了子代理管理、文件系统操作、对话压缩、持久化记忆、技能系统、人机协作等生产级特性。这些特性不是随意堆砌的,而是经过团队在大量真实使用场景中验证过的标配能力。

+----------------------------------+
|  Deep Agents                     |  <-- 开箱即用的完整框架,包含所有生产级特性
|  +----------------------------+  |
|  |  LangChain create_agent    |  |  <-- 轻量级智能体框架,最小工具循环
|  |  +----------------------+  |  |
|  |  |  LangGraph           |  |  |  <-- 图运行时引擎,提供状态管理和流式输出
|  |  +----------------------+  |  |
|  +----------------------------+  |
+----------------------------------+

1.2 核心设计原则

Deep Agents 的设计遵循四条核心原则。它们不是空洞的口号,而是体现框架每一个设计决策中的指导思想:

原则一:Opinionated(有主见但不固执)。 "有主见"意味着框架为你做了很多决策——这些决策基于团队在大量真实使用场景中的实践经验。例如,默认开启对话摘要(因为长对话必然导致上下文溢出是生产环境最常见的问题)、默认添加通用子代理(因为任务委托是处理复杂任务的最佳策略)、默认使用增量消息归约器(因为 O(N²) 的检查点增长在生产中不可接受)。你不用从零开始——你获得的是经历过生产环境考验的起点。当然,如果你不同意这些默认值,可以通过 Profile 系统或中间件排除来覆盖它们。

原则二:Extensible(可扩展但不需要)。 可扩展性体现在三个层面:配置级(Profile 系统,不需要写代码)、中间件级(实现 AgentMiddleware 接口插入自定义逻辑)、组件级(替换整个后端、创建自定义子代理、修改状态 Schema)。但关键是——大多数场景下你不需要扩展,开箱即用已经足够强大。扩展机制是为那些真正需要深度定制的特殊场景准备的。

原则三:Model-agnostic(模型无关)。 框架不绑定任何特定模型提供商。从 OpenAI 的 GPT 到 Anthropic 的 Claude,从 Google 的 Gemini 到自托管的 Ollama 模型,任何支持工具调用的 LLM 都可以使用。这种灵活性通过 init_chat_model 标准化接口实现——框架内部只与 BaseChatModel 接口交互,完全不关心底层模型是谁。这意味着你可以根据任务需求、成本预算和延迟要求灵活选择模型。

原则四:Production-ready(生产就绪)。 Deep Agents 不是实验室玩具。建立在 LangGraph 之上意味着你免费获得所有 LangGraph 的生产级特性。开发环境和生产环境用的是同一套代码——不需要"原型写完再重写"。框架内部做了大量生产环境优化,如增量检查点、流式输出、优雅的错误恢复等。

1.3 核心特性一览

Deep Agents 的八大核心特性各有侧重,它们通过统一的中间件栈协同工作:

特性 说明 解决的核心问题
Sub-agents 将任务委托给拥有独立上下文窗口的子代理 复杂任务分解 + 上下文隔离 + Token 节省
Filesystem 可插拔的本地/沙箱/远程文件系统后端 智能体文件操作的统一抽象层
Context management 长对话自动摘要,工具输出卸载到磁盘 上下文窗口溢出——长对话的头号敌人
Shell access 在沙箱环境中执行命令 智能体需要执行代码、运行测试
Persistent memory 跨会话记忆,可插拔的存储后端 会话间的知识延续
Human-in-the-loop 工具调用前的人工审批 安全控制和质量把关
Skills 按需加载的可复用行为模式 知识复用和工作流标准化
Tools 自定义函数或任何 MCP 服务器 能力扩展

1.4 仓库结构

Deep Agents 采用 monorepo 结构。核心 SDK 在 libs/deepagents/,配套工具在其他目录:

deepagents/
+-- libs/
|   +-- deepagents/     # 核心 SDK(本教程重点)——所有智能体逻辑
|   +-- cli/            # CLI 部署工具——init/dev/deploy 命令
|   +-- code/           # Deep Agents Code 终端编码助手
|   +-- acp/            # Agent Context Protocol 支持
|   +-- evals/          # 评估套件——回归测试和性能基准
|   +-- partners/       # 第三方集成(Daytona、Modal、QuickJS 等)
+-- examples/           # 示例项目——学习实战用法的最佳起点
+-- .github/            # CI/CD 工作流

核心 SDK 内部结构。建议对照源码阅读后续章节:

libs/deepagents/deepagents/
+-- graph.py            # 核心入口:create_deep_agent 函数
+-- _models.py          # 模型字符串解析逻辑
+-- _tools.py           # 工具描述覆写机制
+-- _messages_reducer.py # 增量消息归约器(DeltaChannel 实现)
+-- backends/           # 后端实现——存储抽象层
|   +-- protocol.py     # BackendProtocol 接口定义
|   +-- state.py        # StateBackend——内存/临时存储
|   +-- filesystem.py   # FilesystemBackend——本地文件系统
|   +-- local_shell.py  # LocalShellBackend——本地 Shell + 文件系统
|   +-- composite.py    # CompositeBackend——路径路由组合
|   +-- store.py        # StoreBackend——LangGraph BaseStore
|   +-- sandbox.py      # BaseSandbox——沙箱基类
|   +-- langsmith.py    # LangSmithSandbox——远程安全执行
|   +-- context_hub.py  # ContextHubBackend——LangSmith Hub
+-- middleware/          # 中间件——扩展机制核心
|   +-- filesystem.py   # 文件系统中间件 + 内置文件工具
|   +-- subagents.py    # 同步子代理中间件
|   +-- async_subagents.py # 异步子代理中间件
|   +-- memory.py       # 记忆中间件
|   +-- skills.py       # 技能中间件
|   +-- summarization.py # 对话摘要中间件
|   +-- rubric.py       # 自我评估迭代中间件
|   +-- permissions.py  # 权限模块(向后兼容重导出)
|   +-- patch_tool_calls.py # 修补悬空工具调用
+-- profiles/           # 配置档案
    +-- harness/        # Harness Profile——运行时行为调优
    +-- provider/       # Provider Profile——模型构造参数

第二章:快速上手

2.1 安装与环境配置

Deep Agents 的安装非常直接。推荐 uv 作为包管理器:

# 使用 uv(推荐——依赖解析速度远优于 pip)
uv add deepagents

# 或使用 pip
pip install deepagents

环境要求: Python >= 3.11。这是因为框架内部使用了 typing.Self、ExceptionGroup 和 tomllib 等 Python 3.11+ 特性。

验证安装:

import deepagents
print(deepagents.__version__)  # 应输出 '0.6.8' 或更高

2.2 最简示例

下面是创建和运行一个基础 Deep Agent 的最简代码。虽然只有几行,但框架在背后自动完成了大量工作:

from deepagents import create_deep_agent

# 创建智能体——使用模型字符串格式
agent = create_deep_agent(
    model="openai:gpt-5.5",
)

# 调用智能体
result = agent.invoke({"messages": "你好,请介绍一下你自己"})
print(result["messages"][-1].content)

背后发生了什么? 调用 create_deep_agent 时,框架在内部自动完成以下步骤:

  1. 模型解析:将字符串 "openai:gpt-5.5" 解析为 BaseChatModel 实例,同时自动应用 OpenAI 的 Provider Profile(启用 Responses API、设置默认参数)。

  2. 中间件栈组装:按预定义顺序组装 12 层中间件——从待办事项管理到文件系统、子代理、对话摘要、人机协作等。这个多层架构让智能体获得了丰富的内置能力。

  3. 工具注册:注册 9 个内置工具——write_todos、ls、read_file、write_file、edit_file、glob、grep、execute、task。即使你一个工具都没指定,智能体也已具备完整的文件操作和任务管理能力。

  4. 系统提示词组装:生成包含文件系统使用指南、工具规范、行为约束的完整系统提示词。这是按 USER → BASE → SUFFIX 三段式结构组织的。

  5. 图编译:将所有组件编译为 LangGraph CompiledStateGraph,验证图的完整性、优化执行路径、设置检查点策略。

agent.invoke() 返回的结果中,messages 列表包含完整的对话历史,最后一条消息的 content 就是智能体的最终回复。

2.3 添加自定义工具

为智能体添加自定义能力非常简单。LangChain 的 @tool 装饰器会自动将 docstring 转为工具描述、将类型注解转为 JSON Schema:

from deepagents import create_deep_agent
from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    """获取指定城市的天气信息。"""
    # 实际使用中替换为真实 API 调用
    return f"{city}今天晴,温度25度"

agent = create_deep_agent(
    model="openai:gpt-5.5",
    tools=[get_weather],
    system_prompt="你是一个天气助手,帮助用户查询天气信息。",
)

result = agent.invoke({"messages": "北京今天天气怎么样?"})
print(result["messages"][-1].content)

关于 system_prompt: 你传入的系统提示词被放在整个提示词体系的最前面,获得最高优先级。框架随后会追加自己的基础提示词(文件系统指南等)和尾部提示词(模型调优指导)。如果你需要完全替换基础提示词,使用第五章介绍的 Harness Profile。

2.4 流式输出与多轮对话

流式输出让用户看到智能体"正在思考"的过程,对于长时间任务至关重要:

from deepagents import create_deep_agent

agent = create_deep_agent(model="openai:gpt-5.5")

# 流式输出
for chunk in agent.stream(
    {"messages": "请写一首关于春天的诗"},
    config={"configurable": {"thread_id": "poem-session"}},
    stream_mode="values",
):
    if "messages" in chunk:
        messages = chunk["messages"]
        last_msg = messages[-1]
        if hasattr(last_msg, "content") and last_msg.content:
            print(last_msg.content, end="", flush=True)

关键参数: thread_id 是会话标识符——同一个 ID 的多次调用共享对话历史,这是实现多轮对话的基础。stream_mode="values" 每次返回完整状态,flush=True 确保输出立即显示。

2.5 异步调用

异步接口适合 FastAPI 等异步框架:

import asyncio
from deepagents import create_deep_agent

async def main():
    agent = create_deep_agent(model="openai:gpt-5.5")
    result = await agent.ainvoke({"messages": "你好"})
    print(result["messages"][-1].content)

asyncio.run(main())

所有异步方法在同步方法名前加 a 前缀:invoke → ainvoke、stream → astream。注意后端和 checkpointer 也需要使用异步版本(如 AsyncPostgresSaver)。


第三章:核心 API — create_deep_agent 详解

create_deep_agent 是整个框架的唯一入口函数。深入理解它的每个参数和内部工作机制,是从"会用"迈向"精通"的关键。

3.1 完整签名

18 个参数初看可能让人望而生畏,但按功能分组后非常清晰:

def create_deep_agent(
    # === 核心配置 ===
    model: str | BaseChatModel | None = None,       # 智能体的"大脑"
    tools: Sequence[BaseTool | Callable | dict] | None = None,  # 自定义工具
    system_prompt: str | SystemMessage | None = None,  # 自定义系统提示词
    *,
    # === 高级特性 ===
    middleware: Sequence[AgentMiddleware] = (),         # 额外中间件
    subagents: Sequence[SubAgent | CompiledSubAgent | AsyncSubAgent] | None = None,
    skills: list[str] | None = None,                   # 技能路径
    memory: list[str] | None = None,                   # 记忆文件路径
    permissions: list[FilesystemPermission] | None = None,
    # === 基础设施 ===
    backend: BackendProtocol | BackendFactory | None = None,
    checkpointer: Checkpointer | None = None,
    store: BaseStore | None = None,
    cache: BaseCache | None = None,
    # === 行为控制 ===
    interrupt_on: dict[str, bool | InterruptOnConfig] | None = None,
    response_format: ResponseFormat | type | dict | None = None,
    # === 高级定制 ===
    state_schema: type[DeepAgentState] | None = None,
    context_schema: type[ContextT] | None = None,
    debug: bool = False,
    name: str | None = None,
) -> CompiledStateGraph

分组理解:

  • 核心配置(model, tools, system_prompt):定义智能体的"大脑"和能力基础
  • 高级特性(subagents, skills, memory, permissions):启用 Deep Agents 的独特功能
  • 基础设施(backend, checkpointer, store, cache):配置持久化和执行环境
  • 行为控制(middleware, interrupt_on, response_format):微调运行时行为
  • 高级定制(state_schema, context_schema, name, debug):深度定制

3.2 内置工具体系

默认情况下,智能体拥有 9 个内置工具:

工具 类型 说明 典型场景
write_todos 任务管理 创建和管理待办事项 复杂多步骤任务规划
ls 文件操作 列出目录(单层,不递归) 探索项目结构
read_file 文件操作 分页读取(默认100行) 查看源码和文档
write_file 文件操作 创建新文件(不覆盖已存在) 创建新脚本和配置
edit_file 文件操作 精确字符串匹配编辑 修改现有代码
glob 文件操作 glob 模式递归查找 查找特定类型文件
grep 文件操作 字面量文本搜索(非正则) 搜索函数定义和引用
execute Shell 沙箱中执行命令 运行测试和构建
task 子代理 委托任务给子代理 分解复杂任务

关于 grep 的重要说明: 使用的是字面量文本匹配而非正则表达式。"def my_func" 会精确匹配,"def my_func.*" 不会被视为正则——这是为了避免 LLM 在正则语法上出错。

关于 execute 的可用性: 仅在实现了 SandboxBackendProtocol 的后端(如 LocalShellBackend、LangSmithSandbox)上可用。

3.3 系统提示词组装

最终系统提示词按三段式严格拼接:

USER(用户 system_prompt)—— 最前面,获得最高注意力
    |
BASE 或 CUSTOM(默认或自定义基础提示词)
    |
SUFFIX(HarnessProfile 尾部提示词)—— 最后面,最接近对话

两个关键不变量:

  1. USER 在最前面:用户的指令拥有最高优先级,无论框架添加了多少内置指令
  2. SUFFIX 在最后面:模型调优指导最接近对话历史,对即时行为影响最大

3.4 中间件栈完整顺序

Base Stack(基础栈——从外到内):
  1. TodoListMiddleware          -- 任务规划,最先执行
  2. SkillsMiddleware            -- 技能加载
  3. FilesystemMiddleware        -- 文件系统(必需,不可排除)
  4. SubAgentMiddleware          -- 同步子代理(有子代理时必需)
  5. SummarizationMiddleware     -- 对话摘要
  6. PatchToolCallsMiddleware    -- 修补悬空工具调用
  7. AsyncSubAgentMiddleware     -- 异步子代理

  <-- 用户自定义 middleware 插入位置 -->

Tail Stack(尾部栈——从外到内):
  8. Harness Profile extra_middleware
  9. _ToolExclusionMiddleware    -- 工具排除
  10. AnthropicPromptCachingMiddleware
  11. MemoryMiddleware           -- 记忆加载
  12. HumanInTheLoopMiddleware   -- 人机协作(最外层防线)

设计考量: FilesystemMiddleware 在 SubAgentMiddleware 之前(子代理也需要文件系统);SummarizationMiddleware 在 PatchToolCallsMiddleware 之前(先压缩再修补);MemoryMiddleware 靠近外层(记忆注入在提示词修改完成后);HumanInTheLoopMiddleware 在最外层(所有工具调用的最后防线)。

3.5 DeepAgentState 与 DeltaChannel

class DeepAgentState(AgentState):
    messages: Required[Annotated[
        list[AnyMessage],
        DeltaChannel(_messages_delta_reducer, snapshot_frequency=50)
    ]]

解决的问题: 在 LangGraph 中,每次状态更新创建检查点。不优化的话存储开销以 O(N²) 增长。DeltaChannel 将开销降到 O(N)——每 50 步做一次完整快照,快照之间只存增量。读取时从最近快照 + 增量重建完整状态。对开发者完全透明。


第四章:模型配置与 Provider Profile

4.1 三种模型指定方式

# 方式 1:字符串格式(强烈推荐——自动应用 Profile)
agent = create_deep_agent(model="openai:gpt-5.5")

# 方式 2:预初始化实例(跳过 Profile 自动应用)
from langchain.chat_models import init_chat_model
model = init_chat_model("anthropic:claude-sonnet-4-6", temperature=0.0)
agent = create_deep_agent(model=model)

# 方式 3:None(已弃用——会触发 DeprecationWarning)
agent = create_deep_agent(model=None)

为什么推荐字符串格式? 框架会自动应用 Provider Profile(优化模型构造参数)和 Harness Profile(优化运行时行为)。预初始化实例会跳过这两步。如果你需要精确控制,更好的做法是自定义 Profile 而非跳过它。

4.2 模型解析流程

用户传入 "openai:gpt-5.5"
    ↓
init_chat_model("openai:gpt-5.5", **provider_profile_kwargs)
    ↓
ProviderProfile 查找(优先级递减):
  第1优先级:精确匹配模型全名 "openai:gpt-5.5"
  第2优先级:精确匹配 provider "openai"(含别名匹配)
  第3优先级:无匹配 → 使用默认参数
    ↓
返回 BaseChatModel 实例

4.3 ProviderProfile vs HarnessProfile

维度 ProviderProfile HarnessProfile
作用阶段 模型构造(init_chat_model) 智能体运行(create_deep_agent)
控制内容 构造参数(temperature, max_tokens等) 运行时行为(提示词、工具、中间件)
类比 引擎的制造参数 车辆的操作手册
from deepagents import register_provider_profile, ProviderProfile

register_provider_profile(
    "my-provider",
    ProviderProfile(
        init_kwargs={"temperature": 0.0, "max_tokens": 4096},
    ),
)

内置 Provider Profile:

  • openai:默认启用 Responses API(对工具调用支持更好)
  • openrouter:强制最低 openai SDK 版本 + 应用归属 HTTP 头

4.4 OpenAI 特殊配置

# 切换回 Chat Completions API
model = init_chat_model("openai:gpt-5.5", use_responses_api=False)

# 零数据留存(ZDR)
model = init_chat_model(
    "openai:gpt-5.5",
    use_responses_api=True,
    store=False,
    include=["reasoning.encrypted_content"],
)

4.5 支持的模型提供商

  • 前沿 API:OpenAI、Anthropic、Google(适合主智能体和复杂任务)
  • 开源托管:Baseten、Fireworks、Together AI(适合子代理和高吞吐)
  • 自托管:Ollama、vLLM、llama.cpp(适合离线运行和隐私敏感场景)

按角色选模型: 主智能体用最强模型(负责规划推理);同步子代理用中等模型(原子任务较简单);对话摘要用最轻量模型(任务简单)。


第五章:Harness Profile — 运行时行为调优

5.1 设计理念

HarnessProfile 是基于一个核心洞察设计的:不同模型有不同的"个性",应该用不同的运行时配置来匹配。Claude Sonnet 在决策前倾向仔细规划探索;GPT-5.5 倾向快速行动;Haiku 擅长高效执行原子任务。

Profile 的自动匹配: 使用字符串模型时,框架自动查找并应用匹配的 HarnessProfile。匹配逻辑与 ProviderProfile 相同——先精确匹配模型名,再回退 provider 名。

5.2 字段详解

@dataclass(frozen=True)
class HarnessProfile:
    base_system_prompt: str | None = None       # 完全替换 BASE 提示词
    system_prompt_suffix: str | None = None     # 追加到末尾(最常用!)
    excluded_tools: list[str] | None = None     # 排除内置工具
    excluded_middleware: list[type | str] | None = None  # 排除中间件
    extra_middleware: list[AgentMiddleware] | None = None  # 额外中间件
    general_purpose_subagent: GeneralPurposeSubagentProfile | None = None
    tool_description_overrides: dict[str, str] | None = None  # 覆写工具描述

system_prompt_suffix 是最常用的字段。 它在提示词末尾追加内容,不破坏 BASE 结构。典型用途:添加"使用简洁的语言"、指定输出格式、设定行为约束。

base_system_prompt 是完全替换。 你需要提供完整的文件系统指南等内容。通常只在完全自定义智能体行为时使用。

5.3 注册和使用

from deepagents import register_harness_profile, HarnessProfile, GeneralPurposeSubagentProfile

register_harness_profile(
    "anthropic:claude-haiku-4-5",
    HarnessProfile(
        system_prompt_suffix="使用简洁的回答风格。不超过3句话,除非用户要求详细说明。",
        general_purpose_subagent=GeneralPurposeSubagentProfile(
            description="轻量级研究助手。用于搜索和收集信息的简单任务。",
        ),
        excluded_tools=["execute"],  # Haiku 不需要 Shell
    ),
)

5.4 通用子代理配置

profile = HarnessProfile(
    general_purpose_subagent=GeneralPurposeSubagentProfile(enabled=False),
)

何时禁用: 已有专门子代理且不想被推卸任务;希望主智能体自己处理以获得精确控制。禁用且无其他同步子代理时,task 工具不暴露。

5.5 内置 Profile

模型 设计思路
anthropic:claude-sonnet-4-6 全面文件指南;鼓励"先探索再行动"
anthropic:claude-haiku-4-5 简化提示词;快速决策导向
anthropic:claude-opus-4-7 深度推理导向;三思而后行
openai:codex 代码为中心;强调测试和 lint

5.6 不可排除的中间件

以下中间件排除会抛 ValueError:

  • FilesystemMiddleware:支撑 6 个文件工具 + 权限系统
  • SubAgentMiddleware:支撑 task 工具和子代理机制

第六章:内置工具体系

6.1 文件操作工具

文件操作是智能体最基本的能力。Deep Agents 提供了 6 个精心设计的文件工具。

ls — 列出目录

class LsSchema(BaseModel):
    path: str  # 绝对路径

只列出当前目录,不递归遍历。这是有意为之——避免大型目录产生巨大输出浪费 token。需要递归探索时用 glob。

read_file — 分页读取

class ReadFileSchema(BaseModel):
    file_path: str   # 绝对路径
    offset: int = 0  # 起始行号(0索引)
    limit: int = 100 # 默认100行

分页设计防止大文件吞噬上下文窗口。支持多模态——图片、音频、视频、PDF 返回为多模态内容块。读取超过 5000 行后自动附加环境信息(文件路径、行号范围)。

write_file — 创建新文件

class WriteFileSchema(BaseModel):
    file_path: str
    content: str

只能创建新文件,不能覆盖。 如果文件已存在则失败。这是安全设计——防止意外丢失代码。修改文件请用 edit_file。

edit_file — 精确匹配编辑

class EditFileSchema(BaseModel):
    file_path: str      # 绝对路径
    old_string: str     # 精确匹配文本
    new_string: str     # 替换文本
    replace_all: bool = False

为什么不用行号? 行号在文件修改后会偏移,而精确字符串匹配不受影响。编辑前必须先 read_file 读取文件——这个约束由中间件强制执行。

glob — 模式查找

class GlobSchema(BaseModel):
    pattern: str          # glob 模式
    path: str | None = None  # 搜索根目录

支持 wcmatch 语法:**/*.py、src/**/*.ts、*.{js,ts}、**/test_*.py。

grep — 内容搜索

class GrepSchema(BaseModel):
    pattern: str           # 字面量文本,非正则
    path: str | None = None
    glob: str | None = None  # 文件过滤
    output_mode: Literal["files_with_matches", "content", "count"] = "files_with_matches"

三种模式:files_with_matches(默认,效率最高)、content(匹配行+上下文)、count(快速评估相关性)。

6.2 Shell 工具

class ExecuteSchema(BaseModel):
    command: str
    timeout: int | None = None

仅在沙箱后端可用(LocalShellBackend、LangSmithSandbox)。非沙箱后端返回错误。

使用 LocalShellBackend 时无沙箱隔离,生产环境务必配合 HITL 中间件。

6.3 write_todos — 任务管理

帮助智能体将复杂任务分解为有序步骤,标记各步骤状态(pending/in_progress/completed),在长对话中保持上下文。

6.4 task — 子代理入口

由 SubAgentMiddleware 提供。详见第九章。


第七章:Backend 后端系统

Backend 是存储抽象层,决定了智能体在哪里存储文件、如何执行命令、数据如何在会话间流转。

7.1 为什么需要后端抽象?

开发阶段你可能希望直接操作本地文件。生产环境你需要沙箱隔离。多租户场景你需要按用户隔离存储。Backend 抽象让你只需改变一个参数就在所有场景间切换,代码逻辑完全不变。

7.2 BackendProtocol

class BackendProtocol:
    def ls(self, path: str) -> LsResult | list[FileInfo]: ...
    def read(self, path: str) -> ReadResult: ...
    def write(self, path: str, content: str | bytes) -> WriteResult: ...
    def edit(self, path: str, old: str, new: str, replace_all: bool) -> EditResult: ...
    def glob(self, pattern: str, path: str | None) -> GlobResult: ...
    def grep(self, pattern: str, path: str | None, ...) -> GrepResult: ...
    def download_files(self, paths: list[str]) -> list[FileDownloadResponse]: ...
    def upload_files(self, files: list[tuple[str, bytes]]) -> list[FileUploadResponse]: ...

class SandboxBackendProtocol(BackendProtocol):
    def execute(self, command: str, timeout: int | None) -> ExecuteResponse: ...

7.3 内置后端选择

后端 持久性 Shell 存储 适用场景
StateBackend 线程内 否 内存状态 原型、测试
FilesystemBackend 磁盘持久 否 本地文件 本地脚本
LocalShellBackend 磁盘持久 是 本地文件 本地开发
CompositeBackend 取决于路由 取决于路由 路径路由 混合存储
StoreBackend 跨线程持久 否 BaseStore 生产记忆
LangSmithSandbox 沙箱内 是 远程沙箱 安全执行
ContextHubBackend 持久 否 Hub 仓库 Hub 管理

选择决策树:

  1. 需要 Shell?→ 沙箱隔离 → LangSmithSandbox;本地可信 → LocalShellBackend
  2. 需要磁盘持久?→ FilesystemBackend;不需要 → StateBackend
  3. 需要跨线程持久?→ StoreBackend

7.4 各后端详解

StateBackend — 内存后端:

from deepagents.backends import StateBackend
agent = create_deep_agent(model="openai:gpt-5.5", backend=StateBackend())
# 通过 files 参数预加载文件
result = agent.invoke(
    {"messages": "读取 /data/task.md"},
    files={"/data/task.md": FileData(content="# 任务\n...", encoding="utf-8")},
)

FilesystemBackend — 本地文件:

from deepagents.backends import FilesystemBackend
agent = create_deep_agent(
    model="openai:gpt-5.5",
    backend=FilesystemBackend(root_dir="/path/to/project"),
)

CompositeBackend — 路由组合:

from deepagents.backends import CompositeBackend, StateBackend, StoreBackend
composite = CompositeBackend(
    default=StateBackend(),          # 临时工作文件
    routes={"/memories/": StoreBackend()},  # 记忆持久化
)

StoreBackend — 生产持久化:

from deepagents.backends import StoreBackend
from langgraph.store.memory import InMemoryStore
store = InMemoryStore()
agent = create_deep_agent(
    model="openai:gpt-5.5",
    backend=StoreBackend(store=store),
    store=store,  # 需要是同一个实例
)

第八章:中间件体系

8.1 洋葱模型

请求方向 ——>
    +------------------------------------------+
    |  中间件A  before(先执行)                 |
    |    +----------------------------------+  |
    |    |  中间件B  before                 |  |
    |    |    +------------------------+   |  |
    |    |    |    核心(模型调用)      |   |  |
    |    |    +------------------------+   |  |
    |    |  中间件B  after(后执行)         |  |
    |    +----------------------------------+  |
    |  中间件A  after(后执行)                  |
    +------------------------------------------+
                                    <—— 响应方向

每层中间件可在请求和响应两个方向上处理数据。这就是为什么顺序至关重要。

8.2 生命周期钩子

钩子 调用时机 典型用途
before_agent 智能体执行前 加载数据、初始化
after_agent 智能体执行后 清理、保存结果
modify_request 模型请求发送前 注入提示词、修改消息
wrap_model_call 包装模型调用 日志、缓存、重试
before_tool_call 工具调用前 权限检查、参数验证
after_tool_call 工具调用后 结果后处理
after_response 模型响应后 自我评估、迭代

8.3 自定义中间件

基础——日志中间件:

from langchain.agents.middleware.types import AgentMiddleware, ModelRequest

class LoggingMiddleware(AgentMiddleware):
    def wrap_model_call(self, request: ModelRequest, handler):
        messages = request.state.get("messages", [])
        print(f"[日志] 消息数: {len(messages)}")
        response = handler(request)  # 转交给内层
        if hasattr(response, 'tool_calls') and response.tool_calls:
            print(f"[日志] 工具调用: {[tc['name'] for tc in response.tool_calls]}")
        return response

agent = create_deep_agent(model="openai:gpt-5.5", middleware=[LoggingMiddleware()])

进阶——重试中间件:

from langchain_core.messages import ToolMessage

class RetryMiddleware(AgentMiddleware):
    def __init__(self, max_retries: int = 3): self.max_retries = max_retries

    def after_tool_call(self, result, *, tool_call_id, tool_name, state, runtime):
        if "error" in str(result).lower():
            state["messages"].append(ToolMessage(
                content=f"工具调用失败: {result}\n请重试。",
                tool_call_id=tool_call_id,
            ))
        return result

handler 的关键理解: 它代表"下一个中间件 + 核心逻辑"的组合。调用 handler(request) 将请求传递给内层。你可以:修改 request 再传、修改 response 再返回、甚至不调用 handler 直接返回(短路)。

8.4 中间件排除

register_harness_profile("lightweight", HarnessProfile(
    excluded_middleware=["SummarizationMiddleware", "TodoListMiddleware"],
))

短对话不需要摘要,简单任务不需要规划。但 FilesystemMiddleware 和 SubAgentMiddleware 不可排除。


第九章:子代理(Subagents)

子代理让智能体拥有"团队协作"能力。主智能体做规划和决策,子代理执行具体任务。

9.1 解决的四大问题

  1. 上下文窗口污染: 50 次搜索结果会填满上下文,导致"忘记"早期指令。子代理有独立上下文,只返回浓缩结果。
  2. 无法并行: 单智能体串行处理三个独立任务。子代理允许并行执行,总耗时缩短。
  3. 缺乏专业分工: "全能"智能体不如各有专长的代理。研究代理有搜索工具,编码代理有执行工具。
  4. Token 成本: 主智能体需要强模型,子任务只需要便宜模型(Haiku 价格约为 Sonnet 的 1/10)。

9.2 SubAgent 声明式定义

from deepagents import create_deep_agent, SubAgent, FilesystemPermission

researcher: SubAgent = {
    "name": "researcher",
    # description 是最重要的字段——主智能体据此决定何时委托
    "description": (
        "研究特定主题并返回结构化发现。"
        "用于需要深度搜索和分析的任务。"
        "不要用于简单问答——主智能体直接回答即可。"
    ),
    "system_prompt": "你是研究助手。搜索信息后返回结构化结果。",
    "model": "anthropic:claude-haiku-4-5",
    "tools": [web_search],
    "skills": ["/skills/research/"],
    "permissions": [FilesystemPermission(operations=["read"], paths=["/research/**"], mode="allow")],
}

agent = create_deep_agent(model="openai:gpt-5.5", subagents=[researcher])

description 编写建议: 这是最重要的字段。明确功能范围、给出正面示例(何时委托)、给出反面示例(何时不委托)、100-300 字。

9.3 状态传递与隔离

传入: 主智能体最近对话上下文 + 任务描述
传出: 仅最后一条 AI 消息文本(+ 结构化输出如果有 response_format)
排除: messages(完整历史)、todos、structured_response、_ 开头字段

排除完整历史意味着中间搜索和思考不进入主智能体上下文——这正是上下文隔离的核心价值。

9.4 最佳实践

  1. 3-5 个子代理通常足够,每个有明确且不重叠的职责
  2. 主智能体综合结果——子代理产原材料,主智能体综合后交付
  3. 独立任务并行调用——三个研究任务用三次 task 调用
  4. 子代理用便宜模型——Haiku 约为 Sonnet 价格的 1/10

第十章:异步子代理(Async Subagents)

异步子代理实现"发射并遗忘"——启动任务后立即继续其他工作。

10.1 同步 vs 异步

特性 同步 异步
执行方式 阻塞等待 立即返回 task_id
结果获取 调用返回时 主动查询状态
适用场景 短任务(秒~分钟) 长任务(分钟~小时)
运行位置 同进程 远程服务器

10.2 定义

from deepagents import create_deep_agent, AsyncSubAgent

processor: AsyncSubAgent = {
    "name": "data-processor",
    "description": "在远程处理大型数据集。",
    "graph_id": "data-processing-graph",
    "url": "https://my-server.example.com",
    "headers": {"Authorization": "Bearer xxx"},
}

可用工具: start_async_task、check_async_task、update_async_task、cancel_async_task、list_async_tasks

10.3 典型工作流

start_async_task → task_id → 继续工作 → check_async_task → 完成/调整

第十一章:Skills 技能系统

Skills 将可复用行为封装为文件,智能体按需加载。解决了"每次重复粘贴指令"的问题。

11.1 价值

没有 Skills 时,每次创建代码审查智能体都要在提示词中粘贴完整审查清单。有了 Skills,写一次 SKILL.md,通过路径引用。团队可以维护共享技能库。

11.2 Skill 结构

/skills/user/web-research/
+-- SKILL.md          # 必需:YAML 元数据 + Markdown 指令
+-- helper.py         # 可选:辅助文件
---
name: web-research
description: 结构化网络研究方法论
allowed-tools: web_search read_file
---

# Web Research Skill

## 何时使用
- 用户要求研究主题
- 需要收集综合多个信息源

## 工作流程
1. 明确研究目标
2. 使用 web_search 初步搜索
3. 进行 2-3 次针对性搜索
4. 综合发现,标注来源
5. 返回结构化结果

YAML 字段: name(必需,1-64字符,匹配目录名)、description(必需,1-1024字符)、license(可选)、allowed-tools(可选,限制可用工具)、metadata(可选,键值对)

11.3 使用

agent = create_deep_agent(
    model="openai:gpt-5.5",
    skills=["/skills/user/", "/skills/project/"],  # 后加载覆盖先加载
    backend=FilesystemBackend(root_dir="/my/project"),
)

层叠: 多个来源按顺序加载,后加载的同名技能覆盖先加载的(last one wins)。基础层定义通用技能,项目层覆盖定制。


第十二章:Memory 记忆系统

12.1 设计理念

传统对话中智能体每次启动都是"一张白纸"。Memory 让智能体访问预定义知识库——项目规范、编码风格、架构说明等。

Memory 不是"学到的记忆"。 不会自动学习。更新需要明确写入操作。这是有意设计——自动记忆可能导致噪声积累。

12.2 AGENTS.md

# 项目概述
电商后端服务,FastAPI + SQLAlchemy。

## 构建/测试
- 构建:make build
- 测试:make test

## 代码风格
- Google 风格 docstring
- 行宽 120 字符

HTML 注释在注入提示词前被自动剥离。

12.3 使用

agent = create_deep_agent(
    model="openai:gpt-5.5",
    memory=["./AGENTS.md", "~/.deepagents/AGENTS.md"],
    backend=FilesystemBackend(root_dir="/"),
)

多来源按顺序拼接,文件不存在时静默跳过。内容注入系统提示词的 <agent_memory> 标签。

12.4 更新指导

中间件自动注入:何时更新(用户明确要求、提供反馈)、何时不更新(临时信息、简单问答)、安全规则(不存储密钥)、信任验证(记忆可能过时)。


第十三章:文件系统权限与安全

13.1 安全模型

Deep Agents 采用"信任 LLM"模型,但有重要前提:在工具/沙箱层面强制执行边界,而非期望模型自我约束。

13.2 FilesystemPermission

from deepagents import FilesystemPermission

permissions = [
    FilesystemPermission(operations=["read"], paths=["/project/**"], mode="allow"),
    FilesystemPermission(operations=["write"], paths=["/secrets/**"], mode="deny"),
    FilesystemPermission(operations=["write"], paths=["/production/**"], mode="interrupt"),
]

三种模式: allow(允许)、deny(拒绝+返回错误)、interrupt(暂停等待审批,自动启用 HITL)

评估规则: 按声明顺序评估,第一个匹配生效。路径以 / 开头,不支持 .. 和 ~。

13.3 工具与操作映射

ls、read_file、glob、grep → read;write_file、edit_file → write

13.4 安全最佳实践

  1. 在工具/沙箱层面执行边界
  2. 用 permissions 限制访问范围
  3. 用 HITL 审批敏感操作
  4. 在隔离环境运行(Docker、沙箱)
  5. 永远不暴露密钥给智能体

第十四章:Human-in-the-Loop 人机协作

14.1 基本配置

from deepagents import create_deep_agent

agent = create_deep_agent(
    model="openai:gpt-5.5",
    interrupt_on={
        "write_file": True,     # 写文件前审批
        "edit_file": True,      # 编辑文件前审批
        "execute": True,        # 执行命令前审批
    },
    checkpointer=checkpointer,  # HITL 需要 checkpointer
)

14.2 InterruptOnConfig

from langchain.agents.middleware import InterruptOnConfig

agent = create_deep_agent(
    model="openai:gpt-5.5",
    interrupt_on={
        "execute": InterruptOnConfig(
            description="Shell 命令执行审批",
            approve_label="允许执行",
            reject_label="拒绝执行",
        ),
    },
)

14.3 权限驱动中断

FilesystemPermission(mode="interrupt") 自动生成 interrupt_on 配置。

14.4 审批流程

智能体请求执行工具 → HITL 拦截 → 用户审批/编辑/拒绝 → 继续/终止

第十五章:上下文管理与对话压缩

15.1 SummarizationMiddleware

当 token 使用超过阈值时自动压缩对话:

from deepagents.middleware.summarization import SummarizationMiddleware
from deepagents.backends import FilesystemBackend

summ = SummarizationMiddleware(
    model="openai:gpt-5.5-mini",
    backend=FilesystemBackend(root_dir="/data"),
    trigger=("fraction", 0.85),    # 窗口 85% 时触发
    keep=("fraction", 0.10),       # 保留最近 10%
)

agent = create_deep_agent(model="openai:gpt-5.5", middleware=[summ])

15.2 触发条件

trigger=("tokens", 8000)      # 按 token 数
trigger=("messages", 50)       # 按消息数
trigger=("fraction", 0.85)     # 按窗口比例

15.3 大参数截断

在完整摘要前先截断旧消息的大工具参数:

from deepagents.middleware.summarization import TruncateArgsSettings

summ = SummarizationMiddleware(
    model="openai:gpt-5.5-mini",
    trigger=("fraction", 0.85),
    keep=("fraction", 0.10),
    truncate_args=TruncateArgsSettings(
        trigger=("fraction", 0.60),  # 60% 时开始截断
        keep=("fraction", 0.20),     # 保留最近 20% 不截断
        max_length=500,               # 参数最大长度
    ),
)

第十六章:Rubric 中间件 — 自我评估迭代

16.1 概念

RubricMiddleware 让你声明"完成标准"。智能体完成前由独立评审子代理评估,不满足则继续迭代。

16.2 工作流程

智能体完成任务 → 评审子代理评估(对照 rubric)
    ↓
satisfied → 返回结果
needs_revision → 注入反馈,继续迭代
failed/max_iterations → 终止

16.3 使用

from deepagents import create_deep_agent, RubricMiddleware

rubric = RubricMiddleware(
    rubric="""
    - 代码通过所有测试
    - 符合项目风格指南
    - 包含错误处理
    - 不引入新 lint 警告
    """,
    model="openai:gpt-5.5-mini",
    max_iterations=3,
)

agent = create_deep_agent(model="openai:gpt-5.5", middleware=[rubric])

第十七章:流式输出与状态管理

17.1 流式模式

# stream_mode="values" -- 每步返回完整状态
for chunk in agent.stream({"messages": "你好"}, stream_mode="values"):
    print(chunk["messages"][-1].content)

# stream_mode="updates" -- 仅增量更新
for chunk in agent.stream({"messages": "你好"}, stream_mode="updates"):
    print(chunk)

17.2 Checkpointer — 会话持久化

from langgraph.checkpoint.memory import MemorySaver

agent = create_deep_agent(
    model="openai:gpt-5.5",
    checkpointer=MemorySaver(),
)

# 第一次对话
agent.invoke({"messages": "我叫张三"}, config={"configurable": {"thread_id": "user-1"}})
# 同一会话继续
agent.invoke({"messages": "我叫什么名字?"}, config={"configurable": {"thread_id": "user-1"}})

17.3 Store — 跨会话存储

from langgraph.store.memory import InMemoryStore
agent = create_deep_agent(model="openai:gpt-5.5", store=InMemoryStore())

第十八章:实战案例解析

18.1 内容创作智能体

展示 memory、skills、subagents 的综合使用:

content-builder-agent/
+-- AGENTS.md              # 品牌声音和写作标准
+-- content_writer.py      # 主程序
+-- subagents.yaml         # 子代理配置
+-- skills/
    +-- blog-post/SKILL.md
    +-- social-media/SKILL.md
from deepagents import create_deep_agent
from deepagents.backends import FilesystemBackend

agent = create_deep_agent(
    memory=["./AGENTS.md"],
    skills=["./skills/"],
    tools=[generate_cover, generate_social_image],
    subagents=load_subagents("subagents.yaml"),
    backend=FilesystemBackend(root_dir=EXAMPLE_DIR),
)

设计模式: Memory 提供品牌指导、Skills 提供结构化流程、Subagent 隔离研究上下文、自定义工具扩展能力。

18.2 深度研究智能体

agent = create_deep_agent(
    model=init_chat_model("anthropic:claude-sonnet-4-5", temperature=0.0),
    tools=[tavily_search, think_tool],
    system_prompt=INSTRUCTIONS,
    subagents=[{
        "name": "research-agent",
        "description": "研究主题并返回发现。每次只给一个主题。",
        "system_prompt": RESEARCHER_INSTRUCTIONS,
        "tools": [tavily_search, think_tool],
    }],
)

设计模式: 主智能体做编排分解,子代理执行具体研究。多个研究子代理可并行运行。

18.3 编码智能体

AGENTS.md:

# Coding Agent

## 工作流
### 阶段1:规划 → 探索仓库 → 定位文件 → write_todos
### 阶段2:实施 → 逐步修改 → 运行测试
### 阶段3:审查 → 完整测试 → Linter → 端到端审查
### 阶段4:交付 → 提交 → 总结

第十九章:生产部署指南

19.1 部署架构

用户请求 → LangGraph Platform → Deep Agent → Backend(沙箱/远程)→ LangSmith(追踪监控)

19.2 CLI 部署

deepagents init my-agent
deepagents dev          # 本地开发
deepagents deploy       # 部署到 LangGraph Platform

19.3 生产配置

from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver
from langgraph.store.postgres.aio import AsyncPostgresStore

agent = create_deep_agent(
    model="openai:gpt-5.5",
    checkpointer=AsyncPostgresSaver(conn_string="postgresql://..."),
    store=AsyncPostgresStore(conn_string="postgresql://..."),
)

19.4 LangSmith 集成

os.environ["LANGSMITH_API_KEY"] = "your-key"
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_PROJECT"] = "my-agent"

19.5 安全最佳实践

  1. 生产用 LangSmithSandbox 或自定义沙箱
  2. 配置 FilesystemPermission 限制访问
  3. 启用 HITL 审批敏感操作
  4. 不暴露密钥给智能体
  5. 配置命令超时和输出截断

19.6 性能优化

  1. 提示缓存:Anthropic 模型启用 add_cache_control=True
  2. 对话压缩:配置 SummarizationMiddleware
  3. 子代理并行:独立任务并行委托
  4. DeltaChannel:默认启用,O(N²)→O(N)
  5. 模型选择:子代理用便宜模型

第二十章:架构全景与扩展指南

20.1 完整架构图

+----------------------------------------------------+
|                  create_deep_agent                  |
|                                                    |
|  +-----------+  +--------------+  +----------+    |
|  |   Model   |  | System Prompt|  |   Tools  |    |
|  | (resolved)|  | (assembled)  |  | (merged) |    |
|  +-----+-----+  +------+------+  +-----+----+    |
|        |               |               |           |
|  +-----+---------------+---------------+------+   |
|  |            Middleware Stack(12层)         |   |
|  +--------------------------------------------+   |
|                                                    |
|  +--------------------------------------------+   |
|  |                  Backend                    |   |
|  +--------------------------------------------+   |
|                                                    |
|  +--------------------------------------------+   |
|  |       LangGraph Runtime                    |   |
|  |  Checkpointer / Store / Cache / Streaming  |   |
|  +--------------------------------------------+   |
+----------------------------------------------------+

20.2 扩展点

扩展点 方式
自定义工具 tools 参数,添加 @tool 函数
自定义中间件 实现 AgentMiddleware 接口
自定义后端 实现 BackendProtocol 接口
自定义沙箱 继承 BaseSandbox
Provider Profile register_provider_profile()
Harness Profile register_harness_profile()
自定义子代理 SubAgent / CompiledSubAgent
自定义技能 SKILL.md 文件
MCP 服务器 MCP 协议工具集成

20.3 自定义 Backend 示例

from deepagents.backends.protocol import BackendProtocol, ReadResult, WriteResult

class RemoteAPIBackend(BackendProtocol):
    def __init__(self, api_url: str, api_key: str): ...
    def ls(self, path: str): ...
    def read(self, path: str): ...
    def write(self, path: str, content: str | bytes): ...
    def edit(self, path: str, old: str, new: str, replace_all: bool): ...
    def glob(self, pattern: str, path: str | None): ...
    def grep(self, pattern: str, path: str | None, ...): ...
    def download_files(self, paths: list[str]): ...
    def upload_files(self, files: list[tuple[str, bytes]]): ...

20.4 第三方插件

通过 importlib.metadata 入口点加载:

[project.entry-points."deepagents.provider_profiles"]
my_profile = "my_package:register_my_provider"

[project.entry-points."deepagents.harness_profiles"]
my_harness = "my_package:register_my_harness"

20.5 生态关系

组件 关系
LangGraph 底层运行时,Deep Agents 构建其上
LangChain 提供模型抽象、工具框架
LangSmith 追踪、评估、监控、沙箱
deepagents.js JavaScript 版本

附录

A. 公共 API 速查

from deepagents import (
    create_deep_agent, DeepAgentState,
    SubAgent, CompiledSubAgent, AsyncSubAgent,
    SubAgentMiddleware, AsyncSubAgentMiddleware,
    FilesystemMiddleware, FilesystemPermission,
    MemoryMiddleware, RubricMiddleware,
    HarnessProfile, HarnessProfileConfig,
    GeneralPurposeSubagentProfile,
    ProviderProfile,
    register_harness_profile, register_provider_profile,
    __version__,
)

B. 后端速查

from deepagents.backends import (
    StateBackend, FilesystemBackend, LocalShellBackend,
    CompositeBackend, StoreBackend,
    LangSmithSandbox, ContextHubBackend,
    BackendProtocol,
)

C. 常用模型字符串

提供商 格式
OpenAI openai:gpt-5.5
Anthropic anthropic:claude-sonnet-4-6
Google google_genai:gemini-2.5-pro
OpenRouter openrouter:anthropic/claude-sonnet-4-6

D. 环境变量

变量 说明
OPENAI_API_KEY OpenAI API 密钥
ANTHROPIC_API_KEY Anthropic API 密钥
LANGSMITH_API_KEY LangSmith API 密钥
LANGGRAPH_API_KEY LangGraph Platform API 密钥
LANGSMITH_TRACING 启用追踪(true)
TAVILY_API_KEY Tavily 搜索 API 密钥

E. 学习路径建议

入门(1-2天):第二章(快速上手)→ 第三章(API详解)→ 第六章(工具)
进阶(3-5天):第七章(Backend)→ 第九章(子代理)→ 第十一/十二章(Skills/Memory)
高级(5-7天):第八章(中间件)→ 第十三/十四章(安全/HITL)→ 第十五章(压缩)
专家(持续深入):第四/五章(Profile)→ 第十六章(Rubric)→ 第十九/二十章(部署/架构)

参考资源: