AI Agent记忆系统设计:短期记忆与长期记忆的实现

在AI Agent的架构中,记忆系统(Memory System) 是区分"智能助手"与"普通聊天机器人"的关键组件。一个没有记忆的Agent只能处理单轮对话,而具备完善记忆系统的Agent能够理解上下文、积累经验、持续进化。本文将深入讲解AI Agent记忆系统的三大核心类型——Buffer Memory、Summary Memory和Vector Memory,并给出完整的Python实现代码。

一、为什么记忆系统如此重要?

想象你在与一位助手对话:

  • 你说:"我住在上海"
  • 五轮之后你问:"我住的城市今天天气如何?"

如果没有记忆系统,Agent完全无法回答这个问题。记忆系统赋予了Agent:

| 记忆类型 | 作用范围 | 核心功能 | |---------|---------|---------| | 短期记忆 | 当前会话 | 保持对话上下文连贯性 | | 长期记忆 | 跨会话持久化 | 存储用户偏好、历史事实 | | 外部记忆 | 知识库/文档 | 扩展Agent的知识边界 |

二、短期记忆:Buffer Memory(缓冲记忆)

Buffer Memory是最基础的短期记忆形式,它直接保存最近的对话历史,通常以滑动窗口的形式维护。

2.1 原理与实现

Buffer Memory的核心思想很简单:保留最近N轮对话,超出窗口的自动丢弃。这种方式计算开销低、延迟小,适合对实时性要求高的场景。

from collections import deque
from dataclasses import dataclass
from typing import List, Optional
from datetime import datetime

@dataclass
class Message:
    role: str  # "user" 或 "assistant"
    content: str
    timestamp: datetime = None
    
    def __post_init__(self):
        if self.timestamp is None:
            self.timestamp = datetime.now()

class BufferMemory:
    """滑动窗口缓冲记忆
    
    保留最近 k 轮对话,适合维护短时上下文。
    """
    
    def __init__(self, max_turns: int = 10):
        self.max_turns = max_turns
        self.buffer = deque(maxlen=max_turns * 2)  # 每轮包含user+assistant
    
    def add_message(self, role: str, content: str) -> None:
        """添加一条消息到缓冲区"""
        self.buffer.append(Message(role=role, content=content))
    
    def get_history(self) -> List[Message]:
        """获取当前缓冲区中的所有消息"""
        return list(self.buffer)
    
    def get_formatted_history(self) -> str:
        """格式化为字符串供LLM使用"""
        lines = []
        for msg in self.buffer:
            role_label = "用户" if msg.role == "user" else "助手"
            lines.append(f"[{role_label}] {msg.content}")
        return "\n".join(lines)
    
    def clear(self) -> None:
        """清空记忆"""
        self.buffer.clear()
    
    def is_empty(self) -> bool:
        return len(self.buffer) == 0

# 使用示例
buffer = BufferMemory(max_turns=3)

# 模拟对话
buffer.add_message("user", "你好,我想订一张去北京的机票")
buffer.add_message("assistant", "好的,请问您想什么时候出发?")
buffer.add_message("user", "明天上午")
buffer.add_message("assistant", "明天上午的航班有CA1501和MU5101...")
buffer.add_message("user", "我要CA1501")

print("=== Buffer Memory 内容 ===")
print(buffer.get_formatted_history())
print(f"\n总消息数:{len(buffer.get_history())}")

2.2 Token感知的Buffer Memory

在实际生产环境中,更高级的做法是按Token数量而非轮数控制窗口大小,因为不同LLM有固定的上下文长度限制。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐