第 10 章 工程实践与进阶拓展 能跑通不等于能上线。本章汇总作用域设计、Markdown 记忆导出、CRUD 运维、Pipeline 定制与性能调优——把 memU 从 Demo 推向生产。 10.1 生产 checklist 项 | 建议 Python | ≥ 3.13,锁定 minor 版本 存储 | Postgres + pgvector LLM | Chat / Embedding 分 Profile;提取用小模型,对话用大模型 检索 | 默认 RAG;
能跑通不等于能上线。本章汇总作用域设计、Markdown 记忆导出、CRUD 运维、Pipeline 定制与性能调优——把 memU 从 Demo 推向生产。
| 项 | 建议 |
|---|---|
| Python | ≥ 3.13,锁定 minor 版本 |
| 存储 | Postgres + pgvector |
| LLM | Chat / Embedding 分 Profile;提取用小模型,对话用大模型 |
| 检索 | 默认 RAG;复杂 query fallback LLM |
| 作用域 | 所有 API 显式传 user / where |
| 密钥 | 环境变量或密钥管理服务 |
| 监控 | LLM 拦截器 + memorize/retrieve 延迟指标 |
| 备份 | pg_dump + 定期 export_memory_files |
scope = {"user_id": "end_user_123"}
scope = {"tenant_id": "acme", "user_id": "employee_456"}
需在 UserConfig.model 中声明 tenant_id 字段。
scope = {"project_id": "repo_xyz", "agent_id": "code_agent"}
原则:写入与读取 scope 键集合一致;不要过度细分导致检索碎片化。
memU 可将数据库中的结构化记忆渲染为可浏览的 Markdown 树(类似 README 描述的 INDEX / MEMORY / SKILL 布局)。
service = MemoryService( llm_profiles={...}, memory_files_config={ "enabled": True, "output_dir": "./agent_memory", "synthesize": False, # True 时用 LLM 合成 MEMORY 正文 }, )
await service.export_memory_files(user={"user_id": "u1"})
产出结构(概念性):
输出目录/ ├── INDEX.md ← 原始资源索引 ├── MEMORY.md ← 记忆总览 ├── SKILL.md ← 技能索引 ├── resource/ ← 原始文件副本 ├── memory/ ← 每个 Category 一页 └── skill/ ← 每项技能一个目录
| 模式 | MEMORY.md | skill/ 树 |
|---|---|---|
synthesize=False |
确定性链接索引 | LLM 合成 |
synthesize=True |
LLM 合成正文 | LLM 合成 |
skill 树 始终由 LLM 从多模态描述合成,不直接从 skill 类型 Item 复制——这是设计选择,保证技能文档可读性。
工作区同步场景下支持增量 merge(仅更新变化来源),避免全量重合成。全量 rebuild 用 export_memory_files;增量逻辑在 workspace sync API 中(高级)。
MemoryService 除 memorize / retrieve 外,还提供手动 CRUD(通过 CRUDMixin):
| 操作 | 用途 |
|---|---|
| list | 审计现有 items / categories |
| create / update | 人工修正错误记忆 |
| delete | GDPR 删除、幻觉清理 |
| clear | 重置某 scope 全部记忆 |
概念性:
# 列出某用户全部 memory items items = await service.list_memory_items(where={"user_id": "u1"}) # 删除一条错误记忆 await service.delete_memory_item(item_id="mem_bad_01") # 合规:清除用户全部数据 await service.clear_memory(where={"user_id": "u1"})
具体方法名以安装版本为准,见附录 B。
同步 memorize 会阻塞直到 LLM 提取完成。生产环境建议:
用户对话 ──► 消息队列 ──► Worker memorize ──► Postgres │ 主线程 retrieve ◄─── 已提交的记忆可能延迟几秒可见
接受 最终一致性:刚说完的话可能下一轮 retrieve 才可见。可接受则大幅改善 UX 延迟。
Workflow 支持运行时修订:
insert_before / insert_afterreplace_stepremove_step场景:
extract_items 后加自定义过滤步骤需深入理解各 step 的 required/produced keys,参考官方 Architecture 文档与 ADR。
memU 不是要替换所有记忆系统。常见架构:
短期 working memory → Redis / 会话 buffer 结构化长期记忆 → memU 知识库 RAG → 向量数据库 + 文档 chunk
memU 擅长 从交互中自动生长 的结构化记忆;静态文档库仍可用传统 RAG。
官方 Locomo 基准:92.09% 平均准确率(全推理任务)。
影响因素:
| 因素 | 影响 |
|---|---|
| Chat 模型 | 提取与 LLM 检索质量 |
| Embedding 模型 | RAG 召回率 |
| Category 数量 | LLM 模式上下文长度 |
| sufficiency_check | 延迟 vs 完整性 |
调优路径:
memU 生态强调 7×24 proactive agent:
next_step_query实现思路:
async def background_learn(service, event_stream): async for event in event_stream: if event.type == "page_view": await service.memorize( resource_url=event.url, modality="document", user={"user_id": event.user_id}, )
| 症状 | 参见 |
|---|---|
| 检索为空 | 附录 C § scope 不匹配 |
| embedding 报错 | 附录 C § Profile 配置 |
| Postgres 连接失败 | 附录 C § DSN |
| 提取结果幻觉 | 降低温度 / 换模型 / CRUD 修正 |
export_memory_files 导出可审计 Markdown 树。| 章 | 你应记住的一句话 |
|---|---|
| 0 | memU = 工作区运行时,memorize + retrieve |
| 1 | pip install memu-py,5 分钟跑通 |
| 2 | 三层记忆 + 六种 memory_type |
| 3 | 四种记录,返回字典字段含义 |
| 4 | MemoryService 五大配置块 |
| 5 | memorize 七步流水线 |
| 6 | retrieve 分层 + RAG/LLM |
| 7 | 五模态统一 caption |
| 8 | Postgres + Profile 路由 |
| 9 | Agent 集成与 Cloud API |
| 10 | 导出、CRUD、生产 checklist |
学完正文,按下面的索引对照运行示例,把每个知识点从「读懂」变成「会调」:
| 示例主题 | 核心知识点 | 建议在第几章后跑 |
|---|---|---|
| 最小记忆闭环 | memorize + retrieve 闭环、作用域隔离 | 第 1 章 |
| 服务初始化与配置 | Profile / 数据库 / 检索模式配置 | 第 4 章 |
| 写入流水线实战 | 多来源写入、批量、重试、类型分布 | 第 5 章 |
| 检索策略对比 | RAG vs LLM、多轮 query、渐进式检索 | 第 6 章 |
| 多模态摄入 | 五模态摄入、工具日志学习 | 第 7 章 |
| 存储后端切换 | 三后端对比、跨进程持久化 | 第 8 章 |
| 智能体记忆闭环 | Retrieve → Generate → Memorize 闭环 | 第 9 章 |
| LangGraph 工具集成 | save/search 工具集成 | 第 9 章 |
| Cloud 异步 API | 云端任务提交与轮询 | 第 9 章 |
| 记忆树导出 | Markdown 记忆树导出 | 第 10 章 |
💡 如果只跑一个,选「智能体记忆闭环」示例——它把 retrieve、prompt 注入、memorize 串成完整对话,是理解「智能体为什么需要记忆」最直接的演示。三轮对话后,注入的记忆块会从空变丰富,亲手看到记忆累积。
附录:术语表(附录 A)、API 速查(附录 B)、报错排查(附录 C)。