hermes Skill自进化流程与提示词组装机制
本文档详细梳理Hermes Agent中skill自进化的完整流程,以及大模型调用时提示词的组装和拼接机制。
目录
概述
Hermes Agent的skill自进化系统是一个主动学习机制,让Agent能够:
- ✅ 从成功经验中提取可复用的流程
- ✅ 在发现问题时自动修正现有技能
- ✅ 持续积累领域知识
- ✅ 实现自我改进的正向循环
这个系统通过三层架构实现:
- 提示词层:通过技能索引主动提示Agent可用的知识库
- 工具层:提供完整的CRUD操作,支持增量修改
- 执行层:安全扫描、缓存管理、持久化存储
一、Skill自进化的核心理念
1.1 什么是Skill?
Skill是Agent的过程记忆(Procedural Memory),用于捕获"如何执行特定类型任务"的已验证经验。
与Memory的区别:
- Memory:广泛的、声明式的知识(用户偏好、环境细节)
- Skill:狭窄的、可操作的过程(具体工作流程、命令序列)
1.2 Skill的目录结构
~/.hermes/skills/ # 主目录(唯一真相源)
├── mlops/ # 分类目录
│ ├── axolotl/
│ │ ├── SKILL.md # 主要指令(必需)
│ │ ├── references/ # 参考文档
│ │ │ ├── api.md
│ │ │ └── examples.md
│ │ ├── templates/ # 输出模板
│ │ ├── scripts/ # 可执行脚本
│ │ └── assets/ # 补充文件
│ └── vllm/
│ └── SKILL.md
├── devops/
│ └── deploy-k8s/ # Agent创建的技能
│ ├── SKILL.md
│ └── references/
└── .hub/ # Skills Hub状态
├── lock.json ├── quarantine/ └── audit.log```
### 1.3 SKILL.md格式
```markdown
---
name: my-skill
description: 简短描述此技能的功能
version: 1.0.0
platforms: [macos, linux] # 可选:限制特定OS平台
metadata:
hermes: tags: [python, automation] category: devops fallback_for_toolsets: [web] # 可选:条件激活
requires_toolsets: [terminal] # 可选:条件激活
---
# Skill标题
## When to Use此技能的触发条件。
## Procedure1. 第一步
2. 第二步
## Pitfalls- 已知的失败模式和修复方法
## Verification如何确认它工作正常。
二、触发机制
2.1 创建新技能的触发条件
在系统提示词中,Agent被明确指导何时创建技能(定义在 agent/prompt_builder.py):
SKILLS_GUIDANCE = (
"After completing a complex task (5+ tool calls), fixing a tricky error, " "or discovering a non-trivial workflow, save the approach as a " "skill with skill_manage so you can reuse it next time.\n" "When using a skill and finding it outdated, incomplete, or wrong, " "patch it immediately with skill_manage(action='patch') — don't wait to be asked. " "Skills that aren't maintained become liabilities.")
触发场景:
| 场景 | 说明 |
|---|---|
| ✅ 复杂任务完成 | 5+工具调用,成功完成 |
| ✅ 解决棘手错误 | 经过多次尝试找到正确路径 |
| ✅ 发现非平凡工作流 | 新的、有效的工作流程 |
| ✅ 用户纠正方法 | 用户提供了更好的方法 |
| ✅ 用户明确要求 | “记住这个流程” |
2.2 更新技能的触发条件
在 skill_manage 工具的描述中定义:
Update when: instructions stale/wrong, OS-specific failures, missing steps or pitfalls found during use. If you used a skill and hit issues not covered by it, patch it immediately.
触发场景:
| 场景 | 说明 |
|---|---|
| 🔧 指令过时/错误 | 发现不准确的内容 |
| 🔧 OS特定失败 | 平台兼容性问题 |
| 🔧 遗漏步骤或陷阱 | 使用时发现未覆盖的情况 |
| 🔧 使用中遇到问题 | 技能未涵盖的场景 |
三、完整执行流程
3.1 系统提示词组装(第一层注入)
时机:会话开始时
位置:run_agent.py → _build_system_prompt()
流程:
def _build_system_prompt(self, system_message: str = None) -> str:
# Layer 1-6: 其他层次...
# Layer 7: Skills index
has_skills_tools = any(name in self.valid_tool_names
for name in ['skills_list', 'skill_view', 'skill_manage'])
if has_skills_tools:
avail_toolsets = {
toolset
for toolset in (
get_toolset_for_tool(tool_name) for tool_name in self.valid_tool_names
)
if toolset
}
skills_prompt = build_skills_system_prompt(
available_tools=self.valid_tool_names,
available_toolsets=avail_toolsets,
)
3.2 技能索引构建
位置:agent/prompt_builder.py → build_skills_system_prompt()
步骤:
-
扫描技能目录
- 本地目录:
~/.hermes/skills/ - 外部目录:配置的共享目录
- 本地目录:
-
解析SKILL.md前言
- 名称、描述
- 平台限制
- 条件激活规则
-
过滤技能
# 平台兼容性检查 if not skill_matches_platform(frontmatter): continue # 条件激活检查 if not _skill_should_show( extract_skill_conditions(frontmatter), available_tools, available_toolsets, ): continue # 禁用列表检查 if frontmatter_name in disabled or skill_name in disabled: continue -
生成紧凑索引格式
## Skills (mandatory) Before replying, scan the skills below. If one clearly matches your task, load it with skill_view(name) and follow its instructions. If a skill has issues, fix it with skill_manage(action='patch'). <available_skills> software-development: - code-review: Structured code review workflow - test-driven-development: TDD methodology research: - arxiv: Search and summarize arXiv papers </available_skills> If none match, proceed normally without loading a skill.
3.3 动态加载技能(第二层注入)
时机:Agent识别到相关技能时
渐进式披露架构(Progressive Disclosure):
Level 0: skills_list() → 元数据列表(~3k tokens)
Level 1: skill_view(name) → 完整SKILL.md内容
Level 2: skill_view(name, file_path) → 参考文件、模板、脚本
优势:只有在真正需要时才加载完整内容,确保token高效使用。
示例:
# Level 0: 列出所有技能
skills_list()
# Level 1: 加载技能主体
skill_view("axolotl")
# Level 2: 加载参考文件
skill_view("axolotl", "references/dataset-formats.md")
3.4 创建/修改技能
工具:skill_manage
主要操作:
| Action | 用途 | Token效率 | 关键参数 |
|---|---|---|---|
create |
从零创建新技能 | 需要完整SKILL.md | name, content, category |
patch |
目标修复(推荐) | 只需变更部分 | name, old_string, new_string |
edit |
重大结构重写 | 需要完整替换 | name, content |
delete |
删除技能 | N/A | name |
write_file |
添加参考文件/模板 | 支持大文件 | name, file_path, file_content |
remove_file |
删除支持文件 | N/A | name, file_path |
patch操作的智能匹配:
# 使用模糊匹配引擎,处理:
# - 空白字符规范化
# - 缩进差异
# - 转义序列
# - 块锚点匹配
from tools.fuzzy_match import fuzzy_find_and_replace
new_content, match_count, _strategy, match_error = fuzzy_find_and_replace(
content, old_string, new_string, replace_all)
示例:
# 创建新技能
skill_manage(
action="create", name="my-deployment-workflow", category="devops", content="""---name: my-deployment-workflow
description: Deploy to Kubernetes with zero downtime
---
# Deployment Workflow
..."""
)
# 修复技能中的错误
skill_manage(
action="patch", name="my-deployment-workflow", old_string="kubectl apply -f deployment.yaml", new_string="kubectl apply -f deployment.yaml --record")
3.5 安全扫描
时机:所有技能变更后
位置:tools/skill_manager_tool.py → _security_scan_skill()
扫描内容:
| 检查项 | 说明 |
|---|---|
| 数据外泄风险 | 检测curl、wget等可能泄露数据的命令 |
| 提示注入攻击 | 检测"ignore previous instructions"等模式 |
| 破坏性命令 | 检测rm -rf、格式化等危险操作 |
| 供应链攻击信号 | 检测可疑的依赖项或外部引用 |
| 隐形Unicode | 检测零宽字符等隐形字符 |
处理流程:
result = scan_skill(skill_dir, source="agent-created")
allowed, reason = should_allow_install(result)
if allowed is False:
# 阻止并回滚
return {"success": False, "error": f"Security scan blocked: {reason}"} if allowed is None:
# 警告但允许
logger.warning("Skill has security findings: %s", reason)
3.6 缓存更新
时机:技能修改成功后立即执行
位置:tools/skill_manager_tool.py
if result.get("success"):
try:
from agent.prompt_builder import clear_skills_system_prompt_cache
clear_skills_system_prompt_cache(clear_snapshot=True)
except Exception:
pass
缓存层次:
- 内存LRU缓存:进程内的快速缓存
- 磁盘快照:
~/.hermes/.skills_prompt_snapshot.json- 包含mtime/size清单
- 冷启动时快速加载
四、提示词组装机制
4.1 完整层次结构
系统提示词按以下顺序组装(定义在 run_agent.py → _build_system_prompt()):
Layer 1: Agent Identity
↓ SOUL.md(~/.hermes/SOUL.md)或 DEFAULT_AGENT_IDENTITY Layer 2: Tool-aware behavior guidance
↓ Memory、Session Search、Skills使用指导
Layer 3: Honcho static block
↓ 当Honcho激活时注入
Layer 4: Optional system message
↓ 用户配置的系统消息
Layer 5: Frozen MEMORY snapshot
↓ 持久化记忆(冻结快照)
Layer 6: Frozen USER profile snapshot
↓ 用户画像(冻结快照)
Layer 7: Skills index ⭐
↓ 技能索引(自进化的核心)
Layer 8: Context files
↓ AGENTS.md、.cursorrules、.hermes.md等
Layer 9: Timestamp + session ID
↓ 会话标识和时间戳
Layer 10: Platform hint
↓ 平台特定提示(WhatsApp/Discord/CLI等)
4.2 缓存策略
稳定前缀缓存:
- 缓存范围:Layer 1-8 在会话开始时构建并缓存
- 重建条件:
- 上下文压缩事件
- 技能修改
- 配置变更
API调用时注入:
以下内容不包含在缓存中,而是在每次API调用时注入:
- ephemeral_system_prompt:临时系统提示
- Prefill messages:预填充消息
- Gateway会话上下文覆盖
- Honcho recall:当前轮次的记忆召回
设计原则:
# 注释来自 run_agent.py# Note: ephemeral_system_prompt is NOT included here. It's injected at
# API-call time only so it stays out of the cached/stored system prompt.
4.3 上下文文件发现
优先级系统(第一个匹配获胜):
| 优先级 | 文件 | 搜索范围 | 说明 | |
|---|---|---|---|---|
| 1 | .hermes.md, HERMES.md |
CWD到git根 | Hermes原生项目配置 | |
| 2 | AGENTS.md |
仅CWD | 通用Agent指令文件 | |
| 3 | CLAUDE.md |
仅CWD | Claude Code兼容 | |
| 4 | .cursorrules, .cursor/rules/*.mdc |
仅CWD | Cursor兼容 |
安全扫描:
所有上下文文件在注入前都会扫描:
_CONTEXT_THREAT_PATTERNS = [
(r'ignore\s+(previous|all|above|prior)\s+instructions', "prompt_injection"), (r'do\s+not\s+tell\s+the\s+user', "deception_hide"), (r'system\s+prompt\s+override', "sys_prompt_override"), # ... 更多模式
]
截断策略:
CONTEXT_FILE_MAX_CHARS = 20_000 # 20k字符上限
CONTEXT_TRUNCATE_HEAD_RATIO = 0.7 # 保留70%头部
CONTEXT_TRUNCATE_TAIL_RATIO = 0.2 # 保留20%尾部
# 中间10%用截断标记替换```
### 4.4 完整示例
以下是所有层次都存在时的系统提示词示例:
```markdown
# Layer 1: Agent Identity
You are Hermes, an AI assistant created by Nous Research.
You are an expert software engineer and researcher.
# Layer 2: Tool-aware behavior guidance
You have persistent memory across sessions. Save durable facts.
# Layer 5: Frozen MEMORY snapshot
## Persistent Memory
- User prefers Python 3.12
# Layer 7: Skills index
## Skills (mandatory)
<available_skills>
software-development: - code-review: Structured code review workflow</available_skills>
五、关键技术特性
5.1 条件激活(Conditional Activation)
技能可以根据当前工具集自动显示/隐藏。
配置方式:
metadata:
hermes:
fallback_for_toolsets: [web]
requires_toolsets: [terminal]
逻辑表:
| 字段 | 行为 |
|---|---|
fallback_for_toolsets |
列出的工具集可用时隐藏,不可用时显示 |
requires_toolsets |
列出的工具集可用时显示,不可用时隐藏 |
fallback_for_tools |
列出的工具可用时隐藏,不可用时显示 |
requires_tools |
列出的工具可用时显示,不可用时隐藏 |
实际案例:
DuckDuckGo搜索技能配置了 fallback_for_toolsets: [web]:
- 当 FIRECRAWL_API_KEY 设置时,web工具集可用 -> DuckDuckGo技能隐藏
- 当 API密钥缺失时,web工具集不可用 -> DuckDuckGo技能自动显示作为免费备选
5.2 平台限制
技能可以限制只在特定操作系统上显示。
配置方式:
platforms: [macos] # 仅macOS
platforms: [macos, linux] # macOS和Linux
平台映射:
| 配置值 | 匹配系统 |
|---|---|
macos |
macOS (Darwin) |
linux |
Linux |
windows |
Windows |
实际案例:
- iMessage技能:
platforms: [macos]- 只在macOS上显示 - Apple Reminders技能:
platforms: [macos]- 只在macOS上显示 - Docker管理技能:
platforms: [macos, linux]- 不支持Windows
5.3 外部技能目录
支持共享技能库,让多个Agent工具共享同一套技能。
配置方式:
skills:
external_dirs:
- ~/.agents/skills
- /home/shared/team-skills
特性:
| 特性 | 说明 |
|---|---|
| 只读 | 外部目录仅用于扫描发现 |
| 本地优先 | 同名技能,本地版本优先 |
| 完整集成 | 出现在索引、skills_list、斜杠命令中 |
| 路径支持 | 支持 ~ 和 ${VAR} 环境变量 |
5.4 安全环境变量配置
技能可以声明必需的环境变量,在加载时自动提示配置。
配置方式:
required_environment_variables:
- name: TENOR_API_KEY
- prompt: Tenor API key
- help: Get a key from https://developers.google.com/tenor
六、代码位置索引
6.1 核心文件
| 功能模块 | 文件路径 | 关键函数/类 |
|---|---|---|
| 提示词组装入口 | run_agent.py:2908 |
_build_system_prompt() |
| 技能索引构建 | agent/prompt_builder.py:440 |
build_skills_system_prompt() |
| 技能扫描解析 | agent/prompt_builder.py:373 |
_parse_skill_file() |
| 条件激活逻辑 | agent/prompt_builder.py:405 |
_skill_should_show() |
| 平台兼容性 | agent/skill_utils.py |
skill_matches_platform() |
| 技能加载工具 | tools/skills_tool.py:409 |
skill_view() |
| 技能列表工具 | tools/skills_tool.py:247 |
skills_list() |
| 技能管理工具 | tools/skill_manager_tool.py:552 |
skill_manage() |
| 创建操作 | tools/skill_manager_tool.py:266 |
_create_skill() |
| 修复操作 | tools/skill_manager_tool.py:349 |
_patch_skill() |
| 编辑操作 | tools/skill_manager_tool.py:316 |
_edit_skill() |
| 删除操作 | tools/skill_manager_tool.py:445 |
_delete_skill() |
| 安全扫描 | tools/skill_manager_tool.py:37 |
_security_scan_skill() |
| 缓存清理 | agent/prompt_builder.py:259 |
clear_skills_system_prompt_cache() |
6.2 辅助文件
| 功能 | 文件路径 |
|---|---|
| 前言解析 | agent/skill_utils.py -> parse_frontmatter() |
| 技能描述提取 | agent/skill_utils.py -> extract_skill_description() |
| 技能条件提取 | agent/skill_utils.py -> extract_skill_conditions() |
| 外部目录获取 | agent/skill_utils.py -> get_all_skills_dirs() |
| 模糊匹配 | tools/fuzzy_match.py -> fuzzy_find_and_replace() |
| 安全扫描器 | tools/skills_guard.py -> scan_skill() |
| 原子写入 | tools/skill_manager_tool.py -> _atomic_write_text() |
七、总结
Hermes Agent的skill自进化系统是一个精心设计的主动学习机制,通过三层架构实现Agent的自我改进:
核心优势
- 主动学习:Agent被明确指导何时创建/更新技能
- 高效进化:patch操作只需变更部分,token高效
- 安全保障:自动扫描防止恶意代码注入
- 上下文感知:根据工具集和平台动态调整可用技能
- 缓存友好:稳定的前缀缓存设计
设计亮点
- 渐进式披露:三层加载机制(列表->内容->参考文件)确保token高效
- 模糊匹配:patch操作容忍格式差异,提高成功率
- 条件激活:技能可以根据环境自动显示/隐藏
- 双缓存:内存LRU + 磁盘快照,兼顾速度和持久化
- 安全优先:多层扫描,自动回滚危险操作
应用场景
- 个人学习:Agent记住用户的工作流程和偏好
- 团队共享:通过外部技能目录共享最佳实践
- 持续改进:使用中不断修正和完善技能库
- 领域专精:针对特定领域积累专业知识
这个系统让Agent能够在不断使用中自我改进,形成正向循环:任务越复杂,积累的技能越多,未来的任务处理就越高效。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)