feat(memory-graph): 完成 Phase 3 - 记忆管理器

Phase 3 实现内容:
- MemoryManager: 统一的记忆管理接口
  * 完整的 CRUD 操作
  * 多策略检索(语义+类型+重要性+时间+遗忘状态过滤)
  * 记忆关联管理

- 记忆生命周期管理:
  * 激活机制:时间衰减 + 访问计数 + 激活传播
  * 遗忘机制:手动遗忘 + 自动遗忘(基于激活度)
  * 激活度计算:考虑上次访问时间的衰减

- 系统维护:
  * 定期维护任务
  * 统计信息(总记忆、节点、边、激活度等)
  * 数据持久化和加载

- GraphStore 增强:
  * 添加 get_all_memories() 方法

修复问题:
- search_memories: 修复记忆ID字段名(memory_id vs id)
- 搜索现在正确返回记忆对象

测试结果 (test_manager.py):
 初始化: 组件整合成功
 CRUD: 创建3条记忆,更新重要性
 关联: 建立2个记忆关系(导致、引用)
 搜索: 找到3条记忆,类型/重要性过滤工作
 激活: 激活度 00.81.0,访问次数统计
 遗忘: 手动+自动遗忘,搜索正确过滤
 统计: 4条记忆,17节点,18边,激活度0.333
 维护: 自动遗忘和保存
 持久化: 关闭后重新加载,数据完整

下一步: 整合到主系统,添加 MCP 工具接口
This commit is contained in:
Windpicker-owo
2025-11-05 18:18:34 +08:00
parent 1f94cd22b7
commit 93a2c1dde0
4 changed files with 731 additions and 4 deletions

View File

@@ -387,7 +387,16 @@ class MemoryTools:
memory_ids = set()
for node_id, similarity, metadata in similar_nodes:
if "memory_ids" in metadata:
memory_ids.update(metadata["memory_ids"])
ids = metadata["memory_ids"]
# 确保是列表
if isinstance(ids, str):
import json
try:
ids = json.loads(ids)
except:
ids = [ids]
if isinstance(ids, list):
memory_ids.update(ids)
# 4. 获取完整记忆
memories = []
@@ -463,10 +472,25 @@ class MemoryTools:
# 获取最相似节点关联的记忆
node_id, similarity, metadata = similar_nodes[0]
if "memory_ids" in metadata and metadata["memory_ids"]:
memory_id = metadata["memory_ids"][0]
if "memory_ids" not in metadata or not metadata["memory_ids"]:
return None
ids = metadata["memory_ids"]
# 确保是列表
if isinstance(ids, str):
import json
try:
ids = json.loads(ids)
except Exception as e:
logger.warning(f"JSON 解析失败: {e}")
ids = [ids]
if isinstance(ids, list) and ids:
memory_id = ids[0]
return self.graph_store.get_memory_by_id(memory_id)
return None
def _summarize_memory(self, memory: Memory) -> str: