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 定位为可靠补充存档,在数据库缺失或需离线处理时作为重要信息来源。
二、会话搜索(Session Search)
处理流程
- FTS5 检索:根据用户输入召回相关会话片段
- 会话归并:判断命中片段所属会话
- 读取上下文:读取命中位置附近完整轨迹
- 摘要生成:由辅助模型生成可注入当前上下文的摘要
关键细节
- FTS5 检索:基于倒排索引,文本由 tokenizer 切分后建立词元到会话 ID 的映射
- 空查询回退:FTS5 未命中时默认返回最近会话,不调用 LLM
- 数量上限:单次最多 5 个会话摘要,防止上下文膨胀
- Lineage 剔除:搜索时剔除当前会话所在谱系,避免将中间过程误作历史信息
三、Hermes 网关
网关是管理多渠道会话的统一入口,将 CLI、Web UI、飞书等不同渠道输入转换为标准格式。
会话隔离策略:
- 按用户隔离,每位用户拥有独立会话历史
- 会话关系以链表形式组织
- /new 创建新链表节点开启新会话
- 确保用户只能使用自己的上下文
四、外部记忆工具
4.1 Provider 管理
外部记忆工具封装为与内部工具一致的调用形式,由 MemoryManager 统一管理。
接口统一,但写入边界严格区分:
| 类型 | 注入位置 | 持久化策略 |
|---|---|---|
| 内建记忆 | 系统级提示词,优先级高 | 长期保留 |
| 外部记忆 | 追加到提示词末尾 | 默认不持久化,仅特别重要的才写入 |
并发限制:每轮最多调用 1 个外部 Provider,可和内建 Provider 并行(单轮最多 2 个)。
4.2 调用 Pipeline
- 获取用户原始输入
- 传给记忆工具召回相关记忆
- 结果标记为外部工具临时结果,追加至提示词末尾
使用原始输入而非加工后的内容,保持查询简洁稳定。
4.3 召回结果隔离
外部记忆工具的 recall 结果不会写入 session.db,不会参与 Session Search。避免形成递归污染。
4.4 异步同步(Sync)
对话完成后,将信息异步同步给外部工具: - 使用异步队列,不阻塞当前对话 - 在整轮对话结束后同步,保证内容完整 - 降低频繁写入开销