mirror of https://github.com/Mai-with-u/MaiBot.git
启用记忆
parent
9ac6801f87
commit
0811cff8bf
|
|
@ -26,7 +26,7 @@ class FrequencyControl:
|
|||
|
||||
def __init__(self, chat_id: str):
|
||||
self.chat_id = chat_id
|
||||
self.chat_stream: ChatStream = get_chat_manager().get_stream(self.chat_id)
|
||||
self.chat_stream: ChatStream = get_chat_manager().get_stream(self.chat_id) # type: ignore
|
||||
if not self.chat_stream:
|
||||
raise ValueError(f"无法找到聊天流: {chat_id}")
|
||||
self.log_prefix = f"[{get_chat_manager().get_stream_name(self.chat_id) or self.chat_id}]"
|
||||
|
|
@ -65,14 +65,14 @@ class FrequencyControl:
|
|||
|
||||
# 按小时统计的历史基准值
|
||||
self._hourly_baseline = {
|
||||
'messages': {}, # {0-23: 平均消息数}
|
||||
'users': {} # {0-23: 平均用户数}
|
||||
"messages": {}, # {0-23: 平均消息数}
|
||||
"users": {}, # {0-23: 平均用户数}
|
||||
}
|
||||
|
||||
# 初始化24小时的默认基准值
|
||||
for hour in range(24):
|
||||
self._hourly_baseline['messages'][hour] = 0.0
|
||||
self._hourly_baseline['users'][hour] = 0.0
|
||||
self._hourly_baseline["messages"][hour] = 0.0
|
||||
self._hourly_baseline["users"][hour] = 0.0
|
||||
|
||||
def _update_historical_baseline(self):
|
||||
"""
|
||||
|
|
@ -95,12 +95,12 @@ class FrequencyControl:
|
|||
start_time=week_ago,
|
||||
end_time=current_time,
|
||||
filter_mai=True,
|
||||
filter_command=True
|
||||
filter_command=True,
|
||||
)
|
||||
|
||||
if historical_messages and len(historical_messages) >= 50:
|
||||
# 按小时统计消息数和用户数
|
||||
hourly_stats = {hour: {'messages': [], 'users': set()} for hour in range(24)}
|
||||
hourly_stats = {hour: {"messages": [], "users": set()} for hour in range(24)}
|
||||
|
||||
for msg in historical_messages:
|
||||
# 获取消息的小时(UTC时间)
|
||||
|
|
@ -108,32 +108,36 @@ class FrequencyControl:
|
|||
msg_hour = msg_time.tm_hour
|
||||
|
||||
# 统计消息数
|
||||
hourly_stats[msg_hour]['messages'].append(msg)
|
||||
hourly_stats[msg_hour]["messages"].append(msg)
|
||||
|
||||
# 统计用户数
|
||||
if msg.user_info and msg.user_info.user_id:
|
||||
hourly_stats[msg_hour]['users'].add(msg.user_info.user_id)
|
||||
hourly_stats[msg_hour]["users"].add(msg.user_info.user_id)
|
||||
|
||||
# 计算每个小时的平均值(基于一周的数据)
|
||||
for hour in range(24):
|
||||
# 计算该小时的平均消息数(一周内该小时的总消息数 / 7天)
|
||||
total_messages = len(hourly_stats[hour]['messages'])
|
||||
total_users = len(hourly_stats[hour]['users'])
|
||||
total_messages = len(hourly_stats[hour]["messages"])
|
||||
total_users = len(hourly_stats[hour]["users"])
|
||||
|
||||
# 只计算有消息的时段,没有消息的时段设为0
|
||||
if total_messages > 0:
|
||||
avg_messages = total_messages / self._historical_days
|
||||
avg_users = total_users / self._historical_days
|
||||
self._hourly_baseline['messages'][hour] = avg_messages
|
||||
self._hourly_baseline['users'][hour] = avg_users
|
||||
self._hourly_baseline["messages"][hour] = avg_messages
|
||||
self._hourly_baseline["users"][hour] = avg_users
|
||||
else:
|
||||
# 没有消息的时段设为0,表示该时段不活跃
|
||||
self._hourly_baseline['messages'][hour] = 0.0
|
||||
self._hourly_baseline['users'][hour] = 0.0
|
||||
self._hourly_baseline["messages"][hour] = 0.0
|
||||
self._hourly_baseline["users"][hour] = 0.0
|
||||
|
||||
# 更新整体基准值(用于兼容性)- 基于原始数据计算,不受max(1.0)限制影响
|
||||
overall_avg_messages = sum(len(hourly_stats[hour]['messages']) for hour in range(24)) / (24 * self._historical_days)
|
||||
overall_avg_users = sum(len(hourly_stats[hour]['users']) for hour in range(24)) / (24 * self._historical_days)
|
||||
overall_avg_messages = sum(len(hourly_stats[hour]["messages"]) for hour in range(24)) / (
|
||||
24 * self._historical_days
|
||||
)
|
||||
overall_avg_users = sum(len(hourly_stats[hour]["users"]) for hour in range(24)) / (
|
||||
24 * self._historical_days
|
||||
)
|
||||
|
||||
self.base_message_count = overall_avg_messages
|
||||
self.base_user_count = overall_avg_users
|
||||
|
|
@ -147,8 +151,8 @@ class FrequencyControl:
|
|||
key_hours = [8, 12, 18, 22] # 早、中、晚、夜
|
||||
for hour in key_hours:
|
||||
# 计算该小时平均每10分钟的消息数和用户数
|
||||
hourly_10min_messages = self._hourly_baseline['messages'][hour] / 6 # 1小时 = 6个10分钟
|
||||
hourly_10min_users = self._hourly_baseline['users'][hour] / 6
|
||||
hourly_10min_messages = self._hourly_baseline["messages"][hour] / 6 # 1小时 = 6个10分钟
|
||||
hourly_10min_users = self._hourly_baseline["users"][hour] / 6
|
||||
logger.info(
|
||||
f"{self.log_prefix} {hour}时基准值: "
|
||||
f"消息数={self._hourly_baseline['messages'][hour]:.2f}/小时 "
|
||||
|
|
@ -178,10 +182,7 @@ class FrequencyControl:
|
|||
tuple: (基准消息数, 基准用户数)
|
||||
"""
|
||||
current_hour = time.localtime().tm_hour
|
||||
return (
|
||||
self._hourly_baseline['messages'][current_hour],
|
||||
self._hourly_baseline['users'][current_hour]
|
||||
)
|
||||
return (self._hourly_baseline["messages"][current_hour], self._hourly_baseline["users"][current_hour])
|
||||
|
||||
def get_dynamic_talk_frequency_adjust(self) -> float:
|
||||
"""
|
||||
|
|
@ -224,7 +225,7 @@ class FrequencyControl:
|
|||
start_time=current_time - 600, # 10分钟前
|
||||
end_time=current_time,
|
||||
filter_mai=True,
|
||||
filter_command=True
|
||||
filter_command=True,
|
||||
)
|
||||
|
||||
# 计算消息数量和用户数量
|
||||
|
|
@ -250,7 +251,9 @@ class FrequencyControl:
|
|||
# 计算人均消息数(10分钟窗口)
|
||||
messages_per_user = message_count / user_count
|
||||
# 使用当前小时每10分钟的基准人均消息数
|
||||
base_messages_per_user = current_hour_10min_messages / current_hour_10min_users if current_hour_10min_users > 0 else 1.0
|
||||
base_messages_per_user = (
|
||||
current_hour_10min_messages / current_hour_10min_users if current_hour_10min_users > 0 else 1.0
|
||||
)
|
||||
|
||||
# 双向调整逻辑
|
||||
if messages_per_user > base_messages_per_user * 1.2:
|
||||
|
|
@ -277,8 +280,7 @@ class FrequencyControl:
|
|||
|
||||
# 平滑调整
|
||||
self.talk_frequency_adjust = (
|
||||
self.talk_frequency_adjust * (1 - self.smoothing_factor) +
|
||||
target_talk_adjust * self.smoothing_factor
|
||||
self.talk_frequency_adjust * (1 - self.smoothing_factor) + target_talk_adjust * self.smoothing_factor
|
||||
)
|
||||
|
||||
# 判断调整方向
|
||||
|
|
@ -329,7 +331,7 @@ class FrequencyControl:
|
|||
start_time=current_time - 600, # 10分钟前
|
||||
end_time=current_time,
|
||||
filter_mai=True,
|
||||
filter_command=True
|
||||
filter_command=True,
|
||||
)
|
||||
|
||||
# 计算消息数量和用户数量
|
||||
|
|
@ -355,7 +357,9 @@ class FrequencyControl:
|
|||
# 计算用户活跃度比率(基于10分钟数据)
|
||||
user_ratio = user_count / current_hour_10min_users
|
||||
# 计算消息活跃度比率(基于10分钟数据)
|
||||
message_ratio = message_count / current_hour_10min_messages if current_hour_10min_messages > 0 else 1.0
|
||||
message_ratio = (
|
||||
message_count / current_hour_10min_messages if current_hour_10min_messages > 0 else 1.0
|
||||
)
|
||||
|
||||
# 双向调整逻辑
|
||||
if user_ratio > 1.3 and message_ratio > 1.3:
|
||||
|
|
@ -385,8 +389,7 @@ class FrequencyControl:
|
|||
|
||||
# 平滑调整
|
||||
self.focus_value_adjust = (
|
||||
self.focus_value_adjust * (1 - self.smoothing_factor) +
|
||||
target_focus_adjust * self.smoothing_factor
|
||||
self.focus_value_adjust * (1 - self.smoothing_factor) + target_focus_adjust * self.smoothing_factor
|
||||
)
|
||||
|
||||
# 计算当前小时平均每10分钟的基准值
|
||||
|
|
@ -424,11 +427,18 @@ class FrequencyControl:
|
|||
logger.error(f"{self.log_prefix} 更新专注度调整值时出错: {e}")
|
||||
|
||||
def get_final_talk_frequency(self) -> float:
|
||||
return get_config_base_talk_frequency(self.chat_stream.stream_id) * self.get_dynamic_talk_frequency_adjust() * self.talk_frequency_external_adjust
|
||||
return (
|
||||
get_config_base_talk_frequency(self.chat_stream.stream_id)
|
||||
* self.get_dynamic_talk_frequency_adjust()
|
||||
* self.talk_frequency_external_adjust
|
||||
)
|
||||
|
||||
def get_final_focus_value(self) -> float:
|
||||
return get_config_base_focus_value(self.chat_stream.stream_id) * self.get_dynamic_focus_value_adjust() * self.focus_value_external_adjust
|
||||
|
||||
return (
|
||||
get_config_base_focus_value(self.chat_stream.stream_id)
|
||||
* self.get_dynamic_focus_value_adjust()
|
||||
* self.focus_value_external_adjust
|
||||
)
|
||||
|
||||
def set_adjustment_parameters(
|
||||
self,
|
||||
|
|
@ -439,7 +449,7 @@ class FrequencyControl:
|
|||
smoothing_factor: Optional[float] = None,
|
||||
update_interval: Optional[int] = None,
|
||||
historical_update_interval: Optional[int] = None,
|
||||
historical_days: Optional[int] = None
|
||||
historical_days: Optional[int] = None,
|
||||
):
|
||||
"""
|
||||
设置调整参数
|
||||
|
|
@ -492,9 +502,6 @@ class FrequencyControlManager:
|
|||
self.frequency_control_dict[chat_id] = FrequencyControl(chat_id)
|
||||
return self.frequency_control_dict[chat_id]
|
||||
|
||||
|
||||
# 创建全局实例
|
||||
frequency_control_manager = FrequencyControlManager()
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -374,8 +374,6 @@ class DefaultReplyer:
|
|||
running_memories = await self.memory_activator.activate_memory_with_chat_history(
|
||||
target_message=target, chat_history=chat_history
|
||||
)
|
||||
running_memories = None
|
||||
|
||||
if not running_memories:
|
||||
return ""
|
||||
|
||||
|
|
@ -680,7 +678,7 @@ class DefaultReplyer:
|
|||
|
||||
async def build_prompt_reply_context(
|
||||
self,
|
||||
reply_message: DatabaseMessages,
|
||||
reply_message: Optional[DatabaseMessages] = None,
|
||||
extra_info: str = "",
|
||||
reply_reason: str = "",
|
||||
available_actions: Optional[Dict[str, ActionInfo]] = None,
|
||||
|
|
|
|||
Loading…
Reference in New Issue