pfc 关系值计算加入非线性换算

pull/937/head
Bakadax 2025-05-08 12:26:53 +08:00
parent 099500f8e6
commit e5b2e2a5ee
2 changed files with 44 additions and 9 deletions

View File

@ -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

View File

@ -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