refactor(core): 提高配置访问安全性并优化记忆判断提示
此提交引入了若干关键改进,以增强应用程序的稳定性和智能性。 首先,通过在 `main.py` 和 `memory_graph/manager_singleton.py` 的关键初始化路径中为 `global_config` 及其嵌套属性添加全面的空值检查,增强了系统的稳健性。这可以防止在配置加载失败或不完整时出现潜在的 `AttributeError` 异常,使应用程序的启动过程更加可靠。 其次,在 `UnifiedMemoryManager` 中的“记忆判断”模型提示已大幅优化。新的提示提供了更严格的指导,避免在简单交互(如问候或闲聊)中进行不必要的长期记忆查询。这一优化通过使记忆检索过程更加高效和具上下文意识,提高了响应速度并降低了计算开销。 最后,新配置已在 Napcat 适配器中添加了选项,以更精细地控制消息处理,包括启用/禁用视频处理和配置自动@回复。
This commit is contained in:
10
src/main.py
10
src/main.py
@@ -360,7 +360,7 @@ class MainSystem:
|
||||
async def initialize(self) -> None:
|
||||
"""初始化系统组件"""
|
||||
# 检查必要的配置
|
||||
if not hasattr(global_config, "bot") or not hasattr(global_config.bot, "nickname"):
|
||||
if not global_config or not global_config.bot or not global_config.bot.nickname:
|
||||
logger.error("缺少必要的bot配置")
|
||||
raise ValueError("Bot配置不完整")
|
||||
|
||||
@@ -386,7 +386,7 @@ class MainSystem:
|
||||
selected_egg = choices(egg_texts, weights=weights, k=1)[0]
|
||||
|
||||
logger.info(f"""
|
||||
全部系统初始化完成,{global_config.bot.nickname}已成功唤醒
|
||||
全部系统初始化完成,{global_config.bot.nickname if global_config and global_config.bot else 'Bot'}已成功唤醒
|
||||
=========================================================
|
||||
MoFox_Bot(第三方修改版)
|
||||
全部组件已成功启动!
|
||||
@@ -484,7 +484,7 @@ MoFox_Bot(第三方修改版)
|
||||
|
||||
# 初始化三层记忆系统(如果启用)
|
||||
try:
|
||||
if global_config.memory and global_config.memory.enable:
|
||||
if global_config and global_config.memory and global_config.memory.enable:
|
||||
from src.memory_graph.manager_singleton import initialize_unified_memory_manager
|
||||
logger.info("三层记忆系统已启用,正在初始化...")
|
||||
await initialize_unified_memory_manager()
|
||||
@@ -568,7 +568,7 @@ MoFox_Bot(第三方修改版)
|
||||
async def _init_planning_components(self) -> None:
|
||||
"""初始化计划相关组件"""
|
||||
# 初始化月度计划管理器
|
||||
if global_config.planning_system.monthly_plan_enable:
|
||||
if global_config and global_config.planning_system and global_config.planning_system.monthly_plan_enable:
|
||||
try:
|
||||
await monthly_plan_manager.start_monthly_plan_generation()
|
||||
logger.info("月度计划管理器初始化成功")
|
||||
@@ -576,7 +576,7 @@ MoFox_Bot(第三方修改版)
|
||||
logger.error(f"月度计划管理器初始化失败: {e}")
|
||||
|
||||
# 初始化日程管理器
|
||||
if global_config.planning_system.schedule_enable:
|
||||
if global_config and global_config.planning_system and global_config.planning_system.schedule_enable:
|
||||
try:
|
||||
await schedule_manager.load_or_generate_today_schedule()
|
||||
await schedule_manager.start_daily_schedule_generation()
|
||||
|
||||
@@ -50,7 +50,7 @@ async def initialize_memory_manager(
|
||||
from src.config.config import global_config
|
||||
|
||||
# 检查是否启用
|
||||
if not global_config.memory or not getattr(global_config.memory, "enable", False):
|
||||
if not global_config or not global_config.memory or not getattr(global_config.memory, "enable", False):
|
||||
logger.info("记忆图系统已在配置中禁用")
|
||||
_initialized = False
|
||||
_memory_manager = None
|
||||
@@ -58,7 +58,7 @@ async def initialize_memory_manager(
|
||||
|
||||
# 处理数据目录
|
||||
if data_dir is None:
|
||||
data_dir = getattr(global_config.memory, "data_dir", "data/memory_graph")
|
||||
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)
|
||||
|
||||
@@ -136,12 +136,15 @@ async def initialize_unified_memory_manager():
|
||||
from src.memory_graph.unified_manager import UnifiedMemoryManager
|
||||
|
||||
# 检查是否启用三层记忆系统
|
||||
if not hasattr(global_config, "memory") or not getattr(
|
||||
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
|
||||
|
||||
# 创建管理器实例
|
||||
|
||||
@@ -330,7 +330,11 @@ class UnifiedMemoryManager:
|
||||
|
||||
"""
|
||||
|
||||
prompt = f"""你是一个记忆检索评估专家。请判断检索到的记忆是否足以回答用户的问题。
|
||||
prompt = f"""你是一个记忆检索评估专家。你的任务是判断当前检索到的“感知记忆”(即时对话)和“短期记忆”(结构化信息)是否足以支撑一次有深度、有上下文的回复。
|
||||
|
||||
**核心原则:**
|
||||
- **不要轻易检索长期记忆!** 只有在当前对话需要深入探讨、回忆过去复杂事件或需要特定背景知识时,才认为记忆不足。
|
||||
- **闲聊、简单问候、表情互动或无特定主题的对话,现有记忆通常是充足的。** 频繁检索长期记忆会拖慢响应速度。
|
||||
|
||||
**用户查询:**
|
||||
{query}
|
||||
@@ -341,25 +345,32 @@ class UnifiedMemoryManager:
|
||||
**检索到的短期记忆(结构化信息,自然语言描述):**
|
||||
{short_term_desc or '(无)'}
|
||||
|
||||
**任务要求:**
|
||||
1. 判断这些记忆是否足以回答用户的问题
|
||||
2. 如果不充足,分析缺少哪些方面的信息
|
||||
3. 生成额外需要检索的 query(用于在长期记忆中检索)
|
||||
**评估指南:**
|
||||
1. **分析用户意图**:用户是在闲聊,还是在讨论一个需要深入挖掘的话题?
|
||||
2. **检查现有记忆**:当前的感知和短期记忆是否已经包含了足够的信息来回应用户的查询?
|
||||
- 对于闲聊(如“你好”、“哈哈”、“[表情]”),现有记忆总是充足的 (`"is_sufficient": true`)。
|
||||
- 对于需要回忆具体细节、深入探讨个人经历或专业知识的查询,如果现有记忆中没有相关信息,则可能不充足。
|
||||
3. **决策**:
|
||||
- 如果记忆充足,设置 `"is_sufficient": true`。
|
||||
- 如果确实需要更多信息才能进行有意义的对话,设置 `"is_sufficient": false`,并提供具体的补充查询。
|
||||
|
||||
**输出格式(JSON):**
|
||||
```json
|
||||
{{
|
||||
"is_sufficient": true/false,
|
||||
"confidence": 0.85,
|
||||
"reasoning": "判断理由",
|
||||
"reasoning": "在这里解释你的判断理由。例如:‘用户只是在打招呼,现有记忆已足够’或‘用户问到了一个具体的历史事件,需要检索长期记忆’。",
|
||||
"missing_aspects": ["缺失的信息1", "缺失的信息2"],
|
||||
"additional_queries": ["补充query1", "补充query2"]
|
||||
}}
|
||||
```
|
||||
|
||||
请输出JSON:"""
|
||||
请严格按照上述原则进行判断,并输出JSON:"""
|
||||
|
||||
# 调用记忆裁判模型
|
||||
from src.config.config import model_config
|
||||
if not model_config.model_task_config:
|
||||
raise ValueError("模型任务配置未加载")
|
||||
llm = LLMRequest(
|
||||
model_set=model_config.model_task_config.memory_judge,
|
||||
request_type="unified_memory.judge",
|
||||
|
||||
@@ -317,6 +317,9 @@ class NapcatAdapterPlugin(BasePlugin):
|
||||
"ignore_non_self_poke": ConfigField(type=bool, default=False, description="是否忽略不是针对自己的戳一戳消息"),
|
||||
"poke_debounce_seconds": ConfigField(type=float, default=2.0, description="戳一戳防抖时间(秒)"),
|
||||
"enable_emoji_like": ConfigField(type=bool, default=True, description="是否启用群聊表情回复处理"),
|
||||
"enable_reply_at": ConfigField(type=bool, default=True, description="是否在回复时自动@原消息发送者"),
|
||||
"reply_at_rate": ConfigField(type=float, default=0.5, description="回复时@的概率(0.0-1.0)"),
|
||||
"enable_video_processing": ConfigField(type=bool, default=True, description="是否启用视频消息处理(下载和解析)"),
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -214,6 +214,9 @@ class MessageHandler:
|
||||
case RealMessageType.record:
|
||||
return await self._handle_record_message(segment)
|
||||
case RealMessageType.video:
|
||||
if not config_api.get_plugin_config(self.plugin_config, "features.enable_video_processing", False):
|
||||
logger.debug("视频消息处理已禁用,跳过")
|
||||
return {"type": "text", "data": "[视频消息]"}
|
||||
return await self._handle_video_message(segment)
|
||||
case RealMessageType.rps:
|
||||
return await self._handle_rps_message(segment)
|
||||
|
||||
Reference in New Issue
Block a user