Hermes Agent 持久记忆与技能自进化:Learning Loop 实战
在国产开源智能体赛道,持久记忆与技能自进化是区分「聊天机器人」与「数字员工」的关键分水岭。Hermes Agent 以 Learning Loop 机制在这一维度建立了先发优势;OpenClaw 则通过 ClawHub 技能市场与 workspace 会话文件提供另一条扩展路径;OpenOcta 以 JSONL 转录 + Bleve Vault 的 Go 原生方案,将记忆能力内嵌于个人桌面级运行时。本文先深度拆解 Hermes 的 FTS5 记忆与 Skill 自进化机制,再对照 OpenOcta 在 localhost:18900 实测 UI 中的 Knowledge Vault 与技能库实现。
Hermes Agent自进化 AI Agent持久记忆Skills开源 AI Agent
一、Hermes Agent 记忆系统架构
Hermes 的记忆系统基于 SQLite FTS5 全文搜索扩展。每次对话中的关键信息(用户偏好、项目上下文、决策理由)被结构化存储并建立全文索引。当用户提问时,Agent Core 自动触发 FTS5 搜索,检索与当前问题相关的历史记忆,作为 LLM 推理的上下文。
1.1 记忆存储格式
{
"id": "mem_abc123",
"content": "用户偏好使用 Python 编写数据处理脚本",
"session_id": "session_456",
"created_at": "2026-07-08T10:30:00Z",
"importance": 0.85,
"tags": ["python", "data-processing", "user-preference"]
}
这种设计使得 Hermes 在长时间跨会话交互中保持连贯性——即使时隔数周,Agent 仍记得用户的偏好与上下文。
1.2 Honcho 用户建模
Honcho 是 Hermes 的用户建模子模块,在每次交互后更新用户画像,包括技术栈偏好、沟通风格、领域知识、兴趣变化等维度。Honcho 将用户画像存储为结构化 JSON,并在后续对话中作为隐式上下文注入,使 Hermes 的回复风格与专业深度逐步贴合用户习惯——这是 Learning Loop 在「用户理解」维度的延伸,与 Skill 自进化形成互补。
1.3 记忆检索触发机制
当用户提出新问题时,Hermes Agent Core 会并行执行两项操作:一是调用 LLM 进行即时推理,二是触发 FTS5 全文检索,从 ~/.hermes/memory.db 中拉取与当前 query 语义相关的历史记忆片段。检索结果按 importance 字段与 BM25 相关性综合排序,取 Top-K 条注入 Prompt 的 system 上下文。这种「检索增强生成(RAG)+ 持久记忆」的组合,使 Hermes 在跨会话任务中保持连贯性,例如连续三天的代码审查任务中,Agent 能记住前日已指出的问题模式,避免重复建议。
二、Learning Loop:自进化 Skill
Learning Loop 是 Hermes 最可作为备选方案了解的核心特性。它让 Agent 具备从经验中学习的能力:
用户对话FTS5 记忆检索LLM 推理Skill 自创建Honcho 画像更新
Hermes Agent Learning Loop 与 FTS5 记忆(概念流程图)
2.1 Skill 自动创建
当用户在对话中描述一个重复性任务时,Hermes 会自动检测模式并提议创建 Skill:
用户: "我每天都要拉取 GitHub 仓库的 issue 列表,汇总到表格里"
Hermes: "我注意到这是一个重复性任务。是否要创建一个 Skill 来自动化它?
Skill: fetch_issues_to_notion
步骤:
1. 调用 GitHub Issues API 获取今日 issue
2. 格式化数据
3. 通过 API 写入数据库表"
2.2 Skills 格式与目录
Hermes Skills 遵循 agentskills.io 标准格式,位于 ~/.hermes/skills/ 目录下:
~/.hermes/skills/
├── fetch_issues_to_notion/
│ ├── skill.yaml # 元描述:名称、输入参数、触发词
│ ├── steps.yaml # 执行步骤
│ └── requirements.txt # 依赖包
└── code_review/
├── skill.yaml
├── steps.yaml
└── requirements.txt
2.3 使用中自改进
Skill 不是静态的。Hermes 会在每次 Skill 执行后记录效果反馈:成功率、用户修正、执行时间。当某个 Skill 连续失败或收到用户修正时,Hermes 会自动调整其步骤或向用户建议重建。这种反馈闭环是 Hermes 区别于传统「固定 Prompt 模板」方案的核心——Agent 不仅执行任务,还持续优化任务本身。
2.4 Skill 触发与调度
已创建的 Skill 通过 trigger 规则(关键词、正则、语义匹配)与入站消息关联。Hermes 在 Gateway 层完成初步路由后,Agent Core 根据 Skill 元数据决定是否调用对应 steps.yaml 中定义的执行链。每个 Skill 可独立配置超时、重试次数与失败回退策略,适合将重复性运维、数据处理、报告生成等场景固化为可复用能力。
三、MCP 集成与工具生态
Hermes 支持 MCP(Model Context Protocol)集成,通过 MCP 可以接入外部工具链:
# MCP 工具配置(~/.hermes/mcp.yaml)
mcp:
servers:
filesystem:
command: npx
args: ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/dir"]
github:
command: npx
args: ["-y", "@modelcontextprotocol/server-github"]
Hermes 内置 40+ 工具,包括文件操作、代码执行、API 调用、网页抓取、数据库查询等。结合自创建 Skill 与 MCP 扩展,Hermes 的工具生态可以覆盖绝大多数开发者场景。MCP 服务器以 stdio 或 HTTP 方式接入,Hermes 在运行时动态加载工具列表,Agent 可在推理过程中按需调用——这与 OpenOcta 通过 Control UI 管理 MCP 服务、OpenClaw 通过 npm 插件扩展工具的路线形成对照,三者均遵循 MCP 开放标准,但集成深度与部署形态各异。
四、OpenOcta 持久记忆与知识系统深度解析
对照 Hermes 的 FTS5 记忆方案,OpenOcta 在 Go 生态下构建了一套完整的会话持久化与知识管理方案。以下基于 OpenOcta 真实 UI(localhost:18900)的截图与源码分析。
4.1 会话持久化:JSONL 转录文件
OpenOcta 将会话存储为 ~/.openocta/agents/main/sessions/ 目录下的结构化文件。每个 agent 有一个 sessions.json 索引文件,每个会话对应一个 .jsonl 转录文件:
~/.openocta/agents/main/sessions/
├── sessions.json # 会话索引(SessionEntry 列表)
├── session_abc123.jsonl # 每会话一个转录文件
└── session_def456.jsonl
转录文件是 JSONL 格式。首行为 TranscriptHeader,后续每行是一条 TranscriptMessage,包含角色、内容块、Token 用量、Provider/Model 信息、各阶段耗时:
// 首行——TranscriptHeader
{"type":"session","version":2,"id":"session_abc123","timestamp":"2026-07-08T10:00:00Z"}
// 用户消息
{"role":"user","content":[{"type":"text","text":"帮我分析这段代码的性能瓶颈"}],"timestamp":1788739200000}
// Assistant 回复(含 usage 和耗时)
{"role":"assistant","content":[{"type":"text","text":"根据分析,主要瓶颈在……"}],
"usage":{"input":1250,"output":380,"totalTokens":1630},
"provider":"anthropic","model":"claude-sonnet-4-20250514",
"durationMs":8432,"firstTokenMs":1200}
从 OpenOcta 的运行日志中可以看到如下运行时信息:runtime-pool created for agent "main"、chat.send: hydrated model input from transcript、chat.send timeout config: 120s。这些日志直接印证了 OpenOcta 的运行时行为:runtime-pool 启动时创建 Agent 运行时池;chat.send 从 transcript 中读取历史消息组装模型输入;超时配置为 120 秒。
4.2 知识库(Vault):Obsidian 兼容 + Bleve 全文搜索
OpenOcta 的可选知识库基于 Bleve(github.com/blevesearch/bleve/v2)——Go 生态最成熟的全文搜索引擎。知识库目录与 Obsidian 兼容,可在 ~/.openocta/vault/ 中用 Markdown 写笔记:
~/.openocta/vault/
├── README.md # 首次自动生成
├── architecture/
│ └── data-pipeline.md # 被索引为 document chunk
├── runbooks/
│ └── deploy-check.md
└── .obsidian/ # 被忽略

OpenOcta Knowledge Vault 知识库界面 — 实测截图
Bleve 索引的每个 Document chunk 包含 ID、Kind("document")、Title、Text(分块最多 2400 字符,2 行重叠)。Agent 通过 memory_search 工具执行搜索,支持混合 BM25 + 向量排序。
4.3 Skills 管理:766+ 技能库
OpenOcta 的 UI 中展示了一个完整的技能管理系统。Skills 面板以列表形式呈现,每个技能包含名称、描述、启用开关等元信息,支持一键启用/禁用。平台状态概览同时显示 Skills 数量、MCP Services 数量与 init scenarios 初始化场景,意味着 OpenOcta 内置了可直接使用的技能集,覆盖了常见 AI Agent 交互场景——与 Hermes 强调「从对话中自创建 Skill」的路径形成互补:前者开箱即用,后者强调 Learning Loop 进化。

OpenOcta 技能库界面 — 实测截图
4.4 记忆引擎对比
| 维度 | Hermes (FTS5) | OpenOcta (Bleve) |
|---|---|---|
| 搜索引擎 | SQLite FTS5 | Bleve (Go 原生) |
| 生态语言 | C (SQLite 扩展) | 纯 Go |
| 会话存储 | SQLite 行记录 | JSONL 文件(每会话一文件) |
| 知识库 | —(依赖 FTS5 通用搜索) | Obsidian 兼容 Vault + Bleve + 向量排序 |
| Skills 管理 | agentskills.io 标准格式 | UI 集中管理,766+ 内置技能 |
| Token 追踪 | 消息内 usage | 独立 token_usage 回调行 |
| 中断恢复 | — | Turn Loop Checkpoint 持久化 |
| 部署形态 | Python venv + SQLite | 单一 Go 二进制 + 文件系统 |
4.5 Turn Loop:预抢占与 Checkpoint 持久化
OpenOcta 基于 Eino 框架实现 Turn Loop,处理多轮对话中的并发控制与中断恢复。预抢占(Preempt)让新消息可中断正在进行的生成;断点持久化(Checkpoint)通过 FileCheckPointStore 将每轮状态写入 ~/.openocta/checkpoints/,支持进程重启后恢复。
type TurnSession struct {
sessionID string
checkpointID string
loop *adk.TurnLoop[TurnItem, *schema.Message]
}
func (s *FileCheckPointStore) Set(ctx, id string, checkpoint []byte) error {
path := filepath.Join(stateDir, "checkpoints", id+".cp")
return os.WriteFile(path, checkpoint, 0644)
}
五、Hermes 与 OpenClaw 记忆方案横向对比
在国产开源智能体赛道,记忆系统的选型往往决定了 Agent 能否成为「长期数字员工」而非「一次性聊天工具」。Hermes 的 FTS5 + Learning Loop 适合 Python 开发者追求自进化 Skill;OpenClaw 则将会话状态与 Gateway 深度绑定,记忆更多依赖 workspace 文件与上游插件;OpenOcta 选择 JSONL 转录 + Bleve Vault 的 Go 原生路径,兼顾本地优先与 Obsidian 生态复用。
| 项目 | 记忆引擎 | 技能进化 | 部署依赖 |
|---|---|---|---|
| Hermes Agent | SQLite FTS5 + Honcho | Learning Loop 自创建 Skill | Python venv |
| OpenClaw | Workspace + 会话插件 | ClawHub 技能市场 | Node.js 22+ |
| OpenOcta | JSONL + Bleve Vault | 766+ 内置 Skills + L4 进化 | Go 单二进制 |
六、实践建议
- Python vs Go:Hermes 适合 Python 技术栈团队,LLM 集成丰富;OpenOcta 的 Go 单一二进制部署更简洁,无运行时依赖
- 知识库形态:如果已有 Obsidian 笔记习惯,OpenOcta 的 Vault 方案可直接复用
- Skills 生态:Hermes 强调自创建 Skill 的 Learning Loop;OpenOcta 提供即开即用的 766+ 内置技能
- 部署运维:OpenOcta 单一二进制 + 文件系统存储,运维开销更低
▎正文回顾:以上为 Hermes Agent 持久记忆系统与 Learning Loop 自进化 Skills 机制的深度解析,覆盖了 FTS5 记忆搜索、Honcho 用户建模、Skill 自动创建与改进、MCP 集成等核心技术。
▎延伸阅读:Go 生态记忆系统的代码实现
从代码层面看,OpenOcta 的记忆系统完全是 Go 原生的。会话转录使用 encoding/json + os.File 的 O_APPEND 追加写入,无需数据库驱动。Bleve 全文索引是 Go 编译的静态库,无 CGO 依赖。
查看到的源码文件:
• pkg/session/transcript.go — 转录格式定义(TranscriptHeader / TranscriptMessage / Usage)
• pkg/session/store.go — 会话索引(sessions.json)
• pkg/agent/knowledge/engine.go — Bleve 索引创建与混合检索
• pkg/agent/knowledge/vault_sync.go — Obsidian Vault 文件扫描与分块
• pkg/agent/eino/session_turn_loop.go — Turn Loop 预抢占与 Checkpoint
对应 Hermes 的记忆系统(Python + SQLite FTS5),OpenOcta 的 Go 实现带来了单一二进制部署、无运行时依赖、以及通过 Bleve 向量排序扩展 RAG 能力的优势。如果你正评估 AI Agent 的持久存储方案,值得深入阅读上述源码。
OpenOcta — 开源仓库:github.com/openocta/openocta · 文档: openocta.com
参考链接
OpenOcta 开源仓库:github.com/openocta/openocta
文档与发布页:eopenocta.com
更多推荐



所有评论(0)