ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【三个月 AI Agent 实战学习】Day 36 :记忆机制入门 —— 短期记忆 vs 长期记忆

【三个月 AI Agent 实战学习】Day 36 :记忆机制入门 —— 短期记忆 vs 长期记忆

Day 36 :记忆机制入门 —— 短期记忆 vs 长期记忆

欢迎来到第三十六天!从今天起,我们正式进入第三阶段——记忆机制与真实世界工具。在前面的学习中,我们已经初步接触了短期记忆(对话历史管理),但一个真正智能的 Agent 不仅需要记住当前对话,还需要在跨越多次会话后依然记得用户的偏好、历史问题和重要信息。这就是长期记忆的价值。今天我们将深入理解短期记忆与长期记忆的区别,并设计一个“带记忆的客服 Agent”的架构蓝图。


一、今日学习目标

  1. 清晰区分短期记忆(Short-term Memory)和长期记忆(Long-term Memory)的概念、存储方式和适用场景。
  2. 理解人类记忆系统对 AI Agent 设计的启发:感觉记忆、工作记忆、长期记忆。
  3. 掌握 Agent 记忆系统的核心组件:存储、检索、更新、遗忘。
  4. 学会设计一个带记忆的客服 Agent 的架构,明确短期记忆和长期记忆各自承担的角色。
  5. 完成记忆系统的技术选型:短期记忆用消息列表/摘要,长期记忆用向量数据库 + 结构化存储。

二、详细实现步骤

步骤 1:理解短期记忆与长期记忆的区别

短期记忆(Short-term Memory):

  • 定义:当前会话内的上下文信息,包括用户说的话、Agent 的回复、工具调用结果等。
  • 存储方式:内存中的消息列表(messages),或 LangChain 的ConversationBufferMemory。
  • 生命周期:会话结束后通常丢弃(除非持久化到长期记忆)。
  • 容量限制:受上下文窗口限制(如 64K Token),需要裁剪或摘要。
  • 作用:保证当前对话的连贯性,让 Agent 理解上下文指代(如“它”、“那个订单”)。

长期记忆(Long-term Memory):

  • 定义:跨越多次会话持久保存的信息,如用户姓名、偏好、历史订单、常见问题等。
  • 存储方式:向量数据库(语义记忆)、关系型数据库(结构化记忆)、键值存储(简单事实)。
  • 生命周期:长期保留,除非主动删除或过期。
  • 容量限制:理论上无限,但需要索引和检索策略。
  • 作用:让 Agent 认识老用户、记住历史问题、提供个性化服务。

类比:

  • 短期记忆 = 你正在和客服聊天时记住的当前对话内容。
  • 长期记忆 = 客服系统中保存的你的用户档案、历史工单记录。
步骤 2:人类记忆系统对 Agent 的启发

认知心理学将人类记忆分为:

  • 感觉记忆:瞬时感官输入(Agent 中对应原始输入)。
  • 工作记忆:当前正在处理的信息(对应短期记忆/上下文窗口)。
  • 长期记忆:分为:
    • 情景记忆:个人经历和事件(对应 Agent 的对话历史存档)。
    • 语义记忆:事实和概念(对应 Agent 的知识库和用户画像)。
    • 程序记忆:技能和习惯(对应 Agent 的工具使用模式)。

我们的 Agent 记忆系统可以借鉴这个框架:

  • 工作记忆= 当前对话的消息列表。
  • 情景记忆= 存储每次会话的摘要或关键事件。
  • 语义记忆= 用户画像(偏好、事实)+ 知识库(RAG)。
步骤 3:Agent 记忆系统的核心组件

一个完整的记忆系统需要以下组件:

  1. 存储(Storage):

    • 短期:消息列表(内存)。
    • 长期:向量数据库(Chroma、FAISS)、SQL 数据库(SQLite、PostgreSQL)、键值存储(Redis)。
  2. 检索(Retrieval):

    • 短期:直接读取消息列表。
    • 长期:根据当前问题,用 Embedding 检索最相关的记忆片段。
  3. 更新(Update):

    • 短期:每轮对话追加消息。
    • 长期:从对话中抽取新事实,更新用户画像或存入向量库。
  4. 遗忘(Forgetting):

    • 短期:滑动窗口、摘要压缩。
    • 长期:设置过期时间、重要性评分、定期清理。
步骤 4:设计带记忆的客服 Agent 架构

我们以“电商客服 Agent”为例,设计一个完整的记忆架构。

场景:用户咨询订单问题,客服 Agent 需要:

  • 记住当前对话中的订单号、问题描述(短期记忆)。
  • 识别老用户,知道他的历史投诉记录、偏好(长期记忆)。
  • 查询订单数据库、物流 API(工具调用)。
  • 生成个性化、连贯的回复。

架构图(文字描述):

用户输入 │ ▼ ┌─────────────────────────────────────────┐ │ 记忆管理器(Memory Manager) │ │ ┌─────────────┐ ┌─────────────────┐ │ │ │ 短期记忆 │ │ 长期记忆 │ │ │ │ (消息列表) │ │ (向量库+SQL) │ │ │ └─────────────┘ └─────────────────┘ │ │ │ │ │ │ └────────┬───────────┘ │ │ ▼ │ │ 上下文组装器(Context Builder) │ │ (短期历史 + 相关长期记忆 + 用户画像) │ └─────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────┐ │ Agent 核心 │ │ (LLM + 工具 + ReAct 循环) │ │ 工具:查订单、查物流、创建工单 │ └─────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────┐ │ 记忆更新器(Memory Updater) │ │ - 追加短期消息 │ │ - 抽取新事实,更新长期记忆 │ └─────────────────────────────────────────┘ │ ▼ 用户回复

关键设计决策:

  1. 短期记忆:使用ConversationBufferWindowMemory,保留最近 10 轮对话,超出部分摘要。
  2. 长期记忆-用户画像:使用 SQLite 存储结构化信息(用户 ID、姓名、偏好、历史工单 ID)。
  3. 长期记忆-历史事件:使用 Chroma 向量库存储每次会话的摘要,检索时根据当前问题匹配。
  4. 记忆抽取:每轮对话后,用 LLM 从用户输入中抽取新事实(如“我的订单号是 12345”),更新短期记忆;会话结束后,生成会话摘要存入长期记忆。
  5. 检索策略:每次用户输入时,先用短期记忆组装上下文,再从长期记忆中检索相关用户画像和历史事件,一起注入提示词。
步骤 5:技术选型与代码骨架

短期记忆:

fromlangchain.memoryimportConversationBufferWindowMemory short_term_memory=ConversationBufferWindowMemory(k=10,# 保留最近 10 轮return_messages=True)

长期记忆-向量存储:

fromlangchain_community.vectorstoresimportChromafromlangchain_openaiimportOpenAIEmbeddings embeddings=OpenAIEmbeddings(model="embedding-2",api_key=os.getenv("ZHIPU_API_KEY"),base_url="https://open.bigmodel.cn/api/paas/v4")long_term_vectorstore=Chroma(collection_name="user_memories",embedding_function=embeddings,persist_directory="./memory_db")

长期记忆-结构化存储:

importsqlite3definit_user_db():conn=sqlite3.connect("users.db")conn.execute(""" CREATE TABLE IF NOT EXISTS user_profile ( user_id TEXT PRIMARY KEY, name TEXT, preferences TEXT, last_order_id TEXT, complaint_count INTEGER DEFAULT 0 ) """)conn.commit()returnconn

记忆管理器骨架:

classMemoryManager:def__init__(self,user_id):self.user_id=user_id self.short_term=ConversationBufferWindowMemory(k=10,return_messages=True)self.vectorstore=long_term_vectorstore self.conn=init_user_db()defget_context(self,query:str)->str:"""组装上下文:短期历史 + 相关长期记忆 + 用户画像"""# 1. 短期历史short_history=self.short_term.load_memory_variables({})["history"]# 2. 检索相关长期记忆relevant_memories=self.vectorstore.similarity_search(query,k=3,filter={"user_id":self.user_id})# 3. 获取用户画像cursor=self.conn.execute("SELECT name, preferences, last_order_id, complaint_count FROM user_profile WHERE user_id = ?",(self.user_id,))profile=cursor.fetchone()return{"short_history":short_history,"relevant_memories":[m.page_contentforminrelevant_memories],"user_profile":profile}defupdate(self,user_input:str,ai_response:str):"""更新记忆"""# 更新短期记忆self.short_term.chat_memory.add_user_message(user_input)self.short_term.chat_memory.add_ai_message(ai_response)# 抽取事实并更新长期记忆(后续课程实现)# self._extract_and_store_facts(user_input, ai_response)defsave_session_summary(self):"""会话结束时,生成摘要存入向量库"""# 后续课程实现pass
步骤 6:明确后续学习路线

今天的任务是理解架构和完成技术选型。接下来的几天我们将逐步实现:

  • Day 37-38:深入 Embedding 和向量数据库,优化检索策略。
  • Day 39-40:实现记忆抽取——从对话中提取结构化事实。
  • Day 41-42:实现记忆更新和遗忘机制。
  • Day 43-45:整合所有组件,完成带记忆的客服 Agent。

三、常见问题与调试

Q1:短期记忆和长期记忆的边界在哪里?
→ 短期记忆是当前会话的上下文,长期记忆是跨会话的持久信息。判断标准:如果这个信息在下次用户来访时仍然有用,就应该存入长期记忆。

Q2:长期记忆用向量库还是 SQL?
→ 两者结合使用。结构化信息(姓名、订单号、偏好标签)用 SQL 存储,便于精确查询和更新;非结构化信息(对话摘要、事件描述)用向量库存储,便于语义检索。

Q3:如何避免长期记忆过多导致检索质量下降?
→ 需要遗忘机制:设置记忆的过期时间、重要性评分,定期清理低价值记忆。也可以限制每个用户存储的记忆数量上限。

Q4:用户隐私如何保护?
→ 长期记忆涉及用户数据,需要:

  • 明确告知用户数据用途。
  • 提供删除记忆的接口。
  • 敏感信息加密存储。
  • 遵守相关法律法规(如 GDPR)。

Q5:记忆抽取会不会增加很多成本?
→ 每轮对话后调用 LLM 抽取事实会增加 API 调用次数。可以优化:只在会话结束时抽取一次,或者使用更小的模型专门做抽取。也可以让主 LLM 在生成回复的同时输出结构化记忆。

Q6:如何评估记忆系统的效果?
→ 设计测试用例:用户在不同会话中询问相同偏好(如“我喜欢科幻”),观察 Agent 是否能在后续会话中记住并应用。统计记忆命中率和用户满意度。


四、今日总结与作业

今天你完成了:

  • ✅ 清晰区分了短期记忆和长期记忆的概念、存储方式和作用。
  • ✅ 了解了人类记忆系统对 Agent 设计的启发。
  • ✅ 掌握了 Agent 记忆系统的四个核心组件:存储、检索、更新、遗忘。
  • ✅ 设计了带记忆的客服 Agent 的完整架构。
  • ✅ 完成了技术选型,并搭建了代码骨架。

今日作业(必做):

  1. 画出你自己的“带记忆客服 Agent”架构图(可以用文字或工具如 draw.io),标注每个模块的功能和数据流向。
  2. 思考并回答:在你的客服场景中,哪些信息属于短期记忆?哪些属于长期记忆?请各列举 5 条。
  3. 实现MemoryManager类的基础版本,包括get_context和update方法(可以先用模拟数据,不调用真实向量库)。
  4. (思考题)如果用户说“我不喜欢之前推荐的那款产品”,你如何设计记忆更新逻辑?请描述你的方案。

明日预告:我们将深入学习 Embedding 和向量数据库的进阶用法,包括如何为长期记忆设计高效的检索策略,以及如何选择合适的 Embedding 模型。

有任何问题欢迎随时提问!

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进