记忆系统架构设计
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.8 | 0.2 | [0.8, 1.2] |
| 语义记忆 | 0.7 | - | [0.8, 1.2] |
| 感知记忆 | 0.8 | 0.2 | [0.8, 1.2] |
4.3 重要性权重计算
importance_weight = 0.8 + (importance * 0.4)
# importance: 0.0 → 1.0
# weight: 0.8 → 1.25. 配置管理
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: str5.2 启用记忆类型
memory_manager = MemoryManager(
config=memory_config,
user_id="user123",
enable_working=True, # 启用工作记忆
enable_episodic=True, # 启用情景记忆
enable_semantic=True, # 启用语义记忆
enable_perceptual=False # 不启用感知记忆
)