Agent 的**记忆压缩(Memory Compression)**主要目的是解决一个问题:
Agent 长时间运行后,会积累大量历史对话、工具调用记录、任务轨迹,如果全部塞入 Context Window,会导致 Token 爆炸、推理变慢、成本升高,所以需要把"过去的信息"压缩成更高价值、更小体积的表示。
常见方法主要有以下几类:
一、摘要压缩
思路
让 LLM 定期把历史记忆总结成短文本。
例如原始记忆:
用户:
我喜欢C++,正在学习机器人后端开发。
讨论ROS2通信机制。
学习MQTT连接机器人云平台。
完成Robot SDK项目,实现TCP通信。
压缩后:
用户长期目标:
-
学习机器人后端开发
-
熟悉C++、ROS2、MQTT
已有经验:
-
开发过Robot SDK
-
实现TCP通信和JSON协议
实现方式
Agent维护:
Raw Memory
|
v
Memory Summarizer
|
v
Compressed Memory
优点
简单
效果好
适合聊天Agent
缺点:
可能丢失细节
例如:
原文:
用户机器人IP是192.168.1.20
总结:
用户有机器人网络环境
IP丢了。
二、分层记忆压缩
类似人类记忆。
分成:
Long-term Memory
|
| |
Semantic Memory Episodic Memory
|
User Profile
第一层:短期记忆 Short-term
保存最近上下文:
例如:
最近20轮聊天
直接放 Prompt:
Context:
user:
assistant:
...
第二层:中期记忆
保存任务阶段信息:
例如:
当前任务:
开发机器人SDK
已完成:
-
TCP通信
-
JSON协议
待完成:
-
心跳机制
-
重连策略
第三层:长期记忆
保存稳定信息:
例如:
用户:
-
熟悉C++
-
做机器人开发
-
使用ROS2
压缩过程:
最近聊天
|
| 超过窗口
v
任务摘要
|
|
长期稳定事实
三、 信息抽取压缩
不是总结,而是抽取关键事实。
例如:
原始:
我最近在机器人公司实习,
主要做C++ SDK,
用TCP连接机器人,
以后想找C++后端岗位。
抽取:
JSON:
{
"skill":[
"C++",
"TCP",
"Robot SDK"
],
"career_goal":
"C++ backend developer"
}
优势:
查询效率高。
比如:
Agent问
用户会不会C++?
直接查:
skill contains C++
不用读全部历史。
四、 向量压缩(Embedding Compression)
把文本变成向量。
流程:
Memory Text
|
Embedding Model
|
0.21,0.55,0.13,...
|
Vector Database
例如:
存:
用户学习ROS2
变成:
0.234,0.882,...
查询:
用户:
"之前机器人通信怎么设计?"
Embedding:
机器人通信设计
搜索:
TCP协议
MQTT
ROS2 Topic
五、 时间衰减压缩(Time Decay)
模拟人的遗忘机制。
不是所有记忆价值一样。
公式:
Memory Score =
Importance × e^(-λt)
例如:
昨天:
用户正在调试TCP bug
重要度:
0.9
一年以前:
问过hello world
重要度:
0.1
随着时间:
重要性下降
应用:
自动删除:
低价值 + 很久以前
六、重要性评分压缩
给每条Memory打分:
Memory Importance =
用户明确要求保存
-
使用频率
-
最近访问
-
任务相关性
例如:
| Memory | Score |
|---|---|
| 用户名字 | 0.9 |
| 用户喜欢C++ | 0.8 |
| 一次报错日志 | 0. |
工业级 Agent Memory 通常组合
实际系统一般不是单一方法:
User Input
|
v
Memory Manager
|
| | |
Short-term Long-term Archive
| |
Recent Vector DB
Context
|
Summarizer
|
Compression