侧边栏壁纸
  • 累计撰写 56 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

DeepAgents深入学习指南

温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Deep Agents 完全学习教程

基于 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.SelfExceptionGrouptomllib 等 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_todoslsread_filewrite_fileedit_fileglobgrepexecutetask。即使你一个工具都没指定,智能体也已具备完整的文件操作和任务管理能力。

  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 → ainvokestream → 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 的后端(如 LocalShellBackendLangSmithSandbox)上可用。

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   -- 人机协作(最外层防线)

设计考量: FilesystemMiddlewareSubAgentMiddleware 之前(子代理也需要文件系统);SummarizationMiddlewarePatchToolCallsMiddleware 之前(先压缩再修补);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 语法:**/*.pysrc/**/*.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

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

使用 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"],
))

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


第九章:子代理(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(完整历史)、todosstructured_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_taskcheck_async_taskupdate_async_taskcancel_async_tasklist_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 工具与操作映射

lsread_fileglobgrepreadwrite_fileedit_filewrite

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)→ 第十九/二十章(部署/架构)

参考资源:

0

评论区