第 12 章 Google ADK复盘架构

第 12 章 真实项目复盘与边界

第 12 章 真实项目复盘与边界

从第 2 章的 v0.1 到现在的生产级系统,云销客服走过了十章的进化。这一章,我们停下来做一次完整的复盘——看架构怎么一步步长成、每个关键决策背后的权衡、踩过哪些坑。然后,聊一个诚实的话题:ADK 的边界在哪里,什么时候不该用它。

12.1 云销客服的完整演进

12.1.1 版本时间线

让我们回顾云销客服的每一次进化:

版本 章节 关键变化 架构形态
v0.1 第 2 章 单 Agent,能查订单/退款政策 单体 Agent + 2 个函数工具
v0.2 第 3 章 加 State 记忆,支持多轮对话 单体 Agent + 有状态工具
v1.0 第 4 章 拆成订单/退款/物流三 Agent 团队 协调者 + 3 个子 Agent
v2.0 第 5 章 图工作流重写退货审批 图工作流(确定性流程)
v3.0 第 6 章 加入人工审批退款节点 动态工作流 + HITL
v4.0 第 7 章 封装技能、接协议生态 Skills + MCP/A2A
v5.0 第 8 章 容器化部署 Docker + 任意云
v6.0 第 9-11 章 可观测性 + 评估 + 安全 生产级完整系统

12.1.2 最终架构图

                        ┌─────────────────────────────┐
                        │         API Server          │
                        │    (adk api_server / FastAPI)│
                        └─────────────┬───────────────┘
                                      │ REST / SSE
                                      ▼
                        ┌─────────────────────────────┐
                        │     yunxiao_cs (root)       │
                        │     协调者 Agent            │
                        └─────────────┬───────────────┘
              ┌───────────────────────┼───────────────────────┐
              │                       │                       │
              ▼                       ▼                       ▼
     ┌──────────────┐      ┌──────────────────┐      ┌──────────────┐
     │ order_agent  │      │ refund_agent     │      │ logistics    │
     │ 订单查询      │      │ 退款处理(Skill)   │      │ 物流查询      │
     └──────┬───────┘      └────────┬─────────┘      └──────────────┘
            │                       │
            ▼                       ▼
     ┌──────────────┐      ┌──────────────────┐
     │ get_order    │      │ 退货审批工作流    │
     │ _status(工具) │      │ (Graph Workflow) │
     └──────────────┘      │  + HITL 人工审批  │
                           └──────────────────┘
                                      │
                              ┌───────┴───────┐
                              │               │
                              ▼               ▼
                       ┌────────────┐  ┌────────────┐
                       │ approved   │  │ rejected   │
                       │ 自动退款    │  │ 告知用户    │
                       └────────────┘  └────────────┘

       横切能力:Skills(退款技能)| MCP(外部工具)| A2A(远程 Agent)
              可观测性(日志/指标/追踪)| 评估(EvalSet)| 安全(确认/回调)

12.2 关键决策复盘

12.2.1 决策一:单体 → 多 Agent 的时机

问题:什么时候该把单体 Agent 拆成多 Agent?

我们的判断:当三个信号同时出现时拆——

  1. 指令开始冲突:查订单、退款、物流的规则互相打架
  2. 职责边界天然清晰:订单/退款/物流本来就是三个领域
  3. 需要独立迭代:退款流程经常改,其他很少变

教训:不要过早拆分。v0.1-v0.2 阶段单 Agent 完全够用,拆早了反而增加"该转给谁"的决策开销。

12.2.2 决策二:什么时候上 Graph Workflow

问题:多 Agent 协作已经能处理退货了,为什么还要图工作流?

我们的判断:当流程有确定的顺序和分支、且不能容忍 LLM 自由发挥时,必须用图工作流。退货审批的资格判断(查订单、比对日期)是确定性逻辑,用纯 Agent 会浪费 3-5 倍 token 且可能出错。

关键认知:多 Agent 处理"模糊分发"(该把任务给谁),图工作流处理"确定流程"(顺序/分支)。两者互补,不是替代。

12.2.3 决策三:HITL 的引入

问题:为什么退款要人工审批?

我们的判断合规和安全需求。大额退款不能让模型自动放行——这是第 6 章和第 11 章反复强调的"代码强制":把"超过阈值必须人工"固化在工作流/工具里,模型绕不过去。

12.2.4 决策四:部署路径

问题:部署到哪?

我们的判断:先用 adk api_server 本地跑通 → Docker 容器化 → 部署到自有服务器(非 Google 环境)。这套路径不依赖任何云厂商,是"部署中立"的实践。

12.3 踩过的坑

12.3.1 模型层

  • Ollama 用 ollama 前缀导致无限循环:必须用 ollama_chat(第 7 章)
  • LiteLlm 的 import 路径:是 google.adk.models.lite_llm,不是 litellm
  • 区域端点下 gemini-flash-latest 选择器不生效:要用具体版本字符串

12.3.2 工作流层

  • task 模式在 v2.0.0 的图工作流中被禁用:图里要用协作模式要留意版本
  • 动态工作流里调用 ctx.run_node 的节点必须 rerun_on_resume=True:否则恢复时会出错

12.3.3 部署层

  • 不配置 session_service_uri 导致会话丢失:生产必须持久化
  • GKE 的 SQLite read-only:构建前要排除 sessions.db

12.3.4 安全层

  • session state 存敏感凭据:官方明确警告不要这么做
  • UI 不转义模型内容导致间接注入:必须转义

12.4 诚实的边界讨论

这一节是全书最"反广告"的部分。ADK 很好,但它不是万能的。

12.4.1 什么时候不该用 ADK

第一,你的项目只需要极简的 Agent 调用。

如果只是"调用一次 LLM 拿个 JSON",ADK 是杀鸡用牛刀。直接用模型 SDK 或 OpenAI Agents 这种极简框架更合适。

第二,你的团队没有工程化基础。

ADK 的能力集中在"生产级",但生产级需要配套的工程能力:可观测性后端、评估数据集、CI 流程。小团队如果没有这些,ADK 的很多能力用不上,反而觉得复杂。

第三,深度绑定特定生态的封闭场景。

如果你确定只用一个厂商的模型和云,且永远不会换,那么那个厂商的一站式框架可能更顺手。ADK 的中立性在你需要"自由"时才体现价值。

第四,极度简单的线性任务。

一个 Agent + 两个工具能解决的事,没必要上多 Agent + 图工作流。记住第 4 章的反模式:为拆而拆是灾难

12.4.2 ADK 的短板(诚实清单)

  • 社区和生态仍在追赶:LangChain 的第三方集成数量仍远超 ADK(第 1 章提过)
  • 2.0 较新,迁移有成本:从 1.x 迁移有破坏性变更(自定义执行覆写、事件 append 等)
  • 部分功能标注 experimental:模型路由、Visual Builder、环境模拟等仍是实验特性,API 可能变
  • 中文资料相对少:官方文档英文为主(中文镜像 adk.wiki 在完善中)
  • 技能生态刚开始:Skills 规范(agentskills.io)还在早期

12.4.3 什么时候 ADK 的优势最明显

反过来,ADK 优势最明显的场景:

  • 企业级 Agent 系统:需要可控性、可观测性、评估、安全
  • 多 Agent + 复杂工作流:混合编排是它的主场
  • 不被绑定的需求:模型、部署都要自由选择
  • 多语言团队:Python/TS/Go/Java/Kotlin 全支持

12.5 为什么这本书叫"为什么最好"

最后一节,我们回到书名。为什么我们有底气说"Google ADK 是最好的 Agent 框架"?

不是因为它功能最多(生态不如 LangChain)、不是因为它最简单(不如 OpenAI Agents)、不是因为它生态最封闭(它最开放)。是因为它的设计取舍,在 2026 年的生产环境下最正确

  1. 图工作流引擎:把确定性逻辑从 LLM 手里夺回来——这是对 Agent 本质最深刻的理解
  2. 生产优先:可观测、可评估、可部署、可安全——一整套生产底座,不是后加的补丁
  3. 开放协议:模型中立、MCP、A2A——赌开放赢,不赌绑定赢
  4. 多语言同步:不被语言绑死
  5. 代码优先:可调试、可测试、无黑魔法

"最好"不是一个绝对判断,而是一个场景判断。在"构建生产级、复杂、不被绑定的 Agent 系统"这个场景下,ADK 是目前最接近正确答案的选择。这就是全书想传达的。

本章小结

  • 云销客服十章演进:单体 → 多 Agent → 图工作流 → HITL → 生产级,每一步都有明确动机
  • 四个关键决策:何时拆多 Agent、何时上图、为何上 HITL、部署到哪
  • 踩坑清单:模型(ollama_chat/lite_llm)、工作流(rerun_on_resume)、部署(持久化)、安全(凭据)
  • 诚实边界:极简场景、无工程化基础、封闭生态、简单线性任务——不该用 ADK
  • 短板清单:社区追赶中、2.0 迁移成本、部分实验特性、中文资料少
  • "最好"是场景判断:在生产级复杂 Agent 系统场景下,ADK 最接近正确答案

练习

  1. 复盘你的项目:如果你在搭 Agent 系统,按云销的演进路径(单体→多Agent→工作流→生产化)画一条你自己的路线图。
  2. 写边界文档:给你的团队写一份"什么情况用 ADK、什么情况不用"的决策文档。
  3. 成本估算:估算你的 Agent 系统如果分别用"纯 Agent"和"图工作流混合"的成本差异。

下一章预告:第 13 章,全书收尾。我们把所有知识串成一张地图,然后看 ADK 的进阶方向——Agents CLI 辅助开发、Visual Builder、REST API、在线语音 Agent。