Episodic Memory
AI 中的情景记忆会存储智能体过去的具体经历及其上下文,并在之后检索这些经历,应用场景从强化学习回放到 LLM 智能体记忆。
人工智能中的情景记忆,是对智能体特定过往经历的存储;每段经历都保留了事件内容、地点和时间等上下文,供智能体日后检索,以辅助当前决策。这个术语源自心理学,Endel Tulving 于 1972 年区分了情景记忆(对个人事件的回忆)和语义记忆(对事实的一般知识)。在 AI 中,情景记忆表现为智能体运行期间写入的外部存储:强化学习智能体保存过往状态转移和回报,基于语言模型构建的 AI 智能体记录之前的对话和操作,机器人及可穿戴助手则记录摄像头曾经拍到的内容。
情景记忆、语义记忆和程序性记忆#
训练好的神经网络将一般知识存储在模型权重中,而权重只会在训练期间改变;因此,要记住昨天发生的某件具体事情,就需要一个能在运行时写入的独立存储。Theodore Sumers、Shunyu Yao、Karthik Narasimhan 和 Thomas Griffiths 于 2023 年提出了语言智能体认知架构(CoALA)框架,将心理学中的类别映射到大型语言模型(LLM)智能体上。工作记忆是当前提示,情景记忆保存智能体的过往经历,语义记忆保存关于世界的事实,程序性记忆则以模型权重和智能体代码的形式保存技能。
具有情景记忆的智能体每一步都会读取并写入记忆:
强化学习中的情景记忆#
Long-Ji Lin 于 1992 年提出的经验回放,是最简单的情景存储:智能体保存状态转移,并从中随机抽样进行训练。2015 年学会玩 Atari 游戏的 DQN 智能体保存了最近的 100 万次状态转移。情景控制则直接利用存储来采取行动。Charles Blundell 和 DeepMind 同事于 2016 年提出的无模型情景控制,会记录每个状态和动作曾获得的最佳回报,并根据记忆中的最近邻估计新状态的价值,因此在训练早期比 DQN 学得更快。DeepMind 于 2020 年推出的 Never Give Up 智能体会因到达当前情节记忆中所有记录状态都很远的状态而奖励自己;这种探索奖励帮助其后继者 Agent57 成为首个在全部 57 款 Atari 游戏中都超越人类基准的深度强化学习智能体。
LLM 智能体中的情景记忆#
语言模型只能记住适合放入其上下文窗口的内容,因此,长期运行的智能体会将经历写入外部存储,并将相关内容检索到提示中。在 2023 年 UIST 上发表的 Generative Agents 研究中,斯坦福大学和 Google 的 Joon Sung Park 及其同事为 25 个模拟角色提供了自然语言观察记录构成的记忆流。每条记忆会按新近度、重要性和相关性打分:新近度是自上次检索以来每经过一个游戏小时便乘以 0.995 的指数衰减值;重要性是语言模型指定的 1 到 10 的整数;相关性则是记忆嵌入与查询嵌入之间的余弦相似度。三项分数经过最小-最大归一化后,以相同权重相加。
以下示例使用 all-MiniLM-L6-v2 句子嵌入模型,为家用机器人的记忆进行评分:
import numpy as np
from sentence_transformers import SentenceTransformer
# Episodic memories of a home robot: what happened, hours since last recalled, importance from 1 to 10
memories = [
("Saw the car keys on the kitchen counter", 30, 5),
("Charged the battery at the docking station", 2, 2),
("Watered the plants in the living room", 5, 3),
("Saw the car keys in the coat pocket in the hallway", 4, 5),
("The user said the back door sticks when it rains", 50, 8),
]
texts, hours, importance = zip(*memories)
model = SentenceTransformer("all-MiniLM-L6-v2")
query = model.encode("Where are my car keys?", normalize_embeddings=True)
relevance = model.encode(list(texts), normalize_embeddings=True) @ query # cosine similarity to the query
recency = 0.995 ** np.array(hours) # exponential decay per hour
# Generative Agents retrieval: min-max normalize each signal to 0-1, then add them with equal weights
signals = [recency, np.array(importance, dtype=float), relevance]
score = sum((s - s.min()) / (s.max() - s.min()) for s in signals)
for i in np.argsort(-score)[:3]:
print(f"score {score[i]:.2f}, relevance {relevance[i]:.2f}: {texts[i]}")走廊中的目击记录以 2.44 分排名第一,高于厨房台面的 1.89 分,尽管较早的那条记忆与问题略为相似(0.71 对 0.70)。新近度拉开了两者的差距,因此机器人报告的是最近一次看到钥匙的位置。Noah Shinn 及其同事于 2023 年提出的 Reflexion,会将智能体对失败尝试所写的反思存入情景缓冲区;在 HumanEval 编码基准上,它的 pass@1 达到 91%,而 GPT-4 为 80%。
视频和具身智能体中的情景记忆#
对于具身 AI和可穿戴摄像头,情景记忆意味着回答有关摄像头先前拍到内容的问题。Meta 与大学合作伙伴于 2021 年发布的 Ego4D 数据集,包含来自 9 个国家、74 个地点的 931 名摄像头佩戴者所拍摄的 3,670 小时第一人称视频,并包含一个情景记忆基准,其中的问题包括“我把钥匙放在哪里了?”基准任务包括定位回答自然语言问题的视频片段、找出参考图像中物体最后一次出现的位置,以及找出某项活动的所有实例。在 Ultralytics 软件包中, VisualAISearch 会使用 CLIP 为文件夹中的每张图像生成嵌入,并按余弦相似度对图像和文本查询进行排序;对于从机器人摄像头保存的帧,这正是此类记忆中的相关性步骤。
情景记忆与相关术语#
- 记忆库:存储模型自身计算所用的向量,例如对比学习中的负样本、过去的视频帧或正常图像块。情景记忆则保存智能体的经历,用于指导其决策。
- 检索增强生成(RAG):从外部文档中检索段落,为模型的回答提供依据。情景记忆将相同的检索机制用于智能体自身的历史记录。
- 向量数据库:常用于存储生产环境智能体情景记忆的存储和相似度搜索层。
- 持续学习:学习新任务时避免灾难性遗忘旧任务,通常通过重放已存储的示例实现。David Lopez-Paz 和 Marc'Aurelio Ranzato 于 2017 年提出的梯度情景记忆(GEM),会为每个先前任务保留一小组示例,并约束每次更新,使这些示例上的损失不会增加。










