即时上下文 → 长期记忆 → 知识库
Agent 的记忆不是一个大仓库,而是三层「速度、容量、寿命」各不相同的缓存------该快的东西要快、该记的东西要记、该分的东西要分。
前言
先看一个最常见的「失忆」现场:你跟一个 Agent 聊到一半,它突然忘了你十分钟前说的话;或者你关掉重开,它像从没见过你;又或者你问它「我上个月跟你说的那件事」,它翻出一堆毫不相关的知识片段。
这三种「失忆」,其实是三种完全不同的问题------忘了刚才(窗口溢出)、忘了过去(没有持久化)、分不清「关于我的事」和「通用知识」。把它们都叫「记忆」,然后指望一个数据库全解决,是注定做不好的。真正靠谱的做法,是把记忆分成三层,每一层用不同的机制、不同的取舍。
一、即时上下文:最快、最贵、最易失的「工作记忆」
第一层,是当前对话窗口里躺着的那些消息------系统提示词、历史对话、刚调过的工具结果。它「记得最快」(直接就在模型眼前),但也「最贵、最易失」。
ts
// 工作记忆:直接塞进模型的那一坨,有硬性 token 上限
const window = [
{ role: 'system', content: systemPrompt }, // 每次都重发
{ role: 'user', content: '帮我看看报告' },
{ role: 'assistant', content: '好的,我先读文件...' },
// ... 越聊越多,直到顶到上下文窗口上限
]
取舍点 :这一层的核心矛盾是「容量 vs 成本 」------塞得越多,模型记得越全,但每一轮都要为这一整坨付 token 钱,而且窗口有硬上限,超了必须做压缩或截断 (这就是前面反复出现的「上下文工程」)。所以工作记忆的原则是:只放当前任务真正需要的东西,放不下的,交给下一层。
二、长期记忆:跨会话的「关于你的事实」
第二层,是那些关掉对话也不该丢的、关于这个用户或项目的事实------你的偏好、做过的决定、项目里重要的约定。它要持久,所以得写盘;它不能全塞进窗口,所以得「按需检索」。
ts
// 长期记忆:写盘 + 检索,而不是塞进每次的窗口
async function remember(user, fact) {
const key = await embed(fact) // 向量化
memoryStore.put({ user, key, fact, time: now() })
}
async function recall(user, query) {
return memoryStore.search(user, await embed(query), { topK: 5 })
}
取舍点 :这一层最难的不是「存」,而是「记什么、怎么取 」。不是每句话都值得记------要过滤掉噪声,只留「跨会话还有用」的事实;取的时候要按相关性检索,而不是把记忆全倒出来。长期记忆的价值,在于「下次见面它还记得你」,代价是「多一层写入 + 多一层检索」。
三、知识库:最慢、最大、最「客观」的外部资料
第三层,是外部文档、资料、手册------不是「关于你」,而是「关于世界」的通用知识。它最大,也最慢(要先检索、再注入),而且它不随会话改变。
ts
// 知识库:RAG 检索,把相关片段按需塞回上下文
async function rag(query) {
const chunks = vectorStore.search(query, { topK: 3 }) // 先检索
return chunks.map((c) => c.text).join('\n') // 再注入
}
取舍点 :知识库和长期记忆最容易混------两者都要「向量检索」,但信任边界不同 :长期记忆是「关于这个用户的、可能过期的、主观的」,知识库是「外部资料的、相对稳定的、客观的」。混在一起,模型就会拿「你上个月随口说的一个想法」去当「权威资料」回答。分层的意义之一,就是让模型知道「哪段话该信到什么程度」。
四、原点:记忆,是用「钱和延迟」换「上下文」
把三层放在一起看,它们其实是同一个维度的三个刻度:
| 层 | 速度 | 容量 | 寿命 | 本质 |
|---|---|---|---|---|
| 即时上下文 | 最快 | 最小(token 上限) | 最短(窗口一关就没) | 用钱换「就在眼前」 |
| 长期记忆 | 中(要检索) | 中 | 长(持久) | 用延迟换「下次还记得」 |
| 知识库 | 最慢(检索+注入) | 最大 | 最长(资料不变) | 用延迟换「知道更多」 |
记忆分层的本质,就是用「钱和延迟」去换「上下文」------越快的层越贵、越小;越慢的层越便宜、越大。设计记忆,就是决定「哪些信息值得放在哪一层」。
所以判断一个 Agent 的记忆设计好不好,就看三条:该快的东西快不快(工作记忆会不会被挤爆)、该记的东西忘不忘(长期记忆有没有真的持久)、该分的东西分不分(长期记忆和知识库混没混)。 三条都过关,才叫「有记忆」;只做一层,那叫「只有一个会溢出的缓冲区」。
(下一篇顺着「每一层都在烧 token、花真金白银」这条线,聊 Agent 的钱到底花哪了:token 与成本。)
结语
回到开头那句:Agent 的记忆不是一个仓库,而是三层速度、容量、寿命各不相同的缓存。
即时上下文负责「就在眼前」,长期记忆负责「下次还记得」,知识库负责「知道更多」。它们对应三种不同的失忆------忘了刚才、忘了过去、分不清对象 ,也对应三种不同的取舍------容量、持久、检索。
把记忆分层,不是把东西多存几份,而是让每一份信息,待在它该待的那一层。
参考: