一道经典的 AI Agent 面试题是:如何设计一个可长期陪伴用户的智能助理?

很多回答会先谈模型选型、工具调用、RAG、任务规划和多 Agent 协作。但真正拉开差距的问题是:

它如何记住用户的长期偏好?如何复用过去的成功经验?如何避免重复犯同样的错误?又如何判断哪些信息该忘掉?

这才是 Agent 设计中的关键分水岭。

没有记忆,Agent 只能完成一次性问答或单轮任务;拥有良好记忆系统,Agent 才能形成连续理解、个性化响应和持续成长能力。

所以,记忆不是简单的历史记录存储,而是 Agent 理解上下文、积累经验、选择行动的核心机制。某种意义上,它决定了 Agent 是否真正“像一个长期协作的智能体”。

一、人类记忆模型对 Agent 设计的启示

设计 Agent 记忆时,一个常见误区是将“记忆”等同于数据库:把对话、文档、日志全部塞进去,检索时再查出来。

但人类的记忆并不是一个无限容量的硬盘。认知科学通常将记忆分为工作记忆、情景记忆和语义记忆。这个分类对 Agent 设计非常有启发。

1. 工作记忆:当前任务中的临时上下文

工作记忆可以理解为人脑当下正在处理的信息。比如你在解一道题时,脑中同时保留题目条件、中间推理步骤和目标答案。

对应到 Agent 中,工作记忆就是当前会话上下文、任务状态、当前工具返回结果、正在执行的计划等。它的特点是容量有限、更新频繁、强依赖当前任务。

这也是为什么大模型的上下文窗口如此关键。窗口越大,Agent 能同时“看见”的信息越多;但窗口不是无限的,成本和噪声也会随之上升。

2. 情景记忆:具体经历和事件

情景记忆是“我曾经经历过什么”。例如用户上次说他喜欢简洁风格,某次任务调用接口失败,某个项目曾经有过上线事故。

在Agent中,情景记忆对应的是具体交互记录、任务轨迹、工具调用历史、用户偏好事件等。它通常带有时间、地点、对象、行为和结果。

这类记忆适合用向量数据库存储,因为很多时候我们不是精确查找某一句话,而是根据语义相似度找“和当前问题相关的过去经历”。

3. 语义记忆:抽象知识和稳定概念

语义记忆是“我知道什么”。例如“Redis 是内存数据库”“这个用户是金融行业 CTO”“某公司内部系统 A 依赖系统 B”。

与情景记忆不同,语义记忆更稳定、更抽象,往往是从大量经验中沉淀出来的知识。它适合用结构化方式表达,例如知识图谱、关系数据库或实体关系网络。

一个成熟的 Agent 不应该只记流水账,还应该能从多次经历中提炼规律:用户偏好什么、项目风险在哪里、哪些操作不应该重复。


二、短期记忆实现方案

短期记忆对应人类的工作记忆,核心问题是:如何在有限上下文中保持任务连续性?

常见方案有四类。

1. 上下文窗口:最直接但最昂贵

最简单的方法是把最近的对话、任务步骤和工具结果全部放进 prompt,让模型直接读取。

优点是实现简单、信息完整;缺点也明显:上下文越长,成本越高,噪声越多,而且很容易触及模型窗口上限。

对于轻量级聊天机器人,这种方式足够;但对于多轮任务型 Agent,仅靠上下文堆叠很快会失控。

2. 滑动窗口:只保留最近 N 轮

滑动窗口是工程上最常见的短期记忆策略。它只保留最近若干轮对话或最近若干步任务状态。

例如只保留最近 10 条消息:

short_memory = messages[-10:]

这种方式简单高效,适合强时效任务。但它的问题在于:早期的重要信息可能被挤掉。比如用户一开始说“回答要用英文”,后续 20 轮之后这条偏好被移除,Agent 就可能忘记。

3. 缓存:保存中间状态和工具结果

对于复杂 Agent,短期记忆不只是对话,还包括任务状态。例如:

  • 当前计划执行到哪一步
  • 哪些工具已经调用过
  • API 返回了什么结果
  • 哪些路径已经失败

这些内容可以放在内存缓存、Redis 或本地状态对象中,供后续推理使用。

task_state = {
    "goal": "生成竞品分析报告",
    "finished_steps": ["收集官网信息", "抓取价格页"],
    "failed_tools": ["search_api_v1"],
    "next_step": "整理功能对比"
}

这类缓存更像 Agent 的“临时工作台”,不一定长期保存,但对当前任务非常关键。

4. 滚动摘要与压缩:用摘要延长记忆寿命

当对话变长时,可以把早期内容压缩成摘要,只保留关键信息,再与最近上下文组合。

例如:

历史摘要:
用户是 B 端 SaaS 产品负责人,偏好结构化输出;
本次任务目标是完成一篇关于 Agent 记忆系统的技术文章;
用户要求控制在 1500-3000 字,并面向 AI 工程师。

这种方式的关键是摘要质量。摘要不是越短越好,而是要保留对未来决策有影响的信息:目标、约束、偏好、已完成动作、重要结论。

短期记忆的本质,是在容量和上下文连续性之间做权衡。


三、长期记忆实现方案

如果说短期记忆解决“当前任务不断片”,长期记忆解决的就是“Agent 能不能成长”。

长期记忆至少应区分两类:情景记忆和语义记忆。

1. 用向量数据库存储情景记忆

情景记忆关注具体经历,适合以文本片段加元数据的方式存储:

{
  "content": "用户曾表示希望技术文章少讲概念,多给工程实现。",
  "metadata": {
    "user_id": "u123",
    "type": "preference",
    "time": "2025-01-10",
    "importance": 0.85
  }
}

经过 embedding 后写入向量数据库,如 FAISS、Milvus、Weaviate、Chroma 等。检索时根据当前任务生成查询向量,召回语义相近的历史片段。

这种方式适合处理:

  • 用户历史偏好
  • 项目执行经验
  • 历史对话片段
  • 工具调用结果
  • 失败案例复盘

2. 用知识图谱存储语义记忆

语义记忆更适合结构化存储。例如:

用户A - 属于 -> 金融行业
用户A - 偏好 -> 简洁结论先行
系统X - 依赖 -> 数据库Y
任务T - 风险点 -> 权限不足

知识图谱的优势在于关系清晰、可解释性强,适合做推理和约束。例如当 Agent 要执行数据库变更时,如果图谱中知道“系统 X 依赖数据库 Y”,它就应该更加谨慎,甚至主动提醒风险。

向量数据库擅长“相似性召回”,知识图谱擅长“关系推理”。二者不是替代关系,而是互补关系。

3. 记忆合并与分层

长期记忆不能无限写入,否则会出现冗余、冲突和噪声。

一个可行的设计是分层:

  • 原始事件层:保存具体对话、工具调用、任务结果
  • 摘要经验层:将多次事件压缩为经验
  • 抽象知识层:沉淀为稳定偏好、规则和实体关系

例如,用户多次要求“先给结论,再解释原因”,系统不应该每次都保存一条重复事件,而应该合并成一条语义记忆:

用户偏好:回答采用“结论先行 + 分点解释”的结构。

这就是从情景记忆向语义记忆的转化,也是 Agent 从“记录”走向“理解”的关键。


四、记忆的写入、检索与遗忘设计

很多 Agent 记忆系统失败,不是因为不会存,而是因为“不知道存什么、什么时候取、什么时候忘”。

1. 写入:不是所有信息都值得记住

记忆写入需要优先级判断。常见维度包括:

  • 重要性:是否影响未来决策
  • 稳定性:是否是长期偏好或规律
  • 新颖性:是否与已有记忆不同
  • 结果价值:是否来自成功或失败经验
  • 用户显式指令:用户是否要求“记住”

例如“今天北京下雨”对多数任务不重要,但“用户要求以后所有报告都用英文摘要”就应该被记录。

2. 检索:注意力加权,而不是简单相似度

向量检索通常按相似度召回,但相似不等于有用。一个更好的排序公式可以综合多种因素:

score = α * similarity
      + β * importance
      + γ * recency
      + δ * emotional_weight

其中:

  • similarity 表示语义相关性
  • importance 表示记忆重要程度
  • recency 表示时间新近程度
  • emotional_weight 可理解为情绪或风险强度,例如失败、投诉、强偏好等

对于技术 Agent 来说,“情感加权”不一定是情绪识别,也可以是业务强度加权。比如生产事故、用户明确不满、严重错误,都应该获得更高检索权重。

3. 遗忘:记忆系统的核心能力

遗忘不是缺陷,而是智能的一部分。

如果 Agent 永远不忘,它会被过期信息、重复信息和低价值信息拖垮。遗忘机制一般分为两类。

主动遗忘

主动遗忘是根据规则清理或降权记忆,例如:

  • 时间衰减:越久远的普通记忆权重越低
  • 低重要性清理:长期未使用的低价值记忆删除
  • 冲突更新:新偏好覆盖旧偏好
  • 合并压缩:多条相似记忆合并为一条
被动遗忘

被动遗忘来自容量限制。比如上下文窗口放不下、缓存空间有限、向量库超过阈值时需要淘汰部分内容。

短期记忆中的滑动窗口就是典型被动遗忘;长期记忆中的归档、冷存储、删除策略也是被动遗忘。

一个好的 Agent 不是“记得越多越好”,而是“该记的记住,该忘的忘掉”。


五、案例分析——LangChain / CrewAI 中的记忆实现

下面用简化代码看一下常见框架中的记忆实现方式。

1. LangChain:对话记忆与向量记忆结合

早期 LangChain 中常见的方式是使用 ConversationBufferMemory 保存对话历史:

from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")

memory = ConversationBufferMemory(
    memory_key="history",
    return_messages=True
)

chain = ConversationChain(
    llm=llm,
    memory=memory
)

chain.invoke({"input": "请记住,我偏好结论先行的回答方式。"})
chain.invoke({"input": "帮我写一段技术方案说明。"})

这种方式适合短期对话连续性,但如果会话很长,就需要引入摘要或向量检索。

例如把关键记忆写入向量库:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
vectorstore = Chroma(
    collection_name="agent_memory",
    embedding_function=embeddings
)

vectorstore.add_texts(
    texts=["用户偏好结论先行、分点展开的技术表达方式。"],
    metadatas=[{"type": "preference", "importance": 0.9}]
)

docs = vectorstore.similarity_search(
    "如何组织技术文章回答?",
    k=3
)

更合理的 Agent 架构通常会把两者结合:

  • Buffer / Window Memory 负责当前上下文
  • Summary Memory 负责压缩长对话
  • Vector Memory 负责长期经验召回
  • 外部数据库负责结构化用户画像和业务实体

2. CrewAI:以任务协作为核心的记忆

CrewAI 更强调多 Agent 协作,可以通过开启 memory 让团队在执行任务时保留上下文和经验。

示例:

from crewai import Agent, Task, Crew

researcher = Agent(
    role="AI Researcher",
    goal="分析 Agent 记忆系统的工程实现",
    backstory="擅长 LLM 应用架构和 RAG 系统设计"
)

writer = Agent(
    role="Technical Writer",
    goal="将研究内容整理成技术文章",
    backstory="擅长面向工程师写作"
)

task = Task(
    description="撰写一篇关于 Agent 记忆设计的技术文章",
    expected_output="结构完整、包含实践建议的文章初稿",
    agent=writer
)

crew = Crew(
    agents=[researcher, writer],
    tasks=[task],
    memory=True
)

result = crew.kickoff()

CrewAI 的思路更接近“团队记忆”:不同角色在协作过程中共享任务背景、执行结果和经验。它适合多 Agent 工作流,但如果要做更精细的长期记忆管理,仍然建议接入外部向量数据库、关系数据库或知识图谱。

简单来说,LangChain 更适合搭建可控的记忆组件,CrewAI 更适合构建协作型 Agent 的任务记忆。实际项目中,两者背后的思想是一致的:短期记忆保证当前任务不断线,长期记忆让系统持续成长。


结论:Agent 记忆的未来,不只是“存更多”

未来 Agent 记忆系统会沿着三个方向演进。

第一,多模态记忆。Agent 不只记文本,还会记图片、语音、视频、操作轨迹和环境状态。对于机器人、智能办公和自动驾驶类场景,多模态记忆会成为基础能力。

第二,元记忆。人类不仅拥有记忆,还知道“自己记得什么、不确定什么、需要查什么”。Agent 也需要类似能力:判断某条记忆是否可靠,知道什么时候应该检索,什么时候应该向用户确认。

第三,记忆与工具调用协同。真正有用的记忆,不只是拿来聊天,而是影响行动。比如 Agent 记得某个 API 曾经失败,就自动换备用接口;记得用户偏好保守策略,就在执行高风险操作前主动确认。

回到开头的问题:为什么记忆是 Agent 的“灵魂”?

因为模型决定了 Agent 的语言能力,工具决定了它能做什么,而记忆决定了它是谁、经历过什么、会如何成长。

如果只是把历史记录塞进数据库,那只是工程堆叠;如果能借鉴人类认知机制,区分短期与长期、情景与语义、记住与遗忘,Agent 才可能从“会回答问题”走向“能持续协作”。这也正是下一代智能体架构真正值得投入的方向。

核心观点:

  • 短期记忆对应工作记忆,可采用滑动窗口、缓存或滚动摘要实现,关键在于容量与上下文连续性
  • 长期记忆需区分情景记忆(具体经验)和语义记忆(抽象知识),分别用向量数据库和知识图谱存储
  • 遗忘机制是记忆系统的核心,需设计主动遗忘(优先级、时间衰减)和被动遗忘(容量限制)策略
  • 记忆检索应结合注意力机制与情感加权,提升相关性和决策质量
  • 认知启发设计可避免纯工程堆叠,使 Agent 记忆更接近人类智能
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐