情景记忆 few-shot Plugin。
长期记忆的「情景记忆(episodic)」类型 — 记住"成功的过往交互"作为下次类似 query 的 few-shot 示例。
与现有 Memory 模块的关系
CMDC 现有记忆模块各司其职:
| 模块 | 类型 | 用途 |
|---|---|---|
Plugin.Builtin.MemoryLoader | 程序记忆 | 加载 AGENTS.md 静态规则到 system prompt |
Plugin.Builtin.MemoryFlush | 语义记忆 | 压缩前提取关键事实 → AGENTS.md |
cmdc_skill_engine | 可复用能力 | Skill 进化(成功/失败评分) |
Plugin.Builtin.EpisodicMemory(本模块) | 情景记忆 | 完整成功对话的 few-shot 复用 |
情景记忆与 Skill 的区别:
- Skill:抽象的可复用能力("如何做 X")
- Episodic:具体的成功对话片段("上次 X 是怎么做成的")
工作流程
:session_end:检查 session 是否成功(自定义judge_fn或简单启发式)- 成功 session → 抽取
{query, plan, tool_trajectory, final_answer}→ 写入CMDC.Memory后端(默认CMDC.Memory.ETS) :session_start:用当前用户首条消息 → 语义检索 top-K episodes → inject 到 system prompt 作为 few-shot 示例
配置
{EpisodicMemory, [
memory_store: :episodic_memory, # 必填,CMDC.Memory backend 表名
memory_module: CMDC.Memory.ETS, # 默认 ETS(cmdc_memory_pg 可换 PG)
judge_fn: &MyApp.judge_success/2, # 自定义成功判断函数
top_k: 3, # session_start 检索 top-K
max_episodes_per_user: 100, # 按 user_id 上限避免内存爆
require_user_id: true # 多租户严格模式(默认 false 兼容旧用户)
]}v0.4.0 实现说明
judge_fn默认启发式:session.turn >= 2 且无 abort/error 视为成功- 语义检索:调用
CMDC.Memorybehaviour 的search/3callback(关键词包含匹配;若 backend 支持向量检索会自动升级为语义检索) - 按
ctx.user_data[:user_id]namespace 隔离(多租户支持)
多租户严格模式(v0.5.4+)
:require_user_id 默认 false(兼容历史行为),开启后行为:
| 路径 | require_user_id: true + ctx 无 user_id 时 |
|---|---|
:session_start 检索 | Logger.warning + 不调 backend.search(返回空,避免泄漏) |
:session_end 写入 | 跳过写入 + emit {:episodic_memory_skipped, %{reason: :missing_user_id}} |
多租户场景强烈建议开启。SaaS / 多账号 Agent 服务必须确保每条 episodic 记录都附 user_id,否则可能跨租户读到他人成功示例。 升级路径:先
:warn观察日志,再切true强制隔离。
Summary
Functions
默认 judge:session.turn >= 2 且无 abort/error 视为成功。