一、核心思想
记忆层要解决两件事:
- 当前对话内:关键事实不丢失。
- 跨会话:新会话能恢复用户偏好、背景和历史决策。
核心公式:记忆系统 = 短期记忆(Session级)+ 长期记忆(跨Session持久化)
下面是记忆系统的整体架构图:
#mermaid-svg-pN24trWWPuTWbvtq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pN24trWWPuTWbvtq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pN24trWWPuTWbvtq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pN24trWWPuTWbvtq .error-icon{fill:#552222;}#mermaid-svg-pN24trWWPuTWbvtq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pN24trWWPuTWbvtq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pN24trWWPuTWbvtq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pN24trWWPuTWbvtq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pN24trWWPuTWbvtq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pN24trWWPuTWbvtq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pN24trWWPuTWbvtq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pN24trWWPuTWbvtq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pN24trWWPuTWbvtq .marker.cross{stroke:#333333;}#mermaid-svg-pN24trWWPuTWbvtq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pN24trWWPuTWbvtq p{margin:0;}#mermaid-svg-pN24trWWPuTWbvtq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pN24trWWPuTWbvtq .cluster-label text{fill:#333;}#mermaid-svg-pN24trWWPuTWbvtq .cluster-label span{color:#333;}#mermaid-svg-pN24trWWPuTWbvtq .cluster-label span p{background-color:transparent;}#mermaid-svg-pN24trWWPuTWbvtq .label text,#mermaid-svg-pN24trWWPuTWbvtq span{fill:#333;color:#333;}#mermaid-svg-pN24trWWPuTWbvtq .node rect,#mermaid-svg-pN24trWWPuTWbvtq .node circle,#mermaid-svg-pN24trWWPuTWbvtq .node ellipse,#mermaid-svg-pN24trWWPuTWbvtq .node polygon,#mermaid-svg-pN24trWWPuTWbvtq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pN24trWWPuTWbvtq .rough-node .label text,#mermaid-svg-pN24trWWPuTWbvtq .node .label text,#mermaid-svg-pN24trWWPuTWbvtq .image-shape .label,#mermaid-svg-pN24trWWPuTWbvtq .icon-shape .label{text-anchor:middle;}#mermaid-svg-pN24trWWPuTWbvtq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pN24trWWPuTWbvtq .rough-node .label,#mermaid-svg-pN24trWWPuTWbvtq .node .label,#mermaid-svg-pN24trWWPuTWbvtq .image-shape .label,#mermaid-svg-pN24trWWPuTWbvtq .icon-shape .label{text-align:center;}#mermaid-svg-pN24trWWPuTWbvtq .node.clickable{cursor:pointer;}#mermaid-svg-pN24trWWPuTWbvtq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pN24trWWPuTWbvtq .arrowheadPath{fill:#333333;}#mermaid-svg-pN24trWWPuTWbvtq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pN24trWWPuTWbvtq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pN24trWWPuTWbvtq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pN24trWWPuTWbvtq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pN24trWWPuTWbvtq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pN24trWWPuTWbvtq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pN24trWWPuTWbvtq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pN24trWWPuTWbvtq .cluster text{fill:#333;}#mermaid-svg-pN24trWWPuTWbvtq .cluster span{color:#333;}#mermaid-svg-pN24trWWPuTWbvtq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pN24trWWPuTWbvtq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pN24trWWPuTWbvtq rect.text{fill:none;stroke-width:0;}#mermaid-svg-pN24trWWPuTWbvtq .icon-shape,#mermaid-svg-pN24trWWPuTWbvtq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pN24trWWPuTWbvtq .icon-shape p,#mermaid-svg-pN24trWWPuTWbvtq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pN24trWWPuTWbvtq .icon-shape .label rect,#mermaid-svg-pN24trWWPuTWbvtq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pN24trWWPuTWbvtq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pN24trWWPuTWbvtq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pN24trWWPuTWbvtq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户交互
短期记忆
Session级
写入链路
语义提纯
长期记忆
跨Session持久化
检索链路
语义相似性
Markdown 轻量方案
向量库方案
二、记忆的分类与存储
1. 按存储形式分类
| 存储形式 | 说明 | 典型实现 |
|---|---|---|
| Token级记忆 | 自然语言或结构化文本 | 向量库中的文本块、JSON |
| 参数化记忆 | 编码进模型参数 | 预训练知识、LoRA适配器、SFT微调 |
| 潜在记忆 | 模型内部表示 | KV Cache、激活值、Hidden States |
下面是记忆生命周期的完整流程图:
#mermaid-svg-7kTsTEs9yXAz5LyZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7kTsTEs9yXAz5LyZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7kTsTEs9yXAz5LyZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7kTsTEs9yXAz5LyZ .error-icon{fill:#552222;}#mermaid-svg-7kTsTEs9yXAz5LyZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7kTsTEs9yXAz5LyZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7kTsTEs9yXAz5LyZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7kTsTEs9yXAz5LyZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7kTsTEs9yXAz5LyZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7kTsTEs9yXAz5LyZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7kTsTEs9yXAz5LyZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7kTsTEs9yXAz5LyZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7kTsTEs9yXAz5LyZ .marker.cross{stroke:#333333;}#mermaid-svg-7kTsTEs9yXAz5LyZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7kTsTEs9yXAz5LyZ p{margin:0;}#mermaid-svg-7kTsTEs9yXAz5LyZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7kTsTEs9yXAz5LyZ .cluster-label text{fill:#333;}#mermaid-svg-7kTsTEs9yXAz5LyZ .cluster-label span{color:#333;}#mermaid-svg-7kTsTEs9yXAz5LyZ .cluster-label span p{background-color:transparent;}#mermaid-svg-7kTsTEs9yXAz5LyZ .label text,#mermaid-svg-7kTsTEs9yXAz5LyZ span{fill:#333;color:#333;}#mermaid-svg-7kTsTEs9yXAz5LyZ .node rect,#mermaid-svg-7kTsTEs9yXAz5LyZ .node circle,#mermaid-svg-7kTsTEs9yXAz5LyZ .node ellipse,#mermaid-svg-7kTsTEs9yXAz5LyZ .node polygon,#mermaid-svg-7kTsTEs9yXAz5LyZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7kTsTEs9yXAz5LyZ .rough-node .label text,#mermaid-svg-7kTsTEs9yXAz5LyZ .node .label text,#mermaid-svg-7kTsTEs9yXAz5LyZ .image-shape .label,#mermaid-svg-7kTsTEs9yXAz5LyZ .icon-shape .label{text-anchor:middle;}#mermaid-svg-7kTsTEs9yXAz5LyZ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7kTsTEs9yXAz5LyZ .rough-node .label,#mermaid-svg-7kTsTEs9yXAz5LyZ .node .label,#mermaid-svg-7kTsTEs9yXAz5LyZ .image-shape .label,#mermaid-svg-7kTsTEs9yXAz5LyZ .icon-shape .label{text-align:center;}#mermaid-svg-7kTsTEs9yXAz5LyZ .node.clickable{cursor:pointer;}#mermaid-svg-7kTsTEs9yXAz5LyZ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7kTsTEs9yXAz5LyZ .arrowheadPath{fill:#333333;}#mermaid-svg-7kTsTEs9yXAz5LyZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7kTsTEs9yXAz5LyZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7kTsTEs9yXAz5LyZ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7kTsTEs9yXAz5LyZ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7kTsTEs9yXAz5LyZ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7kTsTEs9yXAz5LyZ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7kTsTEs9yXAz5LyZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7kTsTEs9yXAz5LyZ .cluster text{fill:#333;}#mermaid-svg-7kTsTEs9yXAz5LyZ .cluster span{color:#333;}#mermaid-svg-7kTsTEs9yXAz5LyZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7kTsTEs9yXAz5LyZ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7kTsTEs9yXAz5LyZ rect.text{fill:none;stroke-width:0;}#mermaid-svg-7kTsTEs9yXAz5LyZ .icon-shape,#mermaid-svg-7kTsTEs9yXAz5LyZ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7kTsTEs9yXAz5LyZ .icon-shape p,#mermaid-svg-7kTsTEs9yXAz5LyZ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7kTsTEs9yXAz5LyZ .icon-shape .label rect,#mermaid-svg-7kTsTEs9yXAz5LyZ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7kTsTEs9yXAz5LyZ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7kTsTEs9yXAz5LyZ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7kTsTEs9yXAz5LyZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原始交互
编码
LLM提取事实三元组
存储
向量库/图数据库
提取
向量检索+BM25
巩固
短期转长期
反思
提取Meta-Knowledge
遗忘
权重衰减+冲突标记
2. 按功能分类
| 功能类型 | 核心问题 | 存储内容 | 典型场景 |
|---|---|---|---|
| 事实记忆 | 智能体知道什么 | 用户偏好、环境状态、显式事实 | 记住用户的技术栈偏好 |
| 经验记忆 | 智能体如何改进 | 过往轨迹、成败教训、策略知识 | 从失败的代码审查中学习 |
| 工作记忆 | 智能体当前思考什么 | 当前推理上下文、任务进展 | 多步推理中的中间状态 |
3. 按内容性质细分
- 情景记忆:记录特定时间、场景的具体事件(回答"发生了什么")。
- 语义记忆:从多个情景提炼的通用知识或规律(回答"意味着什么")。
- 程序记忆:存储技能、规则和习得行为(自动执行任务序列)。
下面是长期记忆的写入与检索双链路图:
#mermaid-svg-hPVZpu714ZVDXT1t{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hPVZpu714ZVDXT1t .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hPVZpu714ZVDXT1t .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hPVZpu714ZVDXT1t .error-icon{fill:#552222;}#mermaid-svg-hPVZpu714ZVDXT1t .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hPVZpu714ZVDXT1t .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hPVZpu714ZVDXT1t .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hPVZpu714ZVDXT1t .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hPVZpu714ZVDXT1t .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hPVZpu714ZVDXT1t .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hPVZpu714ZVDXT1t .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hPVZpu714ZVDXT1t .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hPVZpu714ZVDXT1t .marker.cross{stroke:#333333;}#mermaid-svg-hPVZpu714ZVDXT1t svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hPVZpu714ZVDXT1t p{margin:0;}#mermaid-svg-hPVZpu714ZVDXT1t .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hPVZpu714ZVDXT1t .cluster-label text{fill:#333;}#mermaid-svg-hPVZpu714ZVDXT1t .cluster-label span{color:#333;}#mermaid-svg-hPVZpu714ZVDXT1t .cluster-label span p{background-color:transparent;}#mermaid-svg-hPVZpu714ZVDXT1t .label text,#mermaid-svg-hPVZpu714ZVDXT1t span{fill:#333;color:#333;}#mermaid-svg-hPVZpu714ZVDXT1t .node rect,#mermaid-svg-hPVZpu714ZVDXT1t .node circle,#mermaid-svg-hPVZpu714ZVDXT1t .node ellipse,#mermaid-svg-hPVZpu714ZVDXT1t .node polygon,#mermaid-svg-hPVZpu714ZVDXT1t .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hPVZpu714ZVDXT1t .rough-node .label text,#mermaid-svg-hPVZpu714ZVDXT1t .node .label text,#mermaid-svg-hPVZpu714ZVDXT1t .image-shape .label,#mermaid-svg-hPVZpu714ZVDXT1t .icon-shape .label{text-anchor:middle;}#mermaid-svg-hPVZpu714ZVDXT1t .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hPVZpu714ZVDXT1t .rough-node .label,#mermaid-svg-hPVZpu714ZVDXT1t .node .label,#mermaid-svg-hPVZpu714ZVDXT1t .image-shape .label,#mermaid-svg-hPVZpu714ZVDXT1t .icon-shape .label{text-align:center;}#mermaid-svg-hPVZpu714ZVDXT1t .node.clickable{cursor:pointer;}#mermaid-svg-hPVZpu714ZVDXT1t .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hPVZpu714ZVDXT1t .arrowheadPath{fill:#333333;}#mermaid-svg-hPVZpu714ZVDXT1t .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hPVZpu714ZVDXT1t .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hPVZpu714ZVDXT1t .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hPVZpu714ZVDXT1t .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hPVZpu714ZVDXT1t .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hPVZpu714ZVDXT1t .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hPVZpu714ZVDXT1t .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hPVZpu714ZVDXT1t .cluster text{fill:#333;}#mermaid-svg-hPVZpu714ZVDXT1t .cluster span{color:#333;}#mermaid-svg-hPVZpu714ZVDXT1t div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hPVZpu714ZVDXT1t .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hPVZpu714ZVDXT1t rect.text{fill:none;stroke-width:0;}#mermaid-svg-hPVZpu714ZVDXT1t .icon-shape,#mermaid-svg-hPVZpu714ZVDXT1t .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hPVZpu714ZVDXT1t .icon-shape p,#mermaid-svg-hPVZpu714ZVDXT1t .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hPVZpu714ZVDXT1t .icon-shape .label rect,#mermaid-svg-hPVZpu714ZVDXT1t .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hPVZpu714ZVDXT1t .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hPVZpu714ZVDXT1t .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hPVZpu714ZVDXT1t :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 检索链路
写入链路
对话结束
语义提纯
过滤噪声
抽取结构化事实
幂等Key写入
乐观锁/MVCC
新Session开始
Query向量化
语义相似性检索
Redis预热/异步精排
长期记忆库
三、记忆的生命周期
一条记忆从进入到淘汰,经历六个环节:
编码 → 存储 → 提取 → 巩固 → 反思 → 遗忘
| 操作 | 说明 | 工程实现 |
|---|---|---|
| 编码 | 将原始交互转为可存储信息 | LLM提取事实三元组、生成摘要 |
| 存储 | 持久化编码后的信息 | 写入向量库/图数据库/参数 |
| 提取 | 根据上下文检索相关记忆 | 向量检索 + BM25 + 图遍历 |
| 巩固 | 短期记忆转长期记忆 | 异步任务:对话摘要 → 实体库 |
| 反思 | 主动回顾评估记忆内容 | 任务完成后提取Meta-Knowledge |
| 遗忘 | 淘汰低价值或过时记忆 | 权重衰减 + 冲突标记废弃 |
四、短期记忆(Short-Term Memory)
- 定义:当前单次会话中的暂存信息(用户提问、模型回复、工具调用结果)。
- 载体:LLM的上下文窗口。
- 管理难点 :窗口再大也有限,且存在位置偏差(中间信息利用率低)。
- 三种控制策略 :
- 上下文缩减:滑动窗口丢弃旧消息,或压缩为摘要。
- 上下文卸载:重型结果放外部存储,Prompt中只保留引用。
- 上下文隔离:多Agent间只传递精简指令,不广播完整历史。
五、长期记忆(Long-Term Memory)
- 定义:活在Session之外的持久化知识库。
- 核心机制 :写入(Record) 与 检索(Retrieve) 两条链路。
写入链路
- 时机:对话结束后,异步触发。
- 过程 :LLM对短期记忆做语义提纯(过滤噪声、抽取结构化事实)。
- 工程要点 :
- 写入操作需幂等Key(基于源消息ID+批次ID,非结果文本哈希)。
- 多端并发时用乐观锁或MVCC处理冲突。
检索链路
- 时机:新Session开始时。
- 过程:将用户Query向量化,与记忆库做语义相似性检索。
- 性能要点:首包路径上的向量检索P99延迟会直接影响TTFT,需用Redis预热或异步精排优化。
下面是记忆演化机制的完整流程图:
#mermaid-svg-NkRNrlyK4HfyiwQB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NkRNrlyK4HfyiwQB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NkRNrlyK4HfyiwQB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NkRNrlyK4HfyiwQB .error-icon{fill:#552222;}#mermaid-svg-NkRNrlyK4HfyiwQB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NkRNrlyK4HfyiwQB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NkRNrlyK4HfyiwQB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NkRNrlyK4HfyiwQB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NkRNrlyK4HfyiwQB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NkRNrlyK4HfyiwQB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NkRNrlyK4HfyiwQB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NkRNrlyK4HfyiwQB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NkRNrlyK4HfyiwQB .marker.cross{stroke:#333333;}#mermaid-svg-NkRNrlyK4HfyiwQB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NkRNrlyK4HfyiwQB p{margin:0;}#mermaid-svg-NkRNrlyK4HfyiwQB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NkRNrlyK4HfyiwQB .cluster-label text{fill:#333;}#mermaid-svg-NkRNrlyK4HfyiwQB .cluster-label span{color:#333;}#mermaid-svg-NkRNrlyK4HfyiwQB .cluster-label span p{background-color:transparent;}#mermaid-svg-NkRNrlyK4HfyiwQB .label text,#mermaid-svg-NkRNrlyK4HfyiwQB span{fill:#333;color:#333;}#mermaid-svg-NkRNrlyK4HfyiwQB .node rect,#mermaid-svg-NkRNrlyK4HfyiwQB .node circle,#mermaid-svg-NkRNrlyK4HfyiwQB .node ellipse,#mermaid-svg-NkRNrlyK4HfyiwQB .node polygon,#mermaid-svg-NkRNrlyK4HfyiwQB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NkRNrlyK4HfyiwQB .rough-node .label text,#mermaid-svg-NkRNrlyK4HfyiwQB .node .label text,#mermaid-svg-NkRNrlyK4HfyiwQB .image-shape .label,#mermaid-svg-NkRNrlyK4HfyiwQB .icon-shape .label{text-anchor:middle;}#mermaid-svg-NkRNrlyK4HfyiwQB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NkRNrlyK4HfyiwQB .rough-node .label,#mermaid-svg-NkRNrlyK4HfyiwQB .node .label,#mermaid-svg-NkRNrlyK4HfyiwQB .image-shape .label,#mermaid-svg-NkRNrlyK4HfyiwQB .icon-shape .label{text-align:center;}#mermaid-svg-NkRNrlyK4HfyiwQB .node.clickable{cursor:pointer;}#mermaid-svg-NkRNrlyK4HfyiwQB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NkRNrlyK4HfyiwQB .arrowheadPath{fill:#333333;}#mermaid-svg-NkRNrlyK4HfyiwQB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NkRNrlyK4HfyiwQB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NkRNrlyK4HfyiwQB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NkRNrlyK4HfyiwQB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NkRNrlyK4HfyiwQB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NkRNrlyK4HfyiwQB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NkRNrlyK4HfyiwQB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NkRNrlyK4HfyiwQB .cluster text{fill:#333;}#mermaid-svg-NkRNrlyK4HfyiwQB .cluster span{color:#333;}#mermaid-svg-NkRNrlyK4HfyiwQB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NkRNrlyK4HfyiwQB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NkRNrlyK4HfyiwQB rect.text{fill:none;stroke-width:0;}#mermaid-svg-NkRNrlyK4HfyiwQB .icon-shape,#mermaid-svg-NkRNrlyK4HfyiwQB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NkRNrlyK4HfyiwQB .icon-shape p,#mermaid-svg-NkRNrlyK4HfyiwQB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NkRNrlyK4HfyiwQB .icon-shape .label rect,#mermaid-svg-NkRNrlyK4HfyiwQB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NkRNrlyK4HfyiwQB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NkRNrlyK4HfyiwQB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NkRNrlyK4HfyiwQB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 存在矛盾
无冲突
任务完成
自我反思
提取Meta-Knowledge
精细化反思闭环
真实性/交付物/数据保真
记忆聚类与合并
实体百科
冲突检测
标记旧记忆废弃
权重衰减
score = relevance × importance × decay(t)
Vacuum清理
维护HNSW图结构
六、长期记忆 vs RAG
| 维度 | 长期记忆 | RAG |
|---|---|---|
| 数据性质 | 个性化经验(用户偏好、习惯) | 共享知识(公司规章、产品文档) |
| 关联对象 | 与特定用户强绑定 | 与"谁在使用"无关 |
| 关系 | 非替代:RAG提供世界知识,长期记忆提供用户画像,可融合排序或相互增强 |
七、主流记忆技术产品对比
| 产品 | 核心思想 | 技术亮点 | 适用场景 |
|---|---|---|---|
| Mem0 | 单次抽取+多信号融合检索 | 语义+BM25+实体链接并行打分 | 通用对话记忆 |
| LETTA(原MemGPT) | 操作系统虚拟内存分页 | 主上下文与外部上下文动态交换 | 长对话上下文管理 |
| ZEP | 时间感知知识图谱 | 情景/语义/社区三层子图;边失效机制 | 企业级多租户 |
| A-MEM | Zettelkasten知识管理 | 卡片笔记法,记忆间自动建立语义连接 | 知识密集型任务 |
| MemOS | 三种记忆类型动态转换 | 纯文本 ↔ KV Cache ↔ LoRA | 全栈记忆管理 |
| MIRIX | 六模块分工协作 | 元记忆管理器路由不同存储结构 | 复杂决策支持 |
LETTA、ZEP、MemOS关键差异
- LETTA:有损压缩(递归摘要会丢失细节)。
- ZEP :可借鉴的边失效机制(新事实覆盖旧事实时标记失效,保留审计)。
- MemOS :LoRA写入后难删除,适合变化极慢的偏好;多租户需动态挂载/卸载adapter。
下面是 Agent 记忆三层对齐架构图:
#mermaid-svg-9rXg2gR7bkJ4AkL0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .error-icon{fill:#552222;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .marker.cross{stroke:#333333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9rXg2gR7bkJ4AkL0 p{margin:0;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .cluster-label text{fill:#333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .cluster-label span{color:#333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .cluster-label span p{background-color:transparent;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .label text,#mermaid-svg-9rXg2gR7bkJ4AkL0 span{fill:#333;color:#333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .node rect,#mermaid-svg-9rXg2gR7bkJ4AkL0 .node circle,#mermaid-svg-9rXg2gR7bkJ4AkL0 .node ellipse,#mermaid-svg-9rXg2gR7bkJ4AkL0 .node polygon,#mermaid-svg-9rXg2gR7bkJ4AkL0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .rough-node .label text,#mermaid-svg-9rXg2gR7bkJ4AkL0 .node .label text,#mermaid-svg-9rXg2gR7bkJ4AkL0 .image-shape .label,#mermaid-svg-9rXg2gR7bkJ4AkL0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .rough-node .label,#mermaid-svg-9rXg2gR7bkJ4AkL0 .node .label,#mermaid-svg-9rXg2gR7bkJ4AkL0 .image-shape .label,#mermaid-svg-9rXg2gR7bkJ4AkL0 .icon-shape .label{text-align:center;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .node.clickable{cursor:pointer;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .arrowheadPath{fill:#333333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9rXg2gR7bkJ4AkL0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9rXg2gR7bkJ4AkL0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9rXg2gR7bkJ4AkL0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .cluster text{fill:#333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .cluster span{color:#333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9rXg2gR7bkJ4AkL0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .icon-shape,#mermaid-svg-9rXg2gR7bkJ4AkL0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .icon-shape p,#mermaid-svg-9rXg2gR7bkJ4AkL0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .icon-shape .label rect,#mermaid-svg-9rXg2gR7bkJ4AkL0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9rXg2gR7bkJ4AkL0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9rXg2gR7bkJ4AkL0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9rXg2gR7bkJ4AkL0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 第三层:工作层
第二层:经验层
第一层:事实层
知道什么事实
用户偏好/环境状态
从过往任务学到了什么
成败教训/策略知识
此刻正在处理什么
当前推理上下文
三层对齐
记忆不空转
八、记忆的演化机制(反思、聚类、遗忘)
1. 反思与合成
- 自我反思:任务完成后提取Meta-Knowledge(如"用户更在意性能而非规范")。
- 精细化反思闭环:每个子任务后触发,进行真实性、交付物、数据保真性三重验证。
- 记忆聚类与合并:自动合并碎片化重复记录,整理成"实体百科"。
2. 遗忘与清理
- 权重衰减 :
score = relevance × importance × decay(t),指数衰减过时记忆。 - 冲突解决:新事实与旧事实矛盾时,标记旧记忆为废弃。
- 注意 :主流向量库的软删除可能破坏HNSW图结构,需定期执行Vacuum清理。
九、检索效果优化
混合检索策略
- RRF(倒数排名融合):几乎不用调参,适合冷启动。
- 线性加权:需标注数据校准权重。
- Cross-encoder Reranker:召回后统一精排,对长尾查询更友好。
元数据硬过滤
- 目的:多租户场景下强制数据隔离(如按UserID过滤)。
- 工程取舍 :强过滤可能破坏HNSW图连通性,导致召回率下降;高活跃租户建议分配独立Collection做物理隔离。
优化优先级
检索链路优化的ROI通常高于写入链路。体感"记忆没用"时,十有八九是Recall跑偏,或精排未将真正相关内容顶上来。先查Trace,再考虑加写入预算。
十、Markdown作为轻量级记忆方案
适用场景
偏好、约定、踩坑记录等信息量可控、对可读性要求高的场景。
优势
- 透明可审计:直接读写文件,无黑盒。
- 持久化与版本控制:文件存磁盘,可提交Git。
- 零迁移成本:无供应商锁定,复制即可。
- 成本极低:免去向量数据库运维成本。
局限
海量非结构化文本检索时,人工组织的Markdown成为瓶颈,此时向量检索不可替代。
十一、Claude Code的CLAUDE.md机制
层级结构
| 层级 | 位置 | 作用范围 | 适用场景 |
|---|---|---|---|
| 组织级 | /etc/claude-code/CLAUDE.md |
所有用户 | 公司编码规范、安全策略 |
| 用户级 | ~/.claude/CLAUDE.md |
个人所有项目 | 代码风格偏好 |
| 项目级 | ./CLAUDE.md 或 ./.claude/CLAUDE.md |
团队共享 | 项目架构、编码标准 |
| 本地级 | ./CLAUDE.local.md |
个人当前项目 | 沙箱URL、测试数据偏好(加入.gitignore) |
写作原则
- 规则要具体可验证:"注意可读性" → "函数名动词开头,不超过40行"。
- 禁令配替代方案:"不要做X,遇到这种情况做Y"。
- 错误驱动添加:只有Claude确实犯了某个错误,且规则能防止再犯时,才写入。
- 控制长度 :每条
CLAUDE.md建议200行以内,过长会稀释重点。
AGENTS.md 与 CLAUDE.md
AGENTS.md是跨工具开放标准(OpenAI Codex、Cursor等采用)。- 可通过
@AGENTS.md导入,让两个工具复用同一份基础指令。
Auto Memory
- Claude根据对话自动写入的笔记(偏好、习惯)。
- 限制:仅加载前200行或25KB;20-30个会话后质量可能下降。
- 禁用 :环境变量
CLAUDE_CODE_DISABLE_AUTO_MEMORY=1。
十二、总结与关键判断
- 短期与长期记忆物理隔离:一个活在当前任务,一个持久化存储。
- 遗忘比写入更重要:舍不得删会导致过时噪音充斥检索结果,体验极差。
- Markdown与向量库互补:偏好/约定用Markdown,海量文本检索用向量库。
- CLAUDE.md不是越多越好:每条规则应对应一次真实错误。
- 检索优化先于写入优化:先查Trace确认召回精度,再优化写入。
- 最终目标 :让Agent知道什么事实 ,从过往任务学到了什么 ,此刻正在处理什么,三层对齐,记忆才不空转。