feat:完善个人侧写
This commit is contained in:
@@ -30,7 +30,10 @@ def init_prompt():
|
|||||||
"""
|
"""
|
||||||
你的自我认知是:
|
你的自我认知是:
|
||||||
{self_info_block}
|
{self_info_block}
|
||||||
|
请记住你的性格,身份和特点。
|
||||||
|
|
||||||
{relation_info_block}
|
{relation_info_block}
|
||||||
|
|
||||||
{extra_info_block}
|
{extra_info_block}
|
||||||
{memory_str}
|
{memory_str}
|
||||||
|
|
||||||
|
|||||||
@@ -204,9 +204,9 @@ class DefaultReplyer:
|
|||||||
reply = []
|
reply = []
|
||||||
with Timer("选择表情", cycle_timers):
|
with Timer("选择表情", cycle_timers):
|
||||||
emoji_keyword = action_data.get("description", [])
|
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:
|
if emoji_base64:
|
||||||
logger.info(f"选择表情: {description}")
|
# logger.info(f"选择表情: {_description}")
|
||||||
reply.append(("emoji", emoji_base64))
|
reply.append(("emoji", emoji_base64))
|
||||||
else:
|
else:
|
||||||
logger.warning(f"{self.log_prefix} 没有找到合适表情")
|
logger.warning(f"{self.log_prefix} 没有找到合适表情")
|
||||||
@@ -578,9 +578,9 @@ class DefaultReplyer:
|
|||||||
description = ""
|
description = ""
|
||||||
emoji_raw = await emoji_manager.get_emoji_for_text(send_emoji)
|
emoji_raw = await emoji_manager.get_emoji_for_text(send_emoji)
|
||||||
if emoji_raw:
|
if emoji_raw:
|
||||||
emoji_path, description = emoji_raw
|
emoji_path, description, _emotion = emoji_raw
|
||||||
emoji_base64 = image_path_to_base64(emoji_path)
|
emoji_base64 = image_path_to_base64(emoji_path)
|
||||||
return emoji_base64, description
|
return emoji_base64, description, _emotion
|
||||||
|
|
||||||
async def _build_single_sending_message(
|
async def _build_single_sending_message(
|
||||||
self,
|
self,
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ class ChatManager:
|
|||||||
message.message_info.group_info,
|
message.message_info.group_info,
|
||||||
)
|
)
|
||||||
self.last_messages[stream_id] = message
|
self.last_messages[stream_id] = message
|
||||||
logger.debug(f"注册消息到聊天流: {stream_id}")
|
# logger.debug(f"注册消息到聊天流: {stream_id}")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _generate_stream_id(platform: str, user_info: UserInfo, group_info: Optional[GroupInfo] = None) -> str:
|
def _generate_stream_id(platform: str, user_info: UserInfo, group_info: Optional[GroupInfo] = None) -> str:
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ class NormalChat:
|
|||||||
if random() < global_config.normal_chat.emoji_chance:
|
if random() < global_config.normal_chat.emoji_chance:
|
||||||
emoji_raw = await emoji_manager.get_emoji_for_text(response)
|
emoji_raw = await emoji_manager.get_emoji_for_text(response)
|
||||||
if emoji_raw:
|
if emoji_raw:
|
||||||
emoji_path, description = emoji_raw
|
emoji_path, description, _emotion = emoji_raw
|
||||||
emoji_cq = image_path_to_base64(emoji_path)
|
emoji_cq = image_path_to_base64(emoji_path)
|
||||||
|
|
||||||
thinking_time_point = round(message.message_info.time, 2)
|
thinking_time_point = round(message.message_info.time, 2)
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ class PromptManager:
|
|||||||
return context_prompt
|
return context_prompt
|
||||||
# 如果上下文中不存在,则使用全局提示模板
|
# 如果上下文中不存在,则使用全局提示模板
|
||||||
async with self._lock:
|
async with self._lock:
|
||||||
logger.debug(f"从全局获取提示词: {name}")
|
# logger.debug(f"从全局获取提示词: {name}")
|
||||||
if name not in self._prompts:
|
if name not in self._prompts:
|
||||||
raise KeyError(f"Prompt '{name}' not found")
|
raise KeyError(f"Prompt '{name}' not found")
|
||||||
return self._prompts[name]
|
return self._prompts[name]
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class ImpressionUpdateTask(AsyncTask):
|
|||||||
super().__init__(
|
super().__init__(
|
||||||
task_name="impression_update",
|
task_name="impression_update",
|
||||||
wait_before_start=10, # 启动后等待10秒
|
wait_before_start=10, # 启动后等待10秒
|
||||||
run_interval=60 # 每1分钟运行一次
|
run_interval=30 # 每1分钟运行一次
|
||||||
)
|
)
|
||||||
|
|
||||||
async def run(self):
|
async def run(self):
|
||||||
@@ -27,7 +27,7 @@ class ImpressionUpdateTask(AsyncTask):
|
|||||||
|
|
||||||
# 获取最近10分钟的消息
|
# 获取最近10分钟的消息
|
||||||
current_time = int(time.time())
|
current_time = int(time.time())
|
||||||
start_time = current_time - 3600 # 10分钟前
|
start_time = current_time - 600 # 10分钟前
|
||||||
logger.debug(f"获取时间范围: {start_time} -> {current_time}")
|
logger.debug(f"获取时间范围: {start_time} -> {current_time}")
|
||||||
|
|
||||||
# 获取所有消息
|
# 获取所有消息
|
||||||
|
|||||||
@@ -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 get_raw_msg_by_timestamp_with_chat_users
|
||||||
from src.chat.utils.chat_message_builder import build_readable_messages
|
from src.chat.utils.chat_message_builder import build_readable_messages
|
||||||
from src.manager.mood_manager import mood_manager
|
from src.manager.mood_manager import mood_manager
|
||||||
|
from src.individuality.individuality import individuality
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
logger = get_logger("relation")
|
logger = get_logger("relation")
|
||||||
@@ -210,6 +212,7 @@ class RelationshipManager:
|
|||||||
else:
|
else:
|
||||||
# print(f"person: {person}")
|
# print(f"person: {person}")
|
||||||
person_id = person_info_manager.get_person_id(person[0], person[1])
|
person_id = person_info_manager.get_person_id(person[0], person[1])
|
||||||
|
|
||||||
person_name = await person_info_manager.get_value(person_id, "person_name")
|
person_name = await person_info_manager.get_value(person_id, "person_name")
|
||||||
# print(f"person_name: {person_name}")
|
# print(f"person_name: {person_name}")
|
||||||
relationship_value = await person_info_manager.get_value(person_id, "relationship_value")
|
relationship_value = await person_info_manager.get_value(person_id, "relationship_value")
|
||||||
@@ -249,20 +252,13 @@ class RelationshipManager:
|
|||||||
else:
|
else:
|
||||||
relation_value_prompt = ""
|
relation_value_prompt = ""
|
||||||
|
|
||||||
if relation_value_prompt:
|
nickname_str = await person_info_manager.get_value(person_id, "nickname")
|
||||||
nickname_str = await person_info_manager.get_value(person_id, "nickname")
|
platform = await person_info_manager.get_value(person_id, "platform")
|
||||||
platform = await person_info_manager.get_value(person_id, "platform")
|
relation_prompt = f"你认识 {person_name} ,ta在{platform}上的昵称是{nickname_str}。"
|
||||||
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"
|
|
||||||
|
|
||||||
person_impression = await person_info_manager.get_value(person_id, "person_impression")
|
person_impression = await person_info_manager.get_value(person_id, "person_impression")
|
||||||
if person_impression:
|
if person_impression:
|
||||||
relation_prompt += f"ta的印象是:{person_impression}。\n"
|
relation_prompt += f"你对ta的印象是:{person_impression}。\n"
|
||||||
|
|
||||||
return relation_prompt
|
return relation_prompt
|
||||||
|
|
||||||
@@ -301,24 +297,24 @@ class RelationshipManager:
|
|||||||
old_impression = await person_info_manager.get_value(person_id, "person_impression")
|
old_impression = await person_info_manager.get_value(person_id, "person_impression")
|
||||||
user_id = await person_info_manager.get_value(person_id, "user_id")
|
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(
|
messages_before = get_raw_msg_by_timestamp_with_chat_users(
|
||||||
chat_id=chat_id,
|
chat_id=chat_id,
|
||||||
timestamp_start=timestamp - 3600, # 前1小时
|
timestamp_start=timestamp - 600, # 前10分钟
|
||||||
timestamp_end=timestamp,
|
timestamp_end=timestamp,
|
||||||
person_ids=[user_id],
|
person_ids=[user_id],
|
||||||
limit=30,
|
limit=200,
|
||||||
limit_mode="latest"
|
limit_mode="latest"
|
||||||
)
|
)
|
||||||
|
|
||||||
messages_after = get_raw_msg_by_timestamp_with_chat_users(
|
messages_after = get_raw_msg_by_timestamp_with_chat_users(
|
||||||
chat_id=chat_id,
|
chat_id=chat_id,
|
||||||
timestamp_start=timestamp,
|
timestamp_start=timestamp,
|
||||||
timestamp_end=timestamp + 3600, # 后1小时
|
timestamp_end=timestamp + 600, # 后10分钟
|
||||||
person_ids=[user_id],
|
person_ids=[user_id],
|
||||||
limit=30,
|
limit=200,
|
||||||
limit_mode="earliest"
|
limit_mode="earliest"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -330,49 +326,98 @@ class RelationshipManager:
|
|||||||
|
|
||||||
# 构建可读消息
|
# 构建可读消息
|
||||||
|
|
||||||
readable_messages = await build_readable_messages(
|
if user_messages:
|
||||||
messages=user_messages,
|
|
||||||
replace_bot_name=True,
|
readable_messages = await build_readable_messages(
|
||||||
timestamp_mode="relative",
|
messages=user_messages,
|
||||||
truncate=False
|
replace_bot_name=True,
|
||||||
)
|
timestamp_mode="relative",
|
||||||
|
truncate=False
|
||||||
# 使用LLM总结印象
|
)
|
||||||
prompt = f"""基于以下信息,总结对{person_name}(昵称:{nickname})的印象:
|
|
||||||
原因:{reason}
|
# 使用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 '无'}
|
历史印象:{old_impression if old_impression else '无'}
|
||||||
最近发言:
|
最近发言:
|
||||||
|
|
||||||
{readable_messages}
|
{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字。"""
|
请用简洁的语言总结对这个人的印象,不超过50字。"""
|
||||||
final_impression, _ = await self.relationship_llm.generate_response_async(prompt=merge_prompt)
|
|
||||||
|
|
||||||
logger.debug(f"合并印象prompt:{merge_prompt}")
|
new_impression, _ = await self.relationship_llm.generate_response_async(prompt=prompt)
|
||||||
logger.info(f"合并印象:{final_impression}")
|
|
||||||
|
|
||||||
else:
|
|
||||||
final_impression = new_impression
|
|
||||||
|
|
||||||
|
|
||||||
# 更新到数据库
|
|
||||||
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})的已有了解和新的了解,合并形成对这个人的完整印象:
|
||||||
|
对这个人的印象:
|
||||||
|
<impression>
|
||||||
|
{old_impression}
|
||||||
|
</impression>
|
||||||
|
|
||||||
|
新了解:
|
||||||
|
<new_impression>
|
||||||
|
{new_impression}
|
||||||
|
</new_impression>
|
||||||
|
|
||||||
|
注意,原有印象比较重要,新了解只是补充,不要超过原有印象的篇幅。
|
||||||
|
请用简洁的语言合并这两段印象,近输出印象,不要输出其他内容,不超过200字。"""
|
||||||
|
final_impression, _ = await self.relationship_llm.generate_response_async(prompt=merge_prompt)
|
||||||
|
|
||||||
|
# 找到<impression>包裹的内容,如果找不到,直接用原文
|
||||||
|
|
||||||
|
match = re.search(r"<impression>(.*?)</impression>", 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()
|
relationship_manager = RelationshipManager()
|
||||||
|
|||||||
Reference in New Issue
Block a user