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 中。

这意味着:

  1. Skill 越长,占用的 prompt token 越多,需要在详尽度和 token 消耗间平衡
  2. 不要在一个 Skill 中覆盖过多场景,拆分成多个小 Skill 更高效
  3. 触发条件要精准,避免无关 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/
└── ...

组织原则:

  1. 按功能域分类,finance、devops、creative 等
  2. Skill 名用 kebab-casefund-portfolio-management
  3. 一个 Skill 一个目录,含 SKILL.md + 可选支持文件
  4. 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 体系最大的价值:不是一次写好就不管,而是每次踩坑都变成下一个使用者的护城河。