From 80747000b2c1c8bf5753c89212bc4a66c3638449 Mon Sep 17 00:00:00 2001 From: 114514 <2514624910@qq.com> Date: Fri, 2 May 2025 11:34:24 +0800 Subject: [PATCH] fix --- src/plugins/PFC/action_planner.py | 75 +++++++++++++++++++----------- src/plugins/PFC/conversation.py | 44 +++++++++--------- src/plugins/PFC/reply_generator.py | 56 +++++++++++----------- 3 files changed, 99 insertions(+), 76 deletions(-) diff --git a/src/plugins/PFC/action_planner.py b/src/plugins/PFC/action_planner.py index a86ddf0a..1f10c973 100644 --- a/src/plugins/PFC/action_planner.py +++ b/src/plugins/PFC/action_planner.py @@ -360,38 +360,38 @@ class ActionPlanner: goals_str = "- 构建对话目标时出错。\n" # --- 知识信息字符串构建开始 --- - knowledge_info_str = "【已获取的相关知识和记忆】\n" - try: + # knowledge_info_str = "【已获取的相关知识和记忆】\n" + # try: # 检查 conversation_info 是否有 knowledge_list 并且不为空 - if hasattr(conversation_info, "knowledge_list") and conversation_info.knowledge_list: + # if hasattr(conversation_info, "knowledge_list") and conversation_info.knowledge_list: # 最多只显示最近的 5 条知识,防止 Prompt 过长 - recent_knowledge = conversation_info.knowledge_list[-5:] - for i, knowledge_item in enumerate(recent_knowledge): - if isinstance(knowledge_item, dict): - query = knowledge_item.get("query", "未知查询") - knowledge = knowledge_item.get("knowledge", "无知识内容") - source = knowledge_item.get("source", "未知来源") + # recent_knowledge = conversation_info.knowledge_list[-5:] + # for i, knowledge_item in enumerate(recent_knowledge): + # if isinstance(knowledge_item, dict): + # query = knowledge_item.get("query", "未知查询") + # knowledge = knowledge_item.get("knowledge", "无知识内容") + # source = knowledge_item.get("source", "未知来源") # 只取知识内容的前 2000 个字,避免太长 - knowledge_snippet = knowledge[:2000] + "..." if len(knowledge) > 2000 else knowledge - knowledge_info_str += ( - f"{i + 1}. 关于 '{query}' 的知识 (来源: {source}):\n {knowledge_snippet}\n" - ) - else: + # knowledge_snippet = knowledge[:2000] + "..." if len(knowledge) > 2000 else knowledge + # knowledge_info_str += ( + # f"{i + 1}. 关于 '{query}' 的知识 (来源: {source}):\n {knowledge_snippet}\n" + # ) + # else: # 处理列表里不是字典的异常情况 - knowledge_info_str += f"{i + 1}. 发现一条格式不正确的知识记录。\n" + # knowledge_info_str += f"{i + 1}. 发现一条格式不正确的知识记录。\n" - if not recent_knowledge: # 如果 knowledge_list 存在但为空 - knowledge_info_str += "- 暂无相关知识和记忆。\n" + # if not recent_knowledge: # 如果 knowledge_list 存在但为空 + # knowledge_info_str += "- 暂无相关知识和记忆。\n" - else: + # else: # 如果 conversation_info 没有 knowledge_list 属性,或者列表为空 - knowledge_info_str += "- 暂无相关知识记忆。\n" - except AttributeError: - logger.warning(f"[私聊][{self.private_name}]ConversationInfo 对象可能缺少 knowledge_list 属性。") - knowledge_info_str += "- 获取知识列表时出错。\n" - except Exception as e: - logger.error(f"[私聊][{self.private_name}]构建知识信息字符串时出错: {e}") - knowledge_info_str += "- 处理知识列表时出错。\n" + # knowledge_info_str += "- 暂无相关知识记忆。\n" + # except AttributeError: + # logger.warning(f"[私聊][{self.private_name}]ConversationInfo 对象可能缺少 knowledge_list 属性。") + # knowledge_info_str += "- 获取知识列表时出错。\n" + # except Exception as e: + # logger.error(f"[私聊][{self.private_name}]构建知识信息字符串时出错: {e}") + # knowledge_info_str += "- 处理知识列表时出错。\n" # --- 知识信息字符串构建结束 --- # 获取聊天历史记录 (chat_history_text) @@ -501,6 +501,27 @@ class ActionPlanner: last_action_context += f"- 该行动当前状态: {status}\n" # self.last_successful_action_type = None # 非完成状态,清除记录 + retrieved_memory_str_planner = "" + retrieved_knowledge_str_planner = "" + retrieval_context = chat_history_text # 使用聊天记录作为检索上下文 + if retrieval_context and retrieval_context != "还没有聊天记录。" and retrieval_context != "[构建聊天记录出错]": + try: + logger.debug(f"[私聊][{self.private_name}] (ActionPlanner) 开始自动检索记忆...") + retrieved_memory_str_planner = await self._get_memory_info(text=retrieval_context) + logger.info(f"[私聊][{self.private_name}] (ActionPlanner) 自动检索记忆 {'完成' if retrieved_memory_str_planner else '无结果'}。") + + logger.debug(f"[私聊][{self.private_name}] (ActionPlanner) 开始自动知识检索...") + retrieved_knowledge_str_planner = await self._get_prompt_info(message=retrieval_context) + logger.info(f"[私聊][{self.private_name}] (ActionPlanner) 自动检索知识 {'完成' if retrieved_knowledge_str_planner else '无结果'}。") + except Exception as retrieval_err: + logger.error(f"[私聊][{self.private_name}] (ActionPlanner) 自动检索时出错: {retrieval_err}") + retrieved_memory_str_planner = "检索记忆时出错。\n" + retrieved_knowledge_str_planner = "检索知识时出错。\n" + else: + logger.debug(f"[私聊][{self.private_name}] (ActionPlanner) 无有效聊天记录,跳过自动检索。") + retrieved_memory_str_planner = "无聊天记录无法检索记忆。\n" + retrieved_knowledge_str_planner = "无聊天记录无法检索知识。\n" + # --- 选择 Prompt --- if last_successful_reply_action in ["direct_reply", "send_new_message"]: prompt_template = PROMPT_FOLLOW_UP @@ -518,7 +539,9 @@ class ActionPlanner: time_since_last_bot_message_info=time_since_last_bot_message_info, timeout_context=timeout_context, chat_history_text=chat_history_text if chat_history_text.strip() else "还没有聊天记录。", - knowledge_info_str=knowledge_info_str, + # knowledge_info_str=knowledge_info_str, + retrieved_memory_str=retrieved_memory_str_planner if retrieved_memory_str_planner else "无相关记忆。", + retrieved_knowledge_str=retrieved_knowledge_str_planner if retrieved_knowledge_str_planner else "无相关知识。" ) logger.debug(f"[私聊][{self.private_name}]发送到LLM的最终提示词:\n------\n{prompt}\n------") diff --git a/src/plugins/PFC/conversation.py b/src/plugins/PFC/conversation.py index 9f744c30..2ecd6824 100644 --- a/src/plugins/PFC/conversation.py +++ b/src/plugins/PFC/conversation.py @@ -505,31 +505,31 @@ class Conversation: } conversation_info.done_action.append(wait_action_record) - elif action == "fetch_knowledge": - self.state = ConversationState.FETCHING - knowledge_query = reason - try: + # elif action == "fetch_knowledge": + # self.state = ConversationState.FETCHING + # knowledge_query = reason + # try: # 检查 knowledge_fetcher 是否存在 - if not hasattr(self, "knowledge_fetcher"): - logger.error(f"[私聊][{self.private_name}]KnowledgeFetcher 未初始化,无法获取知识。") - raise AttributeError("KnowledgeFetcher not initialized") + # if not hasattr(self, "knowledge_fetcher"): + # logger.error(f"[私聊][{self.private_name}]KnowledgeFetcher 未初始化,无法获取知识。") + # raise AttributeError("KnowledgeFetcher not initialized") - knowledge, source = await self.knowledge_fetcher.fetch(knowledge_query, observation_info.chat_history) - logger.info(f"[私聊][{self.private_name}]获取到知识: {knowledge[:100]}..., 来源: {source}") - if knowledge: + # knowledge, source = await self.knowledge_fetcher.fetch(knowledge_query, observation_info.chat_history) + # logger.info(f"[私聊][{self.private_name}]获取到知识: {knowledge[:100]}..., 来源: {source}") + # if knowledge: # 确保 knowledge_list 存在 - if not hasattr(conversation_info, "knowledge_list"): - conversation_info.knowledge_list = [] - conversation_info.knowledge_list.append( - {"query": knowledge_query, "knowledge": knowledge, "source": source} - ) - action_successful = True - except Exception as fetch_err: - logger.error(f"[私聊][{self.private_name}]获取知识时出错: {str(fetch_err)}") - conversation_info.done_action[action_index].update( - {"status": "recall", "final_reason": f"获取知识失败: {str(fetch_err)}"} - ) - self.conversation_info.last_successful_reply_action = None # 重置状态 + # if not hasattr(conversation_info, "knowledge_list"): + # conversation_info.knowledge_list = [] + # conversation_info.knowledge_list.append( + # {"query": knowledge_query, "knowledge": knowledge, "source": source} + # ) + # action_successful = True + # except Exception as fetch_err: + # logger.error(f"[私聊][{self.private_name}]获取知识时出错: {str(fetch_err)}") + # conversation_info.done_action[action_index].update( + # {"status": "recall", "final_reason": f"获取知识失败: {str(fetch_err)}"} + # ) + # self.conversation_info.last_successful_reply_action = None # 重置状态 elif action == "rethink_goal": self.state = ConversationState.RETHINKING diff --git a/src/plugins/PFC/reply_generator.py b/src/plugins/PFC/reply_generator.py index 1b2362f3..a9ed61fd 100644 --- a/src/plugins/PFC/reply_generator.py +++ b/src/plugins/PFC/reply_generator.py @@ -37,7 +37,7 @@ PROMPT_DIRECT_REPLY = """{persona_text}。现在你在参与一场QQ私聊,请 最近的聊天记录: {chat_history_text} -{related_memory_info}。 +{retrieved_memory_str} 请根据上述信息,结合聊天记录,回复对方。该回复应该: @@ -66,7 +66,7 @@ PROMPT_SEND_NEW_MESSAGE = """{persona_text}。现在你在参与一场QQ私聊 最近的聊天记录: {chat_history_text} -{related_memory_info} +{retrieved_memory_str} 请根据上述信息,结合聊天记录,继续发一条新消息(例如对之前消息的补充,深入话题,或追问等等)。该消息应该: 1. 符合对话目标,以"你"的角度发言(不要自己与自己对话!) @@ -282,36 +282,36 @@ class ReplyGenerator: goals_str = "- 目前没有明确对话目标\n" # 简化无目标情况 # --- 新增:构建知识信息字符串 --- - knowledge_info_str = "【供参考的相关知识和记忆】\n" # 稍微改下标题,表明是供参考 - try: + # knowledge_info_str = "【供参考的相关知识和记忆】\n" # 稍微改下标题,表明是供参考 + # try: # 检查 conversation_info 是否有 knowledge_list 并且不为空 - if hasattr(conversation_info, "knowledge_list") and conversation_info.knowledge_list: + # if hasattr(conversation_info, "knowledge_list") and conversation_info.knowledge_list: # 最多只显示最近的 5 条知识 - recent_knowledge = conversation_info.knowledge_list[-5:] - for i, knowledge_item in enumerate(recent_knowledge): - if isinstance(knowledge_item, dict): - query = knowledge_item.get("query", "未知查询") - knowledge = knowledge_item.get("knowledge", "无知识内容") - source = knowledge_item.get("source", "未知来源") + # recent_knowledge = conversation_info.knowledge_list[-5:] + # for i, knowledge_item in enumerate(recent_knowledge): + # if isinstance(knowledge_item, dict): + # query = knowledge_item.get("query", "未知查询") + # knowledge = knowledge_item.get("knowledge", "无知识内容") + # source = knowledge_item.get("source", "未知来源") # 只取知识内容的前 2000 个字 - knowledge_snippet = knowledge[:2000] + "..." if len(knowledge) > 2000 else knowledge - knowledge_info_str += ( - f"{i + 1}. 关于 '{query}' (来源: {source}): {knowledge_snippet}\n" # 格式微调,更简洁 - ) - else: - knowledge_info_str += f"{i + 1}. 发现一条格式不正确的知识记录。\n" + # knowledge_snippet = knowledge[:2000] + "..." if len(knowledge) > 2000 else knowledge + # knowledge_info_str += ( + # f"{i + 1}. 关于 '{query}' (来源: {source}): {knowledge_snippet}\n" # 格式微调,更简洁 + # ) + # else: + # knowledge_info_str += f"{i + 1}. 发现一条格式不正确的知识记录。\n" - if not recent_knowledge: - knowledge_info_str += "- 暂无。\n" # 更简洁的提示 + # if not recent_knowledge: + # knowledge_info_str += "- 暂无。\n" # 更简洁的提示 - else: - knowledge_info_str += "- 暂无。\n" - except AttributeError: - logger.warning(f"[私聊][{self.private_name}]ConversationInfo 对象可能缺少 knowledge_list 属性。") - knowledge_info_str += "- 获取知识列表时出错。\n" - except Exception as e: - logger.error(f"[私聊][{self.private_name}]构建知识信息字符串时出错: {e}") - knowledge_info_str += "- 处理知识列表时出错。\n" + # else: + # knowledge_info_str += "- 暂无。\n" + # except AttributeError: + # logger.warning(f"[私聊][{self.private_name}]ConversationInfo 对象可能缺少 knowledge_list 属性。") + # knowledge_info_str += "- 获取知识列表时出错。\n" + # except Exception as e: + # logger.error(f"[私聊][{self.private_name}]构建知识信息字符串时出错: {e}") + # knowledge_info_str += "- 处理知识列表时出错。\n" # 获取聊天历史记录 (chat_history_text) chat_history_text = observation_info.chat_history_str @@ -377,7 +377,7 @@ class ReplyGenerator: persona_text=persona_text, goals_str=goals_str, chat_history_text=chat_history_text, - knowledge_info_str=knowledge_info_str, + # knowledge_info_str=knowledge_info_str, retrieved_memory_str=retrieved_memory_str if retrieved_memory_str else "无相关记忆。", # 如果为空则提示无 retrieved_knowledge_str=retrieved_knowledge_str if retrieved_knowledge_str else "无相关知识。" # 如果为空则提示无 )