239 lines
8.1 KiB
Python
239 lines
8.1 KiB
Python
"""
|
||
记忆系统管理单例
|
||
|
||
提供全局访问的 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}")
|
||
|