省 90% token!谷歌重磅指南教你用 Skill 构建 ADK 智能体
Type: article
Author: Google Developers Blog
Primary Topic: agents
Ingested: 2026-04-17
Summary
Google Developers Blog 发表了 Agent Development Kit(ADK)中的 SkillToolset 深度指南。核心亮点:渐进式披露(Progressive Disclosure)架构,让 AI Agent 按需加载领域专业知识,最多可将基础上下文消耗降低 90%。通过 Skill 工厂(Skill Factory)设计模式,Agent 可以在运行时动态生成全新的 Skill 定义,实现自我扩展。介绍了四种 Skill 构建模式:内联 Skill、文件型 Skill、外部导入 Skill 和元 Skill(Skill 工厂)。基于 agentskills.io 开放标准,支持跨平台复用(Gemini CLI、Claude Code、Cursor 等 40+ 产品)。
Key Concepts
- Google ADK
- SkillToolset
- 渐进式披露(Progressive Disclosure)
- 三层知识加载(L1/L2/L3)
- Skill 工厂(Skill Factory)
- 元 Skill(Meta Skill)
- agentskills.io 规范
- Token 优化
- Agent 自我扩展
核心问题
AI Agent 能执行指令,但能不能自己编写指令?
Google Developers Blog 发表了一篇面向开发者的深度指南,介绍了 Agent Development Kit(ADK)中的 SkillToolset 能力。
核心亮点:
- 渐进式披露(Progressive Disclosure)架构
- 让 AI Agent 按需加载领域专业知识
- 最多可将基础上下文消耗降低 90%
- Skill 工厂(Skill Factory)设计模式
- Agent 可以在运行时动态生成全新的 Skill 定义,实现自我扩展
AI Agent 的知识膨胀难题
问题描述
典型场景:
- 刚开始做 demo,系统提示词(System Prompt)里写几条规则就够了
- 随着业务场景增多,提示词开始不受控制地膨胀
- SEO 规则、代码审查规范、API 接口文档、合规审计流程、数据处理规范全部塞进一个巨大的指令字符串
严重程度:
- 假设一个 Agent 有 10 项能力
- 每项能力的完整指令约需 1000 个 token
- 全部拼进系统提示词 = 每次调用消耗约 10000 个 token 的基础上下文
- 实际上用户可能只用到其中 2 项能力
- 8000 个 token 被白白浪费(80% 浪费率)
问题影响
1. 成本增加:
- 计费方式按输入和输出的 token 数量收费
- 每次调用都在为用户根本用不到的知识买单
- 高频使用的生产环境 Agent,开销累积相当可观
2. 响应质量下降:
- 上下文窗口是有限的资源
- 塞进太多无关信息会稀释模型对关键指令的关注度
- 好比在嘈杂的会议室里找人说话,背景噪音越大,沟通效率越低
- 当 Agent 需要在多个能力维度之间切换时,过长的系统提示词会降低执行精度
- 能力维度超过 10 个之后尤为明显
3. 功能丰富度 vs 响应准确性的艰难取舍
解决方案:渐进式披露(Progressive Disclosure)
核心思想
把知识加载拆分成三个层级,只在需要的时候才加载需要的知识。
类比:
- 像查字典一样按需翻阅
- 而不是把整本百科全书一次性全部翻开
三层知识加载架构
L1 元数据层(约 100 token/Skill)
内容:
- Skill 的名称和描述
- 没有任何具体的执行指令
作用:
- Agent 启动时加载所有 Skill 的 L1 元数据
- 相当于拿到一份餐厅菜单
- Agent 浏览菜单判断当前用户需求跟哪些 Skill 相关
- 决定是否要"点某道菜"(加载更详细的指令)
L2 指令层(通常不超过 5000 token/Skill)
内容:
- Skill 的完整指令体
- 详细描述执行某项任务所需遵循的每一个步骤
加载时机:
- 只有当 Agent 通过 L1 判断某个 Skill 确实跟当前任务相关时
- 才会通过 API 调用显式加载该 Skill 的 L2 内容
类比:
- 客人看完菜单点了菜,后厨才开始准备具体的菜品
L3 资源层(完全按需加载)
内容:
- 外部参考文件
- 比如写作风格指南、API 接口规范文档、代码模板等
加载时机:
- Skill 的 L2 指令中会引用这些资源
- Agent 在执行过程中根据指令的具体需要才去加载对应的参考文件
类比:
- 厨师在烹调过程中发现需要查阅某个配方细节,才翻开对应的参考书页
效果对比
传统方式:
- 10 项 Skill 的 Agent
- 每次调用消耗约 10000 个 token 的基础上下文
渐进式披露:
- L1 元数据总共只有约 1000 个 token
- 基础上下文消耗直接降低了约 90%
- 只有当 Agent 真正需要某项具体 Skill 时,才会额外加载对应的 L2 和 L3 内容
实际案例:
- 一个只触发了 2 项 Skill 的任务
- 实际消耗的 token 大约是:
- 1000(L1)+ 2000(2 项 L2)= 3000 个
- 相比传统方式的 10000 个节省了 70%
技术实现
ADK 通过 SkillToolset 类实现:
- 开发者把 Skill 列表传给 SkillToolset
- 自动生成三个工具:
list_skills(对应 L1,在每次对话中自动注入)load_skill(对应 L2,按需调用)load_skill_resource(对应 L3,按需调用)
自主决策:
- Agent 在运行过程中自主决定何时调用哪个工具
- 开发者不需要手动编写 if-else 逻辑来编排加载流程
- Agent 本身就是决策者
四种 Skill 构建模式
1. 内联 Skill(Inline Skill)
定位:便利贴,小而直接
实现方式:
- 直接在 Agent 代码中定义一个 Python 对象
- 包含名称、描述和指令三个字段
- 全部用代码字符串写死
适用场景:
- 小型、稳定、很少变动的规则集
- 比如检查清单类任务
典型例子:SEO 检查 Skill
seo_skill = {
"name": "seo-checklist",
"description": "博客文章 SEO 优化检查清单,涵盖标题标签、元描述、标题结构和可读性",
"instructions": """
检查项:
1. 标题控制在 50-60 个字符之间且主关键词靠前
2. 元描述控制在 150-160 个字符且包含行动号召
3. H2/H3 层级结构合理且 2-3 个标题包含关键词
4. 第一段在前 100 个词中出现主关键词
5. 图片需要包含关键词的 alt 文本并经过压缩处理
对照每个检查项审查内容并给出改进建议。
"""
}
优点:
- 简单直接,零配置
- 适合快速原型开发
- 几行代码就能给 Agent 加一项新能力
局限:
- 难以引用外部文档(写作风格指南、API 接口规范等)
- 跟代码耦合在一起,修改 Skill 需要改代码重新部署
- 当 Skill 复杂度上升或需要在多个 Agent 之间复用时,需要升级到文件型 Skill
2. 文件型 Skill(File-based Skill)
定位:参考活页夹,按主题分门别类地存放专业知识
实现方式:
- 把 Skill 从代码中剥离出来
- 放到独立的目录结构中
- 每个 Skill 拥有自己的文件夹
目录结构:
blog-writing-skill/
├── SKILL.md # 指令入口
├── references/ # 参考资料
│ └── style-guide.md
├── assets/ # 素材
└── scripts/ # 脚本
SKILL.md 格式:
---
name: blog-writing
description: 专业博客写作 Skill,遵循风格指南
---
# 博客写作指令
## 步骤
1. 分析主题和目标受众
2. 参考 references/style-guide.md 了解写作风格
3. 构建文章结构
4. 撰写内容
5. 审查和优化
知识分层:
- SKILL.md 中的指令(L2)告诉 Agent 应该遵循哪些步骤
- references/style-guide.md(L3)提供每个步骤所需的详细领域知识
- Agent 在执行过程中根据指令需要,通过
load_skill_resource工具加载参考文件
关键优势:
1. 可复用性:
- Skill 目录是独立于 Agent 代码存在的
- 任何遵循 agentskills.io 规范的 Agent 都可以加载同一个目录
- 为一个项目写的博客写作 Skill,可以直接搬到另一个内容管理项目中复用
2. 可维护性:
- 修改 Skill 只需要编辑 SKILL.md 文件
- 不需要改代码重新部署
- 可以纳入 Git 版本管理,追踪每次修改的历史
3. 团队协作:
- 不同成员可以各自维护不同 Skill 的目录,互不干扰
3. 外部导入 Skill(External Skill)
定位:从社区仓库中找到并下载的现成 Skill
实现方式:
- 代码实现和文件型 Skill 完全一样
- 唯一区别在于 Skill 目录的来源
类比:
- 文件型 Skill = 自己手写一本参考书
- 外部导入 Skill = 直接去图书馆借一本别人已经写好的
使用示例:
# 从社区仓库下载 Skill
# 然后用和文件型 Skill 完全相同的方法加载
skill = load_skill_from_dir("./content-research-writer")
社区资源:
- awesome-claude-skills 等社区 Skill 仓库
- Google 官方 ADK 开发 Skill
- 安装命令:
npx skills add google/adk-docs -y -g
跨平台兼容:
- agentskills.io 规范定义了一套通用的目录格式
- 加载器不关心 SKILL.md 是你自己写的还是从网上下载的
- 目前已经有 40+ 产品支持 agentskills.io 规范
- 包括 Gemini CLI、Claude Code、Cursor 等
- 一份 Skill 定义可以在不同厂商的 Agent 平台之间通用
4. Skill 工厂(Skill Factory)/ 元 Skill(Meta Skill)
定位:Agent 自我扩展的能力
核心能力:
- 不是执行某项具体任务
- 专门用来生成新的 SKILL.md 文件
- Agent 可以在运行时编写新的 Skill 定义并立即使用
- 整个过程不需要人工干预
实现原理:
1. 本质:
- 也是一个内联 Skill
- 用途从执行具体任务变成了编写 Skill 定义文件
2. 指令内容:
- 详细告诉 Agent 如何编写符合规范的 SKILL.md 文件
- 包括命名规则(必须使用短横线命名,最长 64 个字符)
- 描述要求(不超过 1024 个字符)
- 指令编写原则(清晰的步骤化表述)
- 结构规范(SKILL.md 控制在 500 行以内,详细内容放到 references 子目录中)
3. 关键:resources 字段:
- 内嵌了两份 L3 参考文档:
- agentskills.io 完整规范(skill-spec.md)
- 一个可运行的代码审查 Skill 示例(example-skill.md)
工作流程:
场景:用户说"我需要一个新 Skill,用来审查 Python 代码中的安全漏洞"
步骤:
- Agent 调用
list_skills浏览已有的 Skill 列表 - 发现没有匹配的安全审查 Skill
- 激活
skill-creator元 Skill - 调用
load_skill_resource读取 agentskills.io 规范 - 了解 SKILL.md 的格式要求和命名规则
- 再读取 example-skill.md 学习一份成熟 Skill 的结构和写法
- 根据用户需求生成 Skill 定义
- 生成的 Skill 包含:
- 合规的短横线命名(kebab-case)
- 结构化指令(涵盖输入验证、认证机制、密码学安全等方面的检查流程)
- 基于严重程度的报告格式
跨平台兼容:
- 生成的 Skill 遵循同样的 agentskills.io 规范
- 不仅能在 ADK 中使用
- 在 Gemini CLI、Claude Code、Cursor 等任何兼容平台上都能直接加载
持久化:
- 开发者可以把生成的 SKILL.md 保存到本地目录
- 下次会话直接用
load_skill_from_dir加载
重要提醒:
人工审核环节:
- 自动生成的 Skill 建议保留人工审核环节
- 元 Skill 的输出直接决定了 Agent 的行为方式和能力边界
- 生成的 SKILL.md 应该像代码审查一样认真过一遍再部署上线
审查重点:
- 指令是否准确覆盖了需求范围
- 是否存在遗漏或冗余的步骤
- 引用的外部资源是否可访问且内容正确
测试:
- 使用 ADK 内置的评估(Evaluation)功能来测试 Skill 的有效性
- 确保它按预期工作,不会在特定场景下产生错误输出
组装完整的 Agent
代码示例
# 创建 SkillToolset 实例
skill_toolset = SkillToolset([
seo_skill, # 内联 Skill
load_skill_from_dir("./blog-writing-skill"), # 文件型 Skill
load_skill_from_dir("./content-research-writer"), # 外部导入 Skill
skill_creator # 元 Skill
])
# 创建 Agent
agent = Agent(
model="gemini-2.5-flash",
tools=[skill_toolset],
system_instruction="""
你是一个博客写作助手,拥有专业 Skill。
- 加载相关 Skill 获取详细指令
- 用 load_skill_resource 访问参考资料
- 遵循每个 Skill 的步骤指令
- 始终解释正在使用哪个 Skill 以及为什么
"""
)
运行流程
场景 1:已知需求(审查博客的 SEO)
- Agent 调用
list_skills浏览 L1 菜单 - 识别出
seo-checklistSkill 相关 - 调用
load_skill加载 L2 指令 - 逐条执行检查
场景 2:全新需求(创建技术博客引言写作 Skill)
- Agent 激活
skill-creator元 Skill - 读取规范文档
- 生成新的 SKILL.md
- 保存后即可在后续会话中复用
设计原则
1. Skill 描述是决策的核心依据
好的描述:
SEO 优化检查清单,用于博客文章,涵盖标题标签、元描述、标题结构和可读性
模糊的描述:
一个有用的 Skill
原则:
- 精准地告诉 Agent 什么时候应该激活这个 Skill
- 对 Agent 的判断有实际帮助
2. 从内联模式开始,按需升级
建议:
- 从内联模式开始
- 只有当 Skill 需要引用外部文档或跨 Agent 复用时才升级到文件型
避免过早优化:
- 如果一个 Skill 的指令不超过 10 行,直接内联写就好
3. 生成的 Skill 需要审核和测试
原则:
- 像管理代码依赖一样认真对待
- 上线前必须审核和测试
技术生态
agentskills.io 开放标准
基石:
- ADK 的 Skill 系统建立在 agentskills.io 这个开放标准之上
- 这是整个技术体系能够跨平台运转的基石
历史:
- 最初由 Anthropic 提出
- 作为开放规范发布
- 已被越来越多的 Agent 产品所采纳
支持产品(40+ 产品):
- Gemini CLI
- Claude Code
- Cursor
- 等等
ADK 语言支持
已支持:
- Python
- Go
- Java(2026 年 3 月底发布 1.0 正式版)
第三方库:
adk-skills-agent(发布在 PyPI 上)- 专门用来把 Agent Skills 格式的 Skill 集成到 Google ADK Agent 中
学习资源
快速开始:
- 克隆 GitHub 仓库快速运行所有四种 Skill 模式的示例代码
系统学习:
- Google Cloud Skills 平台上的学习路径
- 系统掌握完整的 ADK 开发流程
核心洞察
AI Agent 的能力边界,正在从被动执行人类编写的指令,拓展到主动为自己编写新指令。
渐进式披露架构:
- 解决了知识膨胀的效率问题
- 让 Agent 既能拥有丰富的能力储备
- 又不会因为上下文过载而影响响应质量
Skill 工厂模式:
- 打开了自我扩展的可能性
- Agent 遇到未知场景时不再只能报错说"做不到"
- 它可以现场编写一份新 Skill 来补齐能力缺口
标签: #GoogleADK #AgentSkills #渐进式披露 #SkillFactory #Token优化 #AI自我扩展