Episodic / Semantic Memory

情景与语义记忆

情景记忆="何时何地发生了什么",语义记忆="我知道的事实"。

详解

情景记忆(Episodic Memory)和语义记忆(Semantic Memory)是认知科学对长期记忆的两种分类,现在也被直接借用来描述 AI Agent 的记忆结构。情景记忆记录的是「带时间戳的具体事件」——「2025年6月20日,用户小明询问了 Python 列表推导式,我给出了示例,用户说很有帮助」;语义记忆记录的是「与事件无关的一般性事实」——「小明是 Python 初学者,偏好简短回答」。两者都属于长期记忆,区别在于:情景记忆保留了事件的上下文(什么时间、什么情况、结果如何),语义记忆则把信息抽象成了通用知识,脱离了具体情境。工程上,这两类记忆可以用不同的存储结构来区分:情景记忆适合用时序数据库或带时间戳的向量存储(每条记录是一次完整交互);语义记忆适合用键值对或知识图谱(每条记录是一个事实断言)。Agent 设计时明确区分这两类,有助于决策「何时检索事件回放」(情景)vs「何时检索背景知识」(语义)。

一个类比
情景记忆像你的日记:「3月15日,我和朋友去了那家新开的火锅店,等了一小时,味道很辣但值得」——带时间、地点、经过、感受。语义记忆像你脑子里的常识:「火锅是一种四川菜系,吃的时候要蘸麻酱」——不记得是哪天知道的,就是「知道」而已。
举个例子
# 用两张表分别存情景记忆(事件)和语义记忆(事实)
import sqlite3
from datetime import datetime

conn = sqlite3.connect("agent_memory.db")

# 情景记忆表:记录每次具体交互,保留时间和上下文
conn.execute("""
    CREATE TABLE IF NOT EXISTS episodic (
        id INTEGER PRIMARY KEY,
        timestamp TEXT,
        event TEXT
    )
""")

# 语义记忆表:记录抽象事实,没有时间绑定
conn.execute("""
    CREATE TABLE IF NOT EXISTS semantic (
        id INTEGER PRIMARY KEY,
        key TEXT UNIQUE,
        value TEXT
    )
""")

# 写入情景记忆:用户做了什么
conn.execute(
    "INSERT INTO episodic (timestamp, event) VALUES (?, ?)",
    (datetime.now().isoformat(), "用户小明询问了列表推导式,示例代码被采纳"),
)

# 写入语义记忆:从交互中提炼的事实
conn.execute(
    "INSERT OR REPLACE INTO semantic (key, value) VALUES (?, ?)",
    ("user_skill_level", "Python 初学者,偏好有注释的示例代码"),
)
conn.commit()
PYTHON 示例
相关概念