1. 智能体与记忆:为什么智能体需要记忆?

先问一个问题:一个没有记忆的智能体,能有多聪明?

答案很简单——它每次都得从头开始。就像你每次跟人聊天,对方都像第一次见你一样,问「你叫什么名字」。这种体验,说实话挺糟糕的。

我刚开始做对话系统时,就踩过这个坑。当时做了一个客服机器人,用户问完「我的订单号是12345」,下一句问「这个订单到哪了」,机器人直接懵了。它不记得刚才的订单号。用户气得骂它「人工智障」。

嗯,这就是没有记忆的代价。

为什么智能体需要记忆?

智能体的核心任务是感知环境 → 做出决策 → 执行动作。但如果没有记忆,这个循环就断了。

  • 上下文连贯:多轮对话、连续任务,都需要记住前面说了什么
  • 经验积累:从过去的错误中学习,避免重复踩坑
  • 个性化服务:记住用户的偏好,而不是每次都问一遍
  • 长期规划:能记住目标,一步步推进,而不是东一榔头西一棒子

核心观点:没有记忆的智能体,本质上是一个「无状态函数」——同样的输入,永远输出同样的结果。但现实世界不是纯函数,它需要状态。

记忆的分类

说到记忆分类,我习惯参考认知科学里的框架。人类记忆不是铁板一块,而是分成了几个系统。智能体也一样,不同场景需要不同类型的记忆。

下面这张图是我自己整理的分类结构,你可以先看个全貌:

智能体记忆分类体系 智能体记忆 工作记忆 长期记忆 情景记忆 语义记忆 说明: • 工作记忆:短期、容量有限,用于当前任务(如对话上下文) • 情景记忆:记录具体事件和经历(如用户上次的操作序列) • 语义记忆:存储事实、概念、规则(如知识库、API 文档) • 长期记忆包含情景记忆和语义记忆,两者相互影响

工作记忆:智能体的「草稿纸」

工作记忆,说白了就是智能体正在「想」的东西。它容量小,但速度快。

在对话场景里,工作记忆就是当前轮次的上下文。比如用户说「帮我查一下北京的天气」,然后又说「那上海呢?」——工作记忆里得记住「查天气」这个意图,才能理解第二句是在问上海的天气。

实战经验:我习惯把工作记忆设计成一个固定大小的滑动窗口。比如保留最近 5 轮对话。太少了接不上上下文,太多了又浪费 token。5 轮是我试下来性价比比较高的值。

工作记忆的几个关键特征:

  • 容量有限:一般只保留当前任务相关的信息
  • 自动刷新:新信息进来,旧信息被挤出
  • 高访问速度:直接存在内存里,不用查数据库

长期记忆:智能体的「硬盘」

长期记忆就不一样了。它容量大,但读写慢。不过它能存很久,甚至永久保存。

长期记忆又分两种:情景记忆和语义记忆。

情景记忆:记得「发生了什么」

情景记忆记录的是具体的事件。比如「昨天上午 10 点,用户张三查询了订单 12345 的状态」。它有时间戳、有具体细节。

我在做一个推荐系统时,就用情景记忆来记录用户的浏览历史。用户看了哪些商品、停留了多久、最后买了什么——这些事件串起来,就能分析出用户的购物习惯。

注意:情景记忆如果存太多,存储成本会很高。我见过有人把所有用户交互日志都存下来,结果数据库膨胀到几百 GB。后来我们加了「遗忘机制」——超过 30 天的事件自动归档或压缩。

语义记忆:记得「是什么」

语义记忆存的是事实和概念,不依赖具体场景。比如「北京是中国的首都」、「HTTP 状态码 404 表示资源未找到」。这些知识是通用的,跟谁问的、什么时候问的没关系。

语义记忆通常来自两个渠道:

  1. 预训练知识:大模型本身在训练时学到的知识
  2. 外部知识库:比如公司内部的 API 文档、产品手册

我个人习惯把语义记忆做成向量数据库。把知识转成向量存进去,需要时做相似度检索。这样既快又灵活。

四种记忆的对比

为了方便你理解,我把它们的区别整理成了一张表:

记忆类型 容量 持久性 访问速度 典型用途
工作记忆 小(几轮对话) 短(秒级) 极快 对话上下文、当前任务状态
情景记忆 大(可扩展) 中(天/周级) 中等 用户行为记录、事件日志
语义记忆 极大(知识库) 长(永久) 慢(需检索) 事实知识、规则、API 文档

一个简单的记忆实现示例

光说不练假把式。下面是我在项目里用过的一个简化版记忆管理器,用 Python 写的:

class AgentMemory:
    def __init__(self):
        self.working_memory = []      # 工作记忆:列表,最多保留5条
        self.episodic_memory = []     # 情景记忆:事件列表
        self.semantic_memory = {}     # 语义记忆:键值对存储

    def update_working_memory(self, item, max_size=5):
        """更新工作记忆,超出容量则丢弃最旧的"""
        self.working_memory.append(item)
        if len(self.working_memory) > max_size:
            self.working_memory.pop(0)

    def store_episode(self, event):
        """存储一个情景事件"""
        self.episodic_memory.append({
            'timestamp': time.time(),
            'event': event
        })

    def store_fact(self, key, value):
        """存储一个语义事实"""
        self.semantic_memory[key] = value

    def recall_working(self):
        """获取当前工作记忆"""
        return self.working_memory

    def recall_episodic(self, query=None):
        """检索情景记忆(简化版:直接返回最近10条)"""
        return self.episodic_memory[-10:]

    def recall_semantic(self, key):
        """检索语义记忆"""
        return self.semantic_memory.get(key, None)

避坑指南:我曾经在生产环境里直接用这个简化版,结果工作记忆的列表没有做深拷贝,导致多个请求共享了同一个列表。用户 A 的上下文污染了用户 B 的对话。后来我改成每个会话实例化一个独立的记忆管理器,问题才解决。

小结

这一章我们聊了智能体为什么需要记忆,以及记忆的四种分类。说白了,工作记忆管「当下」,情景记忆管「过去发生了什么」,语义记忆管「世界是什么样的」。三者配合,智能体才能像个「人」一样思考。