feat(memory): 重构记忆系统检索机制并优化召回率

- 实现五阶段检索流程:元数据过滤→向量搜索→语义重排序→上下文过滤→增强重排序
- 添加回退机制保障检索健壮性,当主检索失败时自动降级到文本匹配
- 优化向量相似度阈值配置,提升记忆召回率
- 新增记忆融合候选收集机制,避免重复记忆存储
- 改进记忆格式化器,支持多种展示格式
- 增强向量存储加载和重建逻辑,确保数据持久化
- 优化记忆存储时机,移至回复生成完成后异步执行
- 添加详细的检索调试日志,便于问题排查
- 简化查询规划器提示模板,提升生成效率
This commit is contained in:
Windpicker-owo
2025-10-01 15:02:38 +08:00
parent 3d59024c3c
commit 99f77135c1
16 changed files with 2058 additions and 203 deletions

View File

@@ -76,59 +76,78 @@ class MainSystem:
def signal_handler(signum, frame):
logger.info("收到退出信号,正在优雅关闭系统...")
self._cleanup()
sys.exit(0)
import asyncio
try:
loop = asyncio.get_event_loop()
if loop.is_running():
# 如果事件循环正在运行,创建任务并设置回调
async def cleanup_and_exit():
await self._async_cleanup()
sys.exit(0)
task = asyncio.create_task(cleanup_and_exit())
# 添加任务完成回调,确保程序退出
task.add_done_callback(lambda t: None)
else:
# 如果事件循环未运行,使用同步清理
self._cleanup()
sys.exit(0)
except Exception as e:
logger.error(f"信号处理失败: {e}")
sys.exit(1)
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
def _cleanup(self):
"""清理资源"""
async def _async_cleanup(self):
"""异步清理资源"""
try:
# 停止消息管理器
from src.chat.message_manager import message_manager
import asyncio
try:
from src.chat.message_manager import message_manager
await message_manager.stop()
logger.info("🛑 消息管理器已停止")
except Exception as e:
logger.error(f"停止消息管理器时出错: {e}")
loop = asyncio.get_event_loop()
if loop.is_running():
asyncio.create_task(message_manager.stop())
else:
loop.run_until_complete(message_manager.stop())
logger.info("🛑 消息管理器已停止")
except Exception as e:
logger.error(f"停止消息管理器时出错: {e}")
try:
# 停止消息重组器
from src.plugin_system.core.event_manager import event_manager
from src.plugin_system import EventType
asyncio.run(event_manager.trigger_event(EventType.ON_STOP, permission_group="SYSTEM"))
from src.utils.message_chunker import reassembler
try:
from src.plugin_system.core.event_manager import event_manager
from src.plugin_system import EventType
from src.utils.message_chunker import reassembler
await event_manager.trigger_event(EventType.ON_STOP, permission_group="SYSTEM")
await reassembler.stop_cleanup_task()
logger.info("🛑 消息重组器已停止")
except Exception as e:
logger.error(f"停止消息重组器时出错: {e}")
# 停止增强记忆系统
try:
if global_config.memory.enable_memory:
await self.enhanced_memory_manager.shutdown()
logger.info("🛑 增强记忆系统已停止")
except Exception as e:
logger.error(f"停止增强记忆系统时出错: {e}")
except Exception as e:
logger.error(f"异步清理资源时出错: {e}")
def _cleanup(self):
"""同步清理资源(向后兼容)"""
import asyncio
try:
loop = asyncio.get_event_loop()
if loop.is_running():
asyncio.create_task(reassembler.stop_cleanup_task())
# 如果循环正在运行,创建异步清理任务
asyncio.create_task(self._async_cleanup())
else:
loop.run_until_complete(reassembler.stop_cleanup_task())
logger.info("🛑 消息重组器已停止")
# 如果循环未运行,直接运行异步清理
loop.run_until_complete(self._async_cleanup())
except Exception as e:
logger.error(f"停止消息重组器时出错: {e}")
try:
# 停止增强记忆系统
if global_config.memory.enable_memory:
import asyncio
loop = asyncio.get_event_loop()
if loop.is_running():
asyncio.create_task(self.enhanced_memory_manager.shutdown())
else:
loop.run_until_complete(self.enhanced_memory_manager.shutdown())
logger.info("🛑 增强记忆系统已停止")
except Exception as e:
logger.error(f"停止增强记忆系统时出错: {e}")
logger.error(f"同步清理资源时出错: {e}")
async def _message_process_wrapper(self, message_data: Dict[str, Any]):
"""并行处理消息的包装器"""