Appearance
Hermes Skills闭环系统:Agent从经验中自我进化的完整实现
当AI Agent学会了"记笔记",它不再只是"被动响应"的工具,而开始具有"主动学习"的特征。Hermes Agent的Skills闭环系统,实现了一个完整的"经验提取→知识存储→智能检索→上下文注入→执行验证→自动改进"闭环。
全局视角:七个阶段构成的闭环
| 阶段 | 说明 |
|---|---|
| 1. Skill创建 | 从经验到知识的蒸馏 |
| 2. 索引构建 | 两层缓存的极致优化 |
| 3. 条件激活 | Skill的智能可见性控制 |
| 4. 渐进式加载 | 从索引到完整内容的披露 |
| 5. 注入策略 | User Message而非System Prompt |
| 6. 自改进机制 | 闭环的关键闭合点 |
| 7. 安全扫描 | Skills生态的免疫系统 |
Skill创建:七道安全关卡
创建触发条件
python
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+ tool calls — 简单任务不值得建Skill
- fixing a tricky error — 踩过的坑是最有价值的知识
- don't wait to be asked — Agent自主判断
- Skills that aren't maintained become liabilities — 过时的Skill比没有Skill更危险
七道验证关卡
| 关卡 | 验证内容 |
|---|---|
| 1 | 名称验证:小写字母/数字/连字符,≤64字符 |
| 2 | 分类验证:单层目录名,无路径穿越 |
| 3 | Frontmatter验证:必须有YAML头部 |
| 4 | 大小限制:≤100,000字符 |
| 5 | 名称冲突检查:跨所有目录去重 |
| 6 | 原子写入:tempfile + os.replace()防崩溃损坏 |
| 7 | 安全扫描:90+威胁模式检测 |
原子写入实现
python
def atomic_write_text(file_path, content, encoding="utf-8"):
fd, temp_path = tempfile.mkstemp(dir=str(file_path.parent))
try:
with os.fdopen(fd, "w", encoding=encoding) as f:
f.write(content)
os.replace(temp_path, file_path)
except Exception:
os.unlink(temp_path)
raise先写临时文件,完成后原子替换——崩溃时要么是旧内容,要么是新内容,绝无损坏文件。
索引构建:两层缓存
Layer 1:进程内LRU缓存
python
SKILLS_PROMPT_CACHE_MAX = 8
SKILLS_PROMPT_CACHE = OrderedDict()缓存键是五元组:目录路径、外部目录、可用工具集、可用工具集组、平台标识。
Layer 2:磁盘快照
通过mtime+size manifest验证快照是否过期——不对比文件内容(太慢),只对比修改时间和大小。
性能对比
| 路径 | 耗时 | 场景 |
|---|---|---|
| Layer 1命中 | ~0.001ms | 同一对话多次访问 |
| Layer 2命中 | ~1ms | 进程刚重启但Skill没变 |
| 全扫描 | 50-500ms | Skill文件变化后首次访问 |
条件激活:智能可见性控制
python
def _skill_should_show(conditions, available_tools, available_toolsets):
# fallback_for: 当主工具可用时,隐藏这个fallback skill
for ts in conditions.get("fallback_for_toolsets", []):
if ts in available_toolsets:
return False
# requires: 当依赖工具不可用时,隐藏这个skill
for t in conditions.get("requires_tools", []):
if t not in available_tools:
return False
return True解决的问题:索引膨胀。fallback_for_toolsets让Skill只在主工具不可用时才出现。
渐进式加载:三级披露
| Tier | 内容 | Token消耗 |
|---|---|---|
| Tier 1 | 索引(名称+描述) | ~20 tokens/Skill |
| Tier 2 | 完整内容(skill_view加载) | 按需 |
| Tier 3 | 支撑文件(API文档等) | 按需 |
效果:100个Skill只增加~2000 tokens,而非500K tokens。
注入策略:为什么用User Message
核心问题:为什么Skill内容作为User Message注入,而非追加到System Prompt?
答案:Prompt Cache。
System Prompt在对话过程中不能变化,否则缓存失效。如果每次加载Skill都修改System Prompt,每轮对话都要重新处理,成本增加数十倍。
权衡:牺牲一点点指令跟随权重,换取90%+成本节约。
注入消息带[SYSTEM: ...]前缀标记,模拟系统级指令权威性。
自改进机制:闭环的闭合点
Patch触发
python
"If a skill you loaded was missing steps, had wrong commands, or needed
pitfalls you discovered, update it before finishing.""patch it immediately"和"before finishing"——立即修正,不留到下次。
Fuzzy Match引擎
python
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
)LLM回忆Skill内容时常有格式差异(多空格、少换行、缩进不同),Fuzzy Match处理这些差异,减少patch失败率。
级联效应
Patch成功后触发缓存清理——clear_snapshot=True清除内存LRU缓存和磁盘快照。
最终一致性模型:
- 当前对话:使用旧版Skill,发现问题并patch
- 下一个对话:索引缓存失效,重新扫描,加载更新后的Skill
安全扫描:90+威胁模式
威胁模式类别
- 环境变量泄露(exfiltration)
- Prompt注入(injection)
- 路径穿越(traversal)
- DAN越狱攻击
- 隐形Unicode字符
信任分级策略
| 来源 | safe | caution | dangerous |
|---|---|---|---|
| builtin(内置) | allow | allow | allow |
| trusted(官方) | allow | allow | block |
| community(社区) | allow | block | block |
| agent-created(自创建) | allow | allow | ask |
结构性检查
- MAX_FILE_COUNT = 50
- MAX_TOTAL_SIZE_KB = 1024
- MAX_SINGLE_FILE_KB = 256
- 可疑二进制扩展名检测
- 符号链接逃逸检测
Skill vs Memory分工
| 类型 | 存什么 | 不存什么 |
|---|---|---|
| Memory | 用户偏好、环境细节、工具特性、稳定约定 | 任务进度、会话结果、完成工作日志 |
| Skill | 做事的方法、流程、陷阱、最佳实践 | 事实信息 |
分工本质:Memory回答"是什么",Skill回答"怎么做"。
总结
| 要点 | 说明 |
|---|---|
| 七阶段闭环 | 创建→索引→激活→加载→注入→改进→扫描 |
| 核心权衡 | User Message注入保护Prompt Cache |
| 安全深度 | 90+威胁模式+信任分级+结构检查 |
| 自改进 | Fuzzy Match+立即patch+缓存清理 |
Hermes的Skills系统本质上实现了认知科学中程序性记忆的工程化模拟:编码→存储→检索→巩固→迁移。
关键词:Hermes Agent, Skills系统, 自进化Agent, 闭环学习, 渐进式披露, Prompt Cache
