记忆子系统:短期缓冲、持久化、工作记忆与语义检索
30 秒导读: 大模型每次调用都是「失忆」的——你不把上文喂 进去,它就什么都不记得。 VoltAgent 的记忆子系统就是那台「喂料机」:把这一轮产生的消息先攒在内存缓冲里, 生成结束后异步刷进数据库(LibSQL / Postgres / Supabase 任选),下一轮再从库里 捞出来拼进 prompt。在这条主干上,它再挂三样「记得更准 / 更省」的能力:语义检索 (按意思召回老消息)、工作记忆(把要点写进一块结构化便签)、摘要压缩 (历史太长就先总结再喂)。
本章只讲「记忆」这一层。agent 主循环怎么把这些记忆拼进一次生成,见 01-agent-runtime.md;工具系统见 02-tools-and-mcp.md。
1. 这是什么(零基础也能懂)
一句话定义: 记忆子系统 = agent 的「上下文持久层」,负责把对话消息存下来、取回来, 并在取回时做得更聪明(只取相关的、只取要点、太长就压缩)。
为什么需要它? 大模型本身无状态。你问「我叫什么名字」,它只能看这一次请求里带了什么。 要让 agent 跨越很多轮、甚至跨越很多天还记得你,就必须有人在每轮之间把消息落盘、 在每轮开头把消息读回。这个「有人」就是记忆子系统。
它把「记忆」分成两个层次,正好对应人脑的两种记忆:
| 层次 | 对应人脑 | 在 VoltAgent 里是什么 | 存在哪 |
|---|---|---|---|
| 短期 | 工作台上的便签 | ConversationBuffer(本轮消息缓冲) | 进程内存,单次生成期间 |
| 长期 | 笔记本 / 档案柜 | Memory + 存储适配器(全部历史) | LibSQL / Postgres / Supabase… |
用起来什么样: 配一个 Memory,把它交给 agent,记忆就自动转起来了——你只要在每次调用
时带上 userId 和 conversationId,框架就知道「这是谁、哪段对话」,自动读旧的、存新的。
// 示意,非源码:最小配置——一句话开启「能跨轮记忆」的 agent
const memory = new Memory({
storage: new LibSQLMemoryAdapter({ url: "file:./voltagent.db" }), // 存哪里
});
const agent = new Agent({ name: "assistant", model, memory });
// 同一个 conversationId,第二轮就能记得第一轮说过的话
await agent.generateText("我叫小明", { userId: "u1", conversationId: "c1" });
await agent.generateText("我叫什么?", { userId: "u1", conversationId: "c1" }); // → 小明
一句话直觉: 把 ConversationBuffer 当内存(RAM)、把存储适配器当磁盘,
把 MemoryPersistQueue 当那个「攒够了 / 该收尾了就把 RAM 写回磁盘」的刷盘线程——
整套记忆就是一个为对话定制的「读缓存 + 写回」体系。