mirror of https://github.com/Mai-with-u/MaiBot.git
pfc 关系值计算加入非线性换算
parent
099500f8e6
commit
e5b2e2a5ee
|
|
@ -9,7 +9,7 @@ from src.plugins.person_info.relationship_manager import (
|
|||
from src.plugins.utils.chat_message_builder import build_readable_messages
|
||||
from src.plugins.PFC.observation_info import ObservationInfo
|
||||
from src.plugins.PFC.conversation_info import ConversationInfo
|
||||
from src.plugins.PFC.pfc_utils import get_items_from_json
|
||||
from src.plugins.PFC.pfc_utils import get_items_from_json, adjust_relationship_value_nonlinear
|
||||
from src.config.config import global_config # 导入全局配置 (向上两级到 src/, 再到 config)
|
||||
|
||||
|
||||
|
|
@ -121,7 +121,7 @@ class PfcRelationshipUpdater:
|
|||
请输出一个JSON对象,包含一个 "adjustment" 字段,其值为一个介于 -{self.REL_INCREMENTAL_MAX_CHANGE} 和 +{self.REL_INCREMENTAL_MAX_CHANGE} 之间的整数,代表关系值的变化。
|
||||
例如:{{ "adjustment": 3 }}。如果对话内容不明确或难以判断,请倾向于输出较小的调整值(如0, 1, -1)。"""
|
||||
|
||||
adjustment_val = self.REL_INCREMENTAL_DEFAULT_CHANGE
|
||||
raw_adjustment_val = self.REL_INCREMENTAL_DEFAULT_CHANGE
|
||||
try:
|
||||
logger.debug(f"[私聊][{self.private_name}] 增量关系评估Prompt:\n{relationship_prompt}")
|
||||
content, _ = await self.llm.generate_response_async(relationship_prompt)
|
||||
|
|
@ -136,13 +136,15 @@ class PfcRelationshipUpdater:
|
|||
)
|
||||
raw_adjustment = result.get("adjustment", self.REL_INCREMENTAL_DEFAULT_CHANGE)
|
||||
if not isinstance(raw_adjustment, (int, float)):
|
||||
adjustment_val = self.REL_INCREMENTAL_DEFAULT_CHANGE
|
||||
raw_adjustment_val = self.REL_INCREMENTAL_DEFAULT_CHANGE
|
||||
else:
|
||||
adjustment_val = float(raw_adjustment)
|
||||
adjustment_val = max(-self.REL_INCREMENTAL_MAX_CHANGE, min(self.REL_INCREMENTAL_MAX_CHANGE, adjustment_val))
|
||||
raw_adjustment_val = float(raw_adjustment)
|
||||
raw_adjustment_val = max(-self.REL_INCREMENTAL_MAX_CHANGE, min(self.REL_INCREMENTAL_MAX_CHANGE, raw_adjustment_val))
|
||||
except Exception as e:
|
||||
logger.error(f"[私聊][{self.private_name}] 增量关系评估LLM调用或解析失败: {e}")
|
||||
|
||||
adjustment_val = await adjust_relationship_value_nonlinear(current_relationship_value, raw_adjustment_val)
|
||||
|
||||
new_relationship_value = max(-1000.0, min(1000.0, current_relationship_value + adjustment_val))
|
||||
await self.person_info_mng.update_one_field(
|
||||
conversation_info.person_id, "relationship_value", new_relationship_value
|
||||
|
|
@ -202,7 +204,7 @@ class PfcRelationshipUpdater:
|
|||
请输出一个JSON对象,包含一个 "final_adjustment" 字段,其值为一个整数,代表关系值的变化量(例如,可以是 -{self.REL_FINAL_MAX_CHANGE} 到 +{self.REL_FINAL_MAX_CHANGE} 之间的一个值)。
|
||||
请大胆评估,但也要合理。"""
|
||||
|
||||
adjustment_val = self.REL_FINAL_DEFAULT_CHANGE
|
||||
raw_adjustment_val = self.REL_FINAL_DEFAULT_CHANGE
|
||||
try:
|
||||
logger.debug(f"[私聊][{self.private_name}] 最终关系评估Prompt:\n{relationship_prompt}")
|
||||
content, _ = await self.llm.generate_response_async(relationship_prompt)
|
||||
|
|
@ -217,13 +219,16 @@ class PfcRelationshipUpdater:
|
|||
)
|
||||
raw_adjustment = result.get("final_adjustment", self.REL_FINAL_DEFAULT_CHANGE)
|
||||
if not isinstance(raw_adjustment, (int, float)):
|
||||
adjustment_val = self.REL_FINAL_DEFAULT_CHANGE
|
||||
raw_adjustment_val = self.REL_FINAL_DEFAULT_CHANGE
|
||||
else:
|
||||
adjustment_val = float(raw_adjustment)
|
||||
adjustment_val = max(-self.REL_FINAL_MAX_CHANGE, min(self.REL_FINAL_MAX_CHANGE, adjustment_val))
|
||||
raw_adjustment_val = float(raw_adjustment)
|
||||
raw_adjustment_val = max(-self.REL_INCREMENTAL_MAX_CHANGE, min(self.REL_INCREMENTAL_MAX_CHANGE, raw_adjustment_val))
|
||||
except Exception as e:
|
||||
logger.error(f"[私聊][{self.private_name}] 最终关系评估LLM调用或解析失败: {e}")
|
||||
|
||||
|
||||
adjustment_val = await adjust_relationship_value_nonlinear(current_relationship_value, raw_adjustment_val)
|
||||
|
||||
new_relationship_value = max(-1000.0, min(1000.0, current_relationship_value + adjustment_val))
|
||||
await self.person_info_mng.update_one_field(
|
||||
conversation_info.person_id, "relationship_value", new_relationship_value
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ from src.plugins.memory_system.Hippocampus import HippocampusManager
|
|||
from src.plugins.heartFC_chat.heartflow_prompt_builder import prompt_builder # 确认 prompt_builder 的导入路径
|
||||
from src.plugins.chat.chat_stream import ChatStream
|
||||
from ..person_info.person_info import person_info_manager
|
||||
import math
|
||||
|
||||
logger = get_logger("pfc_utils")
|
||||
|
||||
|
|
@ -308,3 +309,32 @@ async def get_person_id(private_name: str, chat_stream: ChatStream):
|
|||
f"[私聊][{private_name}] 未能确定私聊对象的 user_id 或 platform,无法获取 person_id。将在收到消息后尝试。"
|
||||
)
|
||||
return None # 返回 None 表示失败
|
||||
|
||||
async def adjust_relationship_value_nonlinear(self, old_value: float, raw_adjustment: float) -> float:
|
||||
# 限制 old_value 范围
|
||||
old_value = max(-1000, min(1000, old_value))
|
||||
value = raw_adjustment
|
||||
|
||||
if old_value >= 0:
|
||||
if value >= 0:
|
||||
value = value * math.cos(math.pi * old_value / 2000)
|
||||
if old_value > 500:
|
||||
rdict = person_info_manager.get_specific_value_list("relationship_value", lambda x: x > 700)
|
||||
high_value_count = len(rdict)
|
||||
if old_value > 700:
|
||||
value *= 3 / (high_value_count + 2)
|
||||
else:
|
||||
value *= 3 / (high_value_count + 3)
|
||||
elif value < 0:
|
||||
value = value * math.exp(old_value / 2000)
|
||||
else:
|
||||
value = 0
|
||||
else:
|
||||
if value >= 0:
|
||||
value = value * math.exp(old_value / 2000)
|
||||
elif value < 0:
|
||||
value = value * math.cos(math.pi * old_value / 2000)
|
||||
else:
|
||||
value = 0
|
||||
|
||||
return value
|
||||
|
|
|
|||
Loading…
Reference in New Issue