Hermes 三层记忆系统中持久记忆——让 AI 跨会话记住你是谁上一篇讲了会话记忆——它只管当前这一轮对话。但你的名字、你的职业、你偏好 FastAPI 还是 Go、你要求所有数据库操作加 try/except、你纠正过 5 次 for 循环要改成 map……这些信息跨会话存在关机重启还在。这就是持久记忆。它是 Hermes 越用越懂你的关键。持久记忆 vs 会话记忆会话记忆Session Memory 生命周期一次对话 存储内容完整的消息流 检索方式顺序读取 消失时机会话结束 / /clear / 超过上下文窗口被裁剪 类比你和同事刚才半小时的对话 持久记忆Persistent Memory 生命周期永久直到你手动删除 存储内容提取后的结构化知识条目 检索方式关键词检索FTS5 语义检索向量相似度 消失时机手动删除 / 被 Hermes 自动标记为过时 类比你同事对你的长期了解——你的能力/风格/偏好/习惯持久记忆的五种类型Hermes 把持久记忆按类型分类存储不同类型的记忆有不同的提取策略和检索优先级类型 存储内容 提取触发 检索优先级 ────────────────────────────────────────────────────────────────────── user 你是谁名字/职业/技能/偏好 对话中自我介绍或暗示 ★★★★★ 最高 project 项目信息技术栈/架构/规则 任务中涉及项目时 ★★★★☆ feedback AI 被纠正的模式 连续 3 次同类纠正 ★★★★★ 最高 reference 外部资源文档/API/Jira 看板 你提到去看那个... ★★★☆☆ decision 决策记录为什么选这个方案 讨论架构/技术选型时 ★★★★☆一个月的持久记忆演变第一周 [user] name: Barry [user] role: 全栈工程师 [user] tech_stack: FastAPI, React, TypeScript [user] language: 中文代码标识符英文 [project] database: PostgreSQL [feedback] 所有数据库操作需要 try/except纠正 3 次后自动生成 第二周 [user] code_style: 函数式map/filter/reduce函数不超过 30 行 [project] api_format: { code, data, message } [feedback] 错误信息用中文纠正 4 次后自动生成 [decision] JWT access token 30min / refresh token 7d [reference] 项目 Jira 看板: jira.internal/project/API 第三周关联开始形成 [user] code_style: 函数式 ──影响──→ [feedback] for→map 规则 [project] PostgreSQL ──影响──→ [feedback] 所有查询加连接池超时 [user] Barry ──偏好──→ FastAPI ──风格──→ Pydantic v2 语法 [decision] bcrypt 选型 ──因为──→ [reference] 安全团队审计要求 第四周知识网络 [user] Barry 的完整画像 - 3 人团队的全栈负责人 - 技术栈FastAPI React TypeScript PostgreSQL - 代码风格函数式、30 行上限、Pydantic v2 - 沟通风格代码标识符英文其他中文 - 关键决策JWT bcrypt Alembic 迁移持久记忆的存储和检索存储不是记原文是提取后结构化Hermes 不会把你说过的每个字都存下来。它先提取再存储原始对话 我不太喜欢用 class 的方式用函数的方式写更清晰。 比如这个用户服务别用 UserService 类直接写函数就行。 create_user / get_user / update_user 各一个函数。 Hermes 的后台处理 步骤一判断类型这是关于代码风格的偏好 → type: user 步骤二提取事实用户偏好函数式而非面向对象 步骤三关联已有记忆 → 已存在 [user] code_style: 函数式map 偏好 → 这条新的强化了它 → 更新 confidence: 0.7 → 0.9 步骤四写入存储 → 更新 SQLite 中的 [user] code_style 条目 → 更新 MEMORY.md 文件检索FTS5 全文 向量语义的双路召回新会话开始或你提出新需求时Hermes 从持久记忆中检索相关信息你的新消息 帮我写一个用户积分查询接口 检索流程 ┌─────────────────────────────────────────┐ │ 第一路FTS5 关键词检索毫秒级 │ │ 搜索词用户 积分 查询 接口 │ │ → 匹配到 │ │ [project] api_format: {code,data,message} │ │ [project] database: PostgreSQL │ │ [feedback] DB 操作加 try/except │ │ [user] tech_stack: FastAPI │ └─────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────┐ │ 第二路向量语义检索百毫秒级 │ │ 语义相似度搜索 │ │ → 用户积分 语义接近 会员等级 │ │ → 找到两周前的记忆 │ │ [decision] 积分计算用 Decimal 而非 Float │ │ [reference] 积分规则文档: wiki/pts │ └─────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────┐ │ 合并 去重 排序 → 注入上下文 │ │ 取 Top 10 条最相关的记忆 │ │ 注入到当前对话的 System Prompt 中 │ └─────────────────────────────────────────┘检索结果的注入方式不是直接拼接在 System Prompt 后面而是结构化注入[Memory Context - 自动注入] 用户画像: - Barry, 全栈工程师, FastAPI React TypeScript - 偏好函数式风格函数不超过 30 行 项目信息: - API 返回格式: { code: 0, data: ..., message: } - 数据库: PostgreSQL, 所有 DB 操作必须 try/except 相关决策: - 积分金额用 Decimal 而非 Float精度要求 [Memory Context End]和 CLAUDE.md / 项目规则文件的关键区别很多人会问这和 Claude Code 的 CLAUDE.md 有什么不同我能把同样的内容写进 CLAUDE.md 吗CLAUDE.md Hermes 持久记忆 ───────────────────────────────────────────────────────────── 谁写的 你手动编写 Hermes 自动提取 你手动补充 内容性质 硬规则不要用 var 软模式用户似乎偏好... 更新方式 git commit 修改 后台持续自动更新 过时处理 靠人记得去改 自动检测并标记过时 关联能力 无独立文件 关联网络这条规则和那条偏好有关 覆盖范围 单个项目 跨项目你这个人不限于当前项目 确定性 高你明确写了 中AI 推断的可能不准确它们不是替代关系是互补关系# 用 CLAUDE.md 写硬规则你明确的、不变的# → 所有数据库操作必须用 async/await# → 项目部署在 AWS us-east-1# → Python 版本锁定在 3.12# 让 Hermes 学习软模式你的风格、习惯、偏好# → 你写 SQL 时喜欢把 JOIN 条件写在同一行# → 你常在下午 4 点左右提交代码# → 你更信任 Pydantic 的 validate_call 而非手动校验持久记忆的日常操作查看记忆# 查看所有持久记忆hermes memory list# 按类型查看hermes memory list--typeuser hermes memory list--typeproject hermes memory list--typefeedback hermes memory list--typedecision# 查看 Hermes 对你的完整理解人类可读hermes memory about-me# 输出示例# Hermes 对 Barry 的理解 ## 身份# Barry 是一个全栈工程师在一个 3 人团队中负责后端核心模块。# 主要使用 FastAPIPython ReactTypeScript PostgreSQL。## 代码风格# - 强偏好函数式编程用 map/filter/reduce 而非 for/while# - 函数控制在 30 行以内# - 用 Pydantic v2 做数据校验# - 所有数据库操作加 try/except## 交流偏好# - 中文交流但代码标识符用英文# - 错误信息用中文# - 偏好精简回复不需要展开推理过程## 最近项目# - my-api: FastAPI 后端服务PostgreSQL Redis# - 积分模块 优惠券模块正在开发中## 置信度评估# - code_style (0.95): 在 23 次对话中反复验证# - error_language (0.88): 在 9 次对话中验证# - api_format (0.75): 在 5 次对话中验证稳定但样本较少搜索记忆# FTS5 关键词搜索hermes memory search数据库连接池# 语义搜索需要 embeddings 配置hermes memory search高并发下的数据库连接管理--semantic# 搜索特定时间范围的记忆hermes memory search积分--from2026-05-01--to2026-06-01添加和编辑记忆# 手动添加一条记忆hermes memoryadd--typeproject\--content数据库连接池默认值从 5 改为 20\--tagsPostgreSQL,performance# 编辑一条记忆hermes memory edit mem_abc123\--content数据库连接池默认值从 5 改为 20已在生产环境验证# 在对话中自然添加最常用/rememberjwt 签名算法用 HS256 不是 RS256因为内部服务不需要非对称加密已记录。纠正和删除记忆# 当 Hermes 记错了 我不是在用 Go我是用 Python 已更新记忆 - 移除: [user] tech_stack: Go - 更新: [user] tech_stack: FastAPI (Python) 感谢纠正 # 当你的偏好变了 我们团队决定从 MySQL 迁移到 PostgreSQL 会主动问需要我更新所有和 MySQL 相关的记忆吗 - [project] database: MySQL → PostgreSQL - [feedback] MySQL 连接字符串格式 → 归档 - [decision] 分库分表策略 → 可能需要重新评估 # 完全删除 hermes memory forget mem_abc123 hermes memory forget --query MySQL # 批量删除含 MySQL 的记忆持久记忆的隐私和备份数据在哪所有持久记忆存储在两个地方 1. SQLite 数据库~/.hermes/data/memory.db → memories 表结构化的记忆条目 → memory_links 表条目之间的关联关系 → FTS5 虚拟表全文索引 2. Markdown 文件~/.hermes/data/MEMORY.md → 人类可读版本 → 可以手动编辑 → 可以纳入 git 管理如果你愿意MEMORY.md 的结构Hermes 自动维护的 MEMORY.md 长这样--- name: barry-profile description: Barry 的用户画像 metadata: type: user --- Barry 是一个全栈工程师3 人团队的技术负责人。 技术栈FastAPI React TypeScript PostgreSQL。 代码风格偏好函数式函数控制在 30 行以内。 --- name: project-my-api description: my-api 项目的技术信息 metadata: type: project --- my-api 是一个 FastAPI 后端服务。 API 返回格式统一为 { code, data, message }。 数据库PostgreSQL迁移工具Alembic。 --- name: feedback-db-try-except description: 数据库操作的错误处理规则 metadata: type: feedback --- 所有数据库操作必须包含 try/except。 错误信息用中文。 来源2026-05-20 至 2026-05-28 期间共 5 次纠正。备份和迁移# 导出所有持久记忆hermes memoryexport--outputmemories-backup-20260604.json# 导出特定类型hermes memoryexport--typeuser--outputuser-profile.json# 迁移到新机器# 旧机器hermes memoryexport--outputhermes-memories.jsonscphermes-memories.json new-machine:~/# 新机器hermes memoryimporthermes-memories.json# Hermes 会检查每条记忆是否已存在跳过重复的# 也可以直接复制整个 data 目录tarczf hermes-data-backup.tar.gz ~/.hermes/data/隐私控制# config.ymlmemory:persistent:# ...advanced:privacy:local_only:true# 记忆提取只在本地运行allowed_memory_types:# 只记录这些类型-user-project-feedback# 不包含 conversation 不记录具体对话内容sensitive_patterns:-\\b\\d{16,19}\\b# 信用卡号-password\\s*\\s*\\S# 密码赋值这篇文章的要点1. 持久记忆是五类结构化知识条目 user / project / feedback / decision / reference 每种有不同的提取触发和检索优先级 2. 存储是先提取再结构化的过程 不是记原文而是从对话中提取事实 → 关联已有记忆 → 更新知识网络 3. 检索是双路召回 FTS5 关键词毫秒级 向量语义百毫秒级→ 合并 Top 10 → 注入上下文 4. 持久记忆 ≠ CLAUDE.md CLAUDE.md 是你写的硬规则持久记忆是 AI 观察你后总结的软模式 两者互补不互相替代 5. 记忆可以导出、备份、迁移——完全可控延伸阅读Hermes Memory ArchitectureSQLite FTS5 使用指南