Skip to content

第六章 技能系统 — Agent 的经验积累

技能(Skill)是 Hermes 的核心竞争力——它让 Agent 能从经验中学习、积累知识、自动改进。与工具不同,技能不需要写 Python 代码,只需要一份 Markdown 指令。

6.1 什么是技能

技能 = Markdown 指令 + 现有工具组合。它告诉 Agent 如何完成特定任务,不需要自定义 Python 代码。

SKILL.md 格式

markdown
---
name: git-workflow
description: Git 分支管理、提交、合并的最佳实践工作流
platforms: [macos, linux, windows]
prerequisites:
  commands: [git]
metadata:
  hermes:
    tags: [git, version-control]
    related_skills: [code-review, testing]
---

# Git Workflow

## 分支命名
- feature/xxx: 新功能
- fix/xxx: 修复
- refactor/xxx: 重构

## 提交规范
使用 Conventional Commits 格式...

## 合并策略
始终使用 rebase 而非 merge...

技能 vs 工具

维度技能 (Skill)工具 (Tool)
形式Markdown 指令Python 代码
创建门槛低(写文档即可)高(需要编程)
能力组合现有工具原子级新能力
适用场景工作流、最佳实践API 集成、二进制处理
示例Git 工作流、代码审查terminal、web_search

6.2 技能发现与加载

三层来源

  1. 本地技能 ~/.hermes/skills/ — 用户创建或安装的技能,可写
  2. 内置技能 skills/ — 随仓库发布,只读
  3. 外部技能 — 通过插件或环境变量指定的目录,只读

冲突规则:本地技能同名时覆盖外部技能。

6.3 渐进式披露

技能采用三层渐进式披露,避免一次性加载所有内容浪费 token:

为什么渐进式披露很重要

一个包含 30+ 技能的 Agent,如果一次性加载所有技能全文,会占用 10K+ tokens。渐进式披露把日常开销降到 ~500 tokens(只加载名称和描述)。

6.4 技能执行

注入方式:User Message

技能作为 user message 注入,而非 system prompt。这是一个关键设计决策:

python
# 技能注入(在 agent/skill_commands.py 中)
if skill_content:
    messages.append({
        "role": "user",
        "content": f"<skill-content>\n{skill_content}\n</skill-content>"
    })

为什么不注入 system prompt?

  1. 保护 Prompt Caching:system prompt 在会话中是固定的(缓存 key),修改它会使缓存失效,导致成本增加 3-4 倍
  2. 按需加载:技能只在需要时注入,不占用基础 prompt 空间
  3. 灵活切换:不同消息可以使用不同技能,不影响缓存

执行流程

6.5 技能自改善循环

Hermes 的学习闭环:

自动创建触发条件

  • 完成了复杂的多步骤任务
  • 用户对结果表示满意(如"做得好"、"完美")
  • 检测到可复用的工作模式

自改善机制

  • 使用中检测到不足时,自动修改技能描述
  • 添加常见错误的解决方案
  • 更新最佳实践和用例

6.6 Skills Hub

Skills Hub 是技能的社区分发平台:

信任模型

来源信任级别安装提示
内置 skills/完全信任无提示
官方 optional-skills/信任无第三方警告
社区 Skills Hub需审核显示第三方警告

6.7 技能守卫

tools/skills_guard.py 提供安全防护:

  1. 内容扫描:检测恶意指令(如试图读取敏感文件)
  2. 仓库信任:预批准的安全仓库列表
  3. 隔离机制:可疑技能被放入隔离区,需用户确认后才能使用

6.8 编写自定义技能

步骤一:创建目录和文件

bash
mkdir -p ~/.hermes/skills/my-deploy
cat > ~/.hermes/skills/my-deploy/SKILL.md << 'EOF'
---
name: my-deploy
description: 将项目部署到生产环境的自动化流程
platforms: [macos, linux]
prerequisites:
  commands: [docker, kubectl]
metadata:
  hermes:
    tags: [deployment, docker, k8s]
---

# 部署到生产

## 前置检查
1. 确认所有测试通过:`pytest tests/ -q`
2. 检查版本号是否更新
3. 确认 Docker 镜像已构建

## 部署步骤
1. 构建镜像:`docker build -t myapp:latest .`
2. 推送镜像:`docker push myregistry/myapp:latest`
3. 更新 K8s:`kubectl set image deployment/myapp myapp=myregistry/myapp:latest`
4. 验证:`kubectl rollout status deployment/myapp`

## 回滚
如果部署失败:`kubectl rollout undo deployment/myapp`
EOF

步骤二:验证技能

bash
hermes  # 启动对话
/my-deploy  # 使用技能

步骤三:(可选)发布到 Skills Hub

bash
hermes skills publish my-deploy

源码导航

  • 技能命令 → agent/skill_commands.py
  • 技能工具函数 → agent/skill_utils.py
  • 技能查看/执行 → tools/skills_tool.py
  • 技能管理 → tools/skill_manager_tool.py
  • Skills Hub → tools/skills_hub.py
  • 技能守卫 → tools/skills_guard.py

下一章:第七章 多平台消息网关

基于 MIT 许可发布