From 00c8144d49aed168081ee9dbd00f594c6a5f9b50 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Sat, 25 Oct 2025 22:02:49 +0800 Subject: [PATCH] =?UTF-8?q?better=EF=BC=9A=E4=BF=AE=E6=94=B9get=5Fmemoy=20?= =?UTF-8?q?tool=E4=BB=A5=E5=A4=84=E7=90=86=E6=B2=A1=E6=9C=89=E6=8F=90?= =?UTF-8?q?=E5=8F=96=E5=88=B0=E8=AE=B0=E5=BF=86=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/planner_actions/planner.py | 4 +-- src/chat/replyer/group_generator.py | 32 +++++++++++++++++---- src/chat/replyer/prompt/replyer_prompt.py | 3 +- src/chat/replyer/prompt/rewrite_prompt.py | 2 +- src/plugins/built_in/memory/build_memory.py | 25 +++++++++------- 5 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/chat/planner_actions/planner.py b/src/chat/planner_actions/planner.py index 5a93b6f4..e0148059 100644 --- a/src/chat/planner_actions/planner.py +++ b/src/chat/planner_actions/planner.py @@ -472,8 +472,8 @@ class ActionPlanner: # 调用LLM llm_content, (reasoning_content, _, _) = await self.planner_llm.generate_response_async(prompt=prompt) - logger.info(f"{self.log_prefix}规划器原始提示词: {prompt}") - logger.info(f"{self.log_prefix}规划器原始响应: {llm_content}") + # logger.info(f"{self.log_prefix}规划器原始提示词: {prompt}") + # logger.info(f"{self.log_prefix}规划器原始响应: {llm_content}") if global_config.debug.show_prompt: logger.info(f"{self.log_prefix}规划器原始提示词: {prompt}") diff --git a/src/chat/replyer/group_generator.py b/src/chat/replyer/group_generator.py index 572ccfa1..073338a2 100644 --- a/src/chat/replyer/group_generator.py +++ b/src/chat/replyer/group_generator.py @@ -485,6 +485,31 @@ class DefaultReplyer: ) -> Tuple[str, str]: """ + Args: + message_list_before_now: 历史消息列表 + target_user_id: 目标用户ID(当前对话对象) + + Returns: + Tuple[str, str]: (核心对话prompt, 背景对话prompt) + """ + # 构建背景对话 prompt + all_dialogue_prompt = "" + if message_list_before_now: + latest_msgs = message_list_before_now[-int(global_config.chat.max_context_size) :] + all_dialogue_prompt = build_readable_messages( + latest_msgs, + replace_bot_name=True, + timestamp_mode="normal_no_YMD", + truncate=True, + ) + + return all_dialogue_prompt + + def core_background_build_chat_history_prompts( + self, message_list_before_now: List[DatabaseMessages], target_user_id: str, sender: str + ) -> Tuple[str, str]: + """ + Args: message_list_before_now: 历史消息列表 target_user_id: 目标用户ID(当前对话对象) @@ -792,9 +817,7 @@ class DefaultReplyer: reply_target_block = "" # 构建分离的对话 prompt - core_dialogue_prompt, background_dialogue_prompt = self.build_chat_history_prompts( - message_list_before_now_long, user_id, sender - ) + dialogue_prompt = self.build_chat_history_prompts(message_list_before_now_long, user_id, sender) return await global_prompt_manager.format_prompt( "replyer_prompt", @@ -809,9 +832,8 @@ class DefaultReplyer: identity=personality_prompt, action_descriptions=actions_info, sender_name=sender, - background_dialogue_prompt=background_dialogue_prompt, + dialogue_prompt=dialogue_prompt, time_block=time_block, - core_dialogue_prompt=core_dialogue_prompt, reply_target_block=reply_target_block, reply_style=global_config.personality.reply_style, keywords_reaction_prompt=keywords_reaction_prompt, diff --git a/src/chat/replyer/prompt/replyer_prompt.py b/src/chat/replyer/prompt/replyer_prompt.py index 732500a5..4e9b015d 100644 --- a/src/chat/replyer/prompt/replyer_prompt.py +++ b/src/chat/replyer/prompt/replyer_prompt.py @@ -17,8 +17,7 @@ def init_replyer_prompt(): 你正在qq群里聊天,下面是群里正在聊的内容: {time_block} -{background_dialogue_prompt} -{core_dialogue_prompt} +{dialogue_prompt} {reply_target_block}。 {identity} diff --git a/src/chat/replyer/prompt/rewrite_prompt.py b/src/chat/replyer/prompt/rewrite_prompt.py index c574de4a..c93d9033 100644 --- a/src/chat/replyer/prompt/rewrite_prompt.py +++ b/src/chat/replyer/prompt/rewrite_prompt.py @@ -24,7 +24,7 @@ def init_rewrite_prompt(): 你可以完全重组回复,保留最基本的表达含义就好,但重组后保持语意通顺。 {keywords_reaction_prompt} {moderation_prompt} -不要输出多余内容(包括冒号和引号,表情包,emoji,at或 @等 ),只输出一条回复就好。 +不要输出多余内容(包括冒号和引号,表情包,emoji,at或 @等 ),只输出一条回复就好。不要思考的太长。 改写后的回复: """, "default_expressor_prompt", diff --git a/src/plugins/built_in/memory/build_memory.py b/src/plugins/built_in/memory/build_memory.py index 563e9ff7..02e71447 100644 --- a/src/plugins/built_in/memory/build_memory.py +++ b/src/plugins/built_in/memory/build_memory.py @@ -130,12 +130,15 @@ class GetMemoryTool(BaseTool): if memory_answer: content_parts.append(f"记忆仓库答案:{memory_answer}") else: - content_parts.append("记忆仓库:没有找到相关记忆") + content_parts.append(f"记忆仓库:对问题'{question}',没有什么印象") if chat_answer: - content_parts.append(f"聊天记录答案:{chat_answer}") + content_parts.append(f"对问题'{question}',基于聊天记录的回答:{chat_answer}") elif has_time_params: - content_parts.append("聊天记录:没有找到相关记录") + if time_point: + content_parts.append(f"在 {time_point} 的时间点,你没有参与聊天") + elif time_range: + content_parts.append(f"在 {time_range} 的时间范围内,你没有参与聊天") return {"content": "\n".join(content_parts)} @@ -191,35 +194,37 @@ class GetMemoryTool(BaseTool): request_type="chat_history_analysis" ) - analysis_prompt = f"""请根据以下聊天记录内容,回答用户的问题。 - + analysis_prompt = f"""请根据以下聊天记录内容,回答用户的问题。请输出一段平文本,不要有特殊格式。 聊天记录: {chat_content} 用户问题:{question} -请仔细分析聊天记录,提取与问题相关的信息,并给出准确的答案。如果聊天记录中没有相关信息,请说明"聊天记录中没有找到相关信息"。 +请仔细分析聊天记录,提取与问题相关的信息,并给出准确的答案。如果聊天记录中没有相关信息,无法回答问题,输出"无有效信息"即可,不要输出其他内容。 答案:""" response, (reasoning, model_name, tool_calls) = await llm_request.generate_response_async( prompt=analysis_prompt, temperature=0.3, - max_tokens=500 + max_tokens=256 ) - return f"基于聊天记录分析:{response}" + if "无有效信息" in response: + return "" + + return response except Exception as llm_error: logger.error(f"LLM分析聊天记录失败: {llm_error}") # 如果LLM分析失败,返回聊天内容的摘要 if len(chat_content) > 300: chat_content = chat_content[:300] + "..." - return f"聊天记录摘要:{chat_content}" + return chat_content except Exception as e: logger.error(f"从聊天记录获取答案失败: {e}") - return f"聊天记录分析失败: {str(e)}" + return "" class GetMemoryAction(BaseAction): """关系动作 - 获取记忆"""