From 1bd5580ff5bd28c856845f4a11db6502bb7558fb Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Tue, 7 Oct 2025 13:52:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(chat):=20=E4=BC=98=E5=8C=96=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=89=93=E6=96=AD=E7=B3=BB=E7=BB=9F=E6=A6=82=E7=8E=87?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E4=B8=BA=E5=8F=8D=E6=AF=94=E4=BE=8B=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将消息打断系统的概率计算从线性模型改为反比例函数模型, 提供更合理的打断概率分布: - 第1次打断概率约80% - 第2次打断概率约35% - 第3次打断概率约15% - 后续趋近于最低概率(5%) 新模型通过反比例函数实现前期高概率、快速衰减的特性, 避免线性模型中后期打断概率仍然较高的问题,提升用户体验。 --- .../data_models/message_manager_data_model.py | 27 +++++++++++-------- template/bot_config_template.toml | 9 ++++--- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/common/data_models/message_manager_data_model.py b/src/common/data_models/message_manager_data_model.py index ddbc4956e..656895648 100644 --- a/src/common/data_models/message_manager_data_model.py +++ b/src/common/data_models/message_manager_data_model.py @@ -93,7 +93,7 @@ class StreamContext(BaseDataModel): return recent_history def calculate_interruption_probability(self, max_limit: int, min_probability: float = 0.1, probability_factor: float | None = None) -> float: - """计算打断概率 - 使用简单线性概率模型 + """计算打断概率 - 使用反比例函数模型 Args: max_limit: 最大打断次数 @@ -110,20 +110,25 @@ class StreamContext(BaseDataModel): if self.interruption_count >= max_limit: return 0.0 - # 线性概率计算:次数越多,概率越低 - # 公式:概率 = max(min_probability, 1.0 - (当前打断次数 / 最大打断次数)) + # 反比例函数概率计算:前期高概率,快速衰减到低概率 + # 公式:概率 = a / (count + b) + min_probability + # 参数设计: + # - a = 1.4 (反比例系数) + # - b = 2.0 (平移参数) # 这确保了: - # - 第1次打断:90% 概率 (如果min_probability=0.1, max_limit=10) - # - 第2次打断:80% 概率 - # - ... - # - 第9次打断:10% 概率 (等于min_probability) - # - 第10次打断:0% 概率 (达到上限) + # - 第1次打断:80% 概率 (count=0) + # - 第2次打断:35% 概率 (count=1) + # - 第3次打断:15% 概率 (count=2) + # - 第4次及以后:约10% 概率 (趋近于min_probability) + # - 达到max_limit:0% 概率 (达到上限) - probability = 1.0 - (self.interruption_count / max_limit) + a = 1.4 # 反比例系数 + b = 2.0 # 平移参数 - # 设置最低概率,确保始终有打断的可能性 + probability = a / (self.interruption_count + b) + min_probability + + # 确保概率在合理范围内 probability = max(min_probability, probability) - return max(0.0, min(1.0, probability)) async def increment_interruption_count(self): diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index b68617920..7473493ae 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -146,15 +146,16 @@ allow_reply_self = false # 是否允许回复自己说的话 max_context_size = 25 # 上下文长度 thinking_timeout = 40 # MoFox-Bot一次回复最长思考规划时间,超过这个时间的思考会放弃(往往是api反应太慢) -# 消息打断系统配置 - 线性概率模型 +# 消息打断系统配置 - 反比例函数概率模型 interruption_enabled = true # 是否启用消息打断系统 interruption_max_limit = 5 # 每个聊天流的最大打断次数 -interruption_min_probability = 0.05 # 最低打断概率(即使达到较高打断次数,也保证有此概率的打断机会) +interruption_min_probability = 0.05 # 最低打断概率(反比例函数趋近的下限值) interruption_afc_reduction = 0.05 # 每次连续打断降低的afc阈值数值 # DEPRECATED: interruption_probability_factor (已废弃的配置项) -# 新的线性概率模型不再需要复杂的概率因子 -# 公式:打断概率 = max(最低概率, 1.0 - (当前打断次数 / 最大打断次数)) +# 新的反比例函数概率模型不再需要复杂的概率因子 +# 公式:打断概率 = 1.4 / (当前打断次数 + 2.0) + 最低概率 +# 特性:第1次80% → 第2次35% → 第3次15% → 趋近于最低概率 # interruption_probability_factor = 0.8 # 此配置已废弃,请删除 # 动态消息分发系统配置