想象你开了一家智能餐厅,顾客用语音、图片甚至手势点单,后厨里不同厨师各司其职,还有食客口味档案和出菜监控屏。要让这一切自动协同,你需要一套后厨中枢系统——这就是 Google ADK(Agent Development Kit)。ADK 像是给 AI Agent 搭建的完整后厨流水线:它听懂顾客意图,为 Agent 注册“厨师技能”(工具),记住每桌食客的偏好(会话),支持多个厨师协作出菜(多 Agent),并随时监控出菜是否超时(部署监控)。而 Gemini 模型就是后厨里那位经验老到的主厨,负责做最终决策。本课将带你从零认识 ADK 的六大模块,并用一套可以运行的代码,把“智能餐厅后厨”真正建起来。

岗位关联

学完本课,你将能运用 Google ADK 在 Google Cloud 上快速开发、部署和监控企业级 AI Agent,成为团队中能独立交付智能应用的 AI 工程师。

目录
  1. 可视化演示
  2. 框架全景:认识这台“后厨中枢”
  3. 意图理解:听懂顾客的弦外之音
  4. 工具注册:给厨师挂上厨具清单
  5. 会话管理:记住老顾客的口味偏好
  6. 多智能体协作:让宴席交给团队
  7. 部署监控:后厨大厅的进度屏
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示ADK模块化架构、工具注册调用流程、多Agent协作拓扑。切换模式理解Google Agent开发套件从意图理解到部署监控的全链路设计。

本节配有交互动效(进入视口后自动加载,约 3KB)。

ADK模块化架构:Agent→Tools→Session→Deploy Agent定义层是核心,封装意图理解与任务编排,通过Gemini模型实现多模态推理 工具注册层连接外部服务,Session管理维持上下文连贯,部署层支持Cloud Run自动扩缩容 ADK = Agent + Tools + Session + Deploy 四层架构覆盖从原型到生产的全流程

框架全景:认识这台“后厨中枢”

一家智能餐厅后厨要想高效运转,不能只买一口锅。它需要燃气灶、刀具、冰箱、叫号大屏和一套排班表。Google ADK 就是给 AI Agent 准备的全套后厨设备:从理解顾客需求,到调用工具、记住偏好、协调多岗位厨师,再到最后出菜和检查是否超时,都在同一套系统里完成。这套设备的强大之处,在于它把零散的组件归纳成一个统一框架。

ADK 把 Agent 抽象成四个核心对象:模型、工具、会话状态和编排器。模型负责思考,工具负责行动,会话状态让它记住前文,编排器则决定每一步的先后顺序。开发时,你只需要声明这四者,ADK 会自动把零件组装成完整服务,像后厨设备已经接好水电,厨师插上电就能开工。

在实际项目中,ADK 深度集成 Gemini 模型,意味着你可以直接使用多模态输入、流式输出和函数调用能力。同时它提供从 Python 原型到生产部署的完整路径:本地调试与线上运行使用同一套代码,上线后交给 Cloud Run 或 Cloud Functions 托管。工具链还包括日志、追踪和评估模块,让 Agent 从“能跑”走向“能落地”。

想象后厨从采购到出菜都有了固定流程,ADK 就是把流程固化成软件的工程化框架。框架全景让你在写第一行代码前,就知道灶台、刀具、冰箱分别放在哪里。

Agent=⟨M,  T,  S,  O⟩\text{Agent} = \langle \mathcal{M},\; \mathcal{T},\; \mathcal{S},\; \mathcal{O} \rangle
四个尖括号里的名字,就是 Agent 的四块地基。
  1. Agent 整体一个可自主推理的智能体,由四类组件共同定义。
    Agent\text{Agent}
  2. 模型 \mathcal{M}Gemini 等语言模型,是后厨里拿主意的主厨。
    M\mathcal{M}
  3. 工具 \mathcal{T}Agent 能调用的 API 或函数,是厨具和食材。
    T\mathcal{T}
  4. 会话状态 \mathcal{S}跨轮对话的记忆与上下文,是顾客偏好档案。
    S\mathcal{S}
  5. 编排器 \mathcal{O}决定先做什么后做什么的调度逻辑,是后厨流程表。
    O\mathcal{O}

意图理解:听懂顾客的弦外之音

顾客说“今儿人多,少放点盐”,后厨不仅要听懂内容,还要懂得这是“少盐”指令。意图理解是 Agent 的第一道工序。ADK 会让 Gemini 将用户输入映射成结构化的函数调用意图,而不是简单地做关键词匹配。同一种需求,用户说“查订单”还是“我的快递呢”,最终都能映射到同一个查询动作。

这里的关键是“函数调用映射”。模型输出一个结构化的动作,例如 query_order(order_id="9527"),就像服务员把顾客的话翻译成一张点菜单。同时,ADK 原生支持多模态输入:文本、图片、音频都可以作为点单方式。你发一张截图说“这个订单怎么回事”,Agent 也能看懂图里的订单号。

意图理解之后是流式输出。模型不是等整段话算完才回答,而是像主厨一边炒菜一边让服务员先上凉菜:首字延迟低,用户体感更接近真人对话。

顾客的语言千变万化,但后厨只需要听懂“加辣、免葱、多点饭”这几个关键动作。意图理解就是帮 Agent 从五花八门的话里,找到那个准确的动作按钮。

P(c∣x)=exp⁡(zc)∑j=1Kexp⁡(zj)P(c \mid x) = \frac{\displaystyle \exp(z_c)}{\displaystyle \sum_{j=1}^{K} \exp(z_j)}
这表示在给定输入 $x$ 时,候选人意图 $c$ 的概率。
  1. 输入 $x$用户的多模态输入经过编码,变成模型能处理的语义向量。
    xx
  2. 候选意图 $c$$c$ 是某个候选操作,比如“查询订单”。
    cc
  3. 匹配分数 $z_c$模型为每个候选意图打出一个原始分数。
    zcz_c
  4. 归一化求和把原始分数变成概率分布,所有候选概率之和为 1。
    exp⁡(zc)∑j=1Kexp⁡(zj)\frac{\exp(z_c)}{\sum_{j=1}^{K} \exp(z_j)}

工具注册:给厨师挂上厨具清单

后厨的刀具、烤箱、食材都要有自己的“位置和用法说明”,否则厨师会拿错工具。工具是 Agent 与外部世界交互的窗口。在 ADK 中,你可以用装饰器或配置声明一个工具,每个工具包含四个要素:名字、描述、参数结构和执行函数。

工具注册表是一个动态注册中心,Agent 启动时把工具挂上去,运行时模型根据描述判断该用哪个工具,再根据参数 Schema 校验模型生成的入参是否合法。如果用户说“帮我订下周一去上海的机票”,模型可能生成 search_flights(departure="北京", arrival="上海", date="2026-01-19"),Schema 会确保日期格式正确。

工具调用失败时,ADK 不会粗暴结束对话,而是把错误信息回传给模型,让它尝试换一种方式重试。这就像厨师炒菜发现没盐,不是直接端上桌,而是立刻让帮厨补货再补救。

一个工具就是一张厨具卡,挂在后厨墙上。模型不一定看得懂每把刀的材质,但只要看清卡片上的用途说明和操作步骤,就能在正确的时机抽出正确的工具。

T={(ni,  di,  σi,  fi)}i=1N\mathcal{T} = \left\{ (n_i,\; d_i,\; \sigma_i,\; f_i) \right\}_{i=1}^{N}
工具集就是一组“名字+描述+参数结构+执行函数”的四元组。
  1. 工具集 $\mathcal{T}$Agent 当前可以调用的全部工具集合。
    T\mathcal{T}
  2. 工具名 $n_i$每个工具的唯一标识,例如 search_flights。
    nin_i
  3. 自然语言描述 $d_i$告诉大模型“什么场景下用我”。
    did_i
  4. 参数结构 $\sigma_i$JSON Schema 描述入参格式。
    σi\sigma_i
  5. 执行函数 $f_i$模型选定工具后真正运行的函数。
    fif_i

会话管理:记住老顾客的口味偏好

餐厅会记住老顾客的忌口和偏好:王先生不吃香菜,李女士要少辣。会话管理就是 Agent 的记忆库。ADK 提供 SessionState 对象,保存消息历史、工具调用结果和自定义变量。每次新请求都在旧状态上更新,让多轮对话像聊天一样连贯。

但上下文窗口是有限的,就像餐桌只有那么大,不能无限堆盘子。ADK 会做压缩和截断:把早期对话概括成摘要,丢弃过期的中间消息,保留关键信息。长会话还要支持持久化,把状态写入数据库,避免服务重启后顾客的记忆全部清零。

会话更新遵循一个简单逻辑:以上一轮工具的真实结果作为事实来源,而不是让模型凭空想象。这样即使模型回答有误,工具返回的订单状态、用户信息也能及时纠正对话方向。

会话状态就像一桌食客从进门到结账的完整记录。ADK 负责把“谁点的、加过几次菜、有什么忌口”都写在一本账上,顾客每一轮提问,都像在提醒服务员:“我刚才说的你还记得吧?”

St=Update(St−1,  ut,  at)S_t = \text{Update}\left( S_{t-1},\; u_t,\; a_t \right)
当前会话状态由上一个状态、新消息和最新动作共同决定。
  1. 历史状态 $S_{t-1}$上一轮对话结束后保存的上下文。
    St−1S_{t-1}
  2. 新用户话语 $u_t$用户当前这一轮发来的请求。
    utu_t
  3. 动作结果 $a_t$上一轮工具调用返回的结果。
    ata_t
  4. 更新函数 Update把新旧信息压缩、截断、改写,得到新状态。
    Update\text{Update}
  5. 当前状态 $S_t$更新后的最新上下文,供下一轮决策使用。
    StS_t

多智能体协作:让宴席交给团队

宴席不是一位厨师从头包到尾,而是配菜、热炒、面点各司其职。复杂任务同样需要多个专职 Agent。ADK 支持异步委托:主 Agent 先分析请求,再把子任务拆给擅长对应领域的子 Agent,最后聚合所有结果,形成统一回答。

任务拆分要保证子任务互不重叠,才能避免两个厨师做同一道菜。协作拓扑可以是星型(主 Agent 统一调度)、层叠(逐级下发)或流水线(前一个 Agent 的输出是后一个的输入)。ADK 通过 sub_agents 配置和专用回调通道管理消息传递,主 Agent 不必关心每个子任务的具体实现。

这种模式特别适合“数据分析”类任务:先由一个 Agent 查数据库,一个 Agent 做图表,一个 Agent 写报告,最后主 Agent 把三份成果拼成完整答案。每个 Agent 的工具和指令都更聚焦,容易维护。

多人后厨讲究分工明确、配合默契。多 Agent 协作把这种默契编码到系统里:每个 Agent 专注一个岗位,主 Agent 负责统筹,最终把一盘盘菜拼成一桌完整宴席。

Ttask=⋃j=1kTj,Ti∩Tj=∅  (i≠j)\mathcal{T}_{\text{task}} = \bigcup_{j=1}^{k} \mathcal{T}_{j}, \quad \mathcal{T}_{i} \cap \mathcal{T}_{j} = \emptyset \; (i \neq j)
总任务被拆成互不重叠的子任务,由不同 Agent 分头完成。
  1. 总任务 $\mathcal{T}_{\text{task}}$一个复杂请求的整体目标,像一桌宴席。
    Ttask\mathcal{T}_{\text{task}}
  2. 子任务并集总任务分成 $k$ 个独立子任务的完整集合。
    ⋃j=1kTj\bigcup_{j=1}^{k} \mathcal{T}_{j}
  3. 子任务不相交任意两个子任务没有重叠,避免重复劳动。
    Ti∩Tj=∅\mathcal{T}_{i} \cap \mathcal{T}_{j} = \emptyset

部署监控:后厨大厅的进度屏

后厨大厅有一块屏幕,显示每桌出菜进度和超时预警。Agent 上线只是第一步,ADK 部署到 Cloud Run 后,管理员需要日志、指标和追踪来保障服务质量。可用率是最直观的健康信号:系统在观测周期内有多少时间是正常出菜的。

每次请求都会生成追踪 ID,像给每桌客人一张排队小票,可以跨会话定位故障发生在哪一步:是意图理解慢,还是工具调用失败,或是流式推送中断。监控面板展示调用量、延迟分位数、错误率,设置告警规则后指标超阈值会自动通知负责人。

除了可用率,还要关注上下文长度分布和资源配额。如果同一时间涌入太多用户,Cloud Run 会自动扩容实例,但也需要设置最大并发避免账单爆炸。生产级 Agent 不是“写完代码就结束”,而是上线后持续观测、迭代。

部署监控就像后厨门口的电子屏:哪一桌等太久,哪道菜做失败,一眼看穿。ADK 让 Agent 的可观测性原生内置,你不必从零搭一套监控系统,而是直接看到“每个环节花了多久、错在哪里”。

A=TupTtotal×100%A = \frac{T_{\text{up}}}{T_{\text{total}}} \times 100\%
可用率就是“后厨正常开门营业的时间”占总时间的百分比。
  1. 可用时长 $T_{\text{up}}$观测周期内 Agent 正常响应请求的时间。
    TupT_{\text{up}}
  2. 总时长 $T_{\text{total}}$整个观测窗口的时间长度。
    TtotalT_{\text{total}}
  3. 可用率 $A$服务可用性百分比,越高代表后厨越少歇业。
    AA

AI 应用场景

电商售后 Agent

阶段:意图理解 + 工具注册

解决的问题:传统 IVR 语音菜单只能按按键,用户说“我前天买的鞋还没到”根本听不懂。ADK 驱动的 Agent 能理解自然语言,并动态调用订单查询、物流查询和退款工具,把售后链路串起来。

具体案例:某电商平台把客服机器人升级为 ADK Agent。用户发来“查一下我最后一个订单到哪了”,Agent 识别意图后调用 query_logistics 工具,并在会话状态里记住用户 ID。用户追问“那怎么退货”,同一轮会话能直接定位到同一个订单,无需重复提供单号。

多 Agent 数据分析助手

阶段:多智能体协作 + 部署监控

解决的问题:数据查询、图表生成、报告撰写三个环节耦合时,单个 Agent 提示词过长且难以维护。ADK 拆分多个专职 Agent,各管一段。

具体案例:运营人员发出“分析本周留存并生成周报”。主 Agent 把任务委托给 SQL Agent 取数、图表 Agent 画图、写手 Agent 汇总,最后流式推送一份 Markdown 周报。Cloud Run 上通过日志追踪每个子任务耗时,哪个环节变慢一目了然。

多模态会议纪要 Agent

阶段:会议管理 + 多模态输入 + 流式输出

解决的问题:人工整理音视频会议纪效率低且容易漏掉关键决策。ADK Agent 可同时处理语音转写和截图理解,生成结构化纪要。

具体案例:产品评审会结束后,Agent 接收录音文件和白板照片,理解“新增支付入口”“三端同时发布”等决策,输出纪要和待办事项。历史会议放入同一会话,下次开会可以继续追问上轮结论。

Python 演示

python65 行
import refrom typing import Callable  class KitchenAgent:    """极简版 ADK 演示:工具注册 + 意图理解 + 会话记忆"""     def __init__(self):        self.tools = {}        self.history = []     def register_tool(self, name: str, desc: str, func: Callable) -> None:        self.tools[name] = {"desc": desc, "func": func}     def understand(self, query: str) -> str:        if "查" in query and "订单" in query:            return "query_order"        if "点" in query and "菜" in query:            return "add_dish"        if "退" in query or "取消" in query:            return "cancel_order"        return "unknown"     def run(self, query: str) -> str:        intent = self.understand(query)        self.history.append((query, intent))        if intent in self.tools:            return self.tools[intent]["func"](query)        return "抱歉,我没听懂,请换个说法。"  def make_query_order():    def func(query: str) -> str:        match = re.search(r"\d+", query)        order_id = match.group(0) if match else "未知"        return f"订单 {order_id} 正在配送中。"    return func  def make_add_dish():    def func(query: str) -> str:        return "已为您加菜,请稍候上桌。"    return func  def make_cancel_order():    def func(query: str) -> str:        return "订单已提交取消申请。"    return func  def main() -> None:    agent = KitchenAgent()    agent.register_tool("query_order", "查询订单状态", make_query_order())    agent.register_tool("add_dish", "向订单添加菜品", make_add_dish())    agent.register_tool("cancel_order", "取消订单", make_cancel_order())     print(agent.run("帮我查一下订单 9527 到哪了?"))    print(agent.run("再加一份甜品"))    print(agent.run("我不想要了,取消吧"))    print("会话记忆:", agent.history)  if __name__ == "__main__":    main()
目的:用 50 行代码演示 ADK 的三个核心概念——工具注册、意图理解、会话记忆,跑一个“智能餐厅点单员”。
  1. self.tools = {}创建一个动态注册中心,后面注册的工具都会放进来。
  2. def register_tool(self, name, desc, func)对应 ADK 的工具注册,把名字、描述和函数绑定。
  3. def understand(self, query)模拟意图理解,把口语映射到结构化动作。
  4. self.history.append((query, intent))保存每一轮对话,模拟 SessionState 的记忆写入。
  5. if intent in self.tools检查当前意图有没有对应的工具可用。
  6. agent.register_tool("query_order", ...)像在 ADK 里声明一个 @tool,挂到注册中心。
  7. print("会话记忆:", agent.history)展示多轮对话后的状态积累。

常见误区

误区我把工具函数写在代码里,Agent 运行时自然就能调用它,不需要额外声明。

正解模型看不到你的源码,只能看到注册中心里的工具元数据。必须显式提供名字、描述和参数 Schema,模型才知道“什么时候该调它、参数怎么填”。这就像菜谱放在抽屉里,厨师不知道抽屉在哪,菜永远不会被做出来。

为何常见:普通函数在代码中确实存在,初学者容易把“函数存在”和“模型可见”混为一谈。

误区Agent 的记忆能力像人脑一样,历史越多越聪明,所以应该把所有消息都塞进上下文。

正解模型上下文窗口是有限的,超过限制会被截断或报错。更重要的是,过长的历史会稀释关键信息,让模型抓不住重点。正确做法是压缩、总结和截断,只保留当前任务需要的事实。

为何常见:人确实能记得很多,但模型的注意力预算和成本都随 token 数上升,无限叠加并不现实。

误区看到多 Agent 演示很震撼,就觉得任何任务都应该拆成多个子 Agent,拆得越细越好。

正解每拆一个 Agent 就增加通信开销、延迟和失败概率。简单任务用单 Agent 更稳定、更快、更省钱。多 Agent 适合规模大、专业分工明确的复杂场景。

为何常见:漂亮的架构图容易让人忽略分布式带来的调试复杂度。

误区代码上传到 Cloud Run,Agent 就能 7×24 小时稳定运行,不需要监控。

正解生产环境会遇到流量突增、依赖超时、密钥过期等问题。必须配置日志、指标、告警、配额和密钥管理,才能保证服务质量。没有监控的 Agent 就像没有仪表盘的飞机。

为何常见:本地 demo 一次跑通,让人误以为生产环境也一样安静。

误区只要把常见问题词典写大一点,正则匹配也能实现意图理解。

正解ADK 使用 Gemini 这样的语义模型,能处理同义改写、省略主语的模糊指令。比如“我的快递呢”和“订单查询”在字面上完全不同,但语义一致。规则只能匹配字面,模型理解的是含义。

为何常见:小范围关键词 demo 容易跑通,但换一种说法就失效,容易低估语义模型的必要性。

面试题

Q1. 在 Google ADK 的 Agent 四元组中,以下哪项不属于核心组件?

单选题 · easy

  • A.模型
  • B.工具
  • C.数据集← 正确答案
  • D.会话状态

答案:C。ADK 的 Agent 由模型、工具、会话状态和编排器构成。数据集不是核心组件,而是训练阶段的概念,与运行时 Agent 的定义无关。

Q2. 工具注册时,“描述(description)”字段的主要作用是?

单选题 · easy

  • A.让模型判断何时调用← 正确答案
  • B.让日志输出更清晰
  • C.让前端渲染更美观
  • D.让网络传输更快速

答案:A。描述是写给大模型看的,模型根据自然语言描述判断当前用户请求是否与该工具匹配。它不参与日志、渲染或网络通信。

Q3. 工具参数 Schema 的作用是?

单选题 · easy

  • A.生成合法的模型入参← 正确答案
  • B.压缩会话存储空间
  • C.加密工具调用链路
  • D.定时清理历史消息

答案:A。Schema 描述工具入参的结构和类型,模型据此生成合法参数。它不负责存储、加密或消息清理。

Q4. 多轮会话中,SessionState 的核心价值是?

单选题 · mid

  • A.保存并延续对话上下文← 正确答案
  • B.替代模型进行推理
  • C.加快工具执行速度
  • D.自动生成前端页面

答案:A。SessionState 保存消息历史、工具结果和自定义变量,让多轮对话保持连贯。它不参与模型推理、工具加速和页面渲染。

Q5. 流式输出相比一次性输出的最大优势是?

单选题 · mid

  • A.首字延迟更低体验更顺← 正确答案
  • B.答案一定更准确
  • C.完全避免模型幻觉
  • D.不需要计算资源

答案:A。流式输出边生成边推送,用户更快看到内容,体感更接近真人对话。但它不会提升正确率,也不能消除幻觉,计算资源依然需要。

Q6. 多 Agent 协作中“任务委托”的本质是?

单选题 · mid

  • A.把子任务交给合适 Agent← 正确答案
  • B.把多个任务合并执行
  • C.让所有 Agent 重复干活
  • D.丢弃不重要的任务

答案:A。任务委托是主 Agent 将子任务交给最专业的 Agent 执行,并聚合结果。合并、重复或丢弃都不符合委托机制。

Q7. ADK 支持的多模态输入包括哪些?

多选题 · mid

  • A.纯文本← 正确答案
  • B.图片← 正确答案
  • C.语音← 正确答案
  • D.数据库表结构

答案:ABC。ADK 深度集成 Gemini,支持文本、图片、语音等多种输入形式。数据库表结构是工具参数的数据类型,不是用户的输入模态。

Q8. 工具调用抛异常时,ADK 推荐的处理方式是?

单选题 · hard

  • A.向模型回传错误并重试← 正确答案
  • B.静默忽略继续对话
  • C.立即终止整个会话
  • D.无脑重复相同调用

答案:A。ADK 会把错误信息作为上下文回传给模型,让模型尝试修正参数或换一种方式再次调用。静默忽略会让用户得到错误答案,终止会话和原样重试都不是智能策略。

Q9. 生产环境部署 ADK Agent 应关注哪些观测指标?

多选题 · hard

  • A.平均响应时间← 正确答案
  • B.工具调用失败率← 正确答案
  • C.客户满意度问卷
  • D.上下文长度分布← 正确答案

答案:ABD。响应时间、工具失败率和上下文长度直接影响可用性与成本。客户满意度属于业务指标,不是运行时观测指标。

Q10. 关于会话上下文窗口管理,以下说法正确的有?

多选题 · extreme

  • A.需压缩长历史记录← 正确答案
  • B.可截断过期消息← 正确答案
  • C.上下文无限增长可行
  • D.持久化防重启丢失← 正确答案

答案:ABD。上下文窗口有上限,需要压缩和截断来保留关键信息。持久化到外部存储能防止服务重启后记忆丢失。上下文无限增长既不可行,也会拖慢推理。