Google 在其 AI 开发框架 Genkit 中支持 Agent Skills,让 AI 能「按需挂载技能包」
- AI Agent 的说明书越堆越多,全塞进上下文既烧 Token 又让模型分心。Google 给自家框架 Genkit 接上了 Agent Skills:说明书放磁盘上,用到哪份调哪份。
- 这套技能标准是 Anthropic 发起的,Google 四个语言版本全接,接入只要一行参数。
- 官方拿 2012 年被毁容的「猴子耶稣」原画当测试题,模型自己认出是油画、唤出对应修复技能。
说明书全塞给 AI,塞不下也没必要
Google 开发者博客发布了一份极其实用的上手教程:自家开源 AI 应用框架 Genkit 正式支持 Agent Skills,由 Anthropic 发起、已经开放成行业标准的「AI 技能包」格式。简单来说,过去你得把所有操作手册塞进提示词,现在手册躺在磁盘上,用到哪份才加载哪份,接入只要一行参数。教程用 Go 语言给了两个能直接跑的例子:一个菜谱机器人,一个会自己挑修复方案的 AI 艺术修复师。
它要解决的问题每个做 Agent 的人都撞过:Agent 接的活越多,要给它的说明书就越多,操作规程、参考指南、各种文档。全部常驻在上下文窗口里,三个毛病一起来:Token 白烧(每次请求都把整摞文档再读一遍)、注意力被稀释(真正相关的那几行淹在几百页里)、答错的概率反而上升。就像一个员工每天上班先把公司全部规章制度从头背一遍,其实他今天只用得上其中一页。
Agent Skills 解决的就是这件事:把专业知识打包成一个个技能,平时躺在后台,被用到的那一刻才加载。如果你用过 Claude Code 的 Skills,这套东西会非常眼熟,格式就是同一个,Anthropic 把它开放成了标准(agentskills.io),Genkit 这次接的正是这套。站内之前拆过 Anthropic 官方拿技能搭验证循环的实战:
一个技能就是一个文件夹
那么这个「按需加载」的技能长什么样?答案简单得出乎意料:一个技能就是一个文件夹,里面必须有一份 SKILL.md 文件。这份文件分两截,头部 frontmatter,用 --- 围起来的一小段元数据,写着技能叫什么、什么时候该用我;正文 body,真正的操作指令。文件夹里还可以放三类可选资源:scripts/(可执行脚本)、references/(参考文档)、assets/(模板素材)。
skill-name/ ├── SKILL.md # Required: metadata + instructions ├── scripts/ # Optional: executable code ├── references/ # Optional: documentation ├── assets/ # Optional: templates, resources └── ... # Any additional files or directories
因为技能就是 Markdown 加普通文件,可以像代码一样用 Git 分发,一台额外的服务器都不用架。frontmatter 官方给了个范本,重点全在 description 上,它就是触发开关:
--- name: adr-template description: Activate this skill when proposing significant architectural changes, documenting codebase refactorings, or resolving design/technical debates. Use this skill to author and maintain Architecture Decision Records (ADRs) to preserve engineering context. license: Apache-2.0 metadata: author: example-org version: "1.0" ---
渐进披露:目录常驻,正文点名才进来
既然文件夹准备好了,模型怎么知道什么时候该用它?靠一套叫渐进披露(progressive disclosure)的机制,分三步:
- 发现(Discovery):启动时扫描技能目录,只把每个技能的名字和描述注入系统提示,相当于只给模型看目录页;
- 激活(Activation):任务对上了某个技能的描述,框架调
use_skill工具,把那份 SKILL.md 的完整正文调进上下文; - 执行(Execution):模型照着正文干活,需要时再去读 references、跑捆绑的脚本。
Token 账就是这么省下来的:常驻上下文的只有每个技能几十个字的名片,几百页细则躺在磁盘上,谁被点名谁进内存。这套设计的好处归成三条:
接入只要一行参数,背后是中间件
既然机制懂了,落到代码上要写多少东西?一行。在 genkit.Generate 调用里加一个 ai.WithUse 参数、指到技能文件夹,接入就完成了:
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("How do I run tests in this repo?"),
ai.WithUse(&middleware.Skills{SkillPaths: []string{"./skills"}}),
)
这一行背后是 Genkit 的中间件(middleware)体系,拦在你的代码和模型之间的一层,每次请求路过时,它可以加料、改道或记账,像快递分拣站。钩子有三类,各拦一环:WrapGenerate 拦每轮对话循环,管系统提示注入这类要看全对话的活;WrapModel 拦每次模型 API 调用,管重试、降级、缓存;WrapTool 拦每次工具执行。Skills 中间件搭在这套钩子上,干的就是三件事:扫描目录找 SKILL.md → 把名片注入系统提示 → 请求对上描述就激活。
例一:说 Cheese,唤出芝士面包技能
所以先跑一个最小的例子。官方第一个示例是个命令行菜谱工具:输入食材,输出菜谱。技能文件夹里放了两个技能,banana-bread(香蕉面包)和 cheese-bread(芝士面包)。跑 go run main.go cheese,模型对上 cheese-bread 的描述、激活技能,按技能里的配方在终端打出一份巴西芝士面包(Pão de Queijo)的完整菜谱:
+-------------------------------------------------+ | TRADITIONAL BRAZILIAN CHEESE BREAD | | (Pao de Queijo) | +-------------------------------------------------+ INGREDIENTS * Tapioca Flour (Sour Starch) .. 2 cups (240g) * Grated Parmesan/Queijo ...... 1.5 cups (150g) …… PRO TIP: You can freeze the unbaked dough balls on a tray, then store them in a bag.
这个例子演示的就是最基本的一环:用户一句话对上技能描述,名片换正文,模型照配方干活。
例二:AI 艺术修复,模型自己看图选技能
但最小例子只演示了匹配。第二个例子接近生产场景:多模态的 AI 艺术修复。喂一张受损艺术品的照片,模型先判断这是素描、油画还是照片,再激活对应的修复技能,drawings、paintings、photography 各有一套修复规程,最后由 Gemini 3.1 Flash Image(也就是 Nano Banana 2)生成修复后的图。技能挑选这一步不用写一行分支逻辑,全靠模型看图判断。
paintings 技能的 SKILL.md 写的就是专业修复师的行规:绝对忠实(严禁添加原作没有的元素)、反现代化(保留笔触、不磨平纹理)、尊重裂纹(craquelure 裂纹网是历史的一部分,不乱填);然后三步流程一笔画完:清漆校正 → 除污 → 补缺损。这份文件本身就是「把专业规程写成技能」的范本:
--- name: paintings description: Restoration protocol for fine art paintings. --- # Painting restoration Perform direct, minimal-intervention restoration of fine art paintings. Prioritize historical integrity, original pigment depth, and surface textures over cosmetic modernization. Do not include any elements, nor introduce any techniques not present in the original piece. ### 1. Core conservation mandates * **Absolute Fidelity:** Strictly forbidden to add new subjects, figures, scenery, details, or narrative elements under any circumstances. * **Anti-Modernization:** Retain original brushstroke characteristics. Do not flatten support textures. * **Patina & Craquelure:** Respect the natural crack network (craquelure) as part of the artwork's history. Do not fill or erase cracks unless they pose an active risk of paint loss. ### 2. Step-by-step restoration process 1. **Varnish Correction:** Gently balance aged, yellowed natural varnishes to recover original pigment chromaticity without forcing modern, high-contrast saturation. 2. **Soot & Grime Reduction:** Isolate and lift surface grime while protecting delicate, thin underlying glaze layers. 3. **Inpaint Major Loss:** Where paint layers are missing, use references from the surviving elements to bridge the gap. Replicate the original brush direction, speed, height, transparency, and light source.
测试用图是个老熟人:西班牙画家 Elías García Martínez 的《Ecce Homo》。2012 年一位业余爱好者把教堂里的这幅画修成了「猴子耶稣」,全网爆红。教程喂给模型的是修复事故之前的原貌,模型正确认出这是一幅古典宗教油画,激活 paintings 技能,输出修复计划:先去掉发黄的清漆和污垢、恢复深红和肤色,再减少干扰性裂纹、保留紫袍的斑点纹理,最后给背景卷轴补上做旧的羊皮纸质感。
这个修复技能还是早期尝试:大模型有随机性,同一张图可能要多跑几次才有好结果,规程本身也需要专业修复师来调优。两个示例的完整代码都开源在 GoogleCloudPlatform 的 devrel-demos 仓库里,链接在文末。
写技能的四条经验
所以写自己的技能之前,把教程收尾附的四条经验照着核一遍:
AI 的说明书不必全塞进对话里,可以像装 App 一样按需挂载
Google 把 Anthropic 发起的「Agent Skills」技能包标准接进了自家 AI 开发框架 Genkit,一页带图讲完
↓ 一页读完 · 有一张会动的图
AI Agent(能自己调工具干活的 AI 助手)接的活越多,你要交给它的说明书就越多:操作规程、参考指南、各种文档。过去这些全得塞进对话里常驻。
Token(模型处理文字的计费单位)白烧,每次提问都把整摞文档再读一遍
注意力被稀释,真正有用的那几行,淹在几百页里
答错的概率反而上升
✔ 像一个员工每天上班先把全公司规章制度背一遍
而他今天只用得上其中一页
Agent Skills 想解决的就是这一件事:把专业知识打包成一个个技能,平时躺在硬盘上,被用到的那一刻才加载进来。
答案简单得出乎意料:一个技能就是一个文件夹,里面必须有一份 SKILL.md 文件。这份文件分两截,轻的那截常驻,重的那截按需调。
模型怎么知道什么时候该用哪个技能?靠一套叫渐进披露(progressive disclosure)的机制,分三步走。假设小互给自己的写作助手准备了三十个技能,今天他要写一篇架构决策记录:
Genkit 是 Google 自家的开源 AI 应用开发框架。要让它认识这些技能,在原来的生成调用里加一个参数、指到技能文件夹就行:
这一行背后是 Genkit 的中间件(middleware,拦在你的代码和模型之间的一层,请求路过时可以加料、改道或记账)。技能这层中间件干三件事:扫目录找 SKILL.md、把名片注入系统提示、请求对上描述就激活。
教程配了两个 Go 语言写的完整示例,代码开源可抄。
命令行输入 cheese,模型对上芝士面包技能的描述、激活,按里面的配方打出一份巴西芝士面包菜谱。演示的是最基本的「匹配描述 → 名片换正文」
✔ 例二 · AI 艺术修复:喂一张受损画作照片,模型自己判断是素描、油画还是照片
对应的三套修复规程各是一个技能。挑技能这步不用写一行判断逻辑,全靠模型看图定;最后由 Gemini 3.1 Flash Image 生成修复后的图
油画那份技能写的就是专业修复师的行规:绝对忠实(禁止添加原作没有的元素)、保留笔触不磨平纹理、裂纹是历史的一部分不乱填;再加清漆校正 → 除污 → 补缺损三步流程
✔ 测试用图是《Ecce Homo》,2012 年被业余爱好者修成「猴子耶稣」爆红全网的那幅原作
喂进去的是事故之前的原貌,模型正确认出是古典宗教油画,激活油画技能,输出修复计划和修复后的图
教程收尾给了四条,写之前照着核一遍:
- 描述写详细:名片里的 description 是唯一的触发开关,用祈使句写清「什么时候用我」。写得越具体,模型越知道什么时候该叫它。
- 一个技能只干一件事:别做「什么都管」的巨型技能,专注的技能才触发得准。
- 捆一份能跑的脚本:给模型一个确定性的「标准答案」工具,关键步骤不靠它临场发挥。
- 细节放 references/:SKILL.md 本身保持干净,长文档挪进参考目录让模型按需去读。
正文里有一行接入参数、技能目录结构、名片写法范本、以及那份完整的油画修复规程,四份材料原样可抄。
稳当!
每提一个问题,整摞重读一遍。
- × Token 白烧
- × 注意力被稀释
- × 答错概率反涨
长什么样
一份说明书。
加一句「什么时候
叫我」,几十个字。
架构决策记录
原地躺在硬盘上。
改多少代码
那个 Genkit 项目。
指到技能文件夹,框架自己去扫。
调修复那份技能
各躺着一份规程。
挑哪份,模型看图
自己定,没写一行
判断逻辑。
