这部分内容是面试中非常容易出彩的亮点,核心在于讲清楚为什么要做区分以及工程上如何分别落地。
一、 核心概念与作用对比
在 RAG 或大模型问答系统中,为了让 AI 表现得像一个真实的“助手”,我们需要解决两个维度的遗忘问题:
-
短期记忆:解决**“模型记不住上一轮说啥”**的问题。
- 作用:维持当前对话轮次中的上下文,保障即时对话连贯性。
- 场景:用户问“这个项目用Java怎么落地?”,接着追问“那向量库选哪个?”。短期记忆要把上一轮的问答拼进去,让模型知道“那”指的是前文的Java项目。
-
长期记忆:解决**“模型记不住用户是谁/有什么偏好”**的问题。
- 作用:实现跨会话的个性化体验与知识持久化,减少用户的冗余输入。
- 场景:用户半年前说过“我对Milvus不熟,优先用ES”,这次再问向量库选型时,系统能调出这个偏好,直接推荐ES。
二、 核心维度的六大差异(面试常考对比例)
这是最核心的技术区别,直接决定了底层的架构设计:
- 数据形态:短期记忆存储的是未加工的原始对话文本(User与Assistant的原话);长期记忆存储的是从对话中提炼出的结构化或向量化的核心信息(非原始文本)。
- 调用方式:短期记忆是全量直填,无论有用没用,全量拼接进 Prompt 的最前面送给模型;长期记忆是按需检索,先检索再注入,只把和当前问题相关的单条记忆加进 Prompt。
- 生命周期:短期记忆是会话级的,对话结束或超时(如30分钟无交互)即销毁;长期记忆是用户级的,与用户ID绑定,永久保存(除非主动删除)。
- 存储介质:短期记忆使用内存优先(如 Redis);长期记忆使用 结构化存储(Redis)+ 向量库(如 Pinecone/Milvus/ES)。
- 数据量:短期记忆极小(仅最近 N 轮,通常小于10轮);长期记忆可达海量。
三、 为什么不能混用这两种机制?
面试官常会问:“为什么要把长期记忆和短期记忆拆开?直接把所有历史都存进短期记忆里不行吗?” 你可以从以下两方面反驳:
1. 为什么不能用“短期记忆的方式(全量直填)”处理长期记忆?
- Prompt 长度爆炸:用户长年累月的核心信息全拼进去,会远超模型的上下文窗口限制(比如 4k 或 8k tokens),导致模型直接报错。
- 模型注意力分散(幻觉风险) :把大量无关信息(比如半年前的饮食偏好)丢给模型,会严重干扰模型对当前技术问题的理解,导致回答偏离重点。
2. 为什么不能用“长期记忆的方式(检索)”处理短期记忆?
- 丢失关键上下文:当前对话的上下文是强相关的。如果用检索,用户一句指代不清的追问(如“那选哪个?”)去检索,可能会漏掉上一轮的关键主语,导致模型不知所云。
四、 最终的架构设计与实现方案总结
在你的简历或实战中,这两个记忆系统应该这样设计落地:
- 会话短期记忆(滑动窗口 + 摘要压缩 + Redis存储) :为了控制 Token 消耗同时保留关联性,只保留最近的 N 轮对话(如最近的 32k token)。当窗口快满时,调用 LLM 对更早之前的对话生成简短的摘要。最后将“早期摘要 + 窗口内最新对话”存入 Redis 供当前会话使用。
- 会话长期记忆(主动录入 + 向量化存储 + 语义相似度召回) :摈弃让 AI 自动提取记忆(因为不可控且易混乱),改为给用户提供一个信息设置入口。用户主动录入的偏好会被向量化并存入 Pinecone 向量库。每次提问前,先用问题去向量库做语义相似度匹配,把召回的个性化数据按需注入上下文。
📝 整体流程串联: 当你向系统提问时,系统会先根据你的输入召回长期记忆,接着从 Redis 获取当前的短期记忆上下文,再去 RAG 知识库检索相关外部数据,最后将 [长期记忆] + [短期记忆] + [RAG数据] + [用户输入] 共同拼接为完整的 Prompt,交由大模型生成最终答案。
。