Merge pull request #596 from na10xi27da/relationship

关系系统输出改进(含bug修复)
This commit is contained in:
SengokuCola
2025-03-28 00:22:27 +08:00
committed by GitHub
5 changed files with 104 additions and 53 deletions

View File

@@ -105,6 +105,24 @@ MOOD_STYLE_CONFIG = {
}, },
} }
# relationship
RELATION_STYLE_CONFIG = {
"advanced": {
"console_format": (
"<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
"<level>{level: <8}</level> | "
"<cyan>{extra[module]: <12}</cyan> | "
"<light-magenta>关系</light-magenta> | "
"<level>{message}</level>"
),
"file_format": ("{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {extra[module]: <15} | 关系 | {message}"),
},
"simple": {
"console_format": ("<green>{time:MM-DD HH:mm}</green> | <light-magenta>关系</light-magenta> | {message}"),
"file_format": ("{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {extra[module]: <15} | 关系 | {message}"),
},
}
SENDER_STYLE_CONFIG = { SENDER_STYLE_CONFIG = {
"advanced": { "advanced": {
"console_format": ( "console_format": (
@@ -217,6 +235,7 @@ SENDER_STYLE_CONFIG = SENDER_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else SENDER
LLM_STYLE_CONFIG = LLM_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else LLM_STYLE_CONFIG["advanced"] LLM_STYLE_CONFIG = LLM_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else LLM_STYLE_CONFIG["advanced"]
CHAT_STYLE_CONFIG = CHAT_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else CHAT_STYLE_CONFIG["advanced"] CHAT_STYLE_CONFIG = CHAT_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else CHAT_STYLE_CONFIG["advanced"]
MOOD_STYLE_CONFIG = MOOD_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else MOOD_STYLE_CONFIG["advanced"] MOOD_STYLE_CONFIG = MOOD_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else MOOD_STYLE_CONFIG["advanced"]
RELATION_STYLE_CONFIG = RELATION_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else RELATION_STYLE_CONFIG["advanced"]
SCHEDULE_STYLE_CONFIG = SCHEDULE_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else SCHEDULE_STYLE_CONFIG["advanced"] SCHEDULE_STYLE_CONFIG = SCHEDULE_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else SCHEDULE_STYLE_CONFIG["advanced"]
HEARTFLOW_STYLE_CONFIG = HEARTFLOW_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else HEARTFLOW_STYLE_CONFIG["advanced"] HEARTFLOW_STYLE_CONFIG = HEARTFLOW_STYLE_CONFIG["simple"] if SIMPLE_OUTPUT else HEARTFLOW_STYLE_CONFIG["advanced"]

View File

@@ -299,7 +299,7 @@ class ChatBot:
) )
# 使用情绪管理器更新情绪 # 使用情绪管理器更新情绪
self.mood_manager.update_mood_from_emotion(emotion[0], global_config.mood_intensity_factor) self.mood_manager.update_mood_from_emotion(emotion, global_config.mood_intensity_factor)
async def handle_notice(self, event: NoticeEvent, bot: Bot) -> None: async def handle_notice(self, event: NoticeEvent, bot: Bot) -> None:
"""处理收到的通知""" """处理收到的通知"""

View File

@@ -144,18 +144,25 @@ class ResponseGenerator:
try: try:
# 构建提示词,结合回复内容、被回复的内容以及立场分析 # 构建提示词,结合回复内容、被回复的内容以及立场分析
prompt = f""" prompt = f"""
请根据以下对话内容,完成以下任务: 严格根据以下对话内容,完成以下任务:
1. 判断回复者的立场是"supportive"(支持)、"opposed"(反对)还是"neutrality"(中立)。 1. 判断回复者对被回复者观点的直接立场:
2. 从"happy,angry,sad,surprised,disgusted,fearful,neutral"中选出最匹配的1个情感标签。 - "支持":明确同意或强化被回复者观点
3. 按照"立场-情绪"的格式输出结果,例如:"supportive-happy" - "反对":明确反驳或否定被回复者观点
- "中立":不表达明确立场或无关回应
2. 从"开心,愤怒,悲伤,惊讶,平静,害羞,恐惧,厌恶,困惑"中选出最匹配的1个情感标签
3. 按照"立场-情绪"的格式直接输出结果,例如:"反对-愤怒"
被回复的内容 对话示例
{processed_plain_text} 被回复「A就是笨」
回复「A明明很聪明」 → 反对-愤怒
回复内容 当前对话
{content} 被回复:「{processed_plain_text}
回复:「{content}
请分析回复者的立场和情感倾向,并输出结果 输出要求
- 只需输出"立场-情绪"结果,不要解释
- 严格基于文字直接表达的对立关系判断
""" """
# 调用模型生成结果 # 调用模型生成结果
@@ -165,18 +172,20 @@ class ResponseGenerator:
# 解析模型输出的结果 # 解析模型输出的结果
if "-" in result: if "-" in result:
stance, emotion = result.split("-", 1) stance, emotion = result.split("-", 1)
valid_stances = ["supportive", "opposed", "neutrality"] valid_stances = ["支持", "反对", "中立"]
valid_emotions = ["happy", "angry", "sad", "surprised", "disgusted", "fearful", "neutral"] valid_emotions = ["开心", "愤怒", "悲伤", "惊讶", "害羞", "平静", "恐惧", "厌恶", "困惑"]
if stance in valid_stances and emotion in valid_emotions: if stance in valid_stances and emotion in valid_emotions:
return stance, emotion # 返回有效的立场-情绪组合 return stance, emotion # 返回有效的立场-情绪组合
else: else:
return "neutrality", "neutral" # 默认返回中立-中性 logger.debug(f"无效立场-情感组合:{result}")
return "中立", "平静" # 默认返回中立-平静
else: else:
return "neutrality", "neutral" # 格式错误时返回默认值 logger.debug(f"立场-情感格式错误:{result}")
return "中立", "平静" # 格式错误时返回默认值
except Exception as e: except Exception as e:
print(f"获取情感标签时出错: {e}") logger.debug(f"获取情感标签时出错: {e}")
return "neutrality", "neutral" # 出错时返回默认值 return "中立", "平静" # 出错时返回默认值
async def _process_response(self, content: str) -> Tuple[List[str], List[str]]: async def _process_response(self, content: str) -> Tuple[List[str], List[str]]:
"""处理响应内容,返回处理后的内容和情感标签""" """处理响应内容,返回处理后的内容和情感标签"""

View File

@@ -1,6 +1,6 @@
import asyncio import asyncio
from typing import Optional from typing import Optional
from src.common.logger import get_module_logger from src.common.logger import get_module_logger, LogConfig, RELATION_STYLE_CONFIG
from ...common.database import db from ...common.database import db
from .message_base import UserInfo from .message_base import UserInfo
@@ -8,7 +8,12 @@ from .chat_stream import ChatStream
import math import math
from bson.decimal128 import Decimal128 from bson.decimal128 import Decimal128
logger = get_module_logger("rel_manager") relationship_config = LogConfig(
# 使用关系专用样式
console_format=RELATION_STYLE_CONFIG["console_format"],
file_format=RELATION_STYLE_CONFIG["file_format"],
)
logger = get_module_logger("rel_manager", config=relationship_config)
class Impression: class Impression:
@@ -270,19 +275,21 @@ class RelationshipManager:
3.人维护关系的精力往往有限,所以当高关系值用户越多,对于中高关系值用户增长越慢 3.人维护关系的精力往往有限,所以当高关系值用户越多,对于中高关系值用户增长越慢
""" """
stancedict = { stancedict = {
"supportive": 0, "支持": 0,
"neutrality": 1, "中立": 1,
"opposed": 2, "反对": 2,
} }
valuedict = { valuedict = {
"happy": 1.5, "开心": 1.5,
"angry": -3.0, "愤怒": -3.5,
"sad": -1.5, "悲伤": -1.5,
"surprised": 0.6, "惊讶": 0.6,
"disgusted": -4.5, "害羞": 2.0,
"fearful": -2.1, "平静": 0.3,
"neutral": 0.3, "恐惧": -2,
"厌恶": -2.5,
"困惑": 0.5,
} }
if self.get_relationship(chat_stream): if self.get_relationship(chat_stream):
old_value = self.get_relationship(chat_stream).relationship_value old_value = self.get_relationship(chat_stream).relationship_value
@@ -301,8 +308,11 @@ class RelationshipManager:
if old_value > 500: if old_value > 500:
high_value_count = 0 high_value_count = 0
for _, relationship in self.relationships.items(): for _, relationship in self.relationships.items():
if relationship.relationship_value >= 850: if relationship.relationship_value >= 700:
high_value_count += 1 high_value_count += 1
if old_value >= 700:
value *= 3 / (high_value_count + 2) # 排除自己
else:
value *= 3 / (high_value_count + 3) value *= 3 / (high_value_count + 3)
elif valuedict[label] < 0 and stancedict[stance] != 0: elif valuedict[label] < 0 and stancedict[stance] != 0:
value = value * math.exp(old_value / 1000) value = value * math.exp(old_value / 1000)
@@ -316,27 +326,20 @@ class RelationshipManager:
else: else:
value = 0 value = 0
logger.info(f"[关系变更] 立场:{stance} 标签:{label} 关系值:{value}") level_num = self.calculate_level_num(old_value+value)
relationship_level = ["厌恶", "冷漠", "一般", "友好", "喜欢", "暧昧"]
logger.info(
f"当前关系: {relationship_level[level_num]}, "
f"关系值: {old_value:.2f}, "
f"当前立场情感: {stance}-{label}, "
f"变更: {value:+.5f}"
)
await self.update_relationship_value(chat_stream=chat_stream, relationship_value=value) await self.update_relationship_value(chat_stream=chat_stream, relationship_value=value)
def build_relationship_info(self, person) -> str: def build_relationship_info(self, person) -> str:
relationship_value = relationship_manager.get_relationship(person).relationship_value relationship_value = relationship_manager.get_relationship(person).relationship_value
if -1000 <= relationship_value < -227: level_num = self.calculate_level_num(relationship_value)
level_num = 0
elif -227 <= relationship_value < -73:
level_num = 1
elif -73 <= relationship_value < 227:
level_num = 2
elif 227 <= relationship_value < 587:
level_num = 3
elif 587 <= relationship_value < 900:
level_num = 4
elif 900 <= relationship_value <= 1000:
level_num = 5
else:
level_num = 5 if relationship_value > 1000 else 0
relationship_level = ["厌恶", "冷漠", "一般", "友好", "喜欢", "暧昧"] relationship_level = ["厌恶", "冷漠", "一般", "友好", "喜欢", "暧昧"]
relation_prompt2_list = [ relation_prompt2_list = [
"冷漠回应", "冷漠回应",
@@ -357,5 +360,23 @@ class RelationshipManager:
f"回复态度为{relation_prompt2_list[level_num]},关系等级为{level_num}" f"回复态度为{relation_prompt2_list[level_num]},关系等级为{level_num}"
) )
def calculate_level_num(self, relationship_value) -> int:
"""关系等级计算"""
if -1000 <= relationship_value < -227:
level_num = 0
elif -227 <= relationship_value < -73:
level_num = 1
elif -73 <= relationship_value < 227:
level_num = 2
elif 227 <= relationship_value < 587:
level_num = 3
elif 587 <= relationship_value < 900:
level_num = 4
elif 900 <= relationship_value <= 1000:
level_num = 5
else:
level_num = 5 if relationship_value > 1000 else 0
return level_num
relationship_manager = RelationshipManager() relationship_manager = RelationshipManager()

View File

@@ -55,13 +55,15 @@ class MoodManager:
# 情绪词映射表 (valence, arousal) # 情绪词映射表 (valence, arousal)
self.emotion_map = { self.emotion_map = {
"happy": (0.8, 0.6), # 高愉悦度,中等唤醒度 "开心": (0.8, 0.6), # 高愉悦度,中等唤醒度
"angry": (-0.7, 0.7), # 负愉悦度,高唤醒度 "愤怒": (-0.7, 0.7), # 负愉悦度,高唤醒度
"sad": (-0.6, 0.3), # 负愉悦度,低唤醒度 "悲伤": (-0.6, 0.3), # 负愉悦度,低唤醒度
"surprised": (0.4, 0.8), # 中等愉悦度,高唤醒度 "惊讶": (0.2, 0.8), # 中等愉悦度,高唤醒度
"disgusted": (-0.8, 0.5), # 高负愉悦度,中等唤醒度 "害羞": (0.5, 0.2), # 中等愉悦度,唤醒度
"fearful": (-0.7, 0.6), # 愉悦度,唤醒度 "平静": (0.0, 0.5), # 中性愉悦度,中等唤醒度
"neutral": (0.0, 0.5), # 中性愉悦度,中等唤醒度 "恐惧": (-0.7, 0.6), # 愉悦度,唤醒度
"厌恶": (-0.4, 0.4), # 负愉悦度,低唤醒度
"困惑": (0.0, 0.6), # 中性愉悦度,高唤醒度
} }
# 情绪文本映射表 # 情绪文本映射表