Memory
跨会话保留的信息 —— 短期、长期、向量库。
一定义
Memory(记忆)是跨会话、跨调用保留的信息。Context 是一次推理里模型能看见的东西;Memory 是那次推理结束之后还能被找回的东西。
二为什么重要
模型的"原生记忆"几乎为零 —— 每次调用是独立的。Memory 是给模型外挂一个大脑,让它记得"你昨天说过你不吃辣"、"你的项目叫 X"、"上次你犯的错是漏了单元测试"。
三三种典型形态
1. 短期(本次会话)
放在 context 里即可。消息列表、累积对话。多轮对话默认就是这种。
2. 长期(跨会话)
写进外部存储。常见做法:
- SQLite / JSON 文件 —— 简单场景,几万条以内。
- 向量数据库(Pinecone、Chroma、pgvector) —— 需要语义检索。
- KV 数据库(Redis) —— 频繁读写、低延迟。
3. 工作记忆(本次任务)
任务执行期间的中间状态,任务结束就清。比如 Agent 当前已经查过哪些 URL、算过哪些中间结果。
四最小可跑的例子
# 写一条记忆
import chromadb
client = chromadb.PersistentClient(path="./memory")
col = client.get_or_create_collection("user_facts")
col.add(ids=["u1"], documents=["用户不吃辣,来自上海,做后端开发。"])
# 检索
q = "他能吃川菜吗?"
res = col.query(query_texts=[q], n_results=2)
for doc, dist in zip(res["documents"][0], res["distances"][0]):
print(f"[{dist:.2f}] {doc}")
# [0.41] 用户不吃辣,来自上海,做后端开发。
五常见误区
- 什么都往记忆里塞 —— 噪声记忆会让检索变差,要定期合并、过期、清理。
- 把原始对话当记忆 —— 应该提炼成事实(用户偏好、项目元数据),而不是堆整段聊天。
- 不分层 —— 把"用户名字"和"上次出错的堆栈"放同一层,优先级会乱。