【AI面试临阵磨枪-30】如何设计 Agent 长短期记忆?对比 FullHistory、SlidingWindow、Summary、Vector 记忆
一、面试题目
面试官:请你讲解如何设计 AI Agent 的长期记忆与短期记忆架构?并对比 FullHistory、SlidingWindow、Summary 摘要记忆、Vector 向量记忆四种记忆方案的原理、优缺点及适用场景。
二、知识储备
1. Agent 长短期记忆整体设计思路
短期记忆(Short-Term Memory)
- 定位:当前任务会话上下文,生命周期仅限单次对话 / 当前任务。
- 作用:保存实时对话轮次、当前执行状态、临时中间结果,给模型提供即时上下文。
- 特点:低延迟、直接塞入 Prompt、容量小、随会话销毁。
长期记忆(Long-Term Memory)
- 定位:跨会话永久沉淀知识,用户偏好、历史习惯、过往任务记录、业务经验。
- 作用:跨轮、跨天、跨会话复用,让 Agent 越用越懂用户。
- 特点:持久化存储、需要检索筛选、不全部塞进 Prompt、按需召回。
整体架构设计
- 对话实时内容进短期记忆;
- 定时 / 任务结束后提炼关键信息,沉淀到长期记忆;
- 每轮推理前,从长期记忆检索相关内容,拼接到短期上下文;
- 控制总 Token 上限,避免上下文溢出、推理耗时过高。
2. 四种记忆方案原理 + 优缺点 + 适用场景
1)FullHistory 完整历史记忆
核心定义把所有对话记录完整原样全部拼接进 Prompt,每轮都喂给大模型。
优点
- 信息无丢失、逻辑最完整;
- 实现最简单,无需任何复杂处理。
缺点
- 轮次越多 Token 爆炸,极易上下文溢出;
- 推理成本高、延迟大、冗余信息多;
- 完全不适合长会话、长期使用。
适用场景
- 对话轮次极少的简单问答;
- 测试 Demo、临时一次性会话;
- 教学演示、极简 Bot。
2)SlidingWindow 滑动窗口记忆
核心定义只保留最近 N 轮对话,超出窗口的旧记录直接丢弃,像滑动窗口一样固定长度。
优点
- 严格控制 Token 数量,不会溢出;
- 实现简单、开销低、延迟稳定;
- 能保留近期上下文连贯性。
缺点
- 丢弃窗口外历史,丢失远期关键信息;
- 无法跨会话记忆、没有长期沉淀能力;
- 固定窗口不够灵活,重要旧信息也会被删掉。
适用场景
- 日常多轮闲聊、客服对话;
- 单任务短流程 Agent;
- 对延迟敏感、不需要久远历史的场景。
3)Summary 摘要记忆(压缩总结)
核心定义不保存原始完整对话,定期让 LLM自动提炼摘要、浓缩关键信息,用摘要代替原始历史塞进 Prompt。
优点
- 极大节省 Token,保留核心逻辑、舍弃冗余;
- 上下文不容易溢出,支持更长会话;
- 能保留跨轮关键意图和用户偏好。
缺点
- 摘要可能丢失细节、产生信息失真;
- 每轮摘要会额外消耗 LLM 调用成本;
- 多分支复杂对话,摘要容易逻辑错乱。
适用场景
- 长文档多轮解读、长篇创作;
- 持续多轮任务对话、办公助手;
- 需要长上下文但不想用向量库的轻量化 Agent。
4)Vector 向量记忆(RAG 式长期记忆)
核心定义把历史对话、用户信息、任务记录做Embedding 向量化,存入向量数据库;每轮提问时语义检索召回相关记忆,动态拼入上下文。
优点
- 真正实现永久长期记忆、跨会话复用;
- 按语义精准召回,不相关内容不混入 Prompt;
- 不受轮次限制,支持海量历史沉淀;
- 可做记忆增删、查询、遗忘、更新。
缺点
- 架构最重,依赖 Embedding 模型 + 向量库;
- 有额外向量存储、检索开销;
- 语义召回存在匹配不准的概率。
适用场景
- 生产级 AI Agent、私人助理;
- 需要记住用户长期偏好、历史习惯;
- 知识库问答、个性化陪伴、长期任务运维。
3. 工程级最佳组合设计
短期记忆:SlidingWindow + 局部 Summary长期记忆:Vector 向量记忆组合逻辑:
- 近期 N 轮用滑动窗口保实时连贯;
- 超长会话做摘要压缩控 Token;
- 历史久远内容向量化存入向量库;
- 每轮先向量检索相关长期记忆,再拼接短期上下文,一起给 LLM 推理。
三、破局之道
在面试中,用这段话展现架构设计深度:设计 Agent 长短期记忆,核心本质是在上下文 Token 限制、信息完整性、推理成本三者之间做平衡。
FullHistory 是最简单但不可落地,只能做 Demo;SlidingWindow 用固定窗口控制长度,保证近期对话连贯但丢失远期信息;Summary 通过大模型摘要压缩信息,在保留关键逻辑的同时降低 Token 开销;Vector 向量记忆是生产级长期记忆的标准方案,依靠语义 Embedding + 向量检索,实现海量历史永久沉淀、按需精准召回。
真正企业级 Agent 不会只用一种记忆策略,而是采用滑动窗口做短期实时上下文、摘要做长会话压缩、向量库做跨会话长期记忆的混合架构,既保证当前任务连贯,又能长期记住用户偏好,同时严格控制上下文长度与推理成本,这是工业级记忆设计的标准思路。
四、代码实现
1. Python 版本
# 1. FullHistory 完整历史 class FullHistoryMemory: def __init__(self): self.history = [] def add(self, query, resp): self.history.append({"q":query, "a":resp}) def get_context(self): # 全部历史直接拼接 return "\n".join([f"用户:{h['q']}\n助手:{h['a']}" for h in self.history]) # 2. SlidingWindow 滑动窗口 class SlidingWindowMemory: def __init__(self, window_size=5): self.history = [] self.window_size = window_size def add(self, query, resp): self.history.append({"q":query, "a":resp}) # 超出窗口截断 if len(self.history) > self.window_size: self.history = self.history[-self.window_size:] def get_context(self): return "\n".join([f"用户:{h['q']}\n助手:{h['a']}" for h in self.history]) # 3. Summary 摘要记忆 class SummaryMemory: def __init__(self): self.raw_history = [] self.summary = "" def add(self, query, resp): self.raw_history.append(f"用户:{query}\n助手:{resp}") # 每满3轮生成一次摘要 if len(self.raw_history) % 3 == 0: self.summary = llm(f"请精简总结以下对话核心内容:\n{self.raw_history}") def get_context(self): return f"对话摘要:{self.summary}\n近期对话:{self.raw_history[-2:]}" # 4. Vector 向量记忆(简化模拟) class VectorMemory: def __init__(self): self.vector_db = [] def add_memory(self, text): # 模拟 embedding 存入向量库 vec = embedding(text) self.vector_db.append({"text":text, "vec":vec}) def recall(self, query, top_k=2): # 模拟语义检索召回相关记忆 q_vec = embedding(query) # 简化:直接返回最近两条 return [item["text"] for item in self.vector_db[-top_k:]]2. JavaScript 版本
// 1. FullHistory 完整历史 class FullHistoryMemory { constructor() { this.history = []; } add(query, resp) { this.history.push({q: query, a: resp}); } getContext() { return this.history.map(h => `用户:${h.q}\n助手:${h.a}`).join("\n"); } } // 2. SlidingWindow 滑动窗口 class SlidingWindowMemory { constructor(windowSize = 5) { this.history = []; this.windowSize = windowSize; } add(query, resp) { this.history.push({q: query, a: resp}); if (this.history.length > this.windowSize) { this.history = this.history.slice(-this.windowSize); } } getContext() { return this.history.map(h => `用户:${h.q}\n助手:${h.a}`).join("\n"); } } // 3. Summary 摘要记忆 class SummaryMemory { constructor() { this.rawHistory = []; this.summary = ""; } async add(query, resp) { this.rawHistory.push(`用户:${query}\n助手:${resp}`); if (this.rawHistory.length % 3 === 0) { this.summary = await llm(`精简总结对话:${this.rawHistory}`); } } getContext() { return `摘要:${this.summary}\n近期:${this.rawHistory.slice(-2)}`; } } // 4. Vector 向量记忆 简化版 class VectorMemory { constructor() { this.store = []; } addMemory(text) { let vec = embedding(text); this.store.push({text, vec}); } recall(query, topK = 2) { return this.store.slice(-topK).map(item => item.text); } }