当前位置: 首页 > news >正文

【AI面试临阵磨枪-30】如何设计 Agent 长短期记忆?对比 FullHistory、SlidingWindow、Summary、Vector 记忆

一、面试题目

面试官:请你讲解如何设计 AI Agent 的长期记忆与短期记忆架构?并对比 FullHistory、SlidingWindow、Summary 摘要记忆、Vector 向量记忆四种记忆方案的原理、优缺点及适用场景。

二、知识储备

1. Agent 长短期记忆整体设计思路

短期记忆(Short-Term Memory)

  • 定位:当前任务会话上下文,生命周期仅限单次对话 / 当前任务。
  • 作用:保存实时对话轮次、当前执行状态、临时中间结果,给模型提供即时上下文。
  • 特点:低延迟、直接塞入 Prompt、容量小、随会话销毁

长期记忆(Long-Term Memory)

  • 定位:跨会话永久沉淀知识,用户偏好、历史习惯、过往任务记录、业务经验。
  • 作用:跨轮、跨天、跨会话复用,让 Agent 越用越懂用户。
  • 特点:持久化存储、需要检索筛选、不全部塞进 Prompt、按需召回

整体架构设计

  1. 对话实时内容进短期记忆
  2. 定时 / 任务结束后提炼关键信息,沉淀到长期记忆
  3. 每轮推理前,从长期记忆检索相关内容,拼接到短期上下文;
  4. 控制总 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 向量记忆组合逻辑:

  1. 近期 N 轮用滑动窗口保实时连贯;
  2. 超长会话做摘要压缩控 Token;
  3. 历史久远内容向量化存入向量库;
  4. 每轮先向量检索相关长期记忆,再拼接短期上下文,一起给 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); } }
http://www.jsqmd.com/news/721655/

相关文章:

  • 智能客服语音合成优化:SOA架构与上下文感知实践
  • 数据中心RDMA网络实战:手把手教你配置PFC和ECN,搞定RoCEv2零丢包
  • Python实战:用gmssl库5分钟搞定SM2/SM3/SM4国密算法加密与签名
  • 如何在 Linux 服务器安装 claude code,并在 VSCode 里使用
  • 告别Abaqus脚本开发困境:5大方法让Python类型提示提升你的仿真效率 [特殊字符]
  • 35岁+突围计划3.0
  • 【AI面试临阵磨枪-029】什么是 Function Calling?与手动解析 LLM 输出的区别?
  • 如何用PowerToys中文版彻底改变你的Windows工作流:从效率瓶颈到生产力飞跃
  • 你的GPS定位漂移吗?基于STM32 HAL库的ATGM336H数据滤波与有效性判断实践
  • Gemma 4工具调用:Python实现大语言模型自动化任务处理
  • 终极破解工具:3步实现Cursor AI无限免费使用,告别API限制困扰
  • 构建情侣专属任务积分系统:从零实现微信小程序互动平台
  • 关于北理课程的反差错乱
  • 别再被‘Bad CRC-32’卡住了!PyTorch安装报错终极排查手册(附--no-cache参数详解)
  • 别再到处找资源了!JEDEC JESD22全套标准(含最新A118、B118)下载与分类管理指南
  • 基于模块化架构的AI应用后端开发:从向量检索到LLM编排的工程实践
  • SpringBoot项目里用Camunda 7.18搞流程审批?这份避坑指南和实战代码请收好
  • 10、 H桥电路与电机方向控制
  • 破解 AI 幻觉困局:Easysearch 以检索技术筑牢大模型“可信防线”
  • 别再被ModuleNotFoundError卡住!Python处理Excel文件,openpyxl、pandas、xlrd到底该用哪个?
  • 别再乱打光了!Blender 3.6+ 灯光保姆级设置指南:从环境光到IES遮罩,一次讲透
  • R语言偏见检测耗时超47分钟?用data.table+Rcpp无缝加速——3个编译级优化技巧让AUC偏差归因提速8.2倍
  • AI规则同步器:用代码管理思维统一多平台提示词与指令集
  • 避坑指南:在C# WinForm项目中使用NModbus4实现RTU从站时,这几个异步和资源管理问题你遇到了吗?
  • 别再死记硬背了!用这5个真实项目场景,彻底搞懂ESP8266 AT指令怎么用
  • 如何用猫抓资源嗅探工具彻底改变你的数字内容管理体验
  • 无人机视频处理挑战与GE ICS-8580多速率压缩方案
  • 终极指南:如何彻底解决Cursor API限制,实现无限免费使用Pro功能
  • 方阵贪吃蛇的必胜策略
  • 别再死记硬背公式了!用Python+SymPy手把手推导状态空间平均法(以Buck电路为例)