想象你开了一家智能餐厅,顾客用语音、图片甚至手势点单,后厨里不同厨师各司其职,还有食客口味档案和出菜监控屏。要让这一切自动协同,你需要一套后厨中枢系统——这就是 Google ADK(Agent Development Kit)。ADK 像是给 AI Agent 搭建的完整后厨流水线:它听懂顾客意图,为 Agent 注册“厨师技能”(工具),记住每桌食客的偏好(会话),支持多个厨师协作出菜(多 Agent),并随时监控出菜是否超时(部署监控)。而 Gemini 模型就是后厨里那位经验老到的主厨,负责做最终决策。本课将带你从零认识 ADK 的六大模块,并用一套可以运行的代码,把“智能餐厅后厨”真正建起来。
学完本课,你将能运用 Google ADK 在 Google Cloud 上快速开发、部署和监控企业级 AI Agent,成为团队中能独立交付智能应用的 AI 工程师。
目录
可视化演示
展示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 整体一个可自主推理的智能体,由四类组件共同定义。
- 模型 \mathcal{M}Gemini 等语言模型,是后厨里拿主意的主厨。
- 工具 \mathcal{T}Agent 能调用的 API 或函数,是厨具和食材。
- 会话状态 \mathcal{S}跨轮对话的记忆与上下文,是顾客偏好档案。
- 编排器 \mathcal{O}决定先做什么后做什么的调度逻辑,是后厨流程表。
意图理解:听懂顾客的弦外之音
顾客说“今儿人多,少放点盐”,后厨不仅要听懂内容,还要懂得这是“少盐”指令。意图理解是 Agent 的第一道工序。ADK 会让 Gemini 将用户输入映射成结构化的函数调用意图,而不是简单地做关键词匹配。同一种需求,用户说“查订单”还是“我的快递呢”,最终都能映射到同一个查询动作。
这里的关键是“函数调用映射”。模型输出一个结构化的动作,例如 query_order(order_id="9527"),就像服务员把顾客的话翻译成一张点菜单。同时,ADK 原生支持多模态输入:文本、图片、音频都可以作为点单方式。你发一张截图说“这个订单怎么回事”,Agent 也能看懂图里的订单号。
意图理解之后是流式输出。模型不是等整段话算完才回答,而是像主厨一边炒菜一边让服务员先上凉菜:首字延迟低,用户体感更接近真人对话。
顾客的语言千变万化,但后厨只需要听懂“加辣、免葱、多点饭”这几个关键动作。意图理解就是帮 Agent 从五花八门的话里,找到那个准确的动作按钮。
- 输入 $x$用户的多模态输入经过编码,变成模型能处理的语义向量。
- 候选意图 $c$$c$ 是某个候选操作,比如“查询订单”。
- 匹配分数 $z_c$模型为每个候选意图打出一个原始分数。
- 归一化求和把原始分数变成概率分布,所有候选概率之和为 1。
工具注册:给厨师挂上厨具清单
后厨的刀具、烤箱、食材都要有自己的“位置和用法说明”,否则厨师会拿错工具。工具是 Agent 与外部世界交互的窗口。在 ADK 中,你可以用装饰器或配置声明一个工具,每个工具包含四个要素:名字、描述、参数结构和执行函数。
工具注册表是一个动态注册中心,Agent 启动时把工具挂上去,运行时模型根据描述判断该用哪个工具,再根据参数 Schema 校验模型生成的入参是否合法。如果用户说“帮我订下周一去上海的机票”,模型可能生成 search_flights(departure="北京", arrival="上海", date="2026-01-19"),Schema 会确保日期格式正确。
工具调用失败时,ADK 不会粗暴结束对话,而是把错误信息回传给模型,让它尝试换一种方式重试。这就像厨师炒菜发现没盐,不是直接端上桌,而是立刻让帮厨补货再补救。
一个工具就是一张厨具卡,挂在后厨墙上。模型不一定看得懂每把刀的材质,但只要看清卡片上的用途说明和操作步骤,就能在正确的时机抽出正确的工具。
- 工具集 $\mathcal{T}$Agent 当前可以调用的全部工具集合。
- 工具名 $n_i$每个工具的唯一标识,例如
search_flights。 - 自然语言描述 $d_i$告诉大模型“什么场景下用我”。
- 参数结构 $\sigma_i$JSON Schema 描述入参格式。
- 执行函数 $f_i$模型选定工具后真正运行的函数。
会话管理:记住老顾客的口味偏好
餐厅会记住老顾客的忌口和偏好:王先生不吃香菜,李女士要少辣。会话管理就是 Agent 的记忆库。ADK 提供 SessionState 对象,保存消息历史、工具调用结果和自定义变量。每次新请求都在旧状态上更新,让多轮对话像聊天一样连贯。
但上下文窗口是有限的,就像餐桌只有那么大,不能无限堆盘子。ADK 会做压缩和截断:把早期对话概括成摘要,丢弃过期的中间消息,保留关键信息。长会话还要支持持久化,把状态写入数据库,避免服务重启后顾客的记忆全部清零。
会话更新遵循一个简单逻辑:以上一轮工具的真实结果作为事实来源,而不是让模型凭空想象。这样即使模型回答有误,工具返回的订单状态、用户信息也能及时纠正对话方向。
会话状态就像一桌食客从进门到结账的完整记录。ADK 负责把“谁点的、加过几次菜、有什么忌口”都写在一本账上,顾客每一轮提问,都像在提醒服务员:“我刚才说的你还记得吧?”
- 历史状态 $S_{t-1}$上一轮对话结束后保存的上下文。
- 新用户话语 $u_t$用户当前这一轮发来的请求。
- 动作结果 $a_t$上一轮工具调用返回的结果。
- 更新函数 Update把新旧信息压缩、截断、改写,得到新状态。
- 当前状态 $S_t$更新后的最新上下文,供下一轮决策使用。
多智能体协作:让宴席交给团队
宴席不是一位厨师从头包到尾,而是配菜、热炒、面点各司其职。复杂任务同样需要多个专职 Agent。ADK 支持异步委托:主 Agent 先分析请求,再把子任务拆给擅长对应领域的子 Agent,最后聚合所有结果,形成统一回答。
任务拆分要保证子任务互不重叠,才能避免两个厨师做同一道菜。协作拓扑可以是星型(主 Agent 统一调度)、层叠(逐级下发)或流水线(前一个 Agent 的输出是后一个的输入)。ADK 通过 sub_agents 配置和专用回调通道管理消息传递,主 Agent 不必关心每个子任务的具体实现。
这种模式特别适合“数据分析”类任务:先由一个 Agent 查数据库,一个 Agent 做图表,一个 Agent 写报告,最后主 Agent 把三份成果拼成完整答案。每个 Agent 的工具和指令都更聚焦,容易维护。
多人后厨讲究分工明确、配合默契。多 Agent 协作把这种默契编码到系统里:每个 Agent 专注一个岗位,主 Agent 负责统筹,最终把一盘盘菜拼成一桌完整宴席。
- 总任务 $\mathcal{T}_{\text{task}}$一个复杂请求的整体目标,像一桌宴席。
- 子任务并集总任务分成 $k$ 个独立子任务的完整集合。
- 子任务不相交任意两个子任务没有重叠,避免重复劳动。
部署监控:后厨大厅的进度屏
后厨大厅有一块屏幕,显示每桌出菜进度和超时预警。Agent 上线只是第一步,ADK 部署到 Cloud Run 后,管理员需要日志、指标和追踪来保障服务质量。可用率是最直观的健康信号:系统在观测周期内有多少时间是正常出菜的。
每次请求都会生成追踪 ID,像给每桌客人一张排队小票,可以跨会话定位故障发生在哪一步:是意图理解慢,还是工具调用失败,或是流式推送中断。监控面板展示调用量、延迟分位数、错误率,设置告警规则后指标超阈值会自动通知负责人。
除了可用率,还要关注上下文长度分布和资源配额。如果同一时间涌入太多用户,Cloud Run 会自动扩容实例,但也需要设置最大并发避免账单爆炸。生产级 Agent 不是“写完代码就结束”,而是上线后持续观测、迭代。
部署监控就像后厨门口的电子屏:哪一桌等太久,哪道菜做失败,一眼看穿。ADK 让 Agent 的可观测性原生内置,你不必从零搭一套监控系统,而是直接看到“每个环节花了多久、错在哪里”。
- 可用时长 $T_{\text{up}}$观测周期内 Agent 正常响应请求的时间。
- 总时长 $T_{\text{total}}$整个观测窗口的时间长度。
- 可用率 $A$服务可用性百分比,越高代表后厨越少歇业。
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 演示
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()
self.tools = {}创建一个动态注册中心,后面注册的工具都会放进来。def register_tool(self, name, desc, func)对应 ADK 的工具注册,把名字、描述和函数绑定。def understand(self, query)模拟意图理解,把口语映射到结构化动作。self.history.append((query, intent))保存每一轮对话,模拟 SessionState 的记忆写入。if intent in self.tools检查当前意图有没有对应的工具可用。agent.register_tool("query_order", ...)像在 ADK 里声明一个@tool,挂到注册中心。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 四元组中,以下哪项不属于核心组件?
- A.模型
- B.工具
- C.数据集← 正确答案
- D.会话状态
答案:C。ADK 的 Agent 由模型、工具、会话状态和编排器构成。数据集不是核心组件,而是训练阶段的概念,与运行时 Agent 的定义无关。
Q2. 工具注册时,“描述(description)”字段的主要作用是?
- A.让模型判断何时调用← 正确答案
- B.让日志输出更清晰
- C.让前端渲染更美观
- D.让网络传输更快速
答案:A。描述是写给大模型看的,模型根据自然语言描述判断当前用户请求是否与该工具匹配。它不参与日志、渲染或网络通信。
Q3. 工具参数 Schema 的作用是?
- A.生成合法的模型入参← 正确答案
- B.压缩会话存储空间
- C.加密工具调用链路
- D.定时清理历史消息
答案:A。Schema 描述工具入参的结构和类型,模型据此生成合法参数。它不负责存储、加密或消息清理。
Q4. 多轮会话中,SessionState 的核心价值是?
- A.保存并延续对话上下文← 正确答案
- B.替代模型进行推理
- C.加快工具执行速度
- D.自动生成前端页面
答案:A。SessionState 保存消息历史、工具结果和自定义变量,让多轮对话保持连贯。它不参与模型推理、工具加速和页面渲染。
Q5. 流式输出相比一次性输出的最大优势是?
- A.首字延迟更低体验更顺← 正确答案
- B.答案一定更准确
- C.完全避免模型幻觉
- D.不需要计算资源
答案:A。流式输出边生成边推送,用户更快看到内容,体感更接近真人对话。但它不会提升正确率,也不能消除幻觉,计算资源依然需要。
Q6. 多 Agent 协作中“任务委托”的本质是?
- A.把子任务交给合适 Agent← 正确答案
- B.把多个任务合并执行
- C.让所有 Agent 重复干活
- D.丢弃不重要的任务
答案:A。任务委托是主 Agent 将子任务交给最专业的 Agent 执行,并聚合结果。合并、重复或丢弃都不符合委托机制。
Q7. ADK 支持的多模态输入包括哪些?
- A.纯文本← 正确答案
- B.图片← 正确答案
- C.语音← 正确答案
- D.数据库表结构
答案:ABC。ADK 深度集成 Gemini,支持文本、图片、语音等多种输入形式。数据库表结构是工具参数的数据类型,不是用户的输入模态。
Q8. 工具调用抛异常时,ADK 推荐的处理方式是?
- A.向模型回传错误并重试← 正确答案
- B.静默忽略继续对话
- C.立即终止整个会话
- D.无脑重复相同调用
答案:A。ADK 会把错误信息作为上下文回传给模型,让模型尝试修正参数或换一种方式再次调用。静默忽略会让用户得到错误答案,终止会话和原样重试都不是智能策略。
Q9. 生产环境部署 ADK Agent 应关注哪些观测指标?
- A.平均响应时间← 正确答案
- B.工具调用失败率← 正确答案
- C.客户满意度问卷
- D.上下文长度分布← 正确答案
答案:ABD。响应时间、工具失败率和上下文长度直接影响可用性与成本。客户满意度属于业务指标,不是运行时观测指标。
Q10. 关于会话上下文窗口管理,以下说法正确的有?
- A.需压缩长历史记录← 正确答案
- B.可截断过期消息← 正确答案
- C.上下文无限增长可行
- D.持久化防重启丢失← 正确答案
答案:ABD。上下文窗口有上限,需要压缩和截断来保留关键信息。持久化到外部存储能防止服务重启后记忆丢失。上下文无限增长既不可行,也会拖慢推理。