Memory-os 7 层记忆架构深度解析:让 Hermes Agent 真正“记住并使用”知识 1. 为什么 Hermes Agent 的记忆总是“存了不用”多轮对话里最让人抓狂的场景不是模型答不上来而是它明明“知道”却装作不知道。你上周跟它敲定用 pnpm 而不是 npm今天它又给你npm install你昨天在会话里定好的目录结构今天它重新发明一遍。问题不在模型能力而在记忆链路存进去的东西Agent 在推理那一刻根本没被喂到嘴边。Hermes Agent 原生有一套记忆系统Workspace 里的 MEMORY.md、USER.md 每轮注入Sessions 用 state.db 存会话加 session_search 工具Fabric 在会话结束时截取笔记。这套设计能跑但有几个结构性缺口MEMORY.md 同时被 memory 工具和 Icarus 插件写入双 Writer 冲突导致内容互相覆盖session_search 要靠模型自己决定调不调模型觉得不需要就永远不查Fabric 提取用text[:500]暴力截断长会话的关键结论直接丢掉结构化事实、向量检索、知识策展这些层压根没有。Memory-os 就是冲着这些缺口来的。它给 Hermes Agent 补了一套 7 层记忆架构核心目标一句话让 Agent 从“有记忆”变成“用记忆”。7 层按生命周期和访问模式切分Layer 1 到 Layer 4 管工作记忆Layer 5 和 Layer 6 组成一套自研 RAG 闭环Layer 7 是规则保障层强制模型采信注入内容。这套分层理念是框架无关的哪怕你不用 HermesLayer 7 的权威层级设计也值得抄。这篇会按“分层职责 → 可复制配置 → 写入/召回/更新三类验证 → 报错排查”的顺序走每一步都给能直接粘贴的片段。适合正在给 Agent 做长期记忆、被“教了又忘”折磨的开发者也适合想理解记忆分层设计思路的人。读完你应该能自己判断你的 Agent 到底是真的用上了记忆还是只是把记忆塞进了提示词。2. Memory-os 接入 Hermes Agent 的前置准备在动配置之前先把 Memory-os 和 Hermes Agent 的关系理清楚。Memory-os 是专门为 Hermes-Agent 做的记忆升级系统不是通用插件Claude Code、Clacky 这类框架不能开箱即用。它是在 Hermes 原生记忆基础上做升级和改造所以你得先有一个能跑的 Hermes Agent 环境再叠加 Memory-os 的层。前置清单大致是这几样。Hermes Agent 本体要能正常启动并完成一轮对话确认 Workspace 目录下已经生成 MEMORY.md 和 USER.md。Python 环境建议 3.10 以上因为 Icarus fork 和 Wiki Agent 用到较新的异步特性。Qdrant 需要一个可访问的实例本地 Docker 起一个就行Memory-os 的 Layer 5 依赖它做向量存储。Redis 用于 ARQ Worker 的向量化任务队列Layer 5 的定时嵌入靠它调度。嵌入模型这块Dense 向量走 Qwen3-Embedding-8B 生成 4096 维Sparse 向量走 FastEmbed 的 BM25这两个模型要提前拉好。模型接入部分如果你本地没有合适的推理端点可以用 TaoToken 统一接。它的 API 地址是https://taotoken.net/api兼容 OpenAI 风格的调用方式把 Base URL 指过去、填上 Key、选好 Model ID 就能用。Memory-os 里 Icarus 提取事实、Wiki Agent 策展、嵌入生成这些环节都要调模型统一走一个端点会省很多事。需要先拿 Key 的话去控制台的 API Keys 页面建一个接入细节看接入文档里面有各语言的示例。目录结构上Memory-os 会在 Hermes 的 Workspace 下新增几个文件CREATIVE.md 承接 Icarus 的创意状态fact_store 相关的 SQLite 库放结构化事实Fabric 条目以 Markdown YAML frontmatter 形式落盘wiki 目录分 raw/ 和策展后的页面。Qdrant 的 collection 名和 Redis 的队列名在配置里指定建议跟现有环境错开避免跟别的项目抢资源。有一点要提前说清楚Memory-os 的信任评分机制依赖模型主动调fact_feedback反馈。作者原话是检索到事实并在回复里引用后必须在同一轮调用 fact_feedback否则 trust_score 就是摆设事实质量会静默退化。这个反馈如果没自动化长期看 helpful/retrieved 会趋近 0评分机制就废了。所以接入时最好在系统提示里把这条约束写死后面 Layer 7 会讲怎么落。3. 7 层记忆架构的可复制配置这一节是全文最重的部分把 7 层拆开每层给职责说明和能直接用的配置片段。配置以 JSON 和 TOML 为主路径按 Hermes 默认目录写你按自己环境改。3.1 Layer 1 Workspace常驻记忆与双 Writer 冲突修复Layer 1 是全局常驻层每轮对话都注入系统提示Agent 不需要搜索就能看见。Hermes 原生有 MEMORY.md 和 USER.mdMemory-os 新增 CREATIVE.md。三个文件的分工是MEMORY.md 由 memory 工具用 § 分隔符追加条目存环境事实、工具特性、项目约定USER.md 用户手写存用户画像和偏好CREATIVE.md 由 Icarus 插件写存学习心得、开放问题、循环计数。CREATIVE.md 本质是个 bug fix。原生系统里 MEMORY.md 被 memory 工具和 Icarus 同时改容易覆盖。拆出来后 memory 工具只碰 MEMORY.mdIcarus 只碰 CREATIVE.md互不干扰。配置上要在 Hermes 的 workspace 配置里显式声明三个文件{ workspace: { memory_file: MEMORY.md, user_file: USER.md, creative_file: CREATIVE.md, inject_every_turn: true, separator: § } }inject_every_turn设为 true 保证每轮都注入separator指定追加分隔符。CREATIVE.md 的写入权限只给 Icarus别让 memory 工具碰它否则双 Writer 问题会换个文件重演。3.2 Layer 2 SessionsFTS5 全文索引与自动注入Layer 2 管原始对话的自动召回。Hermes 原生用 state.db 存会话加 session_search 工具但搜索靠模型自己决策模型不调工具记忆就不生效。Memory-os 加了 FTS5 全文索引并让 Icarus 在pre_llm_call阶段自动查相关历史注入系统提示。设计思想是不等 Agent 主动调工具在它思考之前就把信息喂过去。FTS5 是关键词搜索不是语义搜索英文措辞可能搜不到中文表达的同一个意思这个缺口由 Layer 5 的向量检索补。配置上要开 FTS5 索引并挂上预注入钩子[sessions] db_path state.db fts5_enabled true fts5_table session_fts auto_inject true inject_top_k 5 inject_hook pre_llm_callinject_top_k控制注入条数别设太大否则系统提示被历史对话淹没。inject_hook指定在 pre_llm_call 阶段触发这是 Memory-os 反复用的模式Layer 3、4、5 的注入都走同一个思路。3.3 Layer 3 Structured Facts结构化事实与信任评分Layer 3 是 Memory-os 全新构建的一层Hermes 原生没有结构化事实存储。Fact Store 存的不是原始文本而是结构化后的事实类别用户偏好/项目信息/工具/通用、实体标签、信任评分、被检索次数 retrieved、被标记有用次数 helpful。信任评分的公式是trust_score 0.5 helpful / retrieved。初始所有事实评分 0.5随着检索和反馈动态调整。这解决的是新旧事实矛盾问题以前让模型用 React后来改用 Vue两条同时被检索出来时评分高的胜出。但前提是模型每次引用事实后要调fact_feedback否则 helpful 不涨评分机制退化。配置片段{ fact_store: { db_path: memory_store.db, categories: [user_preference, project_info, tool, general], initial_trust: 0.5, feedback_required: true, contradiction_detection: true, decay_scan_interval_hours: 24 } }feedback_required设为 true 会在系统提示里强制模型反馈contradiction_detection开启矛盾检测decay_scan_interval_hours控制衰减扫描频率长期没被检索的事实会被降权。3.4 Layer 4 FabricLLM 提取替代暴力截断Layer 4 是跨会话经验卡片层。Hermes 原生在会话结束时用text[:500]截断存 Fabric 条目长会话的关键结论直接丢。Memory-os 改成用 LLM 从对话中提取结构化笔记存为 Markdown YAML frontmatter--- id: 29914be5 type: resolution summary: Fixed MEMORY.md corruption from dual-writer conflict training_value: high status: completed --- ## Context ... ## Action/Decision ... ## Outcome ...打个比方原生方式像今天上班只给你看昨天会议记录的前 500 字你知道大概发生了啥但不完整Memory-os 的方式像给你一份会议总结每个要点都在能较完整还原。配置上要指定提取用的模型和 frontmatter 字段[fabric] extract_model your-model-id extract_on_session_end true frontmatter_fields [id, type, summary, training_value, status] multi_source_inject [qdrant, sessions, facts] creative_isolation truemulti_source_inject让 Fabric 注入时并行拉多个源creative_isolation保证创意状态隔离在 CREATIVE.md不污染 Fabric。3.5 Layer 56Wiki 策展与向量检索闭环Layer 5 和 Layer 6 是全新两层互为上下游。Layer 6 是 wiki 生产层Layer 5 是 wiki 检索层。从数据流看 Layer 6 先于 Layer 5从 Agent 使用看 Layer 5 是实际检索层Layer 6 对 Agent 无感。Layer 6 由两条定时任务控制。Wiki Agent 每周两次调度周一/周四凌晨 3 点流程是读 SCHEMA.md index.md log.md 搞清全貌扫 raw/ 下未处理文档对每个文件判断值不值得建页、建 concept/entity/comparison 哪种生成 markdown 写入对应目录带 YAML frontmatter、wikilink、回链 source。Vault Curator 每周一次处理已有页面补全缺失 frontmatter、添加语义 wikilink、更新 index.md。Layer 5 每小时做一次向量化。每个内容调 Qwen3-Embedding-8B 生成 4096 维 Dense 向量同时调 FastEmbed BM25 生成稀疏向量。流程是扫描变更SHA-256 比对状态文件只处理新增/修改、入队 Redis、双向量嵌入、去重写入 Qdrantcosine ≥ 0.92 的近重复点合并 payload 0.92 直接 upsert。检索有 4 级降级Level 1 混合检索Dense BM25 → RRF 融合排序Level 2 仅 Dense 向量检索Level 3 词法搜索grep wiki 目录下 .mdLevel 4 SQLite 关键词搜索搜 lineage 表全挂则 fail-open 不注入Agent 照样干活。配置片段[wiki] raw_dir wiki/raw curated_dir wiki/pages schema_file wiki/SCHEMA.md index_file wiki/index.md log_file wiki/log.md wiki_agent_cron 0 3 * * 1,4 curator_cron 0 3 * * 6 [vector] qdrant_url http://localhost:6333 collection memory_os_wiki dense_model Qwen3-Embedding-8B dense_dim 4096 sparse_model fastembed-bm25 dedup_threshold 0.92 embed_interval_hours 1 redis_url redis://localhost:6379 queue_name memory_os_embedwiki_agent_cron和curator_cron用标准 cron 表达式dedup_threshold控制去重阈值embed_interval_hours是向量化周期。3.6 Layer 7 Ground Truth4 级权威层级Layer 7 不是物理存储层是概念层管 Agent 对注入内容的态度该不该信、该不该用。Hermes 原生有 3 级权威层级终端输出 官方文档 训练知识Memory-os 扩为 4 级把注入记忆插为第 2 级。核心是两段 prompt。第一段告诉 Agent注入的记忆是 documented knowledge 和 prior decisions 的 ground truth当注入记忆跟假设或训练知识冲突时注入记忆赢永远不要把已有答案的问题当新问题。第二段定义注入约定[fabric]、[qdrant]、[sessions]、[facts]四个来源标签注入记忆取 Ground Truth 第 2 级意味着你已知晓推理时直接用行动时用运行时证据验证。配置上把这两段写进 SOUL.md 和 rulebook.md[ground_truth] levels [terminal_output, injected_memory, official_docs, training_knowledge] soul_file SOUL.md rulebook_file rulebook.md inject_labels [fabric, qdrant, sessions, facts]levels数组顺序就是权威从高到低inject_labels定义注入来源标签跟 Layer 2 到 Layer 5 的注入源对应。4. 验证请求写入、召回、更新三类测试配置写完不代表记忆就生效了得用三类测试确认 Agent 真的用上记忆。下面每个测试都给操作步骤和预期结果。4.1 写入测试确认事实落盘先测写入。跟 Agent 说一句明确的事实比如“这个项目统一用 pnpm不要用 npm”。然后检查 fact_store 和 MEMORY.md。查 fact_storesqlite3 memory_store.db SELECT id, category, entity, trust_score, retrieved, helpful FROM facts ORDER BY rowid DESC LIMIT 5;预期能看到一条 category 为 user_preference 或 project_info 的记录trust_score 初始 0.5retrieved 和 helpful 都是 0。再查 MEMORY.mdtail -20 MEMORY.md应该能看到用 § 分隔的新条目。如果 fact_store 没记录说明 Icarus 的提取没触发检查extract_on_session_end是否为 true以及提取模型是否可达。4.2 召回测试确认自动注入召回测试要验证 pre_llm_call 钩子有没有把相关历史喂进去。新开一个会话问一个需要用到刚才事实的问题比如“装依赖用什么命令”。观察 Agent 回复如果它答 pnpm 而不是 npm说明召回生效。更严格的验证是看系统提示里有没有注入标签。在 Hermes 开 debug 日志搜[facts]或[sessions]grep -E \[(fabric|qdrant|sessions|facts)\] hermes_debug.log | tail -20预期能看到带来源标签的注入内容。如果日志里没有检查auto_inject和inject_hook配置以及 FTS5 索引是否建好sqlite3 state.db SELECT name FROM sqlite_master WHERE typetable AND name LIKE %fts%;4.3 更新测试确认信任评分与矛盾检测更新测试验证新旧事实冲突时评分机制是否工作。先让 Agent 记住“用 React”再改口说“改用 Vue 了”。然后问“前端框架用哪个”看它答 Vue 还是 React。查两条事实的评分sqlite3 memory_store.db SELECT entity, trust_score, retrieved, helpful FROM facts WHERE entity IN (React,Vue);如果矛盾检测生效Vue 这条的 trust_score 应该高于 React或者 React 被标记为过时。如果两条评分一样说明contradiction_detection没起作用或者模型没调fact_feedback。手动触发一次反馈测试# 在 Agent 对话里引用事实后检查 helpful 是否增长 sqlite3 memory_store.db SELECT entity, helpful FROM facts WHERE entityVue;helpful 不涨就是反馈链路断了回到 Layer 3 的feedback_required配置检查。5. 本篇常见报错排查接入过程里最容易撞的几个报错逐个拆。401 Unauthorized模型端点鉴权失败。检查 Base URL 是否指向https://taotoken.net/apiKey 是否有效Model ID 是否拼对。Memory-os 里 Icarus 提取、Wiki 策展、嵌入生成可能用不同模型逐个确认配置里的 model 字段。如果只有某个环节 401说明那个环节的 Key 没配。local proxy failed本地代理或网络层问题。检查 Qdrant 和 Redis 是否可达curl http://localhost:6333/collections和redis-cli ping各测一下。如果 Qdrant 挂了Layer 5 会降级到 Level 3 词法搜索不会直接报错但向量检索失效。Redis 挂了则向量化任务入不了队wiki 更新停滞。reading choices 相关报错通常是模型返回格式不符合预期Icarus 解析 LLM 输出时拿不到 choices 字段。检查提取模型是否返回标准 OpenAI 格式如果用了非标准端点可能要在配置里加响应适配。另外确认 prompt 里没有让模型输出非 JSON 内容Fabric 提取要求结构化输出。OAuth 相关报错如果模型端点用 OAuth 而非 API Key检查 token 是否过期。Memory-os 的定时任务Wiki Agent、Vault Curator、向量化跑在后台OAuth token 过期后这些任务会静默失败日志里才看得到。建议用长期有效的 API Key 而非 OAuth。FTS5 索引建不起来SQLite 编译时没开 FTS5。检查sqlite3 state.db PRAGMA compile_options;里有没有ENABLE_FTS5。没有的话换个带 FTS5 的 SQLite 版本或者用 Python 的 sqlite3 模块确认。Qdrant 去重阈值误伤dedup_threshold设太低比如 0.8会把不同内容当重复合并设太高比如 0.98则去重失效。0.92 是作者默认值实测下来这个值对技术文档比较合适。如果发现 wiki 页面丢失先查这个阈值。信任评分不涨回到 Layer 3确认feedback_required为 true且系统提示里明确要求模型引用事实后调fact_feedback。如果模型不遵守可以在 Layer 7 的 rulebook.md 里加一条硬约束。6. 把记忆链路跑通之后7 层跑通后你的 Hermes Agent 应该能做到用户偏好常驻可见历史对话自动召回结构化事实带评分跨会话经验卡片完整wiki 知识自动策展和向量检索注入内容被强制采信。这套链路的价值不在单层多强而在分层协作Layer 1 到 Layer 4 管工作记忆Layer 5 和 Layer 6 管长周期知识Layer 7 管规则保障。如果你想把这套记忆能力接到自己的模型端点上TaoToken 的 API 地址是https://taotoken.net/api兼容 OpenAI 风格Icarus 提取、Wiki 策展、嵌入生成都能走。需要 Key 去控制台的 API Keys 页面建接入示例看接入文档。长期跑编码和 Agent 任务的话Coding Plan 会更划算模型对话页面可以先试模型效果。最后留个实用技巧Memory-os 的信任评分机制依赖持续反馈如果发现评分长期不动别急着改公式先查fact_feedback的调用链路。任何需要持续反馈才能生效的机制反馈没自动化最终都会退化成摆设。这是我在接入时踩过的坑也是这套架构里最容易被忽略的一环。