From 4cc4d12b2a4d31398c90d12d8ea9aab26de256f1 Mon Sep 17 00:00:00 2001 From: Bakadax Date: Fri, 9 May 2025 08:51:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=B7=B2=E8=AF=BB=E6=A0=87?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=E9=87=8D=E5=A4=8D=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/PFC/action_planner.py | 48 +----------- src/plugins/PFC/conversation.py | 2 - src/plugins/PFC/conversation_initializer.py | 4 - src/plugins/PFC/pfc_KnowledgeFetcher.py | 85 --------------------- src/plugins/PFC/pfc_utils.py | 42 ++++++++++ src/plugins/PFC/reply_generator.py | 20 +---- 6 files changed, 48 insertions(+), 153 deletions(-) delete mode 100644 src/plugins/PFC/pfc_KnowledgeFetcher.py diff --git a/src/plugins/PFC/action_planner.py b/src/plugins/PFC/action_planner.py index 212c2bf0..63fe2cca 100644 --- a/src/plugins/PFC/action_planner.py +++ b/src/plugins/PFC/action_planner.py @@ -10,7 +10,7 @@ from ..models.utils_model import LLMRequest from src.config.config import global_config # 确保导入路径正确 -from .pfc_utils import get_items_from_json +from .pfc_utils import get_items_from_json, build_chat_history_text from .chat_observer import ChatObserver from .observation_info import ObservationInfo from .conversation_info import ConversationInfo @@ -210,7 +210,7 @@ class ActionPlanner: time_since_last_bot_message_info = self._get_bot_last_speak_time_info(observation_info) timeout_context = self._get_timeout_context(conversation_info) goals_str = self._build_goals_string(conversation_info) - chat_history_text = await self._build_chat_history_text(observation_info) + chat_history_text = await build_chat_history_text(observation_info, self.private_name) # 获取 sender_name, relationship_text, current_emotion_text sender_name_str = getattr(observation_info, "sender_name", "对方") # 从 observation_info 获取 if not sender_name_str: @@ -467,50 +467,6 @@ class ActionPlanner: goals_str = "- 构建对话目标时出错。\n" return goals_str - async def _build_chat_history_text(self, observation_info: ObservationInfo) -> str: - """构建聊天历史记录文本 (包含未处理消息)""" - - chat_history_text = "" - try: - if hasattr(observation_info, "chat_history_str") and observation_info.chat_history_str: - chat_history_text = observation_info.chat_history_str - elif hasattr(observation_info, "chat_history") and observation_info.chat_history: - history_slice = observation_info.chat_history[-20:] - chat_history_text = await build_readable_messages( - history_slice, replace_bot_name=True, merge_messages=False, timestamp_mode="relative", read_mark=0.0 - ) - else: - chat_history_text = "还没有聊天记录。\n" - unread_count = getattr(observation_info, "new_messages_count", 0) - unread_messages = getattr(observation_info, "unprocessed_messages", []) - if unread_count > 0 and unread_messages: - bot_qq_str = str(global_config.BOT_QQ) - other_unread_messages = [ - msg for msg in unread_messages if msg.get("user_info", {}).get("user_id") != bot_qq_str - ] - other_unread_count = len(other_unread_messages) - if other_unread_count > 0: - new_messages_str = await build_readable_messages( - other_unread_messages, - replace_bot_name=True, - merge_messages=False, - timestamp_mode="relative", - read_mark=0.0, - ) - chat_history_text += ( - f"\n--- 以下是 {other_unread_count} 条你需要处理的新消息 ---\n{new_messages_str}\n------\n" - ) - logger.debug(f"[私聊][{self.private_name}] 向 LLM 追加了 {other_unread_count} 条未读消息。") - else: - chat_history_text += "\n--- 以上均为已读消息,未读消息均已处理完毕 ---\n" - except AttributeError as e: - logger.warning(f"[私聊][{self.private_name}] 构建聊天记录文本时属性错误: {e}") - chat_history_text = "[获取聊天记录时出错]\n" - except Exception as e: - logger.error(f"[私聊][{self.private_name}] 处理聊天记录时发生未知错误: {e}") - chat_history_text = "[处理聊天记录时出错]\n" - return chat_history_text - def _build_action_history_context(self, conversation_info: ConversationInfo) -> Tuple[str, str]: """构建行动历史概要和上一次行动详细情况""" diff --git a/src/plugins/PFC/conversation.py b/src/plugins/PFC/conversation.py index da613317..b4a0e633 100644 --- a/src/plugins/PFC/conversation.py +++ b/src/plugins/PFC/conversation.py @@ -25,7 +25,6 @@ from .observation_info import ObservationInfo from .conversation_info import ConversationInfo from .reply_generator import ReplyGenerator from .PFC_idle.idle_chat import IdleChat -from .pfc_KnowledgeFetcher import KnowledgeFetcher from .waiter import Waiter from .reply_checker import ReplyChecker @@ -74,7 +73,6 @@ class Conversation: self.action_planner: Optional[ActionPlanner] = None self.goal_analyzer: Optional[GoalAnalyzer] = None self.reply_generator: Optional[ReplyGenerator] = None - self.knowledge_fetcher: Optional[KnowledgeFetcher] = None self.waiter: Optional[Waiter] = None self.direct_sender: Optional[DirectMessageSender] = None self.idle_chat: Optional[IdleChat] = None diff --git a/src/plugins/PFC/conversation_initializer.py b/src/plugins/PFC/conversation_initializer.py index 932f74f5..118bc171 100644 --- a/src/plugins/PFC/conversation_initializer.py +++ b/src/plugins/PFC/conversation_initializer.py @@ -18,7 +18,6 @@ from .observation_info import ObservationInfo from .conversation_info import ConversationInfo from .reply_generator import ReplyGenerator from .PFC_idle.idle_chat import IdleChat -from .pfc_KnowledgeFetcher import KnowledgeFetcher # 修正大小写 from .waiter import Waiter from .pfc_utils import get_person_id from .reply_checker import ReplyChecker @@ -166,9 +165,6 @@ async def initialize_core_components(conversation_instance: "Conversation"): conversation_instance.stream_id, conversation_instance.private_name ) - logger.debug(f"[私聊][{conversation_instance.private_name}] (Initializer) 初始化 KnowledgeFetcher...") - conversation_instance.knowledge_fetcher = KnowledgeFetcher(conversation_instance.private_name) - logger.debug(f"[私聊][{conversation_instance.private_name}] (Initializer) 初始化 Waiter...") conversation_instance.waiter = Waiter(conversation_instance.stream_id, conversation_instance.private_name) diff --git a/src/plugins/PFC/pfc_KnowledgeFetcher.py b/src/plugins/PFC/pfc_KnowledgeFetcher.py deleted file mode 100644 index 0989339d..00000000 --- a/src/plugins/PFC/pfc_KnowledgeFetcher.py +++ /dev/null @@ -1,85 +0,0 @@ -from typing import List, Tuple -from src.common.logger import get_module_logger -from src.plugins.memory_system.Hippocampus import HippocampusManager -from ..models.utils_model import LLMRequest -from ...config.config import global_config -from ..chat.message import Message -from ..knowledge.knowledge_lib import qa_manager -from ..utils.chat_message_builder import build_readable_messages - -logger = get_module_logger("knowledge_fetcher") - - -class KnowledgeFetcher: - """知识调取器""" - - def __init__(self, private_name: str): - self.llm = LLMRequest( - model=global_config.llm_normal, - temperature=global_config.llm_normal["temp"], - max_tokens=1000, - request_type="knowledge_fetch", - ) - self.private_name = private_name - - def _lpmm_get_knowledge(self, query: str) -> str: - """获取相关知识 - - Args: - query: 查询内容 - - Returns: - str: 构造好的,带相关度的知识 - """ - - logger.debug(f"[私聊][{self.private_name}]正在从LPMM知识库中获取知识") - try: - knowledge_info = qa_manager.get_knowledge(query) - logger.debug(f"[私聊][{self.private_name}]LPMM知识库查询结果: {knowledge_info:150}") - return knowledge_info - except Exception as e: - logger.error(f"[私聊][{self.private_name}]LPMM知识库搜索工具执行失败: {str(e)}") - return "未找到匹配的知识" - - async def fetch(self, query: str, chat_history: List[Message]) -> Tuple[str, str]: - """获取相关知识 - - Args: - query: 查询内容 - chat_history: 聊天历史 - - Returns: - Tuple[str, str]: (获取的知识, 知识来源) - """ - # 构建查询上下文 - chat_history_text = await build_readable_messages( - chat_history, - replace_bot_name=True, - merge_messages=False, - timestamp_mode="relative", - read_mark=0.0, - ) - - # 从记忆中获取相关知识 - related_memory = await HippocampusManager.get_instance().get_memory_from_text( - text=f"{query}\n{chat_history_text}", - max_memory_num=3, - max_memory_length=2, - max_depth=3, - fast_retrieval=False, - ) - knowledge_text = "" - sources_text = "无记忆匹配" # 默认值 - if related_memory: - sources = [] - for memory in related_memory: - knowledge_text += memory[1] + "\n" - sources.append(f"记忆片段{memory[0]}") - knowledge_text = knowledge_text.strip() - sources_text = ",".join(sources) - - knowledge_text += "\n现在有以下**知识**可供参考:\n " - knowledge_text += self._lpmm_get_knowledge(query) - knowledge_text += "\n请记住这些**知识**,并根据**知识**回答问题。\n" - - return knowledge_text or "未找到相关知识", sources_text or "无记忆匹配" diff --git a/src/plugins/PFC/pfc_utils.py b/src/plugins/PFC/pfc_utils.py index 38ead120..00c7c9ab 100644 --- a/src/plugins/PFC/pfc_utils.py +++ b/src/plugins/PFC/pfc_utils.py @@ -8,6 +8,9 @@ from src.plugins.heartFC_chat.heartflow_prompt_builder import prompt_builder # from src.plugins.chat.chat_stream import ChatStream from ..person_info.person_info import person_info_manager import math +from src.plugins.utils.chat_message_builder import build_readable_messages +from .observation_info import ObservationInfo +from src.config.config import global_config logger = get_logger("pfc_utils") @@ -339,3 +342,42 @@ async def adjust_relationship_value_nonlinear(old_value: float, raw_adjustment: value = 0 return value + +async def build_chat_history_text(observation_info: ObservationInfo, private_name: str) -> str: + """构建聊天历史记录文本 (包含未处理消息)""" + + chat_history_text = "" + try: + if hasattr(observation_info, "chat_history_str") and observation_info.chat_history_str: + chat_history_text = observation_info.chat_history_str + elif hasattr(observation_info, "chat_history") and observation_info.chat_history: + history_slice = observation_info.chat_history[-20:] + chat_history_text = await build_readable_messages( + history_slice, replace_bot_name=True, merge_messages=False, timestamp_mode="relative", read_mark=0.0 + ) + else: + chat_history_text = "还没有聊天记录。\n" + unread_count = getattr(observation_info, "new_messages_count", 0) + unread_messages = getattr(observation_info, "unprocessed_messages", []) + if unread_count > 0 and unread_messages: + bot_qq_str = str(global_config.BOT_QQ) + other_unread_messages = [ + msg for msg in unread_messages if msg.get("user_info", {}).get("user_id") != bot_qq_str + ] + other_unread_count = len(other_unread_messages) + if other_unread_count > 0: + new_messages_str = await build_readable_messages( + other_unread_messages, + replace_bot_name=True, + merge_messages=False, + timestamp_mode="relative", + read_mark=0.0, + ) + chat_history_text += f"\n{new_messages_str}\n------\n" + except AttributeError as e: + logger.warning(f"[私聊][{private_name}] 构建聊天记录文本时属性错误: {e}") + chat_history_text = "[获取聊天记录时出错]\n" + except Exception as e: + logger.error(f"[私聊][{private_name}] 处理聊天记录时发生未知错误: {e}") + chat_history_text = "[处理聊天记录时出错]\n" + return chat_history_text \ No newline at end of file diff --git a/src/plugins/PFC/reply_generator.py b/src/plugins/PFC/reply_generator.py index 01182259..426ef454 100644 --- a/src/plugins/PFC/reply_generator.py +++ b/src/plugins/PFC/reply_generator.py @@ -1,4 +1,6 @@ import random + +from networkx import bull_graph from .pfc_utils import retrieve_contextual_info from src.common.logger_manager import get_logger @@ -9,7 +11,7 @@ from .reply_checker import ReplyChecker from src.individuality.individuality import Individuality from .observation_info import ObservationInfo from .conversation_info import ConversationInfo -from src.plugins.utils.chat_message_builder import build_readable_messages +from .pfc_utils import build_chat_history_text logger = get_logger("reply_generator") @@ -214,21 +216,7 @@ class ReplyGenerator: else: goals_str = "- 目前没有明确对话目标\n" - chat_history_text = observation_info.chat_history_str - if observation_info.new_messages_count > 0 and observation_info.unprocessed_messages: - new_messages_list = observation_info.unprocessed_messages - new_messages_str = await build_readable_messages( - new_messages_list, - replace_bot_name=True, - merge_messages=False, - timestamp_mode="relative", - read_mark=0.0, - ) - chat_history_text += f"\n--- 以下是 {observation_info.new_messages_count} 条新消息 ---\n{new_messages_str}" - elif not chat_history_text: - chat_history_text = "还没有聊天记录。" - else: - chat_history_text += "\n--- 以上均为已读消息,未读消息均已处理完毕 ---\n" + chat_history_text = await build_chat_history_text(observation_info, self.private_name) sender_name_str = getattr(observation_info, "sender_name", "对方") if not sender_name_str: