diff --git a/src/llm_models/utils_model.py b/src/llm_models/utils_model.py index 1e4b975c6..2d35f6a8a 100644 --- a/src/llm_models/utils_model.py +++ b/src/llm_models/utils_model.py @@ -979,7 +979,7 @@ class LLMRequest: def _resolve_system_prompt(self, model_set: TaskConfig) -> str | None: """确定是否需要附加统一的system prompt.""" try: - if model_config and model_set is model_config.model_task_config.replyer: + if model_config and (model_set is model_config.model_task_config.replyer or model_set is model_config.model_task_config.replyer_private): return SYSTEM_PROMPT except AttributeError: logger.debug("模型配置缺少replyer定义,无法注入系统提示词") diff --git a/src/memory_graph/unified_manager.py b/src/memory_graph/unified_manager.py index 42d64a659..170ce3eab 100644 --- a/src/memory_graph/unified_manager.py +++ b/src/memory_graph/unified_manager.py @@ -328,41 +328,41 @@ class UnifiedMemoryManager: """ - prompt = f"""你是一个记忆检索评估专家。你的任务是判断当前检索到的“感知记忆”(即时对话)和“短期记忆”(结构化信息)是否足以支撑一次有深度、有上下文的回复。 + prompt = f"""你是“记忆判官”(记忆检索评估专家)。你的任务是:基于给定的历史消息、当前消息,以及我们已经检索到的“感知记忆”和“短期记忆”,判断是否还需要检索“长期记忆”(LTM)来支撑一次准确、完整、上下文一致的回复。 -**核心原则:** -- **适当检索长期记忆有助于提升回复质量。** 当对话涉及到特定话题、人物、事件或需要回忆过去的经历时,应该检索长期记忆。 -- **判断标准:** 只有当现有记忆无法理解用户意图,或无法形成基本、连贯的回复时,才认为“不充足”。检索长期记忆耗时。除非有需要,否则不要检索。 -- **如果用户在讨论某个具体话题,即使现有记忆有一些相关信息,也可以检索长期记忆来补充更多背景。** +**总体偏好(重要):** +- 我们宁可多花一点资源去检索长期记忆,也不要在本该检索时漏检索。 +- 因此:只要存在明显不确定、信息缺口、或需要更精确细节的情况,就倾向于判定“现有记忆不充足”(`is_sufficient: false`)。 -**用户查询:** +**输入:** +**当前用户消息:** {query} -{chat_history_block}**检索到的感知记忆(即时对话,格式:【时间 (聊天流)】消息列表):** +{chat_history_block}**已检索到的感知记忆(即时对话,格式:【时间 (聊天流)】消息列表):** {perceptual_desc or '(无)'} -**检索到的短期记忆(结构化信息,自然语言描述):** +**已检索到的短期记忆(结构化信息,自然语言描述):** {short_term_desc or '(无)'} -**评估指南:** -1. **分析用户意图**:用户在聊什么?是简单闲聊还是有具体话题? -2. **检查现有记忆**: - - 对于闲聊、打招呼、无特定主题的互动 → 现有记忆充足 (`is_sufficient: true`)。 - - 如果涉及具体话题(人物、事件、知识),但现有记忆能提供基本信息 → 现有记忆充足 (`is_sufficient: true`)。 - - 仅当用户明确问及过去的特定事件,或当前信息完全无法理解用户意图时 → 现有记忆不充足 (`is_sufficient: false`)。 +**什么时候必须检索长期记忆(满足任一条 → `is_sufficient: false`):** +1. **用户明确要求回忆/找回过去信息**:例如“你还记得…?”“上次我们说到…?”“帮我回忆一下…/之前…/那天…/某次…” +2. **你对答案没有把握或存在不确定性**:例如无法确定人物/事件/时间/地点/偏好/承诺/任务细节,或只能给出模糊猜测。 +3. **现有记忆不足以给出精确回答**:要给出具体结论、细节、步骤、承诺、时间线、决定依据,但感知/短期记忆缺少关键事实。 +4. **对话依赖用户个体历史**:涉及用户的个人信息、偏好、长期目标、过往经历、已约定事项、持续进行的项目/任务,需要更早的上下文才能回答。 +5. **指代不清或背景缺失**:出现“那个/那件事/他/她/它/之前说的/你知道的”等省略指代,现有记忆不足以唯一指向。 +6. **记忆冲突或碎片化**:感知/短期记忆之间存在矛盾、时间线断裂、或信息片段无法拼成完整图景。 -**输出格式(JSON):** -```json -{{ - "is_sufficient": true/false, - "confidence": 0.85, - "reasoning": "在这里解释你的判断理由。例如:‘用户只是在打招呼,现有记忆已足够,无需检索长期记忆。’或‘用户问到了一个具体的历史事件,现有记忆完全没有相关信息,必须检索长期记忆。’", - "missing_aspects": ["缺失的信息1", "缺失的信息2"], - "additional_queries": ["补充query1", "补充query2"] -}} -``` +**什么时候可以不检索(同时满足全部条件 → `is_sufficient: true`):** +- 用户只是闲聊/打招呼/情绪表达/泛化问题(不依赖用户个人历史),且现有记忆已足以给出可靠且一致的回复; +- 你能在不猜测的情况下回答,且不需要更早的细节来保证准确性。 -请输出JSON:""" +**输出要求(JSON):** +- `is_sufficient`: `true` 表示“无需检索长期记忆”;`false` 表示“需要检索长期记忆” +- `confidence`: 0~1,表示你对该判断的把握;若你偏向检索但仍不确定,也应输出较低/中等置信度并保持 `is_sufficient: false` +- `missing_aspects`: 列出阻碍精确回答的缺失点(可为空数组) +- `additional_queries`: 给出 1~5 条用于检索长期记忆的补充 query(尽量短、可检索、包含关键实体/事件/时间线线索;可为空数组) + +请仅输出 JSON(可以用 ```json 包裹,也可以直接输出纯 JSON):""" # 调用记忆裁判模型 if not model_config.model_task_config: