Files
Mofox-Core/src/memory_graph/manager_singleton.py
2025-12-16 16:10:13 +08:00

239 lines
8.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
记忆系统管理单例
提供全局访问的 MemoryManager 和 UnifiedMemoryManager 实例
"""
from __future__ import annotations
import asyncio
from pathlib import Path
from src.common.logger import get_logger
from src.memory_graph.manager import MemoryManager
logger = get_logger(__name__)
# 全局 MemoryManager 实例(旧的单层记忆系统,已弃用)
_memory_manager: MemoryManager | None = None
_initialized: bool = False
# 全局 UnifiedMemoryManager 实例(新的三层记忆系统)
_unified_memory_manager = None
_unified_memory_init_lock: asyncio.Lock | None = None
# ============================================================================
# 旧的单层记忆系统 API已弃用保留用于向后兼容
# ============================================================================
async def initialize_memory_manager(
data_dir: Path | str | None = None,
) -> MemoryManager | None:
"""
初始化全局 MemoryManager
直接从 global_config.memory 读取配置
Args:
data_dir: 数据目录(可选,默认从配置读取)
Returns:
MemoryManager 实例,如果禁用则返回 None
"""
global _memory_manager, _initialized
if _initialized and _memory_manager:
logger.info("MemoryManager 已经初始化,返回现有实例")
return _memory_manager
try:
from src.config.config import global_config
# 检查是否启用
if not global_config or not global_config.memory or not getattr(global_config.memory, "enable", False):
logger.info("记忆图系统已在配置中禁用")
_initialized = False
_memory_manager = None
return None
# 处理数据目录
if data_dir is None:
data_dir = getattr(global_config.memory, "data_dir", "data/memory_graph") if global_config and global_config.memory else "data/memory_graph"
if isinstance(data_dir, str):
data_dir = Path(data_dir)
_memory_manager = MemoryManager(data_dir=data_dir)
await _memory_manager.initialize()
_initialized = True
logger.info("全局 MemoryManager 初始化成功")
return _memory_manager
except Exception as e:
logger.error(f"初始化 MemoryManager 失败: {e}")
_initialized = False
_memory_manager = None
raise
def get_memory_manager() -> MemoryManager | None:
"""
获取全局 MemoryManager 实例
Returns:
MemoryManager 实例,如果未初始化则返回 None
"""
if not _initialized or _memory_manager is None:
logger.warning("MemoryManager 尚未初始化,请先调用 initialize_memory_manager()")
return None
return _memory_manager
async def shutdown_memory_manager():
"""关闭全局 MemoryManager"""
global _memory_manager, _initialized
if _memory_manager:
try:
await _memory_manager.shutdown()
logger.info("全局 MemoryManager 已关闭")
except Exception as e:
logger.error(f"关闭 MemoryManager 时出错: {e}")
finally:
_memory_manager = None
_initialized = False
def is_initialized() -> bool:
"""检查 MemoryManager 是否已初始化"""
return _initialized and _memory_manager is not None
# ============================================================================
# 新的三层记忆系统 API推荐使用
# ============================================================================
async def initialize_unified_memory_manager():
"""
初始化统一记忆管理器(三层记忆系统)
从全局配置读取参数
Returns:
初始化后的管理器实例,未启用返回 None
"""
global _unified_memory_manager
if _unified_memory_manager is not None:
logger.warning("统一记忆管理器已经初始化")
return _unified_memory_manager
try:
from src.config.config import global_config
from src.memory_graph.unified_manager import UnifiedMemoryManager
# 检查是否启用三层记忆系统
if not global_config or not global_config.memory or not getattr(
global_config.memory, "enable", False
):
logger.warning("三层记忆系统未启用,跳过初始化")
return None
if not global_config or not global_config.memory:
logger.warning("未找到内存配置,跳过统一内存管理器初始化。")
return None
config = global_config.memory
# 创建管理器实例
# 注意:我们将 data_dir 指向 three_tier 子目录,以隔离感知/短期记忆数据
# 同时传入全局 _memory_manager 以共享长期记忆图存储
base_data_dir = Path(getattr(config, "data_dir", "data/memory_graph"))
_unified_memory_manager = UnifiedMemoryManager(
data_dir=base_data_dir,
memory_manager=_memory_manager,
# 感知记忆配置
perceptual_max_blocks=getattr(config, "perceptual_max_blocks", 50),
perceptual_block_size=getattr(config, "perceptual_block_size", 5),
perceptual_activation_threshold=getattr(config, "perceptual_activation_threshold", 3),
perceptual_recall_top_k=getattr(config, "perceptual_topk", 5),
perceptual_recall_threshold=getattr(config, "perceptual_similarity_threshold", 0.55),
# 短期记忆配置
short_term_max_memories=getattr(config, "short_term_max_memories", 30),
short_term_transfer_threshold=getattr(config, "short_term_transfer_threshold", 0.6),
short_term_overflow_strategy=getattr(config, "short_term_overflow_strategy", "transfer_all"),
short_term_enable_force_cleanup=getattr(config, "short_term_enable_force_cleanup", True),
short_term_cleanup_keep_ratio=getattr(config, "short_term_cleanup_keep_ratio", 0.9),
# 长期记忆配置
long_term_batch_size=getattr(config, "long_term_batch_size", 10),
long_term_search_top_k=getattr(config, "search_top_k", 5),
long_term_decay_factor=getattr(config, "long_term_decay_factor", 0.95),
long_term_auto_transfer_interval=getattr(config, "long_term_auto_transfer_interval", 600),
# 智能检索配置
judge_confidence_threshold=getattr(config, "judge_confidence_threshold", 0.7),
)
# 初始化
await _unified_memory_manager.initialize()
return _unified_memory_manager
except Exception as e:
logger.error(f"初始化统一记忆管理器失败: {e}")
raise
def get_unified_memory_manager():
"""
获取统一记忆管理器实例(三层记忆系统)
Returns:
管理器实例,未初始化返回 None
"""
if _unified_memory_manager is None:
logger.warning("统一记忆管理器尚未初始化,请先调用 initialize_unified_memory_manager()")
return _unified_memory_manager
async def ensure_unified_memory_manager_initialized():
"""
确保统一记忆管理器已初始化。
在首次访问时自动初始化,避免调用方重复判断。
"""
global _unified_memory_init_lock, _unified_memory_manager
if _unified_memory_manager is not None:
return _unified_memory_manager
if _unified_memory_init_lock is None:
_unified_memory_init_lock = asyncio.Lock()
async with _unified_memory_init_lock:
if _unified_memory_manager is not None:
return _unified_memory_manager
return await initialize_unified_memory_manager()
async def shutdown_unified_memory_manager() -> None:
"""关闭统一记忆管理器"""
global _unified_memory_manager
if _unified_memory_manager is None:
logger.warning("统一记忆管理器未初始化,无需关闭")
return
try:
await _unified_memory_manager.shutdown()
_unified_memory_manager = None
logger.info("统一记忆管理器已关闭")
except Exception as e:
logger.error(f"关闭统一记忆管理器失败: {e}")