Hermes Agent 深度解析:具有闭合学习循环的自主 AI Agent
作者:工程视角调研
日期:2026-06-09
系列:AI 知识库系统调研(01/09)
定位:工程师实践指南,含完整代码示例
项目地址:https://github.com/NousResearch/hermes-agent
Skills Hub:https://agentskills.io
Obsidian 集成:https://github.com/Burgunthy/hermes-second-brain
1. Hermes 是什么
1.1 Nous Research 与 Hermes 的背景
Nous Research 是一家专注于前沿 LLM 研究和开源模型开发的公司,以其 Hermes 系列微调模型(Hermes-3-Llama-3.1 等)闻名于开源社区。这些模型在指令跟随、工具调用和 Agent 能力方面经过专项优化,是开源 Agent 工程的重要底座。
Hermes Agent 框架是 Nous Research 在模型层之上的工程延伸:如果说 Hermes 模型解决了”LLM 能做什么”的问题,那么 Hermes Agent 解决的是”LLM 怎么持续学习和进化”的问题。其设计动机来自于对现有 Agent 框架的一个核心批判:
大多数 Agent 框架是无状态的。每次对话结束,Agent 就”忘”了所有东西。
这在单次任务场景下尚可接受,但对于需要长期工作的知识工作者(写作、研究、软件工程)而言,这是根本性的缺陷。人类专家之所以越来越强,是因为每次工作都会让他们在脑中积累经验和模式。Hermes Agent 的目标就是让 AI Agent 拥有同等能力。
1.2 核心定位:具有闭合学习循环的自主 Agent
Hermes Agent 的官方定位是:“A self-improving AI agent with a closed learning loop”(具有闭合学习循环的自主 AI Agent)。
这里的”闭合学习循环”(Closed Learning Loop)是理解 Hermes 的核心概念。所谓”开放循环”的 Agent,每次执行任务后不留任何痕迹,下次面对同类任务时从零开始。“闭合循环”的 Agent 则在完成任务后:
- 更新记忆文件,记录本次工作的上下文和结论
- 如果完成了复杂任务,自动生成可复用的 Skill 文件
- 分析用户行为,更新用户画像模型
- 将本次对话摘要索引进全文搜索库
这四个动作形成了一个闭环:每次工作都让 Agent 变得更懂你、更擅长你需要的任务。
1.3 与 Claude Code / AutoGPT / LangChain Agent 的本质区别
这是选型时最常见的困惑,下表从本质维度进行对比:
| 维度 | Claude Code | AutoGPT | LangChain Agent | Hermes Agent |
|---|---|---|---|---|
| 主要场景 | 代码开发 | 通用任务执行 | 通用 Agent 框架 | 知识管理 + 持续学习 |
| 跨 Session 记忆 | MEMORY.md(手动维护) | 无 | 需自行接入向量库 | 自动三层记忆系统 |
| 技能系统 | Skills(.md 格式) | 插件体系 | Tool/Chain | 自动生成 + 自我改进 |
| 用户建模 | 无 | 无 | 无 | Honcho 辩证推断 |
| 定时任务 | 无 | 无 | 需外部 Cron | 内置调度器 |
| LLM 支持 | 仅 Claude | GPT-4 系 | 多提供商 | 300+ 模型 |
| 部署方式 | 命令行工具 | 自托管 | 库/框架 | 命令行 + 后台服务 |
| 学习能力 | 依赖用户维护 | 无 | 无 | 主动积累,自动进化 |
关键差异在于主动性和持续性:
- Claude Code 是优秀的代码助手,需要用户主动维护 MEMORY.md
- AutoGPT 是任务执行引擎,没有跨 Session 积累机制
- LangChain 是框架,知识持久化需要开发者自己实现
- Hermes Agent 是知识工作伴侣,主动维护记忆、自动生成技能、持续建模用户
1.4 名称来源与设计哲学
“Hermes”(赫尔墨斯)是希腊神话中的信使神,负责传递知识、连接不同领域。这个命名暗示了设计哲学的两个层面:
- 连接性:连接不同的知识源(笔记、网络、代码库、历史对话),而不是孤立地处理单次请求
- 传递性:知识在时间轴上传递——过去的工作成果能有效传递给未来的自己(和 Agent)
设计哲学的核心可以用一句话概括:“AI Agent 应该像有经验的同事一样工作,而不是像每次都刚入职的实习生。“
2. 核心架构:闭合学习循环
2.1 完整流程图
┌─────────────────────────────────────────────────────────────────┐
│ Hermes Agent 闭合学习循环 │
└─────────────────────────────────────────────────────────────────┘
用户输入/定时触发
│
▼
┌───────────────┐ ┌──────────────────────────────────────────┐
│ 感知层 │────▶│ 输入源 │
│ Perception │ │ ├── 用户消息(自然语言) │
└───────────────┘ │ ├── 文件监控(raw/inbox/ 新增文件) │
│ ├── Cron 触发(定时任务) │
│ └── MCP 事件(外部工具回调) │
└──────────────────────────────────────────┘
│
▼
┌───────────────┐ ┌──────────────────────────────────────────┐
│ 记忆层 │────▶│ 三层记忆召回 │
│ Memory │ │ ├── MEMORY.md(项目/上下文持久记忆) │
└───────────────┘ │ ├── USER.md(用户偏好画像) │
│ ├── SOUL.md(Agent 行为原则) │
│ └── FTS5 历史会话检索(SQLite) │
└──────────────────────────────────────────┘
│
▼
┌───────────────┐ ┌──────────────────────────────────────────┐
│ 推理层 │────▶│ LLM 决策 │
│ Reasoning │ │ ├── 理解意图 │
└───────────────┘ │ ├── 分解子任务 │
│ ├── 选择 Skills(Progressive Disclosure)│
│ └── 规划工具调用序列 │
└──────────────────────────────────────────┘
│
▼
┌───────────────┐ ┌──────────────────────────────────────────┐
│ 行动层 │────▶│ 工具执行 │
│ Action │ │ ├── 文件操作(读/写/搜索) │
└───────────────┘ │ ├── MCP Server 调用 │
│ ├── Shell 命令执行 │
│ ├── Skills 执行(调用 Skill 文件指令) │
│ └── 并行子 Agent 协调 │
└──────────────────────────────────────────┘
│
▼
┌───────────────┐ ┌──────────────────────────────────────────┐
│ 学习层 │────▶│ 知识沉淀(任务完成后自动触发) │
│ Learning │ │ ├── 更新 MEMORY.md │
└───────────────┘ │ ├── 更新 USER.md(Honcho 推断) │
│ ├── 自动生成 Skill 文件 │
│ └── 写入 FTS5 会话摘要索引 │
└──────────────────────────────────────────┘
│
└────────────────────────▶ 下次任务(循环闭合)
2.2 感知层(Perception):多源信息摄取
感知层负责将外部信号统一接入 Agent。Hermes 支持四类输入源:
直接交互:用户在终端输入自然语言指令。这是最基础的输入方式,类似于 Claude Code。
文件监控:通过 inotify(Linux)或 FSEvents(macOS)监控指定目录。当 raw/inbox/ 目录有新文件写入时,自动触发摄取流水线。这是 Hermes 与 Obsidian 集成的核心机制——用户在手机上用 Obsidian Mobile 新增笔记,Hermes 在桌面端自动处理。
Cron 触发:内置调度器,支持标准 cron 表达式。每天凌晨 4 点自动运行知识整理、每周自动更新知识图谱等。
MCP 事件:通过 Model Context Protocol,Hermes 可以接收来自外部工具(日历、邮件、代码库)的事件推送。
2.3 记忆层(Memory):三层持久化记忆
这是 Hermes 最核心的差异化能力,详见第 3 节。
2.4 推理层(Reasoning):LLM 决策
推理层的关键设计是渐进式技能加载(Progressive Disclosure)。Agent 启动时只加载所有 Skill 的 name 和 description(约 100 tokens/Skill),当任务匹配某个 Skill 时,才加载完整的 SKILL.md 内容。这让 Agent 可以维护数百个技能而不爆炸 context window。
2.5 行动层(Action):工具执行
Hermes 内置了文件读写、Shell 执行、HTTP 请求等标准工具,并通过 MCP 协议支持任意扩展工具。并行子 Agent 能力允许将复杂任务拆分为多个独立子任务并发执行,然后聚合结果。
2.6 学习层(Learning):技能自动生成
这是区分 Hermes 与”普通 Agent 框架”的关键层。学习层在任务完成后自动运行以下操作:
- 判断本次任务是否值得生成 Skill(通过 LLM 评估复杂度和复用价值)
- 如果值得,生成符合 agentskills.io 规范的 SKILL.md 文件
- 更新 MEMORY.md 中的相关章节
- 通过 Honcho 分析本次交互,更新 USER.md 用户画像
- 将本次对话摘要写入 FTS5 全文检索索引
3. 三层记忆系统详解
3.1 MEMORY.md:跨 Session 项目记忆
MEMORY.md 是 Hermes 与 Claude Code 最相似的机制,但实现方式有重要差异:
Claude Code 的 MEMORY.md:由用户手动维护,Agent 在每次 Session 开始时读取。没有自动更新机制。
Hermes 的 MEMORY.md:由 Agent 自动维护,每次 Session 结束时 Agent 主动判断是否需要更新。触发更新的条件包括:
- 用户明确要求记住某件事
- Agent 发现了新的有用信息(API、文件结构、偏好等)
- 完成了复杂任务,有值得记录的结论
典型的 MEMORY.md 结构:
# Project Memory
## Context
- 项目名称:GeneralAndroid Performance Suite
- 主要技术栈:Python/PyQt6, ADB, Perfetto, Simpleperf
- 工作目录:/home/zbc/pangu/GeneralAndroid/
## Key Discoveries
### 2026-06-01: AtlasTextOp Cache Miss 根因
- Scale 动画导致 Strike Descriptor 的 scale factor 变化
- 这会使 LRU 字形缓存失效,触发重新光栅化
- 复现条件:TextView 在 ScaleX 动画过程中首次渲染新字符
### 2026-06-05: Simpleperf off-cpu 遗漏问题
- 进程有大量 JNI transition 时,需要加 `--trace-offcpu`
- 否则 off-cpu 时间统计会漏掉约 30-40% 的阻塞时间
## Environment Setup
- ADB 路径:/home/zbc/.local/bin/
- Perfetto 本地二进制:/home/zbc/.local/bin/trace_processor_shell
- 测试设备序列号:可通过 `adb devices` 查看
## Ongoing Tasks
- [ ] 调研 Hermes Agent 用于知识管理
- [x] 完成 AtlasTextOp 分析报告MEMORY.md 的写入时机是由 LLM 决定的:Agent 在生成最终回答后,会额外运行一次”是否需要更新记忆”的推理步骤。如果判断需要,则调用文件写入工具更新 MEMORY.md 的对应章节。
3.2 USER.md:用户建模与个性化追踪
USER.md 是 Hermes 最独特的记忆层,基于 Honcho(Plastic Labs 开发的用户建模框架)实现。
Honcho 的核心思想是辩证式用户画像推断(Dialectical User Modeling):Agent 不仅记录用户说了什么,还通过多轮对话逐步推断用户的工作风格、认知模型和隐性偏好。
# User Profile
## Communication Style
- 偏好:技术深度优先,不需要过多解释基础概念
- 示例:直接引用源码而非用"某个地方"描述
- 不喜欢:泛泛而谈的结论,需要具体证据支撑
## Working Patterns
- 工作时间:深夜(22:00-02:00)活跃度最高
- 任务切换:经常在多个技术问题间跳转,需要快速恢复上下文
- 验证习惯:倾向于自己跑代码验证而非相信文档描述
## Domain Expertise
- 精通:Android 图形渲染栈、ADB 工具链、Python GUI
- 熟悉:Perfetto Trace 分析、Linux 性能工具
- 学习中:AI Agent 框架、知识图谱构建
## Preferences
- 文件格式:优先 Markdown,避免 JSON 配置文件
- 代码风格:Python,注重可读性而非性能
- 工具偏好:终端命令行 > GUI 应用
## Inferred Beliefs
- 认为文档应该"自我解释",不依赖外部知识
- 相信"最短路径"原则:用最少的工具解决问题
- 疑虑:对自动化过度扩张保持警惕USER.md 的更新是渐进式的:Agent 不会在一次交互后完全重写用户画像,而是通过多次对话逐步补充和修正。Honcho 会对新观察和旧画像进行辩证评估,避免偶然行为被过度泛化。
3.3 SOUL.md:Agent 自身价值观与行为原则
SOUL.md 是 Hermes 最哲学性的设计,也是最少见于其他 Agent 框架的组件。它存储的是 Agent 自身的”价值观”和行为原则,而非用户偏好或项目上下文。
# Agent Soul
## Core Principles
1. **知识第一**:我的首要目标是帮助用户构建和维护高质量的知识库
2. **准确性优先**:宁可说"不确定",不伪造信息或过度推断
3. **渐进式改进**:每次交互后留下比之前更好的状态
## Working Style
- 在处理复杂技术问题时,优先展示推理过程而非直接给出结论
- 对于涉及生产系统的操作,始终要求用户确认后再执行
- 当发现记忆文件需要更新时,主动提醒用户
## Learning Philosophy
- 新生成的 Skill 文件需要至少被成功使用一次才标记为"稳定"
- 对于用户明确纠正过的行为,更新 USER.md 并不再重复
## Boundaries
- 不主动删除用户文件,除非经过明确确认
- 不在未知权限边界内执行 Shell 命令
- 对 SOUL.md 自身的修改需要用户显式授权SOUL.md 有一个重要特性:它可以由用户配置,也可以由 Agent 在积累足够经验后提议修改(但需要用户确认)。这形成了一个 Agent 自主性与人类控制之间的协商机制。
3.4 FTS5 全文检索:跨 Session 知识召回
三个记忆文件解决了”结构化记忆”问题,但仍有一类需求无法满足:“我上个月和 Agent 讨论过的某个技术细节,我记不清在哪了”。
Hermes 通过 SQLite FTS5(Full-Text Search 5)解决这个问题。每次 Session 结束后,Agent 生成本次对话的摘要,并写入 SQLite FTS5 索引:
-- Hermes 内部使用的 FTS5 schema(推断)
CREATE VIRTUAL TABLE conversation_history USING fts5(
session_id,
timestamp,
summary,
key_topics,
conclusions,
content='conversations'
);当用户询问相关历史时,Hermes 会:
- 用 FTS5 搜索相关会话
- 检索出 top-K 会话摘要
- 将摘要传给 LLM,让 LLM 综合回答
# 示例:FTS5 检索 + LLM 摘要的伪代码
def recall_from_history(query: str) -> str:
# FTS5 全文检索
results = db.execute("""
SELECT summary, key_topics, conclusions, timestamp
FROM conversation_history
WHERE conversation_history MATCH ?
ORDER BY rank
LIMIT 5
""", (query,))
# 构建上下文
context = "\n\n".join([
f"[{r['timestamp']}]\n{r['summary']}\n结论: {r['conclusions']}"
for r in results
])
# LLM 综合回答
return llm.complete(f"""
基于以下历史对话摘要,回答问题:"{query}"
历史记录:
{context}
""")这个机制的价值在于:即使具体细节没有被写入 MEMORY.md,用户仍然可以通过自然语言查询找到历史讨论的结论。
4. Skills 生态系统
4.1 Skill 的本质:.md 格式的可执行指令
Hermes 的 Skill 系统基于 agentskills.io 标准,这是一个由 Anthropic 发起、已被 30+ Agent 产品采纳的开放格式。
Skill 本质上是一个目录,其中 SKILL.md 是核心文件:
my-skill/
├── SKILL.md # 必需:元数据 + 指令
├── scripts/ # 可选:可执行脚本
│ ├── main.py
│ └── utils.sh
├── references/ # 可选:参考文档
│ └── api-guide.md
└── assets/ # 可选:模板和资源
└── template.md
SKILL.md 的格式:
---
name: android-perfetto-capture
description: 在 Android 设备上抓取 Perfetto 系统 trace,包括 CPU 调度、内存分配和图形渲染事件。当用户需要分析性能问题、抓取 trace 或调查 jank 时使用。
license: MIT
compatibility: 需要 adb 已连接设备,Python 3.8+
metadata:
author: zbc
version: "2.0"
tags: android, perfetto, performance
allowed-tools: Bash(adb:*) Bash(python3:*)
---
## 概述
本 Skill 提供端到端的 Perfetto trace 抓取流程,从配置到分析一步完成。
## 前置条件
1. ADB 已连接目标设备:`adb devices` 确认连接
2. 设备需要 root 或 userdebug 版本(用于 kernel events)
## 步骤
### 1. 启动 Perfetto trace
```bash
# 通用配置:CPU + 内存 + 图形
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace.perfetto \
<<EOF
buffers: { size_kb: 63488 fill_policy: RING_BUFFER }
data_sources: { config { name: "linux.ftrace" ftrace_config {
ftrace_events: "sched/sched_switch"
ftrace_events: "sched/sched_wakeup"
ftrace_events: "power/suspend_resume"
atrace_categories: "gfx"
atrace_categories: "input"
atrace_categories: "view"
atrace_categories: "am"
atrace_categories: "wm"
buffer_size_kb: 8192
}}}
data_sources: { config { name: "android.heapprofd" heapprofd_config {
sampling_interval_bytes: 4096
continuous_dump_config { dump_phase_ms: 0 dump_interval_ms: 1000 }
}}}
duration_ms: 10000
EOF2. 拉取 trace 文件
adb pull /data/misc/perfetto-traces/trace.perfetto /tmp/trace.perfetto3. 本地分析
from perfetto.trace_processor import TraceProcessor, TraceProcessorConfig
tp = TraceProcessor(
trace="/tmp/trace.perfetto",
config=TraceProcessorConfig(bin_path="/home/zbc/.local/bin/trace_processor_shell")
)
# 查询帧耗时
frames = tp.query("""
SELECT ts, dur, name
FROM slice
WHERE name LIKE 'DrawFrames%'
ORDER BY dur DESC
LIMIT 10
""")常见问题
- 无 root 权限:去掉 heapprofd 配置,仅抓 ftrace
- trace 文件过大:缩短 duration_ms 或减少 atrace_categories
### 4.2 与 Claude Code Skills 的完全兼容性
这是选择 Hermes 的重要理由之一:agentskills.io 是跨平台开放标准,同一个 Skill 文件可以在以下平台使用:
- Claude Code(Anthropic 官方)
- Hermes Agent(Nous Research)
- Cursor、GitHub Copilot、VS Code
- Gemini CLI、OpenAI Codex
- 30+ 其他 Agent 产品
这意味着你在 Claude Code 中积累的 Skill 库可以直接迁移到 Hermes,反之亦然。
### 4.3 内置 Skills 分类
Hermes 在 `~/.hermes/skills/` 中预装了多类技能:
~/.hermes/skills/ ├── note-taking/ # 笔记管理 │ ├── quick-capture/ # 快速捕获想法 │ ├── meeting-notes/ # 会议记录 │ └── research-note/ # 研究笔记格式 ├── research/ # 研究辅助 │ ├── web-research/ # 网络调研 │ ├── paper-summary/ # 论文摘要 │ └── source-verification/ # 信息验证 ├── productivity/ # 生产力工具 │ ├── daily-review/ # 每日回顾 │ ├── task-breakdown/ # 任务分解 │ └── knowledge-graph/ # 知识图谱更新 └── coding/ # 编码辅助 ├── code-review/ # 代码审查 ├── debug-trace/ # 调试追踪 └── doc-generation/ # 文档生成
### 4.4 Skill 自动生成机制
Hermes 最令人印象深刻的能力是**自动生成 Skills**。触发条件是:用户完成一个复杂任务,且 Agent 判断该任务有复用价值。
自动生成的流程:
用户完成复杂任务 │ ▼ Agent 评估(LLM 推理):
- 任务步骤数 > 阈值?
- 有可复用的模式?
- 用户过去有类似请求? │ ▼ 如果是 Agent 生成 Skill 草稿
- 提取任务的核心步骤
- 参数化可变部分(设备序列号、文件路径等)
- 生成 SKILL.md 元数据 │ ▼ Agent 向用户提议: “我注意到这是一个常见任务, 我已为你生成了 Skill 草稿,是否保存?” │ ▼ 用户确认 保存到 ~/.hermes/skills/ 或项目级 .claude/skills/ │ ▼ 下次同类任务:自动激活此 Skill
### 4.5 从 Claude Code 迁移 Skills
由于 agentskills.io 格式完全兼容,迁移命令:
```bash
# 将 Claude Code 的 Skills 复制到 Hermes
cp -r ~/.claude/skills/ ~/.hermes/skills/
# 或者建立软链接(推荐,保持同步)
ln -s ~/.claude/skills/ ~/.hermes/skills/shared/
# 验证格式
hermes skills validate
注意事项:Claude Code 的 CLAUDE.md 格式与 Hermes 的 MEMORY.md 格式不同,需要手动整理一次。
5. Cron 定时自动化
5.1 内置调度器的工作原理
Hermes 内置了基于 tokio 或 cron 库的调度器(根据实现语言而定)。调度器在 hermes daemon 后台进程中运行,无需依赖系统 crontab。
调度配置文件 ~/.hermes/config/cron.yaml:
schedules:
- name: daily-knowledge-digest
cron: "0 4 * * *" # 每天凌晨 4 点
skill: knowledge-digest
context: "daily"
enabled: true
- name: weekly-graph-update
cron: "0 2 * * 0" # 每周日凌晨 2 点
skill: knowledge-graph
context: "weekly"
enabled: true
- name: nightly-backup
cron: "0 1 * * *" # 每天凌晨 1 点
skill: obsidian-backup
context: "backup"
enabled: true
- name: monthly-review
cron: "0 10 1 * *" # 每月 1 号上午 10 点
skill: monthly-knowledge-review
context: "monthly"
enabled: false # 默认关闭,需手动启用5.2 知识库整理 Skill 示例
~/.hermes/skills/knowledge-digest/SKILL.md:
---
name: knowledge-digest
description: 每日知识库摘要:处理 raw/inbox/ 中的新笔记,提取关键概念,更新 wiki/,生成每日摘要。在定时任务中自动运行,或用户要求"整理今天的笔记"时触发。
---
## 执行步骤
### 1. 扫描 inbox
```python
import os
from pathlib import Path
inbox = Path("~/obsidian/raw/inbox/").expanduser()
new_files = [f for f in inbox.iterdir()
if f.suffix == ".md"
and f.stat().st_mtime > last_run_timestamp]2. 提取概念实体
对每个新文件:
- 提取关键概念(人名、技术术语、项目名)
- 检查是否与 wiki/concepts/ 已有条目冲突或重叠
- 生成新的 wiki 条目草稿
3. 更新 wiki 目录
- 新实体写入
wiki/entities/<entity-name>.md - 新概念写入
wiki/concepts/<concept>.md - 更新
wiki-index.md索引
4. 生成每日摘要
输出到 daily-summaries/YYYY-MM-DD.md:
- 今日处理文件数
- 新增实体/概念列表
- 重要发现或连接
5. 归档处理完的 inbox 文件
移动到 raw/processed/YYYY-MM/
### 5.3 完整的定时任务模板套件
**每日 4AM:知识摄取**
```yaml
- name: daily-ingest
cron: "0 4 * * *"
prompt: |
检查 raw/inbox/ 目录中的新文件。
对每个新文件:
1. 分析内容,提取关键信息
2. 在 wiki/ 中创建或更新相关条目
3. 在 MEMORY.md 中记录重要发现
将处理完的文件移至 raw/processed/
每周日:知识图谱重建
- name: weekly-graph
cron: "0 2 * * 0"
prompt: |
运行 wiki-graph.py 重建知识图谱。
分析 wiki/ 目录中所有文件的链接关系。
生成 graphify-out/ 中的 JSON 图谱文件。
统计本周知识增长:新节点数、新连接数。每月 1 日:知识质量审查
- name: monthly-review
cron: "0 10 1 * *"
prompt: |
审查 wiki/ 目录中的所有条目:
1. 标记 3 个月未更新的"陈旧"条目
2. 找出没有反向链接的"孤岛"条目
3. 识别内容重复的条目,建议合并
4. 生成月度报告到 reports/YYYY-MM-quality.md6. 与 Obsidian 深度集成
6.1 hermes-second-brain 项目
hermes-second-brain 是一个面向 Obsidian 用户的集成模板,提供了完整的目录结构和配置文件,让 Hermes Agent 成为 Obsidian 知识库的自动化管理引擎。
这个项目的核心理念:Obsidian 提供人类可读的知识界面,Hermes 提供自动化的知识维护引擎。两者的分工:
| 角色 | 工具 | 职责 |
|---|---|---|
| 用户 | Obsidian(桌面 + 移动) | 阅读、手动写作、可视化浏览 |
| 自动化引擎 | Hermes Agent(定时任务) | 摄取、整理、分类、连接 |
| 知识图谱 | wiki-graph.py + Obsidian Graph View | 可视化知识结构 |
6.2 完整目录结构
~/obsidian-vault/
│
├── .hermes.md ← Hermes Agent 的上下文配置文件
│
├── raw/ ← 原始输入(inbox)
│ ├── inbox/ ← 新文件在此,Hermes 定时处理
│ │ ├── 2026-06-09-meeting-notes.md
│ │ └── idea-about-atlas-rendering.md
│ └── processed/ ← 处理完毕,按月归档
│ └── 2026-06/
│ └── ...
│
├── wiki/ ← 精炼后的知识库(主体)
│ ├── concepts/ ← 技术概念(AtlasTextOp, FTS5, 等)
│ │ ├── AtlasTextOp.md
│ │ └── Perfetto-Trace.md
│ ├── entities/ ← 人物/项目/工具实体
│ │ ├── Nous-Research.md
│ │ └── Hermes-Agent.md
│ ├── how-tos/ ← 操作流程(生成自 Skills 执行记录)
│ │ └── capture-perfetto-trace.md
│ └── index.md ← 知识库总索引
│
├── daily-notes/ ← 每日笔记(Obsidian 原生功能)
│ └── 2026-06-09.md
│
├── daily-summaries/ ← Hermes 生成的每日摘要
│ └── 2026-06-09-digest.md
│
├── graphify-out/ ← wiki-graph.py 输出的图谱数据
│ ├── graph.json
│ └── stats.json
│
├── reports/ ← 月度/周度质量报告
│ └── 2026-06-quality.md
│
└── scripts/
└── wiki-graph.py ← 知识图谱生成脚本
6.3 .hermes.md 上下文配置文件
.hermes.md 是放在项目根目录的 Hermes 配置文件,相当于 Claude Code 的 .claude/CLAUDE.md:
# Hermes Second Brain Configuration
## Identity
我是 zbc 的知识管理助手。我的职责是维护和整理 Obsidian 知识库,
帮助将零散的笔记转化为结构化的可检索知识。
## Vault Structure
- raw/inbox/:待处理的原始笔记
- wiki/concepts/:精炼后的技术概念文档
- wiki/entities/:人物、项目、工具的实体页面
- wiki/how-tos/:可操作的步骤指南
## Processing Rules
### 摄取规则
1. inbox 文件按创建时间顺序处理
2. 会议记录 → wiki/entities/ (参与者) + daily-summaries/
3. 技术笔记 → wiki/concepts/ (核心概念)
4. 操作记录 → wiki/how-tos/
### 写作风格
- 技术文档:精确、有代码示例、有来源引用
- 概念文档:先定义、再原理、再应用场景
- 避免:泛泛而谈、缺少证据的结论
### 链接规则
- 所有 wiki 文件中出现的已知实体/概念都应创建 [[双向链接]]
- 新文档至少有 2 个反向链接才算"已整合"
## Automated Tasks
- 每天 04:00:处理 inbox 新文件
- 每周日 02:00:重建知识图谱
- 每月 1 日:质量审查报告6.4 wiki-graph.py 知识图谱生成
#!/usr/bin/env python3
"""
wiki-graph.py: 从 Obsidian vault 生成知识图谱
输出 graphify-out/graph.json,供 Obsidian Graph View 和 D3.js 使用
"""
import json
import re
from pathlib import Path
from datetime import datetime
WIKI_DIR = Path("./wiki")
OUTPUT_DIR = Path("./graphify-out")
def extract_links(content: str) -> list[str]:
"""提取 Obsidian [[双向链接]]"""
return re.findall(r'\[\[([^\]|]+)(?:\|[^\]]*)?\]\]', content)
def build_graph(wiki_dir: Path) -> dict:
nodes = []
edges = []
node_ids = {}
# 构建节点列表
for md_file in wiki_dir.rglob("*.md"):
rel_path = md_file.relative_to(wiki_dir)
node_id = str(rel_path.with_suffix(""))
node_ids[md_file.stem] = node_id
stat = md_file.stat()
nodes.append({
"id": node_id,
"name": md_file.stem,
"path": str(rel_path),
"category": str(rel_path.parent),
"modified": datetime.fromtimestamp(stat.st_mtime).isoformat(),
"size": stat.st_size,
})
# 构建边(链接关系)
for md_file in wiki_dir.rglob("*.md"):
source_id = str(md_file.relative_to(wiki_dir).with_suffix(""))
content = md_file.read_text(encoding="utf-8")
links = extract_links(content)
for link in links:
target_id = node_ids.get(link)
if target_id and target_id != source_id:
edges.append({
"source": source_id,
"target": target_id,
"weight": 1,
})
return {"nodes": nodes, "edges": edges}
def compute_stats(graph: dict) -> dict:
node_count = len(graph["nodes"])
edge_count = len(graph["edges"])
# 计算入度(反向链接数)
in_degree = {}
for edge in graph["edges"]:
in_degree[edge["target"]] = in_degree.get(edge["target"], 0) + 1
isolated = sum(1 for n in graph["nodes"] if n["id"] not in in_degree)
return {
"nodes": node_count,
"edges": edge_count,
"isolated_nodes": isolated,
"avg_connections": edge_count / node_count if node_count > 0 else 0,
"top_connected": sorted(in_degree.items(), key=lambda x: x[1], reverse=True)[:10],
}
if __name__ == "__main__":
OUTPUT_DIR.mkdir(exist_ok=True)
graph = build_graph(WIKI_DIR)
stats = compute_stats(graph)
(OUTPUT_DIR / "graph.json").write_text(json.dumps(graph, ensure_ascii=False, indent=2))
(OUTPUT_DIR / "stats.json").write_text(json.dumps(stats, ensure_ascii=False, indent=2))
print(f"图谱生成完成: {stats['nodes']} 节点, {stats['edges']} 边")
print(f"孤立节点: {stats['isolated_nodes']} ({stats['isolated_nodes']/stats['nodes']*100:.1f}%)")6.5 自动化流程全图
手机端 Obsidian Mobile
│ 新建笔记
▼
raw/inbox/idea.md ← 用户手动写入原始想法
│
│ inotify 监控 或 每日 4AM cron
▼
Hermes Agent(后台进程)
│
├── 读取 .hermes.md 上下文
├── 加载 MEMORY.md + USER.md
├── 激活 knowledge-digest Skill
│
▼
LLM 分析笔记内容
│
├── 提取实体:[[Hermes-Agent]], [[Obsidian]]
├── 识别类型:技术调研笔记
├── 关联已有条目:wiki/entities/Hermes-Agent.md
│
▼
更新 wiki/
├── wiki/entities/Hermes-Agent.md(追加新内容)
└── wiki/concepts/Closed-Learning-Loop.md(新建)
│
▼
生成 daily-summaries/2026-06-09-digest.md
│
▼
归档原文件 → raw/processed/2026-06/idea.md
│
▼
每周日 → wiki-graph.py → graphify-out/graph.json
│
▼
Obsidian Graph View 展示知识网络
7. 多 LLM 提供商支持
7.1 支持的提供商全列表
Hermes Agent 通过 OpenAI 兼容接口支持 300+ 模型:
| 提供商 | 特点 | 适合场景 |
|---|---|---|
| Nous Portal | Hermes 官方推荐,低延迟 | 技能生成、用户建模 |
| OpenRouter | 统一接口,模型最多 | 实验性任务、对比测试 |
| Anthropic | Claude 系列,推理强 | 复杂分析、代码生成 |
| OpenAI | GPT-4o,通用 | 通用知识问答 |
| Gemini 系列,上下文窗口大 | 长文档处理 | |
| Ollama | 完全本地,隐私优先 | 敏感数据处理 |
| 小米 MiMo | 针对 MIUI 优化 | 小米相关开发 |
| Kimi | 中文优化,长文本 | 中文知识管理 |
7.2 本地模型(Ollama)配置
对于隐私敏感的知识库内容,推荐使用 Ollama 本地模型:
# 安装 Ollama
curl -fsSL https://ollama.ai/install.sh | sh
# 拉取推荐模型(知识管理场景)
ollama pull qwen2.5:7b # 中文优秀,7B 可本地运行
ollama pull llama3.2:3b # 快速,适合摄取任务
ollama pull hermes3:8b # Nous Research 专门优化的 Agent 模型~/.hermes/config/providers.yaml:
providers:
default: ollama
ollama:
base_url: "http://localhost:11434/v1"
api_key: "ollama" # Ollama 不需要真实 key
default_model: hermes3:8b
anthropic:
api_key: "${ANTHROPIC_API_KEY}"
default_model: claude-sonnet-4-5
openrouter:
api_key: "${OPENROUTER_API_KEY}"
base_url: "https://openrouter.ai/api/v1"
default_model: "nous/hermes-3-llama-3.1-405b"
# 不同任务使用不同模型
task_routing:
ingest: ollama/qwen2.5:7b # 摄取:快速、本地
synthesis: anthropic/claude-sonnet-4-5 # 提炼:质量优先
qa: ollama/hermes3:8b # 问答:平衡
skill_generation: anthropic/claude-opus-4 # 生成 Skill:最高质量7.3 切换模型
# 查看当前配置
hermes model show
# 切换默认模型
hermes model set ollama/hermes3:8b
# 单次任务使用特定模型
hermes ask --model anthropic/claude-opus-4 "分析这份技术文档..."
# 为特定 Skill 指定模型
hermes skill run knowledge-digest --model ollama/qwen2.5:7b7.4 为知识库任务选择合适模型
根据任务类型做出合理选择:
知识摄取(Ingestion)
└── 要求:快速、低成本、中文理解
└── 推荐:Qwen2.5:7b (Ollama) 或 Kimi-moonshot-v1-8k
└── 不需要:超强推理能力
知识提炼(Synthesis)
└── 要求:连接散点、推断含义、结构化输出
└── 推荐:Claude Sonnet 或 GPT-4o
└── 关键能力:长上下文处理
问答检索(QA)
└── 要求:精确回忆、引用来源
└── 推荐:Hermes3:8b (Ollama) 或 Claude Haiku(成本控制)
└── 注意:RAG 质量比模型能力更重要
Skill 生成
└── 要求:生成高质量、可复用的指令文档
└── 推荐:Claude Opus 或 GPT-4o
└── 这是高价值操作,值得用好模型
8. 与 Claude Code 的协同使用
8.1 两者的本质定位差异
从工程师的角度看,Claude Code 和 Hermes Agent 是互补而非替代关系:
| 维度 | Claude Code | Hermes Agent |
|---|---|---|
| 核心场景 | 代码编写、重构、调试 | 知识积累、研究、笔记管理 |
| 状态管理 | 基于文件系统的持久状态 | 基于记忆文件的持久状态 |
| 自动化 | 依赖用户触发 | 内置 Cron,可无人值守运行 |
| 技能系统 | 手动维护 Skills | 自动生成并改进 Skills |
| 适合谁 | 开发阶段的编码工作 | 研究积累和知识管理 |
8.2 Skills 文件互相复用
这是最直接的协同方式。项目级 Skills 放在 .claude/skills/,用户级 Skills 放在 ~/.claude/skills/,两个目录对 Hermes 也完全有效:
# 目录结构(推荐)
~/.claude/skills/ ← 用户级 Skills(两者共享)
├── android-perfetto-capture/
├── adb-tools/
└── code-review/
/project/.claude/skills/ ← 项目级 Skills(两者共享)
├── build-apk/
└── run-tests/
# Hermes 配置(指向 Claude Code 的 Skills 目录)
# ~/.hermes/config/config.yaml
skills_paths:
- ~/.claude/skills/ # 用户级共享
- ~/.hermes/skills/ # Hermes 专属
- "./.claude/skills/" # 项目级共享(相对路径)8.3 推荐的工作流划分
开发工作流(Claude Code 主导)
├── 写代码:Claude Code + Bash 工具
├── 重构:Claude Code + git
├── 代码审查:/code-review skill
└── 调试:Claude Code + Perfetto skill
知识管理工作流(Hermes 主导)
├── 技术调研:Hermes(自动整理到 wiki/)
├── 会议记录:Obsidian → raw/inbox/ → Hermes 自动处理
├── 错误根因记录:Hermes 更新 MEMORY.md
└── 经验沉淀:Hermes 自动生成 Skill
协同场景
├── Claude Code 解决了一个复杂 bug
│ → 在 Claude Code 中 /save-context
│ → Hermes 定时任务摄取上下文
│ → 写入 wiki/how-tos/diagnose-X.md
│
└── Hermes 积累的知识图谱
→ 在 Claude Code 中通过 MEMORY.md 引用
→ Agent 在解决问题时自动参考历史结论
8.4 共享 MEMORY.md 的可行性
理论上 Claude Code 和 Hermes 可以共享同一个 MEMORY.md,但需要注意:
可行方案:
# Claude Code 的 MEMORY.md
~/.claude/projects/GeneralAndroid/memory/MEMORY.md
# Hermes 配置指向同一文件
# ~/.hermes/config/config.yaml
memory_path: ~/.claude/projects/GeneralAndroid/memory/MEMORY.md潜在冲突:如果两者同时运行并写入 MEMORY.md,可能产生竞态条件。建议通过文件锁或分节方式处理:
# MEMORY.md
## [Claude Code] 代码开发上下文
<!-- Claude Code 写入此节 -->
...
## [Hermes] 知识库管理上下文
<!-- Hermes 写入此节 -->
...
## [共享] 项目核心事实
<!-- 两者只读,手动维护 -->
...9. 安装与快速上手
9.1 完整安装步骤
Linux / macOS(推荐):
# 方法一:官方安装脚本
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
# 安装完成后配置
hermes setup安装脚本会自动完成:
- 下载对应平台的 Hermes 二进制文件
- 创建
~/.hermes/目录结构 - 安装预置 Skills
- 配置 Shell 集成(.bashrc / .zshrc)
Android Termux:
# 在 Termux 中安装
pkg update && pkg install -y curl wget
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
# Termux 特殊配置
# Termux 没有 inotify,使用轮询模式
# ~/.hermes/config/config.yaml
watch_mode: polling
watch_interval_seconds: 60
# 开机自启(Termux:Boot)
mkdir -p ~/.termux/boot/
cat > ~/.termux/boot/start-hermes.sh << 'EOF'
#!/data/data/com.termux/files/usr/bin/bash
hermes daemon start
EOF
chmod +x ~/.termux/boot/start-hermes.sh9.2 hermes setup 配置向导
首次运行 hermes setup 会进入交互式配置向导:
Hermes Agent Setup
==================
? 选择主要 LLM 提供商:
> Nous Portal(官方推荐)
Anthropic Claude
OpenAI
Ollama(本地)
自定义
? 输入 API Key: sk-xxx...
? 选择默认模型:
> hermes3-llama-3.1-405b
hermes3-llama-3.1-70b(平衡)
hermes3-llama-3.1-8b(快速/低成本)
? 知识库根目录: ~/obsidian
? 启用定时任务?
> 是(推荐)
否
? 选择启用的定时任务:
[x] 每日 4AM 知识摄取
[x] 每周日知识图谱更新
[ ] 每月质量审查(可后续启用)
Setup 完成!运行 'hermes daemon start' 启动后台服务
9.3 第一个知识管理任务演练
# 1. 启动后台守护进程
hermes daemon start
# 2. 检查状态
hermes status
# ✓ Daemon running (pid: 12345)
# ✓ LLM: Nous Portal / hermes3-405b
# ✓ Watch: ~/obsidian/raw/inbox/ (inotify)
# ✓ Cron: 3 tasks scheduled
# 3. 在 inbox 中放入一篇笔记
cat > ~/obsidian/raw/inbox/hermes-research.md << 'EOF'
# Hermes Agent 调研笔记
## 核心发现
- Hermes 有三层记忆系统:MEMORY / USER / SOUL
- Skills 格式与 Claude Code 兼容(agentskills.io 标准)
- 内置 Cron 调度器,可无人值守运行
- 通过 Honcho 实现用户建模
## 待深入研究
- FTS5 检索的具体实现
- 并行子 Agent 的调度机制
EOF
# 4. 手动触发处理(不等 cron)
hermes run knowledge-digest
# 5. 查看结果
ls ~/obsidian/wiki/entities/
# Hermes-Agent.md ← 自动创建
ls ~/obsidian/wiki/concepts/
# Closed-Learning-Loop.md ← 自动创建
# FTS5-Full-Text-Search.md ← 自动创建
# 6. 查看历史会话
hermes history search "Hermes 记忆系统"
# [2026-06-09 04:02] 处理 hermes-research.md
# 结论: 发现三层记忆系统架构,创建了 3 个 wiki 条目
# 7. 生成知识图谱
hermes run knowledge-graph
# graphify-out/graph.json 已更新
# 节点: 47, 边: 899.4 常用命令速查表
# === 基本操作 ===
hermes ask "你的问题" # 交互式问答(加载所有记忆上下文)
hermes daemon start/stop/status # 守护进程管理
hermes status # 查看系统状态
# === 记忆管理 ===
hermes memory show # 查看当前 MEMORY.md
hermes memory edit # 手动编辑 MEMORY.md
hermes user show # 查看用户画像 USER.md
hermes soul show # 查看 Agent 行为原则 SOUL.md
# === Skills 管理 ===
hermes skills list # 列出所有可用 Skills
hermes skills search "android" # 搜索 Skills
hermes skill run <skill-name> # 手动运行指定 Skill
hermes skills validate # 验证 Skill 格式
hermes skills import <dir> # 导入外部 Skills
# === 知识库操作 ===
hermes run knowledge-digest # 立即处理 inbox
hermes run knowledge-graph # 重建知识图谱
hermes history search "关键词" # FTS5 历史搜索
hermes history stats # 查看会话统计
# === 模型管理 ===
hermes model show # 显示当前模型配置
hermes model set <provider/model> # 切换模型
hermes model test # 测试模型连通性
# === Cron 任务 ===
hermes cron list # 列出所有定时任务
hermes cron enable/disable <name> # 启用/禁用任务
hermes cron run <name> # 立即执行定时任务
hermes cron logs <name> # 查看任务执行日志10. 评估与局限性
10.1 核心优势
真实的跨 Session 记忆:与 Claude Code 的 MEMORY.md 不同,Hermes 的记忆由 Agent 主动维护,不依赖用户手动记录。这是工程上最大的差异点:用户无需改变工作习惯,知识会自然积累。
技能自进化:Skills 不仅可以被创建,还可以被 Agent 在使用过程中逐步改进。一个记录了边界条件和常见错误的 Skill,比初始生成时更有价值。
与 Obsidian 的原生集成:不是把 Obsidian 当文件存储,而是理解 [[双向链接]]、Frontmatter、日期笔记等 Obsidian 特有概念。wiki-graph.py 生成的图谱可以直接在 Obsidian Graph View 中可视化。
agentskills.io 生态的杠杆:30+ Agent 产品共享同一 Skill 格式,意味着 Hermes 用户可以利用整个生态中其他用户创建的 Skills,也可以将自己的 Skills 贡献给社区。
多模型灵活路由:不同任务使用不同模型(快速摄取用小模型、高质量合成用大模型),在效果和成本之间做出最优权衡。
10.2 实际局限
需要自托管和一定学习曲线:Hermes 不是开箱即用的 SaaS 产品,需要配置 API Key、调整目录结构、理解三层记忆系统。对于希望”零配置使用”的用户,前期投入较高。
中文支持尚在完善中:Hermes 的默认模型是英文优化的 LLM,处理大量中文笔记时,建议配置 Kimi 或 Qwen 作为摄取模型。部分 Skill 内置指令是英文的,可能影响中文场景下的任务质量。
依赖 LLM 推理质量:记忆写入时机、Skill 生成决策、用户画像推断——这些都依赖 LLM 的判断。使用廉价小模型时,这些判断的质量会明显下降。使用 hermes3:8b Ollama 模型时,自动生成的 MEMORY.md 更新质量显著低于 Claude Sonnet。
并发安全尚需验证:当 Cron 任务和用户交互同时运行时,多个进程同时写 MEMORY.md 存在潜在的竞态条件。生产环境建议设置写锁或错开调度时间。
SOUL.md 的哲学争议:让 Agent 拥有”价值观文件”是创新也是风险。SOUL.md 写得不好可能导致 Agent 在某些场景下过于保守(拒绝正常操作)或过于激进(绕过确认步骤)。
10.3 适合谁使用
高度适合:
- 长期做技术调研、需要积累知识库的工程师
- Obsidian 重度用户,希望引入 AI 自动化整理
- 同时使用 Claude Code 且想要统一 Skills 生态的开发者
- 需要无人值守知识处理流水线的个人或小团队
一般适合:
- 以”完成单次任务”为主的用户(Hermes 的优势在长期积累,短期收益有限)
- 偏好 GUI 工具的用户(Hermes 是纯命令行工具)
不太适合:
- 对数据隐私要求极高且不能配置本地 Ollama 的场景
- 没有稳定互联网连接的环境(Ollama 本地模式除外)
- 期望”即插即用”不做任何配置的用户
附录:关键配置文件速查
~/.hermes/config/config.yaml 完整示例
# Hermes Agent 主配置文件
# LLM 提供商
llm:
default_provider: ollama
providers:
ollama:
base_url: "http://localhost:11434/v1"
api_key: "ollama"
default_model: "hermes3:8b"
anthropic:
api_key: "${ANTHROPIC_API_KEY}"
default_model: "claude-sonnet-4-5"
# 任务路由(不同任务用不同模型)
task_models:
ingest: "ollama/qwen2.5:7b"
synthesis: "anthropic/claude-sonnet-4-5"
qa: "ollama/hermes3:8b"
skill_generation: "anthropic/claude-sonnet-4-5"
# 知识库路径
knowledge_base:
root: "~/obsidian"
inbox: "raw/inbox"
wiki: "wiki"
processed: "raw/processed"
# Skills 搜索路径
skills_paths:
- "~/.claude/skills/" # 与 Claude Code 共享
- "~/.hermes/skills/" # Hermes 专属
- "./.claude/skills/" # 项目级
# 记忆文件路径
memory:
memory_file: "MEMORY.md"
user_file: "USER.md"
soul_file: "SOUL.md"
# 可选:与 Claude Code 共享 MEMORY.md
# memory_file: "~/.claude/projects/GeneralAndroid/memory/MEMORY.md"
# FTS5 索引
history:
db_path: "~/.hermes/history.db"
max_sessions: 10000
summary_model: "ollama/qwen2.5:7b"
# 监控模式
watch:
mode: inotify # inotify(Linux)/ fsevents(macOS)/ polling(Termux)
interval_seconds: 60 # polling 模式下的轮询间隔
# 日志
logging:
level: info
file: "~/.hermes/logs/hermes.log"
rotate_days: 30本文档版本:2026-06-09
涵盖范围:Hermes Agent 架构原理、三层记忆系统、Skills 生态、Obsidian 集成、多 LLM 配置、与 Claude Code 协同
相关文档:00-AI知识库系统总览 | 02-Obsidian作为AI知识库核心存储