diff --git a/src/chat/focus_chat/planners/planner_simple.py b/src/chat/focus_chat/planners/planner_simple.py index a99c80f47..2b943be6c 100644 --- a/src/chat/focus_chat/planners/planner_simple.py +++ b/src/chat/focus_chat/planners/planner_simple.py @@ -30,7 +30,10 @@ def init_prompt(): """ 你的自我认知是: {self_info_block} +请记住你的性格,身份和特点。 + {relation_info_block} + {extra_info_block} {memory_str} diff --git a/src/chat/focus_chat/replyer/default_replyer.py b/src/chat/focus_chat/replyer/default_replyer.py index 64858c46f..6599e72d5 100644 --- a/src/chat/focus_chat/replyer/default_replyer.py +++ b/src/chat/focus_chat/replyer/default_replyer.py @@ -204,9 +204,9 @@ class DefaultReplyer: reply = [] with Timer("选择表情", cycle_timers): emoji_keyword = action_data.get("description", []) - emoji_base64, description = await self._choose_emoji(emoji_keyword) + emoji_base64, _description, emotion = await self._choose_emoji(emoji_keyword) if emoji_base64: - logger.info(f"选择表情: {description}") + # logger.info(f"选择表情: {_description}") reply.append(("emoji", emoji_base64)) else: logger.warning(f"{self.log_prefix} 没有找到合适表情") @@ -578,9 +578,9 @@ class DefaultReplyer: description = "" emoji_raw = await emoji_manager.get_emoji_for_text(send_emoji) if emoji_raw: - emoji_path, description = emoji_raw + emoji_path, description, _emotion = emoji_raw emoji_base64 = image_path_to_base64(emoji_path) - return emoji_base64, description + return emoji_base64, description, _emotion async def _build_single_sending_message( self, diff --git a/src/chat/message_receive/chat_stream.py b/src/chat/message_receive/chat_stream.py index edbc733a9..0f60d4942 100644 --- a/src/chat/message_receive/chat_stream.py +++ b/src/chat/message_receive/chat_stream.py @@ -157,7 +157,7 @@ class ChatManager: message.message_info.group_info, ) self.last_messages[stream_id] = message - logger.debug(f"注册消息到聊天流: {stream_id}") + # logger.debug(f"注册消息到聊天流: {stream_id}") @staticmethod def _generate_stream_id(platform: str, user_info: UserInfo, group_info: Optional[GroupInfo] = None) -> str: diff --git a/src/chat/normal_chat/normal_chat.py b/src/chat/normal_chat/normal_chat.py index d1437c79b..cb13721c1 100644 --- a/src/chat/normal_chat/normal_chat.py +++ b/src/chat/normal_chat/normal_chat.py @@ -168,7 +168,7 @@ class NormalChat: if random() < global_config.normal_chat.emoji_chance: emoji_raw = await emoji_manager.get_emoji_for_text(response) if emoji_raw: - emoji_path, description = emoji_raw + emoji_path, description, _emotion = emoji_raw emoji_cq = image_path_to_base64(emoji_path) thinking_time_point = round(message.message_info.time, 2) diff --git a/src/chat/utils/prompt_builder.py b/src/chat/utils/prompt_builder.py index ced5adc53..5d7c6ac5a 100644 --- a/src/chat/utils/prompt_builder.py +++ b/src/chat/utils/prompt_builder.py @@ -100,7 +100,7 @@ class PromptManager: return context_prompt # 如果上下文中不存在,则使用全局提示模板 async with self._lock: - logger.debug(f"从全局获取提示词: {name}") + # logger.debug(f"从全局获取提示词: {name}") if name not in self._prompts: raise KeyError(f"Prompt '{name}' not found") return self._prompts[name] diff --git a/src/person_info/impression_update_task.py b/src/person_info/impression_update_task.py index 53f50e303..4ab23b29e 100644 --- a/src/person_info/impression_update_task.py +++ b/src/person_info/impression_update_task.py @@ -18,7 +18,7 @@ class ImpressionUpdateTask(AsyncTask): super().__init__( task_name="impression_update", wait_before_start=10, # 启动后等待10秒 - run_interval=60 # 每1分钟运行一次 + run_interval=30 # 每1分钟运行一次 ) async def run(self): @@ -27,7 +27,7 @@ class ImpressionUpdateTask(AsyncTask): # 获取最近10分钟的消息 current_time = int(time.time()) - start_time = current_time - 3600 # 10分钟前 + start_time = current_time - 600 # 10分钟前 logger.debug(f"获取时间范围: {start_time} -> {current_time}") # 获取所有消息 diff --git a/src/person_info/relationship_manager.py b/src/person_info/relationship_manager.py index 81c29d32a..5139e165e 100644 --- a/src/person_info/relationship_manager.py +++ b/src/person_info/relationship_manager.py @@ -9,6 +9,8 @@ from src.config.config import global_config from src.chat.utils.chat_message_builder import get_raw_msg_by_timestamp_with_chat_users from src.chat.utils.chat_message_builder import build_readable_messages from src.manager.mood_manager import mood_manager +from src.individuality.individuality import individuality +import re logger = get_logger("relation") @@ -210,6 +212,7 @@ class RelationshipManager: else: # print(f"person: {person}") person_id = person_info_manager.get_person_id(person[0], person[1]) + person_name = await person_info_manager.get_value(person_id, "person_name") # print(f"person_name: {person_name}") relationship_value = await person_info_manager.get_value(person_id, "relationship_value") @@ -249,20 +252,13 @@ class RelationshipManager: else: relation_value_prompt = "" - if relation_value_prompt: - nickname_str = await person_info_manager.get_value(person_id, "nickname") - platform = await person_info_manager.get_value(person_id, "platform") - relation_prompt = f"{relation_value_prompt},ta在{platform}上的昵称是{nickname_str}。\n" - else: - relation_prompt = "" - - person_name_reason = await person_info_manager.get_value(person_id, "person_name_reason") - if person_name_reason: - relation_prompt += f"ta的昵称{person_name}的由来是:{person_name_reason}。\n" + nickname_str = await person_info_manager.get_value(person_id, "nickname") + platform = await person_info_manager.get_value(person_id, "platform") + relation_prompt = f"你认识 {person_name} ,ta在{platform}上的昵称是{nickname_str}。" person_impression = await person_info_manager.get_value(person_id, "person_impression") if person_impression: - relation_prompt += f"ta的印象是:{person_impression}。\n" + relation_prompt += f"你对ta的印象是:{person_impression}。\n" return relation_prompt @@ -301,24 +297,24 @@ class RelationshipManager: old_impression = await person_info_manager.get_value(person_id, "person_impression") user_id = await person_info_manager.get_value(person_id, "user_id") - logger.debug(f"更新印象的person_id: {person_id}, chat_id: {chat_id}, reason: {reason}, timestamp: {timestamp}, user_id: {user_id}") + # logger.debug(f"更新印象的person_id: {person_id}, chat_id: {chat_id}, reason: {reason}, timestamp: {timestamp}, user_id: {user_id}") # 获取时间戳前后的消息 messages_before = get_raw_msg_by_timestamp_with_chat_users( chat_id=chat_id, - timestamp_start=timestamp - 3600, # 前1小时 + timestamp_start=timestamp - 600, # 前10分钟 timestamp_end=timestamp, person_ids=[user_id], - limit=30, + limit=200, limit_mode="latest" ) messages_after = get_raw_msg_by_timestamp_with_chat_users( chat_id=chat_id, timestamp_start=timestamp, - timestamp_end=timestamp + 3600, # 后1小时 + timestamp_end=timestamp + 600, # 后10分钟 person_ids=[user_id], - limit=30, + limit=200, limit_mode="earliest" ) @@ -330,49 +326,98 @@ class RelationshipManager: # 构建可读消息 - readable_messages = await build_readable_messages( - messages=user_messages, - replace_bot_name=True, - timestamp_mode="relative", - truncate=False - ) - - # 使用LLM总结印象 - prompt = f"""基于以下信息,总结对{person_name}(昵称:{nickname})的印象: -原因:{reason} + if user_messages: + + readable_messages = await build_readable_messages( + messages=user_messages, + replace_bot_name=True, + timestamp_mode="relative", + truncate=False + ) + + # 使用LLM总结印象 + alias_str = "" + for alias in global_config.bot.alias_names: + alias_str += f"{alias}, " + + + personality_block = individuality.get_personality_prompt(x_person=2, level=2) + identity_block = individuality.get_identity_prompt(x_person=2, level=2) + + prompt = f""" +你的名字是{global_config.bot.nickname},别名是{alias_str}。 +你是一个AI,但是你伪装成了一个人类,不要让别人发现这一点 +请参考以下人格: +{personality_block} +{identity_block} + +基于以下信息,总结对{person_name}(昵称:{nickname})的印象: 历史印象:{old_impression if old_impression else '无'} 最近发言: + {readable_messages} -请用简洁的语言总结对这个人的印象,不超过200字。""" - - new_impression, _ = await self.relationship_llm.generate_response_async(prompt=prompt) - - - logger.debug(f"新印象prompt:{prompt}") - logger.info(f"新印象:{new_impression}") - - - # 合并新旧印象 - if old_impression: - merge_prompt = f"""请将以下两段印象合并,形成一段连贯的描述: -旧印象:{old_impression} -新印象:{new_impression} +(如果某个发言像另一个聊天机器人,请指出来) -请用简洁的语言合并这两段印象,不超过200字。""" - final_impression, _ = await self.relationship_llm.generate_response_async(prompt=merge_prompt) +请用简洁的语言总结对这个人的印象,不超过50字。""" - logger.debug(f"合并印象prompt:{merge_prompt}") - logger.info(f"合并印象:{final_impression}") - - else: - final_impression = new_impression + new_impression, _ = await self.relationship_llm.generate_response_async(prompt=prompt) - # 更新到数据库 - await person_info_manager.update_one_field(person_id, "person_impression", final_impression) + + # 合并新旧印象 + if old_impression: + merge_prompt = f""" +你的名字是{global_config.bot.nickname},别名是{alias_str}。 +你是一个AI,但是你伪装成了一个人类,不要让别人发现这一点 +请参考以下人格: +{personality_block} +{identity_block} + +请根据对{person_name}(昵称:{nickname})的已有了解和新的了解,合并形成对这个人的完整印象: +对这个人的印象: + +{old_impression} + + +新了解: + +{new_impression} + + +注意,原有印象比较重要,新了解只是补充,不要超过原有印象的篇幅。 +请用简洁的语言合并这两段印象,近输出印象,不要输出其他内容,不超过200字。""" + final_impression, _ = await self.relationship_llm.generate_response_async(prompt=merge_prompt) + + # 找到包裹的内容,如果找不到,直接用原文 + + match = re.search(r"(.*?)", final_impression, re.DOTALL) + if match: + final_impression = match.group(1).strip() + + + logger.debug(f"新印象prompt:{prompt}") + logger.info(f"新印象:{new_impression}") + logger.debug(f"合并印象prompt:{merge_prompt}") + logger.info(f"合并印象:{final_impression}") + + else: + logger.debug(f"新印象prompt:{prompt}") + logger.info(f"新印象:{new_impression}") + + + final_impression = new_impression + + + # 更新到数据库 + await person_info_manager.update_one_field(person_id, "person_impression", final_impression) + + return final_impression - return final_impression + else: + logger.info(f"没有找到{person_name}的消息") + return old_impression + relationship_manager = RelationshipManager()