feat:回复温度现在会受到:人格-情绪-temp的链条影响;顺便修改了情绪激活度的取值

feat:回复温度现在会受到:人格-情绪-temp的链条影响;顺便修改了情绪激活度的取值
This commit is contained in:
SengokuCola
2025-04-09 22:50:21 +08:00
parent a41d0efe7a
commit f3d6e7cfa5
4 changed files with 79 additions and 30 deletions

View File

@@ -1,7 +1,7 @@
import time import time
from random import random from random import random
import re import re
from typing import List
from ...memory_system.Hippocampus import HippocampusManager from ...memory_system.Hippocampus import HippocampusManager
from ...moods.moods import MoodManager from ...moods.moods import MoodManager
from ...config.config import global_config from ...config.config import global_config
@@ -18,6 +18,7 @@ from src.common.logger import get_module_logger, CHAT_STYLE_CONFIG, LogConfig
from ...chat.chat_stream import chat_manager from ...chat.chat_stream import chat_manager
from ...person_info.relationship_manager import relationship_manager from ...person_info.relationship_manager import relationship_manager
from ...chat.message_buffer import message_buffer from ...chat.message_buffer import message_buffer
from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager
# 定义日志配置 # 定义日志配置
chat_config = LogConfig( chat_config = LogConfig(
@@ -58,7 +59,11 @@ class ReasoningChat:
return thinking_id return thinking_id
async def _send_response_messages(self, message, chat, response_set, thinking_id): async def _send_response_messages(self,
message,
chat,
response_set:List[str],
thinking_id) -> MessageSending:
"""发送回复消息""" """发送回复消息"""
container = message_manager.get_container(chat.stream_id) container = message_manager.get_container(chat.stream_id)
thinking_message = None thinking_message = None
@@ -77,6 +82,7 @@ class ReasoningChat:
message_set = MessageSet(chat, thinking_id) message_set = MessageSet(chat, thinking_id)
mark_head = False mark_head = False
first_bot_msg = None
for msg in response_set: for msg in response_set:
message_segment = Seg(type="text", data=msg) message_segment = Seg(type="text", data=msg)
bot_message = MessageSending( bot_message = MessageSending(
@@ -96,9 +102,12 @@ class ReasoningChat:
) )
if not mark_head: if not mark_head:
mark_head = True mark_head = True
first_bot_msg = bot_message
message_set.add_message(bot_message) message_set.add_message(bot_message)
message_manager.add_message(message_set) message_manager.add_message(message_set)
return first_bot_msg
async def _handle_emoji(self, message, chat, response): async def _handle_emoji(self, message, chat, response):
"""处理表情包""" """处理表情包"""
if random() < global_config.emoji_chance: if random() < global_config.emoji_chance:
@@ -232,22 +241,34 @@ class ReasoningChat:
timer2 = time.time() timer2 = time.time()
timing_results["创建思考消息"] = timer2 - timer1 timing_results["创建思考消息"] = timer2 - timer1
logger.debug(f"创建捕捉器thinking_id:{thinking_id}")
info_catcher = info_catcher_manager.get_info_catcher(thinking_id)
info_catcher.catch_decide_to_response(message)
# 生成回复 # 生成回复
timer1 = time.time() timer1 = time.time()
response_set = await self.gpt.generate_response(message) response_set = await self.gpt.generate_response(message,thinking_id)
timer2 = time.time() timer2 = time.time()
timing_results["生成回复"] = timer2 - timer1 timing_results["生成回复"] = timer2 - timer1
info_catcher.catch_after_generate_response(timing_results["生成回复"])
if not response_set: if not response_set:
logger.info("为什么生成回复失败?") logger.info("为什么生成回复失败?")
return return
# 发送消息 # 发送消息
timer1 = time.time() timer1 = time.time()
await self._send_response_messages(message, chat, response_set, thinking_id) first_bot_msg = await self._send_response_messages(message, chat, response_set, thinking_id)
timer2 = time.time() timer2 = time.time()
timing_results["发送消息"] = timer2 - timer1 timing_results["发送消息"] = timer2 - timer1
info_catcher.catch_after_response(timing_results["发送消息"],response_set,first_bot_msg)
info_catcher.done_catch()
# 处理表情包 # 处理表情包
timer1 = time.time() timer1 = time.time()
await self._handle_emoji(message, chat, response_set) await self._handle_emoji(message, chat, response_set)

View File

@@ -8,6 +8,7 @@ from ...chat.message import MessageThinking
from .reasoning_prompt_builder import prompt_builder from .reasoning_prompt_builder import prompt_builder
from ...chat.utils import process_llm_response from ...chat.utils import process_llm_response
from src.common.logger import get_module_logger, LogConfig, LLM_STYLE_CONFIG from src.common.logger import get_module_logger, LogConfig, LLM_STYLE_CONFIG
from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager
# 定义日志配置 # 定义日志配置
llm_config = LogConfig( llm_config = LogConfig(
@@ -37,7 +38,7 @@ class ResponseGenerator:
self.current_model_type = "r1" # 默认使用 R1 self.current_model_type = "r1" # 默认使用 R1
self.current_model_name = "unknown model" self.current_model_name = "unknown model"
async def generate_response(self, message: MessageThinking) -> Optional[Union[str, List[str]]]: async def generate_response(self, message: MessageThinking,thinking_id:str) -> Optional[Union[str, List[str]]]:
"""根据当前模型类型选择对应的生成函数""" """根据当前模型类型选择对应的生成函数"""
# 从global_config中获取模型概率值并选择模型 # 从global_config中获取模型概率值并选择模型
if random.random() < global_config.MODEL_R1_PROBABILITY: if random.random() < global_config.MODEL_R1_PROBABILITY:
@@ -51,7 +52,7 @@ class ResponseGenerator:
f"{self.current_model_type}思考:{message.processed_plain_text[:30] + '...' if len(message.processed_plain_text) > 30 else message.processed_plain_text}" f"{self.current_model_type}思考:{message.processed_plain_text[:30] + '...' if len(message.processed_plain_text) > 30 else message.processed_plain_text}"
) # noqa: E501 ) # noqa: E501
model_response = await self._generate_response_with_model(message, current_model) model_response = await self._generate_response_with_model(message, current_model,thinking_id)
# print(f"raw_content: {model_response}") # print(f"raw_content: {model_response}")
@@ -64,8 +65,11 @@ class ResponseGenerator:
logger.info(f"{self.current_model_type}思考,失败") logger.info(f"{self.current_model_type}思考,失败")
return None return None
async def _generate_response_with_model(self, message: MessageThinking, model: LLM_request): async def _generate_response_with_model(self, message: MessageThinking, model: LLM_request,thinking_id:str):
sender_name = "" sender_name = ""
info_catcher = info_catcher_manager.get_info_catcher(thinking_id)
if message.chat_stream.user_info.user_cardname and message.chat_stream.user_info.user_nickname: if message.chat_stream.user_info.user_cardname and message.chat_stream.user_info.user_nickname:
sender_name = ( sender_name = (
f"[({message.chat_stream.user_info.user_id}){message.chat_stream.user_info.user_nickname}]" f"[({message.chat_stream.user_info.user_id}){message.chat_stream.user_info.user_nickname}]"
@@ -90,6 +94,14 @@ class ResponseGenerator:
try: try:
content, reasoning_content, self.current_model_name = await model.generate_response(prompt) content, reasoning_content, self.current_model_name = await model.generate_response(prompt)
info_catcher.catch_after_llm_generated(
prompt=prompt,
response=content,
reasoning_content=reasoning_content,
model_name=self.current_model_name)
except Exception: except Exception:
logger.exception("生成回复时出错") logger.exception("生成回复时出错")
return None return None

View File

@@ -10,6 +10,8 @@ from ...chat.utils import process_llm_response
from src.common.logger import get_module_logger, LogConfig, LLM_STYLE_CONFIG from src.common.logger import get_module_logger, LogConfig, LLM_STYLE_CONFIG
from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager
from src.plugins.moods.moods import MoodManager
# 定义日志配置 # 定义日志配置
llm_config = LogConfig( llm_config = LogConfig(
# 使用消息发送专用样式 # 使用消息发送专用样式
@@ -40,7 +42,11 @@ class ResponseGenerator:
f"思考:{message.processed_plain_text[:30] + '...' if len(message.processed_plain_text) > 30 else message.processed_plain_text}" f"思考:{message.processed_plain_text[:30] + '...' if len(message.processed_plain_text) > 30 else message.processed_plain_text}"
) )
arousal_multiplier = MoodManager.get_instance().get_arousal_multiplier()
current_model = self.model_normal current_model = self.model_normal
current_model.temperature = 0.7 * arousal_multiplier #激活度越高,温度越高
model_response = await self._generate_response_with_model(message, current_model,thinking_id) model_response = await self._generate_response_with_model(message, current_model,thinking_id)
# print(f"raw_content: {model_response}") # print(f"raw_content: {model_response}")

View File

@@ -19,7 +19,7 @@ logger = get_module_logger("mood_manager", config=mood_config)
@dataclass @dataclass
class MoodState: class MoodState:
valence: float # 愉悦度 (-1.0 到 1.0)-1表示极度负面1表示极度正面 valence: float # 愉悦度 (-1.0 到 1.0)-1表示极度负面1表示极度正面
arousal: float # 唤醒度 (0.0 到 1.0)0表示完全平静1表示极度兴奋 arousal: float # 唤醒度 (-1.0 到 1.0)-1表示抑制1表示兴奋
text: str # 心情文本描述 text: str # 心情文本描述
@@ -42,7 +42,7 @@ class MoodManager:
self._initialized = True self._initialized = True
# 初始化心情状态 # 初始化心情状态
self.current_mood = MoodState(valence=0.0, arousal=0.5, text="平静") self.current_mood = MoodState(valence=0.0, arousal=0.0, text="平静")
# 从配置文件获取衰减率 # 从配置文件获取衰减率
self.decay_rate_valence = 1 - global_config.mood_decay_rate # 愉悦度衰减率 self.decay_rate_valence = 1 - global_config.mood_decay_rate # 愉悦度衰减率
@@ -71,21 +71,21 @@ class MoodManager:
# 情绪文本映射表 # 情绪文本映射表
self.mood_text_map = { self.mood_text_map = {
# 第一象限:高唤醒,正愉悦 # 第一象限:高唤醒,正愉悦
(0.5, 0.7): "兴奋", (0.5, 0.4): "兴奋",
(0.3, 0.8): "快乐", (0.3, 0.6): "快乐",
(0.2, 0.65): "满足", (0.2, 0.3): "满足",
# 第二象限:高唤醒,负愉悦 # 第二象限:高唤醒,负愉悦
(-0.5, 0.7): "愤怒", (-0.5, 0.4): "愤怒",
(-0.3, 0.8): "焦虑", (-0.3, 0.6): "焦虑",
(-0.2, 0.65): "烦躁", (-0.2, 0.3): "烦躁",
# 第三象限:低唤醒,负愉悦 # 第三象限:低唤醒,负愉悦
(-0.5, 0.3): "悲伤", (-0.5, -0.4): "悲伤",
(-0.3, 0.35): "疲倦", (-0.3, -0.3): "疲倦",
(-0.4, 0.15): "疲倦", (-0.4, -0.7): "疲倦",
# 第四象限:低唤醒,正愉悦 # 第四象限:低唤醒,正愉悦
(0.2, 0.45): "平静", (0.2, -0.1): "平静",
(0.3, 0.4): "安宁", (0.3, -0.2): "安宁",
(0.5, 0.3): "放松", (0.5, -0.4): "放松",
} }
@classmethod @classmethod
@@ -164,15 +164,15 @@ class MoodManager:
-decay_rate_negative * time_diff * neuroticism_factor -decay_rate_negative * time_diff * neuroticism_factor
) )
# Arousal 向中性0.5)回归 # Arousal 向中性0回归
arousal_target = 0.5 arousal_target = 0
self.current_mood.arousal = arousal_target + (self.current_mood.arousal - arousal_target) * math.exp( self.current_mood.arousal = arousal_target + (self.current_mood.arousal - arousal_target) * math.exp(
-self.decay_rate_arousal * time_diff * neuroticism_factor -self.decay_rate_arousal * time_diff * neuroticism_factor
) )
# 确保值在合理范围内 # 确保值在合理范围内
self.current_mood.valence = max(-1.0, min(1.0, self.current_mood.valence)) self.current_mood.valence = max(-1.0, min(1.0, self.current_mood.valence))
self.current_mood.arousal = max(0.0, min(1.0, self.current_mood.arousal)) self.current_mood.arousal = max(-1.0, min(1.0, self.current_mood.arousal))
self.last_update = current_time self.last_update = current_time
@@ -184,7 +184,7 @@ class MoodManager:
# 限制范围 # 限制范围
self.current_mood.valence = max(-1.0, min(1.0, self.current_mood.valence)) self.current_mood.valence = max(-1.0, min(1.0, self.current_mood.valence))
self.current_mood.arousal = max(0.0, min(1.0, self.current_mood.arousal)) self.current_mood.arousal = max(-1.0, min(1.0, self.current_mood.arousal))
self._update_mood_text() self._update_mood_text()
@@ -217,7 +217,7 @@ class MoodManager:
# 限制范围 # 限制范围
self.current_mood.valence = max(-1.0, min(1.0, self.current_mood.valence)) self.current_mood.valence = max(-1.0, min(1.0, self.current_mood.valence))
self.current_mood.arousal = max(0.0, min(1.0, self.current_mood.arousal)) self.current_mood.arousal = max(-1.0, min(1.0, self.current_mood.arousal))
self._update_mood_text() self._update_mood_text()
@@ -232,13 +232,23 @@ class MoodManager:
elif self.current_mood.valence < -0.5: elif self.current_mood.valence < -0.5:
base_prompt += "你现在心情不太好," base_prompt += "你现在心情不太好,"
if self.current_mood.arousal > 0.7: if self.current_mood.arousal > 0.4:
base_prompt += "情绪比较激动。" base_prompt += "情绪比较激动。"
elif self.current_mood.arousal < 0.3: elif self.current_mood.arousal < -0.4:
base_prompt += "情绪比较平静。" base_prompt += "情绪比较平静。"
return base_prompt return base_prompt
def get_arousal_multiplier(self) -> float:
"""根据当前情绪状态返回唤醒度乘数"""
if self.current_mood.arousal > 0.4:
multiplier = 1 + min(0.15,(self.current_mood.arousal - 0.4)/3)
return multiplier
elif self.current_mood.arousal < -0.4:
multiplier = 1 - min(0.15,((0 - self.current_mood.arousal) - 0.4)/3)
return multiplier
return 1.0
def get_current_mood(self) -> MoodState: def get_current_mood(self) -> MoodState:
"""获取当前情绪状态""" """获取当前情绪状态"""
return self.current_mood return self.current_mood
@@ -278,7 +288,7 @@ class MoodManager:
# 限制范围 # 限制范围
self.current_mood.valence = max(-1.0, min(1.0, self.current_mood.valence)) self.current_mood.valence = max(-1.0, min(1.0, self.current_mood.valence))
self.current_mood.arousal = max(0.0, min(1.0, self.current_mood.arousal)) self.current_mood.arousal = max(-1.0, min(1.0, self.current_mood.arousal))
self._update_mood_text() self._update_mood_text()