龙虾-OpenClaw一文详细了解-手搓OpenClaw-6 记忆系统I 0. 为什么要手搓 OpenClawOpenClaw 很强但完整工程体量也很大。对于大多数开发者来说直接阅读全量代码会有三个痛点模块多Gateway、Agent、Tools、Sessions、Channels 互相耦合路径长一条消息从输入到回复跨越多个子系统调试难没有自己的“最小版本”很难定位问题所以这个系列采用一个更实用的学习路径先做最小闭环再逐步补齐能力。代码地址:https://gitee.com/wisdomfriend/openclaw_py1. 目标用 Python 从 0 到 1 复现 OpenClaw 的核心能力Agent Loop工具调用 多轮推理Session 与并发隔离记忆系统短期 长期Skills 系统分层加载Web/Telegram 等渠道接入第一篇的阶段目标是跑起 FastAPI 服务打通一个最小/v1/chat对话接口具备会话隔离与并发控制每会话锁 全局信号量2. 目标架构用户输入: CLI/Web/Telegram/DiscordGateway ServerSessionManagerSession Lock Global SemaphoreAgent LoopPrompt BuilderLLM Provider AdapterTool Runtimeexec/web/search/read/write...Memory Manager短期会话历史长期记忆: MEMORY.md 日志Knowledge RAGBM25 Embedding RRF RerankSkill RegistryL1 元数据L2 指令加载L3 资源加载Cron Scheduler3. 本篇目标把“长期记忆”真正落地到项目中目标不是概念而是可运行的工程实现重要信息能写入MEMORY.md每次写入会同步记录到memory/YYYY-MM-DD.md重启后依然能读取与召回4. 对齐 OpenClaw 实现思路OpenClawTypeScript给我们的启发工作区里把MEMORY.md当成默认长期记忆入口同时支持memory.md兼容路径优先MEMORY.md在 bootstrap 阶段把记忆文件并入上下文和AGENTS.md同类对应源码锚点repos/openclaw/src/agents/workspace.tsexportconstDEFAULT_MEMORY_FILENAMEMEMORY.md;exportconstDEFAULT_MEMORY_ALT_FILENAMEmemory.md;...// Prefer MEMORY.md; fall back to memory.md only when absent.for(constnameof[DEFAULT_MEMORY_FILENAME,DEFAULT_MEMORY_ALT_FILENAME]asconst){3. 本篇落地文件openclaw_py/app/memory/store.pyopenclaw_py/app/memory/manager.pyopenclaw_py/app/config.pyopenclaw_py/app/core/agent.pyopenclaw_py/app/core/tools.py4. 存储层MEMORY.md memory/*.md文件openclaw_py/app/memory/store.pyclassMarkdownMemoryStore:Markdown-backed long-term memory using MEMORY.md memory/*.md.def__init__(self,base_dir:Path)-None:self.base_dirbase_dir.resolve()self.memory_fileself.base_dir/MEMORY.mdself.daily_dirself.base_dir/memorydefupsert(self,key:str,value:str)-None:entriesself._parse_memory_md()entries[clean_key]MemoryEntry(keyclean_key,valueclean_value,updatedself._now_text(),)self._write_memory_md(entries)self.append_daily_log(clean_key,clean_value)这一步的核心价值主文件做“当前态”日志文件做“时间序列审计”两者互补。5. 管理层remember / recall / boot_context文件openclaw_py/app/memory/manager.pyclassLongTermMemoryManager:defremember(self,key:str,value:str)-str:self.store.upsert(key,value)returnfmemory_saved: [{key}]{value}defrecall(self,query:str,top_k:int|NoneNone)-str:...defboot_context(self,max_chars:int|NoneNone)-str:lines[### Long-Term Memory Snapshot]...return\n.join(lines).strip()当前recall()先用轻量关键词召回便于快速跑通。下一篇会升级为混合检索BM25 向量。6. Agent 接入启动注入 显式记忆写入文件openclaw_py/app/core/agent.pyself.memorymemory_managerorLongTermMemoryManager()self.tool_runtimetool_runtimeorbuild_default_tool_runtime(memory_managerself.memory)...memory_snapshotself.memory.boot_context(max_charssettings.long_term_memory_bootstrap_chars,)ifmemory_snapshot:self.history.append({role:system,content:memory_snapshot})def_maybe_promote_explicit_memory(self,user_message:str)-None:memory_recordself.memory.maybe_remember_from_user_text(user_message)ifnotmemory_record:returnself.history.append({role:system,content:f[memory_saved]\n{memory_record}})这意味着用户明确说“记住……”时不必等待离线流程立即落盘。7. 工具层接入长期记忆文件openclaw_py/app/core/tools.py新增工具remember(key, value)recall(query, top_k)forget(key)这样模型在工具调用链中可以直接读写长期记忆。8. 下一篇衔接第 7 篇进入“长期记忆检索”9. 支持一下如果这篇对你有帮助欢迎点赞、收藏、关注。有余力的话欢迎打赏支持我会把实战代码更新得更快。