记忆系统架构设计

1. 四层架构设计

HelloAgents记忆系统采用四层架构,从底到上依次为:

┌─────────────────────────────────────┐
│     嵌入服务层 (Embedding Layer)    │
├─────────────────────────────────────┤
│     存储后端层 (Storage Layer)      │
├─────────────────────────────────────┤
│     记忆类型层 (Memory Types)       │
├─────────────────────────────────────┤
│    基础设施层 (Infrastructure)      │
└─────────────────────────────────────┘

1.1 基础设施层

提供核心数据结构和统一接口:

  • MemoryManager:记忆管理器,统一调度和协调
  • MemoryItem:记忆数据结构,标准化记忆项
  • MemoryConfig:配置管理,系统参数设置
  • BaseMemory:记忆基类,通用接口定义

1.2 记忆类型层

实现四种不同类型的记忆:

记忆类型存储方式特点应用场景
工作记忆纯内存TTL管理,容量有限当前对话上下文
情景记忆SQLite + Qdrant时间序列,事件追踪历史交互记录
语义记忆Qdrant + Neo4j知识图谱,关系推理抽象知识和概念
感知记忆SQLite + Qdrant多模态支持图像、音频等

1.3 存储后端层

提供多种存储后端:

  • QdrantVectorStore:向量存储,高性能语义检索
  • Neo4jGraphStore:图存储,知识图谱管理
  • SQLiteDocumentStore:文档存储,结构化持久化

1.4 嵌入服务层

统一的嵌入服务接口:

  • DashScopeEmbedding:通义千问嵌入(云端API)
  • LocalTransformerEmbedding:本地嵌入(离线部署)
  • TFIDFEmbedding:TFIDF嵌入(轻量级兜底)

2. 四种记忆类型详解

2.1 工作记忆(Working Memory)

特点

  • 容量有限(默认50条)
  • TTL自动清理机制(默认60分钟)
  • 纯内存存储,访问速度极快
  • 混合检索:TF-IDF向量化 + 关键词匹配

存储策略

# 容量管理
if len(self.memories) >= self.max_capacity:
    self._remove_lowest_priority_memory()
 
# TTL清理
self._expire_old_memories()

评分公式

final_score = (相似度 × 时间衰减) × (0.8 + 重要性 × 0.4)

应用场景

  • 当前对话上下文
  • 临时状态信息
  • 即时任务跟踪

2.2 情景记忆(Episodic Memory)

特点

  • SQLite + Qdrant混合存储架构
  • 支持时间序列和会话级检索
  • 结构化过滤 + 语义向量检索
  • 完整的事件上下文保存

存储架构

# SQLite:结构化数据存储
self.doc_store = SQLiteDocumentStore(config.database_path)
 
# Qdrant:向量检索
self.vector_store = QdrantVectorStore(
    config.qdrant_url,
    config.qdrant_api_key
)
 
# 会话索引
self.sessions = {}  # session_id -> [episode_ids]

评分公式

score = (向量相似度 × 0.8 + 时间近因性 × 0.2) × (0.8 + 重要性 × 0.4)

应用场景

  • 历史对话记录
  • 重要事件追踪
  • 学习经历复盘

2.3 语义记忆(Semantic Memory)

特点

  • 使用预训练模型进行文本嵌入
  • 向量检索进行快速相似度匹配
  • 知识图谱存储实体和关系
  • 混合检索策略:向量+图+语义推理

存储架构

# Neo4j:知识图谱
self.graph_store = Neo4jGraphStore(**neo4j_config)
 
# Qdrant:向量检索
self.vector_store = QdrantConnectionManager.get_instance(**qdrant_config)
 
# 实体和关系缓存
self.entities: Dict[str, Entity] = {}
self.relations: List[Relation] = []

知识图谱构建

# 1. 生成文本嵌入
embedding = self.embedding_model.encode(memory_item.content)
 
# 2. 提取实体和关系
entities = self._extract_entities(memory_item.content)
relations = self._extract_relations(memory_item.content, entities)
 
# 3. 存储到Neo4j图数据库
for entity in entities:
    self._add_entity_to_graph(entity, memory_item)
 
for relation in relations:
    self._add_relation_to_graph(relation, memory_item)

评分公式

score = (向量相似度 × 0.7 + 图相似度 × 0.3) × (0.8 + 重要性 × 0.4)

应用场景

  • 抽象知识存储
  • 概念和规则
  • 用户偏好和习惯

2.4 感知记忆(Perceptual Memory)

特点

  • 支持多模态数据(文本、图像、音频)
  • 跨模态相似性搜索
  • 感知数据的语义理解
  • 支持内容生成和检索

存储架构

# 多模态编码器
self.text_embedder = get_text_embedder()
self._clip_model = self._init_clip_model()  # 图像编码
self._clap_model = self._init_clap_model()  # 音频编码
 
# 按模态分离的向量存储
self.vector_stores = {
    "text": QdrantConnectionManager.get_instance(...),
    "image": QdrantConnectionManager.get_instance(...),
    "audio": QdrantConnectionManager.get_instance(...)
}

跨模态检索

# 同模态检索
store = self._get_vector_store_for_modality(modality)
hits = store.search_similar(query_vector, limit, where)
 
# 跨模态语义对齐
# 通过统一的向量空间实现不同模态的语义对齐

评分公式

score = (向量相似度 × 0.8 + 时间近因性 × 0.2) × (0.8 + 重要性 × 0.4)

时间衰减模型

# 指数衰减:24小时内保持高分,之后逐渐衰减
decay_factor = 0.1
recency_score = math.exp(-decay_factor * age_hours / 24)

应用场景

  • 图像内容检索
  • 音频信息存储
  • 多模态对话记忆

3. 记忆管理工作流程

3.1 完整工作流程

1. 编码(Encoding)
   ↓
2. 存储(Storage)
   ↓
3. 检索(Retrieval)
   ↓
4. 整合(Consolidation)
   ↓
5. 遗忘(Forgetting)

3.2 记忆添加流程

用户输入 → MemoryTool.execute("add")
    ↓
MemoryManager.add_memory()
    ↓
根据类型分发到具体记忆类
    ↓
生成嵌入向量
    ↓
提取元数据(实体、关系等)
    ↓
存储到相应后端
    ↓
返回记忆ID

3.3 记忆检索流程

用户查询 → MemoryTool.execute("search")
    ↓
MemoryManager.retrieve_memories()
    ↓
并行检索多种记忆类型
    ↓
混合检索策略
  - 向量检索
  - 结构化查询
  - 关键词匹配
  ↓
综合评分排序
  - 相似度得分
  - 时间衰减
  - 重要性权重
    ↓
返回Top-K结果

4. 混合检索策略

4.1 检索方法

不同记忆类型采用不同的检索策略:

记忆类型主要检索方法辅助方法
工作记忆TF-IDF向量化关键词匹配
情景记忆向量检索结构化过滤
语义记忆向量+图检索语义推理
感知记忆向量检索时间衰减

4.2 评分权重

不同记忆类型的评分权重:

记忆类型向量权重时间权重重要性权重范围
工作记忆0.7-[0.8, 1.2]
情景记忆0.80.2[0.8, 1.2]
语义记忆0.7-[0.8, 1.2]
感知记忆0.80.2[0.8, 1.2]

4.3 重要性权重计算

importance_weight = 0.8 + (importance * 0.4)
# importance: 0.0 → 1.0
# weight: 0.8 → 1.2

5. 配置管理

5.1 MemoryConfig参数

class MemoryConfig:
    # 工作记忆配置
    working_memory_capacity: int = 50
    working_memory_ttl: int = 60  # 分钟
 
    # 数据库配置
    database_path: str = "./memory_data/memory.db"
 
    # Qdrant配置
    qdrant_url: str
    qdrant_api_key: str
    qdrant_collection: str = "hello_agents_vectors"
    qdrant_vector_size: int = 384
    qdrant_distance: str = "cosine"
 
    # Neo4j配置
    neo4j_uri: str
    neo4j_username: str
    neo4j_password: str
    neo4j_database: str = "neo4j"
 
    # 嵌入配置
    embed_model_type: str = "dashscope"
    embed_model_name: str
    embed_api_key: str

5.2 启用记忆类型

memory_manager = MemoryManager(
    config=memory_config,
    user_id="user123",
    enable_working=True,    # 启用工作记忆
    enable_episodic=True,   # 启用情景记忆
    enable_semantic=True,    # 启用语义记忆
    enable_perceptual=False  # 不启用感知记忆
)