From e5b2e2a5ee5f779ad6d5c768a83c0262373596b2 Mon Sep 17 00:00:00 2001 From: Bakadax Date: Thu, 8 May 2025 12:26:53 +0800 Subject: [PATCH] =?UTF-8?q?pfc=20=E5=85=B3=E7=B3=BB=E5=80=BC=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E5=8A=A0=E5=85=A5=E9=9D=9E=E7=BA=BF=E6=80=A7=E6=8D=A2?= =?UTF-8?q?=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/PFC/pfc_relationship.py | 23 +++++++++++++--------- src/plugins/PFC/pfc_utils.py | 30 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/plugins/PFC/pfc_relationship.py b/src/plugins/PFC/pfc_relationship.py index aa0586e3..fb6e96aa 100644 --- a/src/plugins/PFC/pfc_relationship.py +++ b/src/plugins/PFC/pfc_relationship.py @@ -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 diff --git a/src/plugins/PFC/pfc_utils.py b/src/plugins/PFC/pfc_utils.py index 47430af6..7d0f6695 100644 --- a/src/plugins/PFC/pfc_utils.py +++ b/src/plugins/PFC/pfc_utils.py @@ -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