添加了一个控制最低回复概率的设置项

pull/182/head
Pliosauroidea 2025-03-11 06:30:42 +08:00
parent dfdae33f92
commit 28a775c249
3 changed files with 41 additions and 22 deletions

View File

@ -20,6 +20,7 @@ class BotConfig:
MIN_TEXT_LENGTH: int = 2 # 最小处理文本长度 MIN_TEXT_LENGTH: int = 2 # 最小处理文本长度
MAX_CONTEXT_SIZE: int = 15 # 上下文最大消息数 MAX_CONTEXT_SIZE: int = 15 # 上下文最大消息数
emoji_chance: float = 0.2 # 发送表情包的基础概率 emoji_chance: float = 0.2 # 发送表情包的基础概率
MIN_RESPONSE_RATE: float = 0.0 # 最小回复概率
ENABLE_PIC_TRANSLATE: bool = True # 是否启用图片翻译 ENABLE_PIC_TRANSLATE: bool = True # 是否启用图片翻译
@ -266,6 +267,7 @@ class BotConfig:
config.MAX_CONTEXT_SIZE = msg_config.get("max_context_size", config.MAX_CONTEXT_SIZE) config.MAX_CONTEXT_SIZE = msg_config.get("max_context_size", config.MAX_CONTEXT_SIZE)
config.emoji_chance = msg_config.get("emoji_chance", config.emoji_chance) config.emoji_chance = msg_config.get("emoji_chance", config.emoji_chance)
config.ban_words=msg_config.get("ban_words",config.ban_words) config.ban_words=msg_config.get("ban_words",config.ban_words)
config.MIN_RESPONSE_RATE = msg_config.get("min_response_rate", config.MIN_RESPONSE_RATE)
if config.INNER_VERSION in SpecifierSet(">=0.0.2"): if config.INNER_VERSION in SpecifierSet(">=0.0.2"):
config.thinking_timeout = msg_config.get("thinking_timeout", config.thinking_timeout) config.thinking_timeout = msg_config.get("thinking_timeout", config.thinking_timeout)

View File

@ -7,26 +7,37 @@ class WillingManager:
self.group_reply_willing = {} # 存储每个群的回复意愿 self.group_reply_willing = {} # 存储每个群的回复意愿
self._decay_task = None self._decay_task = None
self._started = False self._started = False
async def _decay_reply_willing(self): async def _decay_reply_willing(self):
"""定期衰减回复意愿""" """定期衰减回复意愿"""
while True: while True:
await asyncio.sleep(5) await asyncio.sleep(5)
for group_id in self.group_reply_willing: for group_id in self.group_reply_willing:
self.group_reply_willing[group_id] = max(0, self.group_reply_willing[group_id] * 0.6) self.group_reply_willing[group_id] = max(
0, self.group_reply_willing[group_id] * 0.6
)
def get_willing(self, group_id: int) -> float: def get_willing(self, group_id: int) -> float:
"""获取指定群组的回复意愿""" """获取指定群组的回复意愿"""
return self.group_reply_willing.get(group_id, 0) return self.group_reply_willing.get(group_id, 0)
def set_willing(self, group_id: int, willing: float): def set_willing(self, group_id: int, willing: float):
"""设置指定群组的回复意愿""" """设置指定群组的回复意愿"""
self.group_reply_willing[group_id] = willing self.group_reply_willing[group_id] = willing
def change_reply_willing_received(self, group_id: int, topic: str, is_mentioned_bot: bool, config, user_id: int = None, is_emoji: bool = False, interested_rate: float = 0) -> float: def change_reply_willing_received(
self,
group_id: int,
topic: str,
is_mentioned_bot: bool,
config,
user_id: int = None,
is_emoji: bool = False,
interested_rate: float = 0,
) -> float:
"""改变指定群组的回复意愿并返回回复概率""" """改变指定群组的回复意愿并返回回复概率"""
current_willing = self.group_reply_willing.get(group_id, 0) current_willing = self.group_reply_willing.get(group_id, 0)
# print(f"初始意愿: {current_willing}") # print(f"初始意愿: {current_willing}")
if is_mentioned_bot and current_willing < 1.0: if is_mentioned_bot and current_willing < 1.0:
current_willing += 0.9 current_willing += 0.9
@ -34,47 +45,51 @@ class WillingManager:
elif is_mentioned_bot: elif is_mentioned_bot:
current_willing += 0.05 current_willing += 0.05
print(f"被重复提及, 当前意愿: {current_willing}") print(f"被重复提及, 当前意愿: {current_willing}")
if is_emoji: if is_emoji:
current_willing *= 0.1 current_willing *= 0.1
print(f"表情包, 当前意愿: {current_willing}") print(f"表情包, 当前意愿: {current_willing}")
print(f"放大系数_interested_rate: {global_config.response_interested_rate_amplifier}") print(
interested_rate *= global_config.response_interested_rate_amplifier #放大回复兴趣度 f"放大系数_interested_rate: {global_config.response_interested_rate_amplifier}"
)
interested_rate *= (
global_config.response_interested_rate_amplifier
) # 放大回复兴趣度
if interested_rate > 0.4: if interested_rate > 0.4:
# print(f"兴趣度: {interested_rate}, 当前意愿: {current_willing}") # print(f"兴趣度: {interested_rate}, 当前意愿: {current_willing}")
current_willing += interested_rate-0.4 current_willing += interested_rate - 0.4
current_willing *= global_config.response_willing_amplifier #放大回复意愿 current_willing *= global_config.response_willing_amplifier # 放大回复意愿
# print(f"放大系数_willing: {global_config.response_willing_amplifier}, 当前意愿: {current_willing}") # print(f"放大系数_willing: {global_config.response_willing_amplifier}, 当前意愿: {current_willing}")
reply_probability = max((current_willing - 0.45) * 2, 0) reply_probability = max((current_willing - 0.45) * 2, 0)
if group_id not in config.talk_allowed_groups: if group_id not in config.talk_allowed_groups:
current_willing = 0 current_willing = 0
reply_probability = 0 reply_probability = 0
if group_id in config.talk_frequency_down_groups: if group_id in config.talk_frequency_down_groups:
reply_probability = reply_probability / global_config.down_frequency_rate reply_probability = reply_probability / global_config.down_frequency_rate
reply_probability += global_config.MIN_RESPONSE_RATE
reply_probability = min(reply_probability, 1) reply_probability = min(reply_probability, 1)
if reply_probability < 0: if reply_probability < 0:
reply_probability = 0 reply_probability = 0
self.group_reply_willing[group_id] = min(current_willing, 3.0) self.group_reply_willing[group_id] = min(current_willing, 3.0)
return reply_probability return reply_probability
def change_reply_willing_sent(self, group_id: int): def change_reply_willing_sent(self, group_id: int):
"""开始思考后降低群组的回复意愿""" """开始思考后降低群组的回复意愿"""
current_willing = self.group_reply_willing.get(group_id, 0) current_willing = self.group_reply_willing.get(group_id, 0)
self.group_reply_willing[group_id] = max(0, current_willing - 2) self.group_reply_willing[group_id] = max(0, current_willing - 2)
def change_reply_willing_after_sent(self, group_id: int): def change_reply_willing_after_sent(self, group_id: int):
"""发送消息后提高群组的回复意愿""" """发送消息后提高群组的回复意愿"""
current_willing = self.group_reply_willing.get(group_id, 0) current_willing = self.group_reply_willing.get(group_id, 0)
if current_willing < 1: if current_willing < 1:
self.group_reply_willing[group_id] = min(1, current_willing + 0.2) self.group_reply_willing[group_id] = min(1, current_willing + 0.2)
async def ensure_started(self): async def ensure_started(self):
"""确保衰减任务已启动""" """确保衰减任务已启动"""
if not self._started: if not self._started:
@ -82,5 +97,6 @@ class WillingManager:
self._decay_task = asyncio.create_task(self._decay_reply_willing()) self._decay_task = asyncio.create_task(self._decay_reply_willing())
self._started = True self._started = True
# 创建全局实例 # 创建全局实例
willing_manager = WillingManager() willing_manager = WillingManager()

View File

@ -21,6 +21,7 @@ min_text_length = 2 # 与麦麦聊天时麦麦只会回答文本大于等于此
max_context_size = 15 # 麦麦获得的上文数量 max_context_size = 15 # 麦麦获得的上文数量
emoji_chance = 0.2 # 麦麦使用表情包的概率 emoji_chance = 0.2 # 麦麦使用表情包的概率
thinking_timeout = 120 # 麦麦思考时间 thinking_timeout = 120 # 麦麦思考时间
min_response_rate = 0.1 # 最低回复概率
response_willing_amplifier = 1 # 麦麦回复意愿放大系数一般为1 response_willing_amplifier = 1 # 麦麦回复意愿放大系数一般为1
response_interested_rate_amplifier = 1 # 麦麦回复兴趣度放大系数,听到记忆里的内容时放大系数 response_interested_rate_amplifier = 1 # 麦麦回复兴趣度放大系数,听到记忆里的内容时放大系数