Hermes Skills 体系:198 个技能的创建、组织与最佳实践
一、Skill 是什么?不是什么?
Hermes 有四个持久化系统,很多人搞混:
| 系统 | 存什么 | 举例 | 生命周期 |
|---|---|---|---|
| Memory | 事实/偏好 | "用户持有 7 只A股基金" | 永久,直到更新 |
| Skill | 可复用的工作流 | "如何部署 fund-web 模板" | 永久,持续迭代 |
| Session | 对话上下文 | 当前任务进度 | 一次会话 |
| Cron | 定时任务 | "每日 08:00 发AI新闻" | 按调度触发 |
Skill 的核心定义:可复用的程序性知识:不是"记住什么",而是"怎么做"。
# Memory(事实)
"用户偏好 ECharts tooltip 用 #F97316 加粗合计行"
# Skill(流程)
"部署 fund-web 模板的步骤:
1. 备份原文件到 backups/
2. 用 patch 编辑模板
3. touch 模板文件
4. sudo systemctl restart fund-web
5. 浏览器验证"
二、Skill 的结构
每个 Skill 是一个目录,内含 SKILL.md(必需)和可选的支持文件:
skills/finance/fund-portfolio-management/
├── SKILL.md ← 主文件:触发条件 + 步骤 + 陷阱
├── scripts/
│ └── fetch_nav.py ← 可执行脚本
├── templates/
│ └── report.md ← 模板文件
└── references/
└── api_docs.md ← 参考文档
SKILL.md 的标准结构:
---
name: fund-portfolio-management
description: 基金数据方法库 — API调用、净值预估、假期检测
---
## 触发场景
- "查基金净值"
- "QDII 预估"
- "今天是否交易日"
## 步骤
1. 先调用 _get_trade_date() 判断交易日
2. A股基金用 fund_query skill
3. QDII 用 _estimate_qdii_nav()
## 常见陷阱
- QDII 净值 T+1 偏移,当天看到的是昨天的净值
- 假期跳过,否则 API 返回空数据
- 270023 费率阶梯:申购费随金额变化
关键字段:
| 字段 | 作用 |
|---|---|
name |
Skill 标识符,加载时用 |
description |
一行摘要,skill 列表中显示 |
| 触发场景 | 告诉 Agent 何时加载此 skill |
| 步骤 | 带编号的执行指令 |
| 常见陷阱 | 已知的坑和绕过方法 |
三、Skill 的加载机制
Agent 每轮对话前扫描 <available_skills> 列表,匹配触发条件后调用 skill_view() 加载全文。Skill 内容被注入到 system prompt 中。
这意味着:
- Skill 越长,占用的 prompt token 越多,需要在详尽度和 token 消耗间平衡
- 不要在一个 Skill 中覆盖过多场景,拆分成多个小 Skill 更高效
- 触发条件要精准,避免无关 Skill 被加载浪费 token
venxine.vip 的基金数据管线用了分层 Skill 架构:
fund-portfolio-management ← 底层:API 调用、数据获取
fund-tracker ← 中层:每10分钟快照采集
fund-web-dashboard ← 上层:页面渲染与部署
fund-weekly-report ← 应用层:周报生成
每个 Skill 职责单一,按需加载。生成周报时只需加载 1 和 4,不需要加载 2 和 3。
四、何时创建 Skill
应该创建 Skill 的场景
- 5 次以上工具调用的复杂任务,每次都重做浪费时间
- 踩过坑后总结的工作流,Skill 的"常见陷阱"部分是最大的价值
- 用户纠正过的做法,避免下次犯同样错误
- 跨会话复用的流程,部署、配置、数据管线
不需要创建 Skill 的场景
- 一次性的简单操作,直接执行
- 纯事实信息,存 Memory
- 会过期的临时状态,存在 session 中
创建示例
部署 fund-web 模板是典型的 Skill 场景,每次部署都要:
# 部署 fund-web 模板的标准流程
1. 备份: cp template.html backups/template_$(date).html
2. 编辑: patch(path='template.html', old='...', new='...')
3. touch: touch template.html
4. 杀进程: sudo fuser -k 5000/tcp
5. 重启: sudo systemctl start fund-web
6. 验证: curl -sI https://venxine.vip/page/ | head -1
这些步骤首次做需要摸索(哪个端口?杀还是 restart?),但第二次就应该固化为 Skill。
五、Skill 的维护与迭代
Skill 不是写完就扔,它需要持续更新。
触发更新的信号
- 执行 Skill 时发现步骤不完整,立即 patch
- 遇到新陷阱,追加到"常见陷阱"
- API 或工具变化,更新命令和参数
- 用户指正了做法,这是最高优先级的更新
维护命令
# 查看 Skill
skill_view(name='fund-portfolio-management')
# 小修改(推荐)
skill_manage(action='patch', name='fund-portfolio-management',
old_string='旧步骤', new_string='新步骤')
# 完整重写(谨慎使用)
skill_manage(action='edit', name='fund-portfolio-management',
content='新的完整 SKILL.md 内容')
原则:用 patch 做增量修改,不要轻易 edit 重写整个文件。 Skill 是长期迭代的产物,每次只改需要改的部分。
六、198 个 Skill 的组织
venxine.vip 的 198 个 Skill 按类别分组:
skills/
├── finance/ ← 基金、股票、加密货币(35 个)
│ ├── fund-tracker/
│ ├── fund-portfolio-management/
│ └── crypto/
├── devops/ ← 部署、配置、监控(12 个)
│ ├── venxine-fund-platform/
│ ├── web-infrastructure/
│ └── system-dashboard/
├── creative/ ← 图表、设计、媒体(20 个)
│ ├── ascii-art/
│ └── comfyui/
├── research/ ← 搜索、论文、新闻(15 个)
│ ├── arxiv/
│ └── cn-web-search/
├── software-dev/ ← 调试、测试、代码审查(10 个)
│ ├── systematic-debugging/
│ └── test-driven-development/
└── ...
组织原则:
- 按功能域分类,finance、devops、creative 等
- Skill 名用 kebab-case,
fund-portfolio-management - 一个 Skill 一个目录,含 SKILL.md + 可选支持文件
- pin 住核心 Skill,防止误删(如
venxine-fund-platform)
上面括号里的数字只列了规模最大的几类,加起来约 90 个;剩下的近 110 个分散在 email、media、productivity、mlops、social-media、gaming、note-taking 等十几个域里,凑齐才是 198 这个总数。
七、Skill vs Memory vs Cron 的决策树
这个知识…
├── 是事实/偏好? → Memory
│ "用户有 7 只A股基金"
│ "图表用离散色板,拒绝全暖色"
│
├── 是可复用的工作流? → Skill
│ "如何部署模板"
│ "如何切换基金基线"
│ "如何排查 cron 失败"
│
├── 是定时执行的任务? → Cron
│ "每日 08:00 生成AI新闻"
│ "每10分钟采集基金数据"
│
└── 是一次性的当前任务? → 直接做
"帮我查一下今天科创50涨了多少"
八、一条铁律
用 Skill 时发现过时/不完整/有错,立即 patch。不要把错误留在 Skill 里等下次再踩。
这才是 Skill 体系最大的价值:不是一次写好就不管,而是每次踩坑都变成下一个使用者的护城河。