From 154026f6401ebc6d74601ffb5798acba3ba45964 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Sat, 1 Mar 2025 11:30:19 +0800 Subject: [PATCH] =?UTF-8?q?v0.2.5=20=E6=8F=90=E5=8D=87=E4=BA=86=E6=80=A7?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复了一个弱智bug,现在修改了数据库消息的存储结构,可能会报错,属于正常情况 --- src/plugins/chat/cq_code.py | 3 +++ src/plugins/chat/message.py | 22 ++++++---------- src/plugins/chat/prompt_builder.py | 10 +++----- src/plugins/chat/storage.py | 2 ++ src/plugins/chat/utils.py | 41 ++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+), 20 deletions(-) diff --git a/src/plugins/chat/cq_code.py b/src/plugins/chat/cq_code.py index d54d71637..ae3429da2 100644 --- a/src/plugins/chat/cq_code.py +++ b/src/plugins/chat/cq_code.py @@ -42,6 +42,7 @@ class CQCode: def translate(self): """根据CQ码类型进行相应的翻译处理""" + print(f"\033[1;34m[调试信息]\033[0m 开始翻译CQ{self.params}码: {self.type}") if self.type == 'text': self.translated_plain_text = self.params.get('text', '') elif self.type == 'image': @@ -318,6 +319,7 @@ class CQCode: # 创建Message对象 from .message import Message if self.reply_message == None: + print(f"\033[1;31m[错误]\033[0m 回复消息为空") return '[回复某人消息]' if self.reply_message.sender.user_id: @@ -333,6 +335,7 @@ class CQCode: return f"[回复 {self.reply_message.sender.nickname} 的消息: {message_obj.processed_plain_text}]" else: + print(f"\033[1;31m[错误]\033[0m 回复消息的sender.user_id为空") return '[回复某人消息]' @staticmethod diff --git a/src/plugins/chat/message.py b/src/plugins/chat/message.py index 22cf610f0..2e91f530e 100644 --- a/src/plugins/chat/message.py +++ b/src/plugins/chat/message.py @@ -42,6 +42,7 @@ class Message: message_segments: List[Dict] = None # 存储解析后的消息片段 processed_plain_text: str = None # 用于存储处理后的plain_text + detailed_plain_text: str = None # 用于存储详细可读文本 time: float = None @@ -70,6 +71,11 @@ class Message: seg.translated_plain_text for seg in self.message_segments ) + #将详细翻译为详细可读文本 + time_str = time.strftime("%m-%d %H:%M:%S", time.localtime(self.time)) + name = self.user_nickname or f"用户{self.user_id}" + content = self.processed_plain_text + self.detailed_plain_text = f"[{time_str}] {name}: {content}\n" def get_groupname(self, group_id: int) -> str: @@ -93,6 +99,7 @@ class Message: - cq_code_list:分割出的聊天对象,包括文本和CQ码 - trans_list:翻译后的对象列表 """ + print(f"\033[1;34m[调试信息]\033[0m 正在处理消息: {message}") cq_code_dict_list = [] trans_list = [] @@ -143,21 +150,8 @@ class Message: #翻译作为字典的CQ码 for _code_item in cq_code_dict_list: - #一个一个CQ码处理 message_obj = cq_code_tool.cq_from_dict_to_class(_code_item,reply = self.reply_message) - trans_list.append(message_obj) - # except Exception as e: - # import traceback - # print(f"\033[1;31m[错误]\033[0m 处理CQ码失败: {str(e)}") - # print(f"CQ码内容: {cq_code}") - # print(f"当前消息属性:") - # print(f"- group_id: {self.group_id}") - # print(f"- user_id: {self.user_id}") - # print(f"- user_nickname: {self.user_nickname}") - # print(f"- group_name: {self.group_name}") - # print("详细错误信息:") - # print(traceback.format_exc()) - + trans_list.append(message_obj) return trans_list class Message_Thinking: diff --git a/src/plugins/chat/prompt_builder.py b/src/plugins/chat/prompt_builder.py index 8d8bf89a4..5572ae1dc 100644 --- a/src/plugins/chat/prompt_builder.py +++ b/src/plugins/chat/prompt_builder.py @@ -3,7 +3,7 @@ import random from dotenv import load_dotenv from ..schedule.schedule_generator import bot_schedule import os -from .utils import get_embedding, combine_messages, get_recent_group_messages +from .utils import get_embedding, combine_messages, get_recent_group_detailed_plain_text from ...common.database import Database from .config import global_config @@ -64,14 +64,12 @@ class PromptBuilder: 请你记住上面的[知识],之后可能会用到\n----------------------------------------------------\n''' promt_info_prompt = '你有一些[知识],在上面可以参考。' + print(f"\033[1;34m[调试信息]\033[0m 正在构建聊天上下文") chat_talking_prompt = '' if group_id: - # 从数据库获取最近消息 - message_objects = get_recent_group_messages(self.db, group_id, limit=global_config.MAX_CONTEXT_SIZE) - if message_objects: - chat_talking_prompt = combine_messages(message_objects) - # print(f"\033[1;34m[调试]\033[0m 已从数据库获取群 {group_id} 的最近{len(message_objects)}条消息记录") + chat_talking_prompt = get_recent_group_detailed_plain_text(self.db, group_id, limit=global_config.MAX_CONTEXT_SIZE,combine = True) + print(f"\033[1;34m[调试]\033[0m 已从数据库获取群 {group_id} 的消息记录:{chat_talking_prompt}") #激活prompt构建 activate_prompt = '' diff --git a/src/plugins/chat/storage.py b/src/plugins/chat/storage.py index 7aea02568..4e2455aa6 100644 --- a/src/plugins/chat/storage.py +++ b/src/plugins/chat/storage.py @@ -25,6 +25,7 @@ class MessageStorage: "user_nickname": message.user_nickname, "group_name": message.group_name, "topic": topic, + "detailed_plain_text": message.detailed_plain_text, } else: message_data = { @@ -38,6 +39,7 @@ class MessageStorage: "user_nickname": message.user_nickname, "group_name": message.group_name, "topic": topic, + "detailed_plain_text": message.detailed_plain_text, } self.db.db.messages.insert_one(message_data) diff --git a/src/plugins/chat/utils.py b/src/plugins/chat/utils.py index ff4d7680d..58e2280cc 100644 --- a/src/plugins/chat/utils.py +++ b/src/plugins/chat/utils.py @@ -6,6 +6,7 @@ import requests import numpy as np from .config import llm_config, global_config import re +from typing import Dict def combine_messages(messages: List[Message]) -> str: @@ -27,6 +28,16 @@ def combine_messages(messages: List[Message]) -> str: return result +def db_message_to_str (message_dict: Dict) -> str: + print(f"message_dict: {message_dict}") + time_str = time.strftime("%m-%d %H:%M:%S", time.localtime(message_dict["time"])) + name = message_dict.get("user_nickname", "") or f"用户{message_dict['user_id']}" + content = message_dict.get("processed_plain_text", "") + result = f"[{time_str}] {name}: {content}\n" + print(f"result: {result}") + return result + + def is_mentioned_bot_in_message(message: Message) -> bool: """检查消息是否提到了机器人""" keywords = [global_config.BOT_NICKNAME] @@ -117,6 +128,36 @@ def get_recent_group_messages(db, group_id: int, limit: int = 12) -> list: message_objects.reverse() return message_objects +def get_recent_group_detailed_plain_text(db, group_id: int, limit: int = 12,combine = False): + recent_messages = list(db.db.messages.find( + {"group_id": group_id}, + { + "time": 1, # 返回时间字段 + "user_id": 1, # 返回用户ID字段 + "user_nickname": 1, # 返回用户昵称字段 + "message_id": 1, # 返回消息ID字段 + "detailed_plain_text": 1 # 返回处理后的文本字段 + } + ).sort("time", -1).limit(limit)) + + if not recent_messages: + return [] + + message_detailed_plain_text = '' + message_detailed_plain_text_list = [] + + + if combine: + for msg_db_data in recent_messages: + message_detailed_plain_text+=str(msg_db_data["detailed_plain_text"]) + return message_detailed_plain_text + else: + for msg_db_data in recent_messages: + message_detailed_plain_text_list.append(msg_db_data["detailed_plain_text"]) + return message_detailed_plain_text_list + + + def split_into_sentences_w_remove_punctuation(text: str) -> List[str]: """将文本分割成句子,但保持书名号中的内容完整 Args: