乐于分享
好东西不私藏

打造Agent的“永久记忆”!OpenClaw Session + LCM + Memory三层记忆架构与调优实战

打造Agent的“永久记忆”!OpenClaw Session + LCM + Memory三层记忆架构与调优实战

想让你的 OpenClaw Agent 在生产环境稳定运行?记忆系统是绕不开的第一关。

这篇万字长文结合原理剖析与真实生产案例,为你彻底讲透 Session + LCM + Memory 黄金三角 如何构建一套真正稳定、高效、可维护的生产级记忆体系。同时,针对六大典型使用场景,直接给出可复制、可落地的“开箱即用”最优配置组合。


一、为什么需要三层记忆架构?

AI Agent 的记忆问题,远比“记住事情”要复杂。它至少包含三个层次的需求:
  • 当前对话的连贯性:Agent 必须清晰地记得你刚才说了什么,才能进行多轮推理和协作。
  • 跨会话的知识沉淀:你昨天告诉它的偏好、上周讨论过的项目决策,不能因为一次会话结束就消失。
  • 历史对话的完整回溯:当需要追溯“上个月那个 Bug 是怎么修的”时,Agent 能精准找到当时的那段完整对话,而不是一个干瘪的摘要。
OpenClaw 内置的滑动窗口策略只能勉强解决第一点,且代价高昂;传统的 MEMORY.md文件或简单的记忆插件能部分解决第二点,但检索精度和自动化程度有限。正是为了系统性解决这三个问题,我们构建了Session + LCM + Memory 三层协同架构

二、三层架构详解:各司其职的“记忆议会”

你可以把整个记忆系统想象成一个高效运转的议会,由三位议员各司其职,共同决策。
三者通过明确的接口和时序协同工作,形成一条完整的“信息→知识→决策”流水线。
更通俗类比:三种“记忆”就像餐厅点餐与老顾客服务
  • Session(短期会话) = 服务员今天的点单便签
记录了这顿饭你点了什么、忌口、几分熟。你结账离开,便签就被扔掉,换新的一张给下一桌客人。它保证了当次服务的精确流畅,但不会记得你三周前点了什么。
  • Memory(长期记忆) = 餐厅的客户关系管理系统 (CRM)
永久记录“王先生是VIP,对花生过敏,喜欢坐靠窗位,钟爱波尔多红酒”。每次你走进餐厅,经理都能直接说:“王先生,老位置给您留着,今天的菜单已经把花生去除了。”
  • 长时间保留 Session(或 LCM 提供的无损对话归档) = 连续三天的商务宴请包间记录
你告诉经理:“这三天菜不用天天点,按我们昨天讨论的临时菜单上,明天主菜换成牛排。” 经理必须保留这三天的完整点单记录,而不能只靠CRM里“爱吃牛排”一条记忆,因为你需要的是这个特定项目的连贯性

OpenClaw 的 Session + LCM + Memory 组合,正是要把这三种记忆能力都赋予你的 AI 助手。 Session 负责“当前这口气”顺不顺,LCM 负责“这件事做得全不全”,Memory 负责“你这个人认得准不准”。


三、生产级组合架构设计:数据流与协作原理

一次典型的对话回合中,三层架构的协作流程如下:
关键设计原则
  • Session 是入口:所有对话必须绑定到会话,其重置策略直接决定了 LCM 和 Memory 的数据生命周期。
  • LCM 是上下文组装者:它接管了原本由 Session 粗暴管理的上下文窗口,用智能压缩替代简单的截断。配置 sessionMemory: false 可避免 Memory 插件与 LCM 在短期上下文上产生功能重叠。
  • Memory 是知识提取者:它不存储原始对话,只提炼“记忆点”,这保证了即使 Session 重置、LCM 摘要老化,关键知识依然可以被精准召回。
这套机制的关键,在于OpenClaw框架通过不同的“插槽”进行分工,并由各组件的自动化规则进行协同,核心的自动化由两个机制驱动:lossless-claw 的 contextThreshold(上下文阈值)和 memory-lancedb-pro 的 autoCapture/autoRecall。

四、生产运转机制解析:存储与检索

4.1 自动存储:上下文引擎归LCM,长期知识归Memory

当一个新消息产生,该存哪、什么时候存,取决于其身份是“上下文引擎”还是“记忆插件”:
  • 增量备份与智能压缩:lossless-claw 插件作为上下文引擎,在每一轮对话后,都会把所有新消息自动、无损地存入本地的 SQLite 数据库。当对话总长度达到设定的 contextThreshold(默认75%)时,它会自动触发压缩流程,用一个独立的、更便宜的模型(summaryModel)将旧消息生成为结构化的分层摘要,以释放模型窗口。
  • 知识提炼与自动归档:memory-lancedb-pro 插件作为记忆插件,会在对话中持续观察。默认情况下,每2轮新对话(extractMinMessages)就会触发一次autoCapture功能,它使用大模型对最近的对话进行智能分析,提炼出偏好、决策等结构化的“记忆点”,存入LanceDB向量数据库。同时,memory-lancedb-pro 也内置了噪音过滤和生命周期管理机制(如 Weibull 衰减算法),确保记忆库不会无限膨胀。
  • 补充的“记忆冲刷”机制:OpenClaw 还有一个“记忆冲刷 (memory flush)”机制。当对话上下文快满、将要触发 lossless-claw 的压缩前,系统会先静默地让 LLM 把当前对话中的关键信息写入当日的 memory/YYYY-MM-DD.md 文件中,然后再执行压缩。这就好像在清理桌面(压缩上下文)前,先把重要文件归档,确保关键信息不被遗漏。

4.2 自动检索:混合策略确保信息不遗漏

当你聊到一个问题时,AI的检索行为是自动的,也是混合的:
  • 会话上下文检索:对于你当前正在进行的对话,lossless-claw 在每轮回复前,都会自动将最近的原始消息(受freshTailCount保护)历史对话的高层级摘要节点(来自DAG)组合成最终的“短期记忆”传给模型。这个检索过程是透明的,Agent 会在需要时自动调用内置的 lcm_grep 或 lcm_expand 工具在海量历史中搜索和回溯。
  • 长期知识库检索:memory-lancedb-pro 的 autoRecall 功能启用了混合检索:每当新会话开始时,它会分析你的首条消息,并通过向量语义搜索和BM25关键词匹配并行在记忆库中查找。找到的相关记忆,会以“记忆上下文”的形式,在每轮对话组装模型上下文时被动态注入。通过这种“线程级”的注入方式,AI在回复时就能同时“看到”当前对话和历史知识。在一次查询中,OpenClaw的检索管道会并行执行两个检索路径,然后将结果合并,既保证了语义理解的广度(向量搜索),又不遗漏精确的文本匹配(关键词搜索)。

4.3 关键配置速查表


六、全局基础配置:三层架构的通用基线

在针对不同场景调优之前,我们需要一套经过验证的通用基线配置。这套配置适用于大多数中等规模、日活跃度一般的场景,具备良好的稳定性和可维护性。
// ~/.openclaw/openclaw.json (通用基线){  "session": {    "dmScope""per-account-channel-peer",  // 最高级别的私聊隔离    "reset": {      "mode""daily",                     // 每日重置      "atHour"4                          // 凌晨 4 点,业务低峰    },    "maintenance": {      "mode""enforce",                   // 强制清理      "pruneAfter""14d",                 // 保留 14 天      "maxEntries"500,                   // 索引条目上限      "rotateBytes""5mb"                 // 索引文件轮转阈值    }  },  "plugins": {    "slots": {      "contextEngine""lossless-claw",      "memory""memory-lancedb-pro"    },    "entries": {      "lossless-claw": {        "enabled"true,        "config": {          "summaryModel""claude-3-5-haiku"// 独立摘要模型          "freshTailCount"32,               // 保护最近 32 条消息          "contextThreshold"0.75,          "incrementalMaxDepth": -1,          // 无限深度          "autoPurge"true,          "pruneHeartbeatOk"true        }      },      "memory-lancedb-pro": {        "enabled"true,        "config": {          "autoCapture"true,          "autoRecall"true,          "smartExtraction"true,          "extractMinMessages"2,          "extractMaxChars"8000,          "retrieval": {            "mode""hybrid",            "vectorWeight"0.7,            "bm25Weight"0.3,            "rerank""cross-encoder",            "rerankProvider""jina"          },          "embedding": {            "provider""openai-compatible",            "model""BAAI/bge-m3",            "baseURL""https://api.siliconflow.cn/v1",            "apiKey""${SILICONFLOW_API_KEY}"          },          "sessionMemory": {            "enabled"false  // 避免与 LCM 冲突          }        }      }    }  }}
基线配置的考量
  • 会话隔离:per-account-channel-peer 是生产级多用户服务的必选项,防止记忆泄露。
  • 会话重置:每日重置结合 14 天保留期,平衡了 Token 成本与历史可追溯性。LCM 的 autoPurge: true 会跟随 Session 清理同步维护数据库。
  • LCM 摘要模型:指定便宜的独立模型,是控制成本的灵魂所在。
  • Memory 检索:混合检索 + 重排序是目前精度最高的组合,sessionMemory: false 确保了 LCM 和 Memory 的职责清晰不打架。

三、一个实例看懂全过程:一次“失忆”与“找回”的真实记录

理论说再多,不如看一次真实发生的过程。我们用一个实际测试,还原这套系统是怎么运转的。
场景:我和 “瞳瞳”(agent)聊完一段内容后,立即手动重置了会话。
第一步:再次询问,它果然“失忆”了
重置后,我立刻问它:“你还记得我们刚才聊了什么吗?”
它诚实地回答:已经不记得了。但它接着提示:可以尝试通过 LCM 工具从历史摘要里找回一些内容。
看到这里你可能会想:“不是说三层架构很厉害吗,怎么还是忘了?”
别急,这正是这套机制精妙的地方。我们先理清此刻发生了什么:
  • Session刚被重置,短期记忆被清空——所以它回答“不记得”。
  • LCM虽然已经无损备份了刚才的对话,但还没来得及生成摘要——所以它只能“提示”可以从 LCM 里找,而不能直接给出答案。
  • Memory提取记忆是异步的,默认每 2 轮对话才触发一次提炼——如果刚聊完就立刻重置,提炼还没来得及执行,记忆库里自然也没有这条记忆。
也就是说,不是系统不行,而是我动作太快,把它的“知识归档”时间给跳过了。
第二步:四小时后,它自己想起来了
隔了 4 个多小时,我再次对它说:“请找回我们之前聊的内容。”
有意思的事情发生了:在这期间,因为我的空闲重置策略(空闲 2 小时自动重置),会话又被重置了一次。但这一次,它没有问我“要不要从 LCM 里找”,而是直接、准确地从 Memory 中检索到了那段对话的关键信息
这背后发生了什么?答案就在那“被跳过的”4 小时里:
Memory 插件在后台默默完成了它被跳过的“作业”——对那段时间的对话进行了自动提炼,将核心信息以结构化记忆的形式存入了向量数据库。
当我再次发起请求时,autoRecall 功能自动触发,用我的新消息在记忆库中精准命中,并将结果注入上下文。
也就是说,第一次是 LCM 的“档案馆”还没整理好目录,第二次是 Memory 的“知识顾问”已经归档完毕,随时待命。
第三步:如果非要翻“原始档案”呢?
那么,如果我就是想要回溯最原始的完整对话——那些没有被提炼成记忆的细节——怎么办?
当然可以。我直接让它通过 LCM 工具从摘要库里检索。它调用了内置的 lcm_grep 和 lcm_expand,在海量归档中搜索并还原了当时的对话片段。这是 LCM 作为“档案馆长”的看家本领:即使摘要已经生成,原始对话依然可被追溯到。
第四步:看看 Memory 里到底存了什么
最后,我检查了一下 Memory 数据库里的实际记录。发现它保存的信息相当完整,而且有一条关键的时间线证据:
记录显示,第一次重置前的最后一条消息时间是 19:35。
而我手动触发重置的时间是 19:45(中间任务处理和重置操作大约用了 10 分钟)。
这印证了我们前面的判断:第一次重置时,Memory 虽然已经捕获了对话内容,但提炼流程还没来得及完成,所以系统只能引导我从 LCM 摘要中查找。而等到第二次尝试时,提炼已经完成,Memory 就能直接给出答案了。
一个值得记住的结论
通过这次实测,我们可以清晰地排出三种数据形态的保真度层级:
freshTailCount(原始消息,不被压缩的尾巴) > Memory(提炼后的结构化记忆) > LCM 摘要(压缩后的层级摘要)
原始消息最完整但生命周期最短,Memory 记忆最精炼且持久,LCM 摘要则是两者之间的桥梁——这就是三层架构各自不可替代的价值。

七、六大典型场景的最优配置组合

以下每个场景都会在基线配置的基础上,给出关键参数的调整项和完整配置片段。你可以直接复制到自己的 openclaw.json 中,替换对应的块即可。

场景一:日常办公协作

场景画像:多主题切换、单次对话 100~300 轮、对响应速度敏感、Token 成本敏感。
调优重点:保持较快的响应节奏,适当降低压缩频率;确保近期对话足够连贯。
// 日常办公场景 - 关键调整{  "session": {    "reset": { "mode": "daily", "atHour": 4 },    "maintenance": { "mode": "enforce", "pruneAfter": "14d", "maxEntries": 300, "rotateBytes": "5mb" }  },  "plugins": {    "entries": {      "lossless-claw": {        "config": {          "freshTailCount": 48,          // 比基线高,保持当前主题的连贯性          "contextThreshold": 0.80,      // 稍高阈值,减少压缩频率          "summaryModel": "claude-3-5-haiku",          "asyncCompaction": true        // 异步压缩,不阻塞交互        }      },      "memory-lancedb-pro": {        "config": {          "extractMinMessages": 3,       // 适当降低提取频率          "extractMaxChars": 6000        }      }    }  }}
决策逻辑:日常对话的信息密度相对较低,不需要每两轮就提取记忆;freshTailCount 提高至 48 确保 Agent 能轻松应对“刚才我们说到哪儿了”之类的上下文切换;异步压缩保证体验流畅。

场景二:编程与软件开发

场景画像:代码密集、对话轮次多、需频繁回溯早期设计决策、调试上下文不能中断。
调优重点:最大化短期上下文完整性,防止压缩破坏当前调试流;为可能的大型代码文件预留空间。
// 编程开发场景 - 关键调整{  "session": {    "reset": { "mode": "idle", "idleMinutes": 1440 },  // 改为空闲24小时重置,避免调试中途被强制重置    "maintenance": { "mode": "enforce", "pruneAfter": "30d", "maxEntries": 500 }  },  "plugins": {    "entries": {      "lossless-claw": {        "config": {          "freshTailCount": 64,          // 最大短期上下文,保护当前调试流          "contextThreshold": 0.70,      // 更低阈值,代码占用 Token 更快          "maxChunkTokens": 16384,       // 较小摘要块,适合代码的细粒度信息          "maxFileBytes": 50000000,      // 允许粘贴较大代码文件(约50MB)          "asyncCompaction": false       // 同步压缩,确保调试一致性        }      },      "memory-lancedb-pro": {        "config": {          "extractMinMessages": 4,       // 降低提取频率,避免频繁 API 调用          "retrieval": {            "bm25Weight": 0.4            // 提高关键词权重,利于代码搜索          }        }      }    }  }}
决策逻辑:编程场景下,会话中途被重置会打断心流,改为空闲重置更稳妥;同步压缩能避免“我刚才看到的错误栈呢?”的诡异时刻;BM25 权重提高是因为代码中充满精确的函数名、变量名,关键词匹配比语义搜索更有效。

场景三:学术研究与长文档分析

场景画像:文献综述、论文研读、多日持续性的深度分析、需要从海量历史中检索特定段落。
调优重点:给摘要层尽可能多的 Token 空间;压缩批次要大,以适配长文档的整体语境。
// 学术研究场景 - 关键调整{  "session": {    "reset": { "mode": "idle", "idleMinutes": 10080 }, // 7天无活动才重置,适合长周期研究    "maintenance": { "mode": "enforce", "pruneAfter": "90d", "maxEntries": 1000 }  },  "plugins": {    "entries": {      "lossless-claw": {        "config": {          "freshTailCount": 16,          // 大幅降低,腾出 Token 给摘要层          "contextThreshold": 0.70,          "maxChunkTokens": 32768,       // 大摘要块,与长文档的整体语境匹配          "maxFileBytes": 100000000,     // 允许处理大型PDF/论文          "autoPurge": false             // 保留所有研究记录,不自动清理        }      },      "memory-lancedb-pro": {        "config": {          "extractMaxChars": 12000,      // 提高单次提取上限,捕获长篇论证          "retrieval": {            "vectorWeight": 0.8          // 语义搜索权重提高,便于跨段落理解          }        }      }    }  }}
决策逻辑:学术场景的核心诉求是“全局鸟瞰 + 精准定位”。减少 freshTailCount 可以让 LCM 把更多 Token 分配给高层摘要,Agent 因此能看到更完整的论证脉络;大摘要块和大文件阈值是为了防止一篇长论文被切得太碎,影响整体理解。

场景四:低成本 / 个人自托管部署

场景画像:使用免费或低价的模型 API(如 DeepSeek、本地 Ollama),对成本极度敏感,但仍希望保留核心的无损记忆能力。
调优重点:摘要模型能省则省;压缩批次最小化以减少 Token 消耗;设置硬性的上下文预算上限。
// 低成本部署场景 - 关键调整{  "session": {    "reset": { "mode": "daily", "atHour": 4 },    "maintenance": { "mode": "enforce", "pruneAfter": "7d", "maxEntries": 200, "rotateBytes": "2mb" }  },  "plugins": {    "entries": {      "lossless-claw": {        "config": {          "freshTailCount": 24,          "contextThreshold": 0.60,      // 更低阈值,适配小上下文窗口          "maxChunkTokens": 8192,        // 最小摘要块,减少每次压缩的 Token 消耗          "summaryModel": "deepseek-chat", // 最便宜的模型做摘要          "contextBudgetCapTokens": 16000 // 硬性上限,防止单次请求爆预算        }      },      "memory-lancedb-pro": {        "config": {          "smartExtraction": false,      // 关闭智能提取,用简单提取节省 LLM 调用          "autoRecall": false,           // 可选关闭自动回忆,改为手动 /memory recall          "retrieval": {            "rerank": "none"             // 关闭重排序,节省额外的模型调用          }        }      }    }  }}
决策逻辑:在预算有限时,必须做出取舍。关闭 smartExtraction 和重排序会牺牲一点精度,但能大幅降低额外的 API 调用量。如果使用本地 Ollama 运行嵌入和摘要模型,则可以将 summaryModel 设为本地模型名,实现几乎零额外成本。

场景五:多 Agent 协作

场景画像:一个 OpenClaw 网关下同时运行多个专职 Agent(如开发助手、运维助手、客服机器人),需确保记忆隔离,并过滤掉无价值的子 Agent 调用和系统会话。
调优重点:LCM 沿用通用配置,用 ignoreSessionPatterns 过滤系统会话;Memory 插件依赖其内置的按 Agent ID 自动隔离机制。
// 多Agent场景 - 关键调整{  "plugins": {    "entries": {      "lossless-claw": {        "config": {          "freshTailCount": -1,          // 交由 LCM 动态判断,更灵活          "ignoreSessionPatterns": [            "agent:*:cron:**",           // 过滤所有 Agent 的定时任务            "agent:main:subagent:**"     // 过滤子 Agent 调用(如果你的架构是主Agent调子Agent)          ]        }      },      "memory-lancedb-pro": {        "config": {          // 无需手动配置 scopes,插件会自动按 Agent ID 隔离记忆存储目录          // 若要查询特定 Agent 的记忆:openclaw memory-pro list --scope agent:<agent-id>        }      }    }  },  "agents": {    "list": [      { "id": "dev", "agentDir": "...", /* ... */ },      { "id": "ops", "agentDir": "...", /* ... */ }    ]  },  "bindings": [    { "match": { "channel": "feishu", "accountId": "dev-bot" }, "agentId": "dev" },    { "match": { "channel": "feishu", "accountId": "ops-bot" }, "agentId": "ops" }  ]}
决策逻辑:多 Agent 场景下,LCM 的 freshTailCount: -1 能动态适应不同 Agent 的不同会话长度。关键是要通过 ignoreSessionPatterns 把大量的系统内部会话排除在 LCM 数据库之外,否则这些无意义的会话会严重拖慢摘要生成和存储膨胀。Memory 插件的隔离则由其底层存储路径自动完成,无需额外操心。

场景六:企业级部署

场景画像:面向多客户的生产级服务,有严格的审计合规要求,对话历史需要长期存档,不能丢失任何信息,且需要通过企业规范约束 AI 的上下文引用行为。
调优重点:关闭所有自动清理,确保全量归档;利用 systemPromptAddition 注入企业规范的上下文使用策略;规划好存储增长与备份策略。
// 企业级部署场景 - 关键调整{  "session": {    "reset": { "mode": "idle", "idleMinutes": 43200 }, // 30天超长空闲    "maintenance": { "mode": "enforce", "pruneAfter": "365d", "maxEntries": 10000 }  },  "plugins": {    "entries": {      "lossless-claw": {        "config": {          "autoPurge": false,            // 绝不自动删除          "pruneHeartbeatOk": false,     // 保留所有心跳记录          "summaryModel": "claude-3-5-haiku", // 质量优先          "systemPromptAddition": "你是一个企业级 AI 助手。在引用任何历史决策、数据或客户信息时,务必使用 lcm_grep 和 lcm_expand 工具回溯原始对话记录,确保信息的绝对准确。不得凭记忆猜测。"        }      },      "memory-lancedb-pro": {        "config": {          "autoCapture": true,          "autoRecall": true,          "smartExtraction": true        // 开启最高精度的提取        }      }    }  }}
决策逻辑:企业场景下,“丢失记忆”是不可接受的合规风险。因此所有自动清理类参数必须关闭。通过 systemPromptAddition 注入引用规范,可以确保 AI 在回答关键业务问题时,走的是“检索→验证→回答”的可靠流程,而不是依赖不可靠的内部记忆。同时,务必配置独立的数据库备份脚本,定期对 lcm.db 和 LanceDB 数据进行冷备。

八、监控与日常维护

一套生产级系统,必须配备可观测性和维护手段。以下是推荐的日常操作清单:

九、总结:从“能记”到“会记”的最后一公里

我们曾立下目标:要为 OpenClaw 搭建一套稳定、永不丢失、且越用越聪明的记忆系统。现在,通过 Session + LCM + Memory 三层架构的组合落地,这个目标已经达成。
Session用严格的生命周期管理,保证了系统的轻盈和隐私安全。
LCM用无损归档和智能压缩,赋予了 Agent 跨天、跨周、甚至跨月的完整对话回溯能力。
Memory用自动提炼和高精度检索,沉淀了真正有价值的知识,让 Agent 成为懂你的长期搭档。
而这篇文章提供的六套场景化配置,正是让这套架构从“能跑”到“好用”的最后一公里。你现在可以直接根据自己的实际场景,复制对应的配置块,在几分钟内完成调优。
最后,用一句话来概括这套黄金三角的价值:Session 让 AI 知道你们正在谈什么,LCM 让它随时能翻出任何一段陈年旧账,Memory 则让它真正理解你是个什么样的人。三者兼备,你的 OpenClaw Agent 才算是真正拥有了“记忆”。

——

感谢阅读

真实经历,真诚分享

关注我,一个只分享 AI 实战记录的人类