Google ADK Agent 开发入门:5种Skill 设计模式手把手教程(2026 最新)
本文用 5 个可运行的代码模板,带你掌握 ADK 中最核心的 Skill 设计模式——从最简单的顺序执行,到生产级的多专家协作。很多同学跑完 ADK 的 Hello World 后就卡住了:Agent 能跑但很脆弱,加需求就崩。根本原因是没有选对 Skill 的组织方式。这篇帮你理清楚 5 种模式分别怎么用、什么场景该选哪个。
Agent Development Kit(ADK)是 Google 发布的 AI Agent 开发框架,帮助开发者用 Python 快速构建可投入生产的智能体应用。 本文用 5 个可运行的代码模板,带你掌握 ADK 中最核心的 Skill 设计模式——从最简单的顺序执行,到生产级的多专家协作。
很多同学跑完 ADK 的 Hello World 后就卡住了:Agent 能跑但很脆弱,加需求就崩。根本原因是没有选对 Skill 的组织方式。这篇帮你理清楚 5 种模式分别怎么用、什么场景该选哪个。
环境准备
开始前确保你有以下环境:
# 1. Python 3.10+
python --version
# 2. 安装 ADK
pip install google-adk
# 3. 配置 API Key(二选一)
# 方案 A:直接用 Google Vertex AI
export GOOGLE_APPLICATION_CREDENTIALS="path/to/service-account.json"
# 方案 B:用第三方 API 网关(支持多模型切换)
export ADK_API_BASE="https://api.ofox.ai/v1"
export ADK_API_KEY="your-key"
环境没问题的话,下面直接上代码。
模式一:顺序链(Sequential Chain)——最适合入门
一句话理解:Skill A 做完 → 结果传给 Skill B → 再传给 Skill C,像流水线一样。
什么时候用?
只要你的任务是"先做这个,再做那个"的线性流程,顺序链就够了:
- 接收用户输入 → 提取关键信息 → 存数据库
- 读取文件 → 数据清洗 → 生成报告
完整可运行代码
from google.adk import Agent, Skill, SequentialRunner
class ExtractSkill(Skill):
"""第一步:从用户输入中提取结构化数据"""
def execute(self, context):
raw_text = context.get("user_input")
entities = self.llm.extract_entities(raw_text)
context.set("entities", entities)
return context
class ValidateSkill(Skill):
"""第二步:检查数据是否完整"""
def execute(self, context):
entities = context.get("entities")
if not entities: # 防御性检查:上一步可能失败
context.set("is_valid", False)
context.set("validation_error", "提取结果为空")
return context
missing = [f for f in ["name", "date", "amount"] if f not in entities]
if missing:
context.set("validation_error", f"缺少字段: {missing}")
context.set("is_valid", False)
else:
context.set("is_valid", True)
return context
class PersistSkill(Skill):
"""第三步:验证通过则写入数据库"""
def execute(self, context):
if not context.get("is_valid"):
print(f"跳过写入,原因:{context.get('validation_error')}")
return context
entities = context.get("entities")
db.insert("records", entities)
context.set("result", "写入成功")
return context
# 组装 Agent
agent = Agent(
skills=[ExtractSkill(), ValidateSkill(), PersistSkill()],
runner=SequentialRunner()
)
新手常见坑
坑 1:中间步骤失败,后面全崩。 比如 ExtractSkill 抛异常,ValidateSkill 收到的是空数据。解决:每个 Skill 开头都加 if not entities 的防御检查(上面代码已经加了)。
坑 2:多次调用后数据残留。 第二次请求还能读到第一次的 context 数据。解决:每次新请求创建一个新的 context 实例,别复用。
坑 3:出了 bug 不知道哪步的问题。 解决:每个 Skill 里加一行 context.log(f"[{self.__class__.__name__}] 输出: {结果}") 打日志。
模式二:并行扇出(Parallel Fan-Out)——多数据源必备
一句话理解:同时发出多个请求,等全部返回后合并结果。比逐个请求快得多。
什么时候用?
多个任务之间互不依赖,可以同时执行:
- 同时查数据库、调 API、读缓存
- 用多个模型分别推理,取最优结果
完整代码
from google.adk import Agent, Skill, ParallelRunner, AggregatorSkill
class SearchDBSkill(Skill):
def execute(self, context):
result = db.query(context.get("query"))
return {"source": "db", "data": result}
class SearchAPISkill(Skill):
def execute(self, context):
result = api.search(context.get("query"))
return {"source": "api", "data": result}
class SearchCacheSkill(Skill):
def execute(self, context):
result = cache.get(context.get("query"))
return {"source": "cache", "data": result}
class MergeResultsSkill(AggregatorSkill):
"""合并所有来源的结果,按优先级选最佳"""
def aggregate(self, results):
valid = [r for r in results if r["data"] is not None]
priority = {"cache": 0, "db": 1, "api": 2} # 缓存优先
valid.sort(key=lambda x: priority.get(x["source"], 99))
return valid[0] if valid else {"error": "所有数据源均无结果"}
agent = Agent(
skills=[SearchDBSkill(), SearchAPISkill(), SearchCacheSkill()],
aggregator=MergeResultsSkill(),
runner=ParallelRunner(timeout_seconds=10) # 10秒超时保底
)
性能实测对比
| 执行方式 | 总耗时 | 原理 |
|---|---|---|
| 顺序调用 | 1.2s + 0.8s + 0.1s = 2.1s | 一个一个等 |
| 并行扇出 | max(1.2, 0.8, 0.1) = 1.2s | 只等最慢的 |
| 并行 + 超时兜底 | ≤1.0s | 超时的直接丢弃 |
一行 ParallelRunner 就能把耗时砍掉近一半,改动极小但效果明显。
模式三:路由模式(Router Pattern)——让 Agent 学会分流
一句话理解:根据用户输入的类型,自动选择调用哪个 Skill。相当于 Agent 内部的智能 if-else。
什么时候用?
你的 Agent 需要处理多种不同类型的请求:
- 用户可能问问题(查询)、要求创建内容、或者要分析数据
- 不同类型走不同处理逻辑
代码示例
from google.adk import Agent, Skill, RouterSkill
class IntentRouter(RouterSkill):
"""判断用户意图,分发到对应 Skill"""
ROUTES = {
"query": "QuerySkill",
"create": "CreateSkill",
"analyze": "AnalyzeSkill",
}
def route(self, context):
user_input = context.get("user_input")
# 推荐:先用规则匹配(快且省钱)
if any(kw in user_input for kw in ["查", "找", "搜索", "是什么"]):
return "QuerySkill"
if any(kw in user_input for kw in ["生成", "创建", "写一个"]):
return "CreateSkill"
# 规则没命中,再用 LLM 兜底
intent = self.llm.classify(
user_input,
categories=list(self.ROUTES.keys())
)
return self.ROUTES.get(intent, "FallbackSkill")
规则路由 vs LLM 路由怎么选?
| 对比项 | 规则路由 | LLM 路由 |
|---|---|---|
| 速度 | <5ms | 200-800ms |
| 准确率 | 约 85%(模糊输入差) | 95%+(复杂意图也行) |
| Token 成本 | 0 | 每次约 500 token |
| 维护难度 | 需要手动加关键词 | 改 prompt 就行 |
建议:先用规则路由跑起来,如果命中率低于 90% 再加 LLM 兜底。上面代码就是这个思路——规则优先,LLM 兜底。
模式四:监督者模式(Supervisor)——复杂任务的大脑
一句话理解:一个"项目经理" Skill 掌控全局,动态调度其他 Skill,可以安排重试、调整计划。
什么时候用?
任务比较复杂,需要多步协作,且可能需要根据中间结果动态调整:
- 自动化代码重构(分析 → 制定方案 → 逐步修改 → 验证)
- 复杂数据处理(可能需要回退和重试)
代码示例
from google.adk import Agent, Skill, SupervisorSkill
class TaskSupervisor(SupervisorSkill):
MAX_RETRIES = 3
def supervise(self, context):
# 让 LLM 制定执行计划
plan = self.llm.plan(context.get("task_description"))
for step in plan["steps"]:
skill_name = step["skill"]
retries = 0
while retries < self.MAX_RETRIES:
result = self.dispatch(skill_name, context)
# LLM 评估这步做得对不对
quality = self.llm.evaluate(
task=step["description"],
result=result,
criteria=step.get("success_criteria", "完成且无错误")
)
if quality["passed"]:
context.set(f"step_{step['id']}_result", result)
break
else:
retries += 1
# 把反馈告诉下次重试,让它改进
context.set(f"step_{step['id']}_feedback", quality["feedback"])
if retries >= self.MAX_RETRIES:
return {"status": "failed", "step": step["id"]}
return {"status": "completed"}
关键决策:静态计划 vs 动态计划
- 静态计划:一开始就生成完整步骤列表,按序执行。简单,Token 消耗低。
- 动态计划:每步执行完后重新评估下一步。灵活,但 Token 消耗高 3-5 倍。
建议:大多数场景静态计划够用,只有任务不确定性很高时(比如调试类任务)才上动态计划。
模式五:专家集成(Specialist Ensemble)——多角度分析
一句话理解:多个"专家"分别从不同角度分析同一问题,最后综合得出结论。
什么时候用?
需要全面分析、不能遗漏的场景:
- 代码审查(安全 + 性能 + 可维护性)
- 方案评审(成本 + 技术可行性 + 用户体验)
代码示例
class SecurityExpert(Skill):
SYSTEM_PROMPT = "你是安全工程师,专注发现代码安全漏洞。"
def execute(self, context):
code = context.get("code_to_review")
analysis = self.llm.analyze(
system=self.SYSTEM_PROMPT,
prompt=f"审查以下代码的安全性:\n{code}"
)
return {"expert": "security", "findings": analysis}
class PerformanceExpert(Skill):
SYSTEM_PROMPT = "你是性能优化专家,专注发现性能瓶颈。"
def execute(self, context):
code = context.get("code_to_review")
analysis = self.llm.analyze(
system=self.SYSTEM_PROMPT,
prompt=f"分析以下代码的性能:\n{code}"
)
return {"expert": "performance", "findings": analysis}
class ReviewModerator(AggregatorSkill):
"""综合所有专家意见,输出最终报告"""
def aggregate(self, expert_results):
combined = "\n".join([
f"【{r['expert']}】{r['findings']}"
for r in expert_results
])
return self.llm.synthesize(
prompt=f"综合以下专家意见,给出最终代码审查报告:\n{combined}"
)
实测效果(代码审查场景)
| 方案 | 发现问题数 | 误报率 | Token 消耗 |
|---|---|---|---|
| 单 LLM 直接审查 | 12 | 25% | ~3,200 |
| 3 专家集成 | 23 | 15% | ~9,800 |
| 3 专家 + 交叉验证 | 21 | 8% | ~14,500 |
问题发现数翻了近一倍,误报率反而降了。代价是 Token 消耗翻 3-5 倍。所以这个模式适合"宁可多花钱也不能漏"的场景。
5 种模式怎么选?一张表搞定
| 模式 | 复杂度 | Token 成本 | 最适合场景 | 典型延迟 |
|---|---|---|---|---|
| 顺序链 | ⭐ | 低 | 线性流程(数据管道) | 各步累加 |
| 并行扇出 | ⭐⭐ | 中 | 多源查询、多模型投票 | 取最慢步 |
| 路由模式 | ⭐ | 低~中 | 多类型请求分发 | 路由 + 1 步 |
| 监督者 | ⭐⭐⭐ | 高 | 复杂多步任务 | 不可预测 |
| 专家集成 | ⭐⭐ | 高 | 多角度分析审查 | 可并行优化 |
选型口诀:任务简单用顺序链,多源查询用扇出,入口分发用路由,复杂编排上监督者,需要全面分析用专家。
生产环境省 Token 的 3 个技巧
这些模式组合使用后(比如 Router → Supervisor → Specialist),Token 成本会快速增长。以下是实测有效的优化方法:
技巧 1:分层模型——不同环节用不同模型
# 路由层:用便宜的小模型
router.set_model("gemini-2.5-flash") # ~$0.15/1M tokens
# 执行层:用中档模型
worker.set_model("claude-sonnet-4-6") # ~$3/1M tokens
# 关键决策:用最强模型
supervisor.set_model("claude-opus-4-6") # ~$15/1M tokens
如果你的项目需要频繁切换不同模型,用一个支持多模型统一调度的 API 平台会方便很多。比如 ofox 支持通过单一接口调用 Claude、GPT、Gemini 等主流模型,不用分别管理多个 API Key。
技巧 2:按需传 Context
# ❌ 错误:把完整 context 传给每个 Skill
# ✅ 正确:每个 Skill 只拿它需要的数据
class SmartContextManager:
def get_for_skill(self, skill_name, full_context):
required_keys = SKILL_CONTEXT_MAP[skill_name]
return {k: full_context[k] for k in required_keys if k in full_context}
技巧 3:缓存中间结果
@skill_cache(ttl=3600, key_fn=lambda ctx: hash(ctx.get("query")))
def execute(self, context):
# 相同输入直接返回缓存,不重复调 LLM
pass
实测这三个技巧组合使用,Token 成本可以降低 40-60%。
常见问题
ADK 和 LangChain 有什么区别?
ADK 和 Google Cloud 生态深度集成,原生支持 Vertex AI。LangChain 更通用,社区生态更大。如果你的项目部署在 GCP 上,ADK 更自然;否则可以根据团队熟悉度选择。
这些模式可以嵌套吗?
可以,生产系统基本都是嵌套的。典型组合:Router → Supervisor → Parallel。但嵌套层数建议不超过 3 层,否则调试会非常痛苦。
一个 Router 能管多少个下游 Skill?
ADK 没有硬限制,但路由准确率会随选项增多而下降。建议单个 Router 不超过 10 个下游,超出时用分层 Router(先大类再小类)。
参考资料:
- Google ADK 官方文档
- 更多 AI 开发教程 → ofox.ai/blog
最后更新:2026-03-26
更多推荐




所有评论(0)