本文档详细梳理Hermes Agent中skill自进化的完整流程,以及大模型调用时提示词的组装和拼接机制。

目录


概述

Hermes Agent的skill自进化系统是一个主动学习机制,让Agent能够:

  • ✅ 从成功经验中提取可复用的流程
  • ✅ 在发现问题时自动修正现有技能
  • ✅ 持续积累领域知识
  • ✅ 实现自我改进的正向循环

这个系统通过三层架构实现:

  1. 提示词层:通过技能索引主动提示Agent可用的知识库
  2. 工具层:提供完整的CRUD操作,支持增量修改
  3. 执行层:安全扫描、缓存管理、持久化存储

一、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.pybuild_skills_system_prompt()

步骤

  1. 扫描技能目录

    • 本地目录:~/.hermes/skills/
    • 外部目录:配置的共享目录
  2. 解析SKILL.md前言

    • 名称、描述
    • 平台限制
    • 条件激活规则
  3. 过滤技能

    # 平台兼容性检查  
    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 
    
  4. 生成紧凑索引格式

    ## 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

缓存层次

  1. 内存LRU缓存:进程内的快速缓存
  2. 磁盘快照~/.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的自我改进:

核心优势

  1. 主动学习:Agent被明确指导何时创建/更新技能
  2. 高效进化:patch操作只需变更部分,token高效
  3. 安全保障:自动扫描防止恶意代码注入
  4. 上下文感知:根据工具集和平台动态调整可用技能
  5. 缓存友好:稳定的前缀缓存设计

设计亮点

  • 渐进式披露:三层加载机制(列表->内容->参考文件)确保token高效
  • 模糊匹配:patch操作容忍格式差异,提高成功率
  • 条件激活:技能可以根据环境自动显示/隐藏
  • 双缓存:内存LRU + 磁盘快照,兼顾速度和持久化
  • 安全优先:多层扫描,自动回滚危险操作

应用场景

  • 个人学习:Agent记住用户的工作流程和偏好
  • 团队共享:通过外部技能目录共享最佳实践
  • 持续改进:使用中不断修正和完善技能库
  • 领域专精:针对特定领域积累专业知识

这个系统让Agent能够在不断使用中自我改进,形成正向循环:任务越复杂,积累的技能越多,未来的任务处理就越高效。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐