在国产开源智能体赛道,持久记忆与技能自进化是区分「聊天机器人」与「数字员工」的关键分水岭。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 transcriptchat.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

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐