AI-Workshop 文献分享 2026-07-18 21:30

AI-Workshop 文献分享 #12 — Hermes Agent 记忆框架(续):会话历史、网关与外部记忆

qyr 继续拆解 Hermes Agent 记忆框架——session.db 并发控制与 JSONL 备份机制、会话搜索(FTS5 + lineage 剔除)、网关多渠道隔离、以及外部记忆 Provider 的调用 pipeline 与异步同步设计。

AI-Workshop 文献分享 Hermes Agent记忆 会话搜索 系统设计

AI-Workshop 文献分享 #12 -- Hermes Agent 记忆框架(续):会话历史、网关与外部记忆

分享人:qyr | 日期:2026-07-18

主题:Hermes Agent 完整会话历史、会话网关与外部记忆工具


一、完整会话历史

Hermes 使用 SQLite 数据库 session.db 持久化管理会话历史。

1.1 会话缓存

完整并不意味着无差别保存所有数据,而是尽量保留重建会话轨迹所需的关键内容: - 用户与助手的对话内容 - 工具调用 ID 与结果 - 推理过程及其他轨迹信息

1.2 并发控制

机制 作用
WAL(Write-Ahead Logging) 写入追加至 .wal 文件,支持单写多读
Jitter Retry 写入竞争时引入随机等待时间重试
BEGIN IMMEDIATE 提前获取写入保留锁,避免写饥饿

1.3 并行存储:JSONL 备份

存储 优势 主要用途
session.db FTS5 查询优化,检索高效 在线检索、跨会话回忆
JSONL 内容完整、格式直观 备份、审计、强化学习等离线场景

JSONL 定位为可靠补充存档,在数据库缺失或需离线处理时作为重要信息来源。


处理流程

  1. FTS5 检索:根据用户输入召回相关会话片段
  2. 会话归并:判断命中片段所属会话
  3. 读取上下文:读取命中位置附近完整轨迹
  4. 摘要生成:由辅助模型生成可注入当前上下文的摘要

关键细节

  • FTS5 检索:基于倒排索引,文本由 tokenizer 切分后建立词元到会话 ID 的映射
  • 空查询回退:FTS5 未命中时默认返回最近会话,不调用 LLM
  • 数量上限:单次最多 5 个会话摘要,防止上下文膨胀
  • Lineage 剔除:搜索时剔除当前会话所在谱系,避免将中间过程误作历史信息

三、Hermes 网关

网关是管理多渠道会话的统一入口,将 CLI、Web UI、飞书等不同渠道输入转换为标准格式。

会话隔离策略: - 按用户隔离,每位用户拥有独立会话历史 - 会话关系以链表形式组织 - /new 创建新链表节点开启新会话 - 确保用户只能使用自己的上下文


四、外部记忆工具

4.1 Provider 管理

外部记忆工具封装为与内部工具一致的调用形式,由 MemoryManager 统一管理。

接口统一,但写入边界严格区分:

类型 注入位置 持久化策略
内建记忆 系统级提示词,优先级高 长期保留
外部记忆 追加到提示词末尾 默认不持久化,仅特别重要的才写入

并发限制:每轮最多调用 1 个外部 Provider,可和内建 Provider 并行(单轮最多 2 个)。

4.2 调用 Pipeline

  1. 获取用户原始输入
  2. 传给记忆工具召回相关记忆
  3. 结果标记为外部工具临时结果,追加至提示词末尾

使用原始输入而非加工后的内容,保持查询简洁稳定。

4.3 召回结果隔离

外部记忆工具的 recall 结果不会写入 session.db,不会参与 Session Search。避免形成递归污染。

4.4 异步同步(Sync)

对话完成后,将信息异步同步给外部工具: - 使用异步队列,不阻塞当前对话 - 在整轮对话结束后同步,保证内容完整 - 降低频繁写入开销