乐于分享
好东西不私藏

当你的AI助手SKILL太多,多到你自己都忘了

当你的AI助手SKILL太多,多到你自己都忘了

1️⃣ 一个真实的尴尬场景

我用 AI 助手(Hermes Agent)搭了一套公众号内容生产流水线——选题侦察、写稿、降AI味、排版、自动发布到草稿箱,五个 skill 串起来,一条龙。

后来又搭了写作素材库,用 FAISS 向量检索存电子书和视频文字稿。又做了商业分析工具、小程序创业方法论库、降AI味工具、违禁词排查……

搭着搭着,我发现了一个很尴尬的问题:

我自己都不知道我有哪些 skill 了。

有一次朋友问我”你这个 AI 都能帮你干嘛”,我愣了半天,只能说出三四个。回去翻了半天目录才发现,我一共搭了 17 个 skill。

更尴尬的是,如果我去忙别的事情,十天半个月不碰,回来之后别说怎么用,连某个 skill 是干什么的都得重新看一遍 SKILL.md。

2️⃣ 你可能也会遇到这个问题

如果你也在用 AI Agent 做自己的工具链,你大概率会走到这一步:

  • 工具越积越多,每个都有一套用法
  • 用斜杠命令逐个查看太低效
  • 想要一个入口,一眼看完所有能力
  • 而且工具增删改了,这个入口要自动同步,不想手动维护文档

最后一条是关键。我不想再搞一个”需要维护的文档”来管理”我已经维护不过来的文档”。

3️⃣ 我的解法:让 AI 自己当导游

我没有生成静态文档,没有搞定时任务,没有建数据库。

方案极其简单——写一个 skill,教 AI 怎么当导游

每次我问”我有哪些 skill”,AI 就现场扫描所有 skill 的 SKILL.md 文件,实时生成一份能力清单。扫描一次大概两三秒,结果天然是最新的:

  • skill 删了 → 扫不到 → 清单里就没了
  • skill 改了 → 扫到新的 → 清单自动更新
  • 新建 skill → 马上出现在清单里

没有中间文件,没有缓存,不存在”文档和实际不一致”的问题。

4️⃣ 输出长什么样

跟 AI 说一句”我有哪些skill”,它会按目录分组返回:

CODE
【wechat-factory】1. wechat-article-pipeline — 公众号文章完整生产流水线   路径: ~/.hermes/skills/wechat-factory/wechat-article-pipeline/   干什么: 从选题到写稿到降AI味到排版发布,一条龙搞定   怎么用: 跟我说"帮我写一篇公众号文章并处理成可发版"2. wechat-publisher — 公众号文章自动发布   路径: ~/.hermes/skills/wechat-factory/wechat-publisher/   干什么: 把文章自动排版、生成封面图、发到草稿箱   怎么用: 跟我说"帮我把这篇文章发到公众号"3. emotion-opinion-humanizer — 降AI味工具   路径: ~/.hermes/skills/wechat-factory/emotion-opinion-humanizer/   干什么: 把AI写的文章改得更像真人写的,去掉模板化痕迹   怎么用: 跟我说"帮这篇稿子降AI味"...【独立 skill】4. material-library — 写作素材库   路径: ~/.hermes/skills/material-library/   干什么: 把电子书、视频文字稿存起来,写文章时能搜到   怎么用: 跟我说"帮我把这本书存到素材库"

注意几个设计细节:

  1. 按目录分组
    ,同一个工具链的 skill 放一起,不会散。比如 wechat-factory 下的 6 个 skill 归为一组。
  2. 只说”怎么用”,不说”怎么操作”。
     面向不懂技术的人,”跟我说xxx”就行,不需要知道底层跑了什么脚本。
  3. 每个 skill 附带绝对路径
    ,方便需要时直接去目录里看源码。

5️⃣ 背后的提示词

这个 skill 的本质就是一段提示词,教 AI 怎么扫描、怎么过滤、怎么翻译成大白话。完整内容如下:

YAML
---name: skill-guidedescription: 当用户想了解自己有哪些可用能力时,扫描所有 skill 并用大白话解释每个 skill 干什么、怎么用。---# 我的能力清单## 触发条件用户说以下类似的话时触发:- "我有哪些skill"、"我能做什么"、"帮我看看有什么能力"- "skill怎么用"、"这个skill是干什么的"- "我之前搞了哪些东西"、"回来太久忘了"- 任何表达"想知道自己有什么工具/能力"的意图## 过滤规则只展示用户自建的 skill,排除 Hermes 系统自带的通用工具。排除以下分类目录下的所有 skill(系统自带):`apple, autonomous-ai-agents, business, creative, data-science, devops, gaming, github, mcp, media, mlops, note-taking, red-teaming, research, smart-home, social-media, software-development, wechat-factory, diagramming, domain, email, feeds, gifs, inference-sh, leisure`系统分类可能会随 Hermes 更新增加,如果发现新的分类目录名明显是通用工具而非用户自建,也一并跳过。## 执行步骤1. 调用 skills_list 获取所有 skill 的 name 和 description2. 按过滤规则排除系统 skill,只保留用户自建的3. 对保留的每个 skill,读取其 SKILL.md 前 50 行,   提取 description 和触发方式4. skill 的绝对路径格式:~/.hermes/skills/<name>/   子 skill 为 ~/.hermes/skills/<category>/<name>/5. 按以下格式输出,每个 skill 占 4 行:  <number>. <english-name> — <中文一句话说明>    路径: <绝对路径>    干什么: <用外行听得懂的话解释>    怎么用: <跟AI说什么就能触发,用自然语言对话>## 输出要求- 面向不懂技术的读者,把读者当成不懂技术的老板- "怎么用"必须是自然语言对话方式,不要出现命令行- 严格按实际目录位置分组,不要平铺,也不要主观归类- 如果某个 skill 的 description 太技术化,  用自己的话翻译成大白话

几个值得说的设计决策:

为什么要过滤系统 skill? 系统自带了 80 多个 skill(apple、github、mlops 等通用工具),如果全列出来,噪音太大,我自己的 17 个 skill 会淹没在里面。只看自建的,一目了然。

为什么要按物理目录分组而不是按功能归类? 因为功能归类是主观的——AI 可能会把”刘小排思维模式”主观归到”wechat-factory”里(因为它跟写作相关),但它实际是一个独立 skill。严格按目录位置分组,零歧义。

为什么不让 AI 缓存结果? 因为 skill 会增删改。缓存意味着”可能过期”,不缓存意味着”永远是新的”。扫描 17 个文件只需要两三秒,不值得为此引入缓存机制。

6️⃣ 思路比我之前想的简单很多

最初我想过几个方案:

  • 生成一个总览 Markdown 文件,skill 变了就更新它 → 需要维护同步逻辑
  • 用 cron 定时扫描,每天更新一次 → 太重了,而且 skill 随时可能改
  • 建一个索引数据库 → 杀鸡用牛刀

最后选的方案是什么都不存储,每次问的时候现场算。跟 React 的渲染哲学一样——不要手动操作 DOM,让框架根据 state 自动算出来。

在这里,state 就是”当前有哪些 skill 目录”,渲染就是”扫描并生成清单”。state 变了,下次渲染自然就是新的。

最简单的方案,往往是最好的方案。