From 7c51cbf027705f4b0686c670321fee9d5b3649b1 Mon Sep 17 00:00:00 2001 From: meng_xi_pan <1903647908@qq.com> Date: Wed, 2 Apr 2025 11:47:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Emood=E4=B8=8Erelation?= =?UTF-8?q?=E7=9A=84=E7=9B=B8=E4=BA=92=E5=8F=8D=E9=A6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../think_flow_chat/think_flow_chat.py | 7 ++- src/plugins/moods/moods.py | 24 ++++---- .../person_info/relationship_manager.py | 56 +++++++++++-------- 3 files changed, 50 insertions(+), 37 deletions(-) diff --git a/src/plugins/chat_module/think_flow_chat/think_flow_chat.py b/src/plugins/chat_module/think_flow_chat/think_flow_chat.py index 3bd5d7181..6cbde1bac 100644 --- a/src/plugins/chat_module/think_flow_chat/think_flow_chat.py +++ b/src/plugins/chat_module/think_flow_chat/think_flow_chat.py @@ -137,12 +137,13 @@ class ThinkFlowChat: await heartflow.get_subheartflow(stream_id).do_thinking_after_reply(response_set, chat_talking_prompt) async def _update_relationship(self, message, response_set): - """更新关系""" + """更新关系情绪""" ori_response = ",".join(response_set) stance, emotion = await self.gpt._get_emotion_tags(ori_response, message.processed_plain_text) await relationship_manager.calculate_update_relationship_value( chat_stream=message.chat_stream, label=emotion, stance=stance ) + self.mood_manager.update_mood_from_emotion(emotion, global_config.mood_intensity_factor) async def process_message(self, message_data: str) -> None: """处理消息并生成回复""" @@ -276,11 +277,11 @@ class ThinkFlowChat: timer2 = time.time() timing_results["更新心流"] = timer2 - timer1 - # 更新关系 + # 更新关系情绪 timer1 = time.time() await self._update_relationship(message, response_set) timer2 = time.time() - timing_results["更新关系"] = timer2 - timer1 + timing_results["更新关系情绪"] = timer2 - timer1 # 输出性能计时结果 if do_reply: diff --git a/src/plugins/moods/moods.py b/src/plugins/moods/moods.py index 8115ee1b9..39e13b937 100644 --- a/src/plugins/moods/moods.py +++ b/src/plugins/moods/moods.py @@ -5,6 +5,7 @@ from dataclasses import dataclass from ..config.config import global_config from src.common.logger import get_module_logger, LogConfig, MOOD_STYLE_CONFIG +from ..person_info.relationship_manager import relationship_manager mood_config = LogConfig( # 使用海马体专用样式 @@ -55,15 +56,15 @@ class MoodManager: # 情绪词映射表 (valence, arousal) self.emotion_map = { - "开心": (0.8, 0.6), # 高愉悦度,中等唤醒度 - "愤怒": (-0.7, 0.7), # 负愉悦度,高唤醒度 - "悲伤": (-0.6, 0.3), # 负愉悦度,低唤醒度 - "惊讶": (0.2, 0.8), # 中等愉悦度,高唤醒度 - "害羞": (0.5, 0.2), # 中等愉悦度,低唤醒度 - "平静": (0.0, 0.5), # 中性愉悦度,中等唤醒度 - "恐惧": (-0.7, 0.6), # 负愉悦度,高唤醒度 - "厌恶": (-0.4, 0.4), # 负愉悦度,低唤醒度 - "困惑": (0.0, 0.6), # 中性愉悦度,高唤醒度 + "开心": (0.21, 0.6), + "害羞": (0.15, 0.2), + "愤怒": (-0.24, 0.8), + "恐惧": (-0.21, 0.7), + "悲伤": (-0.21, 0.3), + "厌恶": (-0.12, 0.4), + "惊讶": (0.06, 0.7), + "困惑": (0.0, 0.6), + "平静": (0.03, 0.5), } # 情绪文本映射表 @@ -93,7 +94,7 @@ class MoodManager: cls._instance = MoodManager() return cls._instance - def start_mood_update(self, update_interval: float = 1.0) -> None: + def start_mood_update(self, update_interval: float = 5.0) -> None: """ 启动情绪更新线程 :param update_interval: 更新间隔(秒) @@ -232,6 +233,8 @@ class MoodManager: valence_change, arousal_change = self.emotion_map[emotion] + valence_change *= relationship_manager.gain_coefficient[relationship_manager.positive_feedback_value] + # 应用情绪强度 valence_change *= intensity arousal_change *= intensity @@ -245,3 +248,4 @@ class MoodManager: self.current_mood.arousal = max(0.0, min(1.0, self.current_mood.arousal)) self._update_mood_text() + diff --git a/src/plugins/person_info/relationship_manager.py b/src/plugins/person_info/relationship_manager.py index e1ca2c79d..0b2f8fa67 100644 --- a/src/plugins/person_info/relationship_manager.py +++ b/src/plugins/person_info/relationship_manager.py @@ -14,10 +14,19 @@ logger = get_module_logger("rel_manager", config=relationship_config) class RelationshipManager: def __init__(self): - self.positive_feedback_dict = {} # 正反馈系统 + self.positive_feedback_value = 0 # 正反馈系统 + self.gain_coefficient = [1.0, 1.0, 1.1, 1.2, 1.4, 1.7, 1.9, 2.0] + self._mood_manager = None - def positive_feedback_sys(self, person_id, value, label: str, stance: str): - """正反馈系统""" + @property + def mood_manager(self): + if self._mood_manager is None: + from ..moods.moods import MoodManager # 延迟导入 + self._mood_manager = MoodManager.get_instance() + return self._mood_manager + + def positive_feedback_sys(self, label: str, stance: str): + """正反馈系统,通过正反馈系数增益情绪变化,根据情绪再影响关系变更""" positive_list = [ "开心", @@ -32,29 +41,27 @@ class RelationshipManager: "厌恶", ] - if person_id not in self.positive_feedback_dict: - self.positive_feedback_dict[person_id] = 0 - if label in positive_list and stance != "反对": - if 7 > self.positive_feedback_dict[person_id] >= 0: - self.positive_feedback_dict[person_id] += 1 - elif self.positive_feedback_dict[person_id] < 0: - self.positive_feedback_dict[person_id] = 0 - return value + if 7 > self.positive_feedback_value >= 0: + self.positive_feedback_value += 1 + elif self.positive_feedback_value < 0: + self.positive_feedback_value = 0 elif label in negative_list and stance != "支持": - if -7 < self.positive_feedback_dict[person_id] <= 0: - self.positive_feedback_dict[person_id] -= 1 - elif self.positive_feedback_dict[person_id] > 0: - self.positive_feedback_dict[person_id] = 0 - return value - else: - return value - - gain_coefficient = [1.0, 1.1, 1.2, 1.4, 1.7, 1.9, 2.0] - value *= gain_coefficient[abs(self.positive_feedback_dict[person_id])-1] - if abs(self.positive_feedback_dict[person_id]) - 1: - logger.info(f"触发增益,当前增益系数:{gain_coefficient[abs(self.positive_feedback_dict[person_id])-1]}") + if -7 < self.positive_feedback_value <= 0: + self.positive_feedback_value -= 1 + elif self.positive_feedback_value > 0: + self.positive_feedback_value = 0 + + if abs(self.positive_feedback_value) > 1: + logger.info(f"触发mood变更增益,当前增益系数:{self.gain_coefficient[abs(self.positive_feedback_value)]}") + def mood_feedback(self, value): + """情绪反馈""" + mood_manager = self.mood_manager + mood_gain = (mood_manager.get_current_mood().valence) ** 2 \ + * math.copysign(1, value * mood_manager.get_current_mood().valence) + value += value * mood_gain + logger.info(f"当前relationship增益系数:{mood_gain:.3f}") return value @@ -124,7 +131,8 @@ class RelationshipManager: else: value = 0 - value = self.positive_feedback_sys(person_id, value, label, stance) + self.positive_feedback_sys(label, stance) + value = self.mood_feedback(value) level_num = self.calculate_level_num(old_value + value) relationship_level = ["厌恶", "冷漠", "一般", "友好", "喜欢", "暧昧"]