🧠 AI Agent 核心架构:记忆系统(Memory System)全解析与面试指南

如果说大模型(LLM)是 AI Agent 的“大脑”,工具(Tools)是“手脚”,那么**记忆系统(Memory)**就是它的“海马体”。

初学者刚接触大模型时,通常只是把它当成一个“一问一答”的维基百科。但在真实的 AI Agent 开发中,如果不解决“记忆”问题,大模型就像只有 7 秒记忆的金鱼。面试官在考察 Agent 架构时,**“如何设计和优化记忆系统”**是区分新手和高阶开发者的重要分水岭。

这篇博客将用最通俗的大白话,带你彻底搞懂 AI Agent 记忆系统的核心分类、主流工程实现方案,并附带面试级别的实战代码!


在这里插入图片描述

💡 一、 为什么 Agent 需要记忆系统?(大白话秒懂)

大语言模型(LLM)本质上是**无状态(Stateless)**的。
意思是,每一次你向 API 发送请求,对它来说都是一次“全新的人生”。它根本不记得你上一秒跟它说了什么。

为了让它能够连贯地和你聊天,我们需要在每次提问时,把历史聊天记录连同新问题一起打包发给它
但是,由于大模型有上下文长度限制(Context Window Limit),并且按 Token 收费,我们不可能把几年来的聊天记录全发给它。

因此,我们需要一个**“记忆系统”**来管理:哪些话该记住、哪些话该遗忘、哪些话该提炼、哪些话该存进数据库里随时翻阅。


🗂️ 二、 记忆系统的两大核心分类(面试必背)

工业界通常借用人类认知心理学的概念,将 Agent 的记忆分为两大类:

1. 短期记忆 (Short-Term Memory / Working Memory)

  • 概念:Agent 正在处理的当前对话上下文(Chat History)。
  • 特点:直接放入大模型的 Prompt 中,模型可以直接“看到”并理解。
  • 容量:受限于大模型的上下文窗口(比如 8K、128K Token)。
  • 类比:就像人类大脑的“工作台”,上面放着你现在正在思考的文件。

2. 长期记忆 (Long-Term Memory)

  • 概念:Agent 存储的海量历史信息和外部知识。
  • 特点:不能一次性全塞给大模型,通常需要将文本向量化(Embedding)后存入向量数据库(Vector DB)。只有当当前对话需要用到时,才通过检索(RAG 技术)提取出来放到工作台上。
  • 容量:理论上无限大(取决于你的硬盘和数据库大小)。
  • 类比:就像人类的“档案馆”或“图书馆”。

⚙️ 三、 短期记忆的四大工程优化策略(面试实战)

既然短期记忆容量有限,当对话越来越长时,我们该怎么处理 Chat History?

  1. 全量记忆(Buffer Memory)
    简单粗暴,把所有对话原封不动保留。仅适用于极短的单次任务。
  2. 滑动窗口记忆(Window Memory)
    只保留最近的 N 轮对话(比如最近 5 轮),把更早的对话直接丢弃。适合闲聊机器人,代码实现极简,成本低。
  3. 摘要记忆(Summary Memory)
    当对话长度达到一定阈值时,在后台悄悄调一个小模型,把之前的对话提炼成一段摘要,替换掉长长的原始聊天记录。既保留了核心信息,又极大节省了 Token。
  4. 实体/知识图谱记忆(Entity/KG Memory)
    在对话过程中,专门抽取用户特征(如“用户叫张三”、“喜欢吃辣”),提取成 Key-Value 格式存入系统。这是高级个人助理必备的能力。

🎯 四、 高频面试 Q&A 实战演练

Q1:现在的大模型(如 GPT-4o, Claude 3.5)都已经支持 128K 甚至 200K 的超长上下文了,我们还需要费劲做“长期记忆(向量数据库)”吗?

标准答案
绝对需要!虽然长上下文模型能装下很多内容,但存在三大致命缺陷:

  1. 成本极其高昂:每次提问都要把 100K 的背景资料发给模型,按 Token 计费分分钟破产。
  2. 首字延迟(TTFT)巨大:模型阅读大量文本需要很长的预填充时间,用户体验极差。
  3. 中间遗忘现象(Lost in the Middle):当上下文过长时,大模型极容易忽略掉放在中间位置的信息。
    因此,**“短期记忆(滑动窗口) + 长期记忆(向量检索 RAG)”**依然是目前兼顾成本、速度和准确度的工业界唯一标准解法。

Q2:如果用户的提问既需要结合最近的聊天上下文,又需要查阅长期记忆库,你怎么设计这个流程?

标准答案
这是典型的 Query Rewrite(查询改写) 场景。
如果用户突然说“那它的价格是多少?”,这里的“它”指代不明,直接去查长期记忆(数据库)肯定查不到。
必须先增加一个步骤:利用“短期记忆(历史对话)”加上“当前提问”,让大模型改写出一个完整、独立的检索词(比如:“苹果 iPhone 15 的价格是多少?”)。然后再用这个改写后的独立 Query 去查长期记忆库。


💻 五、 面试加分代码:手写一个融合“长短期记忆”的 Agent 核心类

在面试白板环节,如果你能用纯 Python 数据结构展示长短期记忆的协同工作原理,会让面试官眼前一亮!

from collections import deque
import json

class AgentMemorySystem:
    """
    工业级 Agent 记忆系统核心骨架 (概念代码)
    包含了 短期记忆(滑动窗口) 和 长期记忆(模拟向量检索) 的结合。
    """
    def __init__(self, window_size=5):
        # ==========================================
        # 1. 短期记忆 (Short-Term Memory)
        # ==========================================
        # 使用 deque (双端队列) 天然实现滑动窗口机制,限制最大长度为 window_size
        self.short_term_memory = deque(maxlen=window_size)
        
        # ==========================================
        # 2. 长期记忆 (Long-Term Memory)
        # ==========================================
        # 这里用字典模拟真实的向量数据库 (Vector DB)
        self.long_term_memory_db = {
            "公司的年假规定": "入职满一年可享受5天年假,满三年可享受10天。",
            "报销流程": "请在每月25号前将发票交至财务部李雷处。"
        }
        
    def add_conversation(self, role: str, content: str):
        """将最新的对话存入短期记忆的滑动窗口中"""
        self.short_term_memory.append({"role": role, "content": content})
        
    def retrieve_long_term_memory(self, query: str) -> str:
        """
        模拟长期记忆检索 (真实环境中这里是 Embedding + 余弦相似度计算)
        """
        print(f"🔍 [触发长期记忆检索] 正在资料库中寻找关于 '{query}' 的信息...")
        # 简单的关键字命中模拟
        for key, knowledge in self.long_term_memory_db.items():
            if key in query:
                return knowledge
        return "未在长期记忆中找到相关信息。"

    def generate_prompt(self, current_user_input: str) -> str:
        """
        核心逻辑:在每次调用大模型前,如何拼装包含记忆的最终 Prompt
        """
        # 第一步:根据当前问题,去长期记忆中找线索(知识增强)
        retrieved_knowledge = self.retrieve_long_term_memory(current_user_input)
        
        # 第二步:提取短期记忆(最近的聊天记录)
        chat_history_str = "\n".join(
            [f"{msg['role']}: {msg['content']}" for msg in self.short_term_memory]
        )
        
        # 第三步:拼装最终发给大模型的完整 Prompt
        final_prompt = f"""
        你是一个智能助手,请结合以下【背景知识】和【历史聊天记录】,回答用户的最新问题。
        
        【背景知识】(来自长期记忆库):
        {retrieved_knowledge}
        
        【历史聊天记录】(来自短期记忆滑动窗口):
        {chat_history_str}
        
        【用户的最新提问】:
        {current_user_input}
        """
        
        return final_prompt

# ==========================================
# 面试现场演示运行
# ==========================================
if __name__ == "__main__":
    agent_memory = AgentMemorySystem(window_size=3) # 只记住最近 3 条
    
    # 模拟历史对话填入短期记忆
    agent_memory.add_conversation("user", "你好,我是新员工张三。")
    agent_memory.add_conversation("assistant", "你好张三!欢迎加入公司,有什么我可以帮你的?")
    agent_memory.add_conversation("user", "我平时喜欢打篮球。") # 这一条会被推入队列末尾
    
    # 用户提出新问题,触发长短期记忆联动
    new_question = "对了,公司的年假规定是怎样的?"
    
    # 生成最终发给 LLM 的 Prompt
    prompt_to_llm = agent_memory.generate_prompt(new_question)
    
    print("\n========== 最终组装的 Prompt (发给大模型的内容) ==========")
    print(prompt_to_llm)
    
    # 💡 面试讲解要点:
    # "通过这个双端队列,我们保证了 Prompt 的长度永远不会爆炸(解决了 Token 成本问题)。
    # 同时,当用户问到具体的规章制度时,系统自动去长期记忆(模拟的 DB)里捞出了答案拼接进去。
    # 这就是目前企业落地时最典型、最轻量级的 Agent 记忆管理架构。"
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐