fix:优化no——reply计算
This commit is contained in:
@@ -54,7 +54,7 @@ async def _calculate_interest(message: MessageRecv) -> Tuple[float, bool]:
|
|||||||
with Timer("记忆激活"):
|
with Timer("记忆激活"):
|
||||||
interested_rate = await hippocampus_manager.get_activate_from_text(
|
interested_rate = await hippocampus_manager.get_activate_from_text(
|
||||||
message.processed_plain_text,
|
message.processed_plain_text,
|
||||||
fast_retrieval=True,
|
fast_retrieval=False,
|
||||||
)
|
)
|
||||||
logger.debug(f"记忆激活率: {interested_rate:.2f}")
|
logger.debug(f"记忆激活率: {interested_rate:.2f}")
|
||||||
|
|
||||||
@@ -106,20 +106,19 @@ class HeartFCMessageReceiver:
|
|||||||
group_info=groupinfo,
|
group_info=groupinfo,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
interested_rate, is_mentioned = await _calculate_interest(message)
|
||||||
|
message.interest_value = interested_rate
|
||||||
|
|
||||||
await self.storage.store_message(message, chat)
|
await self.storage.store_message(message, chat)
|
||||||
|
|
||||||
subheartflow = await heartflow.get_or_create_subheartflow(chat.stream_id)
|
subheartflow = await heartflow.get_or_create_subheartflow(chat.stream_id)
|
||||||
message.update_chat_stream(chat)
|
message.update_chat_stream(chat)
|
||||||
|
|
||||||
# 6. 兴趣度计算与更新
|
|
||||||
interested_rate, is_mentioned = await _calculate_interest(message)
|
|
||||||
subheartflow.add_message_to_normal_chat_cache(message, interested_rate, is_mentioned)
|
subheartflow.add_message_to_normal_chat_cache(message, interested_rate, is_mentioned)
|
||||||
|
|
||||||
chat_mood = mood_manager.get_mood_by_chat_id(subheartflow.chat_id)
|
chat_mood = mood_manager.get_mood_by_chat_id(subheartflow.chat_id)
|
||||||
asyncio.create_task(chat_mood.update_mood_by_message(message, interested_rate))
|
asyncio.create_task(chat_mood.update_mood_by_message(message, interested_rate))
|
||||||
|
|
||||||
with open("interested_rates.txt", "a", encoding="utf-8") as f:
|
|
||||||
f.write(f"{interested_rate}\n")
|
|
||||||
|
|
||||||
# 7. 日志记录
|
# 7. 日志记录
|
||||||
mes_name = chat.group_info.group_name if chat.group_info else "私聊"
|
mes_name = chat.group_info.group_name if chat.group_info else "私聊"
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ class MessageRecv(Message):
|
|||||||
self.is_mentioned = None
|
self.is_mentioned = None
|
||||||
self.priority_mode = "interest"
|
self.priority_mode = "interest"
|
||||||
self.priority_info = None
|
self.priority_info = None
|
||||||
|
self.interest_value = None
|
||||||
|
|
||||||
def update_chat_stream(self, chat_stream: "ChatStream"):
|
def update_chat_stream(self, chat_stream: "ChatStream"):
|
||||||
self.chat_stream = chat_stream
|
self.chat_stream = chat_stream
|
||||||
@@ -337,6 +338,8 @@ class MessageSending(MessageProcessBase):
|
|||||||
# 用于显示发送内容与显示不一致的情况
|
# 用于显示发送内容与显示不一致的情况
|
||||||
self.display_message = display_message
|
self.display_message = display_message
|
||||||
|
|
||||||
|
self.interest_value = 0.0
|
||||||
|
|
||||||
def build_reply(self):
|
def build_reply(self):
|
||||||
"""设置回复消息"""
|
"""设置回复消息"""
|
||||||
if self.reply:
|
if self.reply:
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import re
|
import re
|
||||||
|
import traceback
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
# from ...common.database.database import db # db is now Peewee's SqliteDatabase instance
|
# from ...common.database.database import db # db is now Peewee's SqliteDatabase instance
|
||||||
@@ -36,11 +37,11 @@ class MessageStorage:
|
|||||||
filtered_display_message = re.sub(pattern, "", display_message, flags=re.DOTALL)
|
filtered_display_message = re.sub(pattern, "", display_message, flags=re.DOTALL)
|
||||||
else:
|
else:
|
||||||
filtered_display_message = ""
|
filtered_display_message = ""
|
||||||
|
interest_value = 0
|
||||||
reply_to = message.reply_to
|
reply_to = message.reply_to
|
||||||
else:
|
else:
|
||||||
filtered_display_message = ""
|
filtered_display_message = ""
|
||||||
|
interest_value = message.interest_value
|
||||||
reply_to = ""
|
reply_to = ""
|
||||||
|
|
||||||
chat_info_dict = chat_stream.to_dict()
|
chat_info_dict = chat_stream.to_dict()
|
||||||
@@ -80,9 +81,11 @@ class MessageStorage:
|
|||||||
processed_plain_text=filtered_processed_plain_text,
|
processed_plain_text=filtered_processed_plain_text,
|
||||||
display_message=filtered_display_message,
|
display_message=filtered_display_message,
|
||||||
memorized_times=message.memorized_times,
|
memorized_times=message.memorized_times,
|
||||||
|
interest_value=interest_value,
|
||||||
)
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception("存储消息失败")
|
logger.exception("存储消息失败")
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def store_recalled_message(message_id: str, time: str, chat_stream: ChatStream) -> None:
|
async def store_recalled_message(message_id: str, time: str, chat_stream: ChatStream) -> None:
|
||||||
|
|||||||
@@ -129,6 +129,8 @@ class Messages(BaseModel):
|
|||||||
|
|
||||||
reply_to = TextField(null=True)
|
reply_to = TextField(null=True)
|
||||||
|
|
||||||
|
interest_value = DoubleField(null=True)
|
||||||
|
|
||||||
# 从 chat_info 扁平化而来的字段
|
# 从 chat_info 扁平化而来的字段
|
||||||
chat_info_stream_id = TextField()
|
chat_info_stream_id = TextField()
|
||||||
chat_info_platform = TextField()
|
chat_info_platform = TextField()
|
||||||
|
|||||||
@@ -100,7 +100,12 @@ class NoReplyAction(BaseAction):
|
|||||||
|
|
||||||
# 3. 检查累计兴趣值
|
# 3. 检查累计兴趣值
|
||||||
if new_message_count > 0:
|
if new_message_count > 0:
|
||||||
accumulated_interest = await self._calculate_accumulated_interest(recent_messages_dict)
|
accumulated_interest = 0.0
|
||||||
|
for msg_dict in recent_messages_dict:
|
||||||
|
text = msg_dict.get("processed_plain_text", "")
|
||||||
|
interest_value = msg_dict.get("interest_value", 0.0)
|
||||||
|
if text:
|
||||||
|
accumulated_interest += interest_value
|
||||||
logger.info(f"{self.log_prefix} 当前累计兴趣值: {accumulated_interest:.2f}")
|
logger.info(f"{self.log_prefix} 当前累计兴趣值: {accumulated_interest:.2f}")
|
||||||
if accumulated_interest >= self._interest_exit_threshold:
|
if accumulated_interest >= self._interest_exit_threshold:
|
||||||
logger.info(
|
logger.info(
|
||||||
@@ -139,51 +144,6 @@ class NoReplyAction(BaseAction):
|
|||||||
)
|
)
|
||||||
return False, f"不回复动作执行失败: {e}"
|
return False, f"不回复动作执行失败: {e}"
|
||||||
|
|
||||||
async def _calculate_accumulated_interest(self, messages_dicts: list[dict]) -> float:
|
|
||||||
"""将所有新消息文本合并,然后一次性计算兴趣值"""
|
|
||||||
if not messages_dicts:
|
|
||||||
return 0.0
|
|
||||||
|
|
||||||
combined_text_parts = []
|
|
||||||
is_any_mentioned = False
|
|
||||||
|
|
||||||
for msg_dict in messages_dicts:
|
|
||||||
try:
|
|
||||||
text = msg_dict.get("processed_plain_text", "")
|
|
||||||
if text:
|
|
||||||
combined_text_parts.append(text)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"{self.log_prefix} 处理单条消息以计算兴趣值时出错: {e}")
|
|
||||||
|
|
||||||
full_text = " ".join(combined_text_parts).strip()
|
|
||||||
if not full_text:
|
|
||||||
return 0.0
|
|
||||||
|
|
||||||
# --- 使用合并后的文本计算兴趣值 ---
|
|
||||||
|
|
||||||
if global_config.bot.nickname in full_text:
|
|
||||||
is_any_mentioned = True
|
|
||||||
|
|
||||||
interested_rate = 0.0
|
|
||||||
if global_config.memory.enable_memory:
|
|
||||||
try:
|
|
||||||
interested_rate = await hippocampus_manager.get_activate_from_text(
|
|
||||||
full_text,
|
|
||||||
fast_retrieval=False,
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"{self.log_prefix} 记忆激活计算失败: {e}")
|
|
||||||
|
|
||||||
text_len = len(full_text)
|
|
||||||
# 根据文本长度调整兴趣度
|
|
||||||
base_interest = 0.01 + (0.05 - 0.01) * (math.log10(text_len + 1) / math.log10(1000 + 1))
|
|
||||||
base_interest = min(max(base_interest, 0.01), 0.05)
|
|
||||||
interested_rate += base_interest
|
|
||||||
|
|
||||||
if is_any_mentioned:
|
|
||||||
interested_rate += 1
|
|
||||||
|
|
||||||
return interested_rate
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def reset_consecutive_count(cls):
|
def reset_consecutive_count(cls):
|
||||||
|
|||||||
Reference in New Issue
Block a user