三 第一编 · 第三章 · · 约 4 分钟读完

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] 用户不吃辣,来自上海,做后端开发。

五常见误区

  • 什么都往记忆里塞 —— 噪声记忆会让检索变差,要定期合并、过期、清理。
  • 把原始对话当记忆 —— 应该提炼成事实(用户偏好、项目元数据),而不是堆整段聊天。
  • 不分层 —— 把"用户名字"和"上次出错的堆栈"放同一层,优先级会乱。