--- title: "Atlas Agent 记忆系统架构(2026)" created: 2026-06-24 updated: 2026-06-24 type: article tags: ["agent-memory", "elasticsearch", "hybrid-retrieval", "consolidation"] sources: - "https://mp.weixin.qq.com/s/fypjVWJBQg_MZV9OMfPpIA" --- # Atlas Agent 记忆系统架构 > 基于 noamschwartz/atlas-memory-demo 的深度工程实践解析。核心主张:Agent 记忆不是 KV 存储问题,是多索引信息检索问题。 ## 问题 `chat_history.append()` 把三种不同生命周期的信息塞进同一个数组——稳定事实、操作流程、时序事件——这是 Agent 永远在"忘记"的根因。真正的挑战是在查询瞬间穿过噪音找到对的那几条。 ## 核心架构:[[atlas-memory-system|三索引 + 公共]] [[agent-memory-taxonomy|四种记忆类型]],各自独立的索引、字段和衰减策略: | 索引 | 存储内容 | 衰减源 | 写入频率 | 更新策略 | |------|---------|--------|---------|---------| | episodic | 原始消息+时间戳 | timestamp | 每回合 | 只写不改 | | semantic | 提炼后稳定事实 | last_used_at | consolidation | supersession 链 | | procedural | 多步操作流程 | 豁免 (1.0) | consolidation | 计数器更新 | | catalog | 公共共享知识 | timestamp | 手动 | 脚本覆盖 | ## 检索管线:[[hybrid-recall-pipeline|混合召回]] ``` 用户消息 → Verbatim Pre-Recall(不经 LLM 改写) → BM25 词法 + Dense 语义 双通路并行 → RRF 融合 (rank_constant=30) → Cross-encoder 重排序 (top-80 → top-K) → 返回(reranker 失败时降级 RRF 顺序) ``` ### 关键参数 - **RECALL_OVER_FETCH_K=80** — consolidation 产生近重复 doc,候选池不足会挤掉 gold doc - **rank_constant=30** — 比默认 60 小,排名靠前的结果保持更强信号权重 - **DECAY_SCALE=1825d** — 演示默认,客服应收紧至 60-180d ### Ablation 数据 (168 QA, 3 persona, ~250 docs/user) | 配置 | R@10 | |------|------| | Full | **0.89** | | Dense-only | 0.845 | | BM25-only | 0.708 | | No-Reranker | -0.238 | dense 是主力,但 BM25 单腿 0.708 说明词法腿不可省略。reranker 最大单点贡献,但只在候选池足够宽时有用。 ## [[verbatim-pre-recall|Verbatim Pre-Recall]] 在 `messages.append(user_msg)` 和 LLM 调用之间,用用户原话(不经改写)跑一次 recall。LLM 会把 "postgres v15.3 + pgvector 0.5.1" 泛化成 "PostgreSQL 数据库"——精确 token 丢失,BM25 词法匹配报废。Verbatim 绕过改写层,把最原始的 token 直接给 BM25。 Ablation 证实:额外 query expansion(LLM paraphrase)反而降低性能——BM25 已捕获精确 token,dense 已捕获语义改写。 ## [[memory-consolidation|Consolidation(写后提炼)]] 每回合结束后从最近 30 条 episodic 事件中提取稳定事实和操作流程。一次 LLM 调用同时输出三类结果:new_facts、new_procedures、procedural_updates。Production 建议改为后台日批模式——积累一天后在夜间统一跑,成本减半。 ## [[soft-supersession|Soft-Supersession]] 非破坏性矛盾处理:用户说"搬家了"→ 创建新 doc + 标记旧 doc (superseded_by) + 召回时过滤旧版。链式追溯支持任意长度,旧记录永不删除(审计需要)。 ## [[gbrain-memory|与 GBrain 的对比]] | 维度 | Atlas (ES) | GBrain (Markdown+Git) | |------|-----------|----------------------| | 存储 | ES 搜索引擎 | Markdown 文件 + Git | | 多租户 | ES DLS(集群层) | 应用层 auth | | 矛盾处理 | Soft-Supersession 链 | Git 版本历史 | | 衰减 | [[per-index-time-decay|Per-index gauss]] | 无显式衰减 | | 透明度 | 仅 API | 直接打开文件 | 个人助理 → GBrain(人可读信任优先);多租户产品 → Atlas(ES 原生隔离)。 ## 三个通用设计原则 1. **衰减曲线是领域性决策** — 先定义信息有效周期,再定衰减参数 2. **BM25 + vector 互补,不可二选一** — BM25 抓精确术语,dense 抓语义意图 3. **记忆需要后台提炼 + 矛盾处理** — 瓶颈从来不在数据库引擎,在分型逻辑和召回架构 ## 来源 [原始存档](raw/articles/atlas-agent-memory-architecture-2026.md)