新增mood与relation的相互反馈
This commit is contained in:
@@ -137,12 +137,13 @@ class ThinkFlowChat:
|
|||||||
await heartflow.get_subheartflow(stream_id).do_thinking_after_reply(response_set, chat_talking_prompt)
|
await heartflow.get_subheartflow(stream_id).do_thinking_after_reply(response_set, chat_talking_prompt)
|
||||||
|
|
||||||
async def _update_relationship(self, message, response_set):
|
async def _update_relationship(self, message, response_set):
|
||||||
"""更新关系"""
|
"""更新关系情绪"""
|
||||||
ori_response = ",".join(response_set)
|
ori_response = ",".join(response_set)
|
||||||
stance, emotion = await self.gpt._get_emotion_tags(ori_response, message.processed_plain_text)
|
stance, emotion = await self.gpt._get_emotion_tags(ori_response, message.processed_plain_text)
|
||||||
await relationship_manager.calculate_update_relationship_value(
|
await relationship_manager.calculate_update_relationship_value(
|
||||||
chat_stream=message.chat_stream, label=emotion, stance=stance
|
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:
|
async def process_message(self, message_data: str) -> None:
|
||||||
"""处理消息并生成回复"""
|
"""处理消息并生成回复"""
|
||||||
@@ -276,11 +277,11 @@ class ThinkFlowChat:
|
|||||||
timer2 = time.time()
|
timer2 = time.time()
|
||||||
timing_results["更新心流"] = timer2 - timer1
|
timing_results["更新心流"] = timer2 - timer1
|
||||||
|
|
||||||
# 更新关系
|
# 更新关系情绪
|
||||||
timer1 = time.time()
|
timer1 = time.time()
|
||||||
await self._update_relationship(message, response_set)
|
await self._update_relationship(message, response_set)
|
||||||
timer2 = time.time()
|
timer2 = time.time()
|
||||||
timing_results["更新关系"] = timer2 - timer1
|
timing_results["更新关系情绪"] = timer2 - timer1
|
||||||
|
|
||||||
# 输出性能计时结果
|
# 输出性能计时结果
|
||||||
if do_reply:
|
if do_reply:
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ from dataclasses import dataclass
|
|||||||
|
|
||||||
from ..config.config import global_config
|
from ..config.config import global_config
|
||||||
from src.common.logger import get_module_logger, LogConfig, MOOD_STYLE_CONFIG
|
from src.common.logger import get_module_logger, LogConfig, MOOD_STYLE_CONFIG
|
||||||
|
from ..person_info.relationship_manager import relationship_manager
|
||||||
|
|
||||||
mood_config = LogConfig(
|
mood_config = LogConfig(
|
||||||
# 使用海马体专用样式
|
# 使用海马体专用样式
|
||||||
@@ -55,15 +56,15 @@ class MoodManager:
|
|||||||
|
|
||||||
# 情绪词映射表 (valence, arousal)
|
# 情绪词映射表 (valence, arousal)
|
||||||
self.emotion_map = {
|
self.emotion_map = {
|
||||||
"开心": (0.8, 0.6), # 高愉悦度,中等唤醒度
|
"开心": (0.21, 0.6),
|
||||||
"愤怒": (-0.7, 0.7), # 负愉悦度,高唤醒度
|
"害羞": (0.15, 0.2),
|
||||||
"悲伤": (-0.6, 0.3), # 负愉悦度,低唤醒度
|
"愤怒": (-0.24, 0.8),
|
||||||
"惊讶": (0.2, 0.8), # 中等愉悦度,高唤醒度
|
"恐惧": (-0.21, 0.7),
|
||||||
"害羞": (0.5, 0.2), # 中等愉悦度,低唤醒度
|
"悲伤": (-0.21, 0.3),
|
||||||
"平静": (0.0, 0.5), # 中性愉悦度,中等唤醒度
|
"厌恶": (-0.12, 0.4),
|
||||||
"恐惧": (-0.7, 0.6), # 负愉悦度,高唤醒度
|
"惊讶": (0.06, 0.7),
|
||||||
"厌恶": (-0.4, 0.4), # 负愉悦度,低唤醒度
|
"困惑": (0.0, 0.6),
|
||||||
"困惑": (0.0, 0.6), # 中性愉悦度,高唤醒度
|
"平静": (0.03, 0.5),
|
||||||
}
|
}
|
||||||
|
|
||||||
# 情绪文本映射表
|
# 情绪文本映射表
|
||||||
@@ -93,7 +94,7 @@ class MoodManager:
|
|||||||
cls._instance = MoodManager()
|
cls._instance = MoodManager()
|
||||||
return cls._instance
|
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: 更新间隔(秒)
|
:param update_interval: 更新间隔(秒)
|
||||||
@@ -232,6 +233,8 @@ class MoodManager:
|
|||||||
|
|
||||||
valence_change, arousal_change = self.emotion_map[emotion]
|
valence_change, arousal_change = self.emotion_map[emotion]
|
||||||
|
|
||||||
|
valence_change *= relationship_manager.gain_coefficient[relationship_manager.positive_feedback_value]
|
||||||
|
|
||||||
# 应用情绪强度
|
# 应用情绪强度
|
||||||
valence_change *= intensity
|
valence_change *= intensity
|
||||||
arousal_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.current_mood.arousal = max(0.0, min(1.0, self.current_mood.arousal))
|
||||||
|
|
||||||
self._update_mood_text()
|
self._update_mood_text()
|
||||||
|
|
||||||
|
|||||||
@@ -14,10 +14,19 @@ logger = get_module_logger("rel_manager", config=relationship_config)
|
|||||||
|
|
||||||
class RelationshipManager:
|
class RelationshipManager:
|
||||||
def __init__(self):
|
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 = [
|
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 label in positive_list and stance != "反对":
|
||||||
if 7 > self.positive_feedback_dict[person_id] >= 0:
|
if 7 > self.positive_feedback_value >= 0:
|
||||||
self.positive_feedback_dict[person_id] += 1
|
self.positive_feedback_value += 1
|
||||||
elif self.positive_feedback_dict[person_id] < 0:
|
elif self.positive_feedback_value < 0:
|
||||||
self.positive_feedback_dict[person_id] = 0
|
self.positive_feedback_value = 0
|
||||||
return value
|
|
||||||
elif label in negative_list and stance != "支持":
|
elif label in negative_list and stance != "支持":
|
||||||
if -7 < self.positive_feedback_dict[person_id] <= 0:
|
if -7 < self.positive_feedback_value <= 0:
|
||||||
self.positive_feedback_dict[person_id] -= 1
|
self.positive_feedback_value -= 1
|
||||||
elif self.positive_feedback_dict[person_id] > 0:
|
elif self.positive_feedback_value > 0:
|
||||||
self.positive_feedback_dict[person_id] = 0
|
self.positive_feedback_value = 0
|
||||||
return value
|
|
||||||
else:
|
|
||||||
return value
|
|
||||||
|
|
||||||
gain_coefficient = [1.0, 1.1, 1.2, 1.4, 1.7, 1.9, 2.0]
|
if abs(self.positive_feedback_value) > 1:
|
||||||
value *= gain_coefficient[abs(self.positive_feedback_dict[person_id])-1]
|
logger.info(f"触发mood变更增益,当前增益系数:{self.gain_coefficient[abs(self.positive_feedback_value)]}")
|
||||||
if abs(self.positive_feedback_dict[person_id]) - 1:
|
|
||||||
logger.info(f"触发增益,当前增益系数:{gain_coefficient[abs(self.positive_feedback_dict[person_id])-1]}")
|
|
||||||
|
|
||||||
|
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
|
return value
|
||||||
|
|
||||||
|
|
||||||
@@ -124,7 +131,8 @@ class RelationshipManager:
|
|||||||
else:
|
else:
|
||||||
value = 0
|
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)
|
level_num = self.calculate_level_num(old_value + value)
|
||||||
relationship_level = ["厌恶", "冷漠", "一般", "友好", "喜欢", "暧昧"]
|
relationship_level = ["厌恶", "冷漠", "一般", "友好", "喜欢", "暧昧"]
|
||||||
|
|||||||
Reference in New Issue
Block a user