记忆的工作原理
Mycel 的记忆分为两层:-
持久化 — 对话历史使用 LangGraph
AsyncSqliteSavercheckpointer 存储在LEON_DB_PATH指定的 SQLite 数据库中。每条消息、工具调用和结果都被记录。恢复 Thread 时,完整历史会被重放。 -
上下文管理 — 随着对话增长,
MemoryMiddleware会在每次模型调用前自动裁剪和压缩历史,确保上下文窗口始终可用。这一过程对用户完全透明。
裁剪(Pruning)
裁剪负责截断过长的工具结果,防止单个输出占用过多上下文。 工具结果超过软阈值时被截断,超过硬阈值时直接清除。最近的消息受到保护不被裁剪,确保 Agent 保有当前的工作上下文。 默认配置:
在
runtime.json 中配置:
压缩(Compaction)
压缩通过 LLM 对旧的对话历史进行摘要,在上下文窗口填满时自动触发。这让 Agent 在非常长的任务中也不会丢失有意义的上下文 — 旧消息被摘要后替换为紧凑的表示。 压缩触发条件(同时满足):- 对话消息数不少于
min_messages - 上下文窗口已使用超过 70%
keep_recent_tokens token 之外的所有内容进行摘要,然后用摘要替换旧历史。
默认配置:
在
runtime.json 中配置:
溢出缓冲区(Spill buffer)
对于输出非常大的工具(例如在大型代码库上运行Grep),溢出缓冲区会自动将输出写入临时文件,而不是内联到对话中。这保持了上下文的整洁,同时数据仍然可以访问。
按工具配置阈值:
持久化详情
Thread 历史是追加式的。回退 Thread 时移动的是活跃 checkpoint 指针,不会删除中间历史。