From 4033c6d8adbb172c53d92f006e054782052e1f96 Mon Sep 17 00:00:00 2001 From: Bakadax Date: Tue, 13 May 2025 13:09:29 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=B0=E5=8F=B7=E5=88=86=E6=9E=90=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/config.py | 6 +++++- src/plugins/group_nickname/nickname_manager.py | 18 +++++++++++++++--- template/bot_config_template.toml | 3 ++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/config/config.py b/src/config/config.py index 3bb14c2e..5fe216ad 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -279,8 +279,9 @@ class BotConfig: max_nicknames_in_prompt: int = 10 # Prompt 中最多注入的绰号数量 nickname_probability_smoothing: int = 1 # 绰号加权随机选择的平滑因子 nickname_queue_max_size: int = 100 # 绰号处理队列最大容量 - nickname_process_sleep_interval: float = 60 # 绰号处理进程休眠间隔(秒) + nickname_process_sleep_interval: float = 5 # 绰号处理进程休眠间隔(秒) nickname_analysis_history_limit: int = 30 # 绰号处理可见最大上下文 + nickname_analysis_probability: float = 0.1 # 绰号随机概率命中,该值越大,绰号分析越频繁 # 模型配置 llm_reasoning: dict[str, str] = field(default_factory=lambda: {}) @@ -432,6 +433,9 @@ class BotConfig: config.nickname_analysis_history_limit = group_nickname_config.get( "nickname_analysis_history_limit", config.nickname_analysis_history_limit ) + config.nickname_analysis_probability = group_nickname_config.get( + "nickname_analysis_probability", config.nickname_analysis_probability + ) def bot(parent: dict): # 机器人基础配置 diff --git a/src/plugins/group_nickname/nickname_manager.py b/src/plugins/group_nickname/nickname_manager.py index bde7e456..378755e1 100644 --- a/src/plugins/group_nickname/nickname_manager.py +++ b/src/plugins/group_nickname/nickname_manager.py @@ -1,7 +1,9 @@ import asyncio import threading +import random import time import json +import random import re from typing import Dict, Optional, List, Any from pymongo.errors import OperationFailure, DuplicateKeyError @@ -143,7 +145,7 @@ class NicknameManager: self.nickname_queue: asyncio.Queue = asyncio.Queue(maxsize=self.queue_max_size) self._stop_event = threading.Event() # stop_event 仍然使用 threading.Event,因为它是由另一个线程设置的 self._nickname_thread: Optional[threading.Thread] = None - self.sleep_interval = getattr(self.config, "nickname_process_sleep_interval", 60) # 超时时间 + self.sleep_interval = getattr(self.config, "nickname_process_sleep_interval", 5) # 超时时间 self._initialized = True logger.info("NicknameManager 初始化完成。") @@ -176,6 +178,7 @@ class NicknameManager: self._stop_event.set() # 设置停止事件,_processing_loop 会检测到 try: # 不需要清空 asyncio.Queue,让循环自然结束或被取消 + # self.empty_queue(self.nickname_queue) self._nickname_thread.join(timeout=10) # 等待线程结束 if self._nickname_thread.is_alive(): logger.warning("绰号处理器线程在超时后仍未停止。") @@ -188,6 +191,13 @@ class NicknameManager: else: logger.info("绰号处理器线程未在运行或已被清理。") + # def empty_queue(self, q: asyncio.Queue): + # while not q.empty(): + # # Depending on your program, you may want to + # # catch QueueEmpty + # q.get_nowait() + # q.task_done() + async def trigger_nickname_analysis( self, anchor_message: MessageRecv, @@ -201,6 +211,10 @@ class NicknameManager: if not self.is_enabled: return + if random.random() < global_config.nickname_analysis_probability: + logger.debug("跳过绰号分析:随机概率未命中。") + return + current_chat_stream = chat_stream or anchor_message.chat_stream if not current_chat_stream or not current_chat_stream.group_info: logger.debug("跳过绰号分析:非群聊或无效的聊天流。") @@ -353,7 +367,6 @@ class NicknameManager: logger.info(f"{log_prefix} LLM 找到绰号映射,准备更新数据库: {nickname_map_to_update}") for user_id_str, nickname in nickname_map_to_update.items(): - # ... (验证和数据库更新逻辑保持不变) ... if not user_id_str or not nickname: logger.warning(f"{log_prefix} 跳过无效条目: user_id='{user_id_str}', nickname='{nickname}'") continue @@ -389,7 +402,6 @@ class NicknameManager: """ 内部方法:调用 LLM 分析聊天记录和 Bot 回复,提取可靠的 用户ID-绰号 映射。 """ - # ... (此方法内部逻辑保持不变) ... if not self.llm_mapper: logger.error("LLM 映射器未初始化,无法执行分析。") return {"is_exist": False} diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index 0bb78789..431d5a04 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -128,8 +128,9 @@ enable_nickname_mapping = false # 绰号映射功能总开关(默认关闭, max_nicknames_in_prompt = 10 # Prompt 中最多注入的绰号数量(防止token数量爆炸) nickname_probability_smoothing = 1 # 绰号加权随机选择的平滑因子 nickname_queue_max_size = 100 # 绰号处理队列最大容量 -nickname_process_sleep_interval = 60 # 绰号处理进程休眠间隔(秒) +nickname_process_sleep_interval = 5 # 绰号处理进程休眠间隔(秒),不建议超过5,否则大概率导致结束过程中超时 nickname_analysis_history_limit = 30 # 绰号处理可见最大上下文 +nickname_analysis_probability = 0.1 # 绰号随机概率命中,该值越大,绰号分析越频繁 [memory] build_memory_interval = 2000 # 记忆构建间隔 单位秒 间隔越低,麦麦学习越多,但是冗余信息也会增多