From 21bca6b0305547183ecb2d2d149bdef633e16e85 Mon Sep 17 00:00:00 2001 From: UnCLAS-Prommer Date: Wed, 21 Jan 2026 18:18:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E7=9A=84prompt=E7=8B=AC?= =?UTF-8?q?=E7=AB=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prompts/chat_target_group1.prompt | 1 + prompts/chat_target_group2.prompt | 1 + prompts/chat_target_private1.prompt | 1 + prompts/chat_target_private2.prompt | 1 + .../default_expressor_prompt.prompt | 17 +--- prompts/lpmm_get_knowledge_prompt.prompt | 10 ++ src/chat/replyer/group_generator.py | 98 +++++++++++-------- src/chat/replyer/private_generator.py | 69 ++++++++----- 8 files changed, 114 insertions(+), 84 deletions(-) create mode 100644 prompts/chat_target_group1.prompt create mode 100644 prompts/chat_target_group2.prompt create mode 100644 prompts/chat_target_private1.prompt create mode 100644 prompts/chat_target_private2.prompt rename src/chat/replyer/prompt/rewrite_prompt.py => prompts/default_expressor_prompt.prompt (59%) create mode 100644 prompts/lpmm_get_knowledge_prompt.prompt diff --git a/prompts/chat_target_group1.prompt b/prompts/chat_target_group1.prompt new file mode 100644 index 00000000..77e89bcc --- /dev/null +++ b/prompts/chat_target_group1.prompt @@ -0,0 +1 @@ +你正在qq群里聊天,下面是群里正在聊的内容: \ No newline at end of file diff --git a/prompts/chat_target_group2.prompt b/prompts/chat_target_group2.prompt new file mode 100644 index 00000000..5b71bace --- /dev/null +++ b/prompts/chat_target_group2.prompt @@ -0,0 +1 @@ +正在群里聊天 \ No newline at end of file diff --git a/prompts/chat_target_private1.prompt b/prompts/chat_target_private1.prompt new file mode 100644 index 00000000..3e86c71f --- /dev/null +++ b/prompts/chat_target_private1.prompt @@ -0,0 +1 @@ +你正在和{sender_name}聊天,这是你们之前聊的内容: \ No newline at end of file diff --git a/prompts/chat_target_private2.prompt b/prompts/chat_target_private2.prompt new file mode 100644 index 00000000..9225ec82 --- /dev/null +++ b/prompts/chat_target_private2.prompt @@ -0,0 +1 @@ +和{sender_name}聊天 \ No newline at end of file diff --git a/src/chat/replyer/prompt/rewrite_prompt.py b/prompts/default_expressor_prompt.prompt similarity index 59% rename from src/chat/replyer/prompt/rewrite_prompt.py rename to prompts/default_expressor_prompt.prompt index c93d9033..4d05bc60 100644 --- a/src/chat/replyer/prompt/rewrite_prompt.py +++ b/prompts/default_expressor_prompt.prompt @@ -1,15 +1,3 @@ -from src.chat.utils.prompt_builder import Prompt -# from src.memory_system.memory_activator import MemoryActivator - - -def init_rewrite_prompt(): - Prompt("你正在qq群里聊天,下面是群里正在聊的内容:", "chat_target_group1") - Prompt("你正在和{sender_name}聊天,这是你们之前聊的内容:", "chat_target_private1") - Prompt("正在群里聊天", "chat_target_group2") - Prompt("和{sender_name}聊天", "chat_target_private2") - - Prompt( - """ {expression_habits_block} {chat_target} {chat_info} @@ -25,7 +13,4 @@ def init_rewrite_prompt(): {keywords_reaction_prompt} {moderation_prompt} 不要输出多余内容(包括冒号和引号,表情包,emoji,at或 @等 ),只输出一条回复就好。不要思考的太长。 -改写后的回复: -""", - "default_expressor_prompt", - ) +改写后的回复: \ No newline at end of file diff --git a/prompts/lpmm_get_knowledge_prompt.prompt b/prompts/lpmm_get_knowledge_prompt.prompt new file mode 100644 index 00000000..2ade0d0f --- /dev/null +++ b/prompts/lpmm_get_knowledge_prompt.prompt @@ -0,0 +1,10 @@ +你是一个专门获取知识的助手。你的名字是{bot_name}。现在是{time_now}。 +群里正在进行的聊天内容: +{chat_history} + +现在,{sender}发送了内容:{target_message},你想要回复ta。 +请仔细分析聊天内容,考虑以下几点: +1. 内容中是否包含需要查询信息的问题 +2. 是否有明确的知识获取指令 + +If you need to use the search tool, please directly call the function "lpmm_search_knowledge". If you do not need to use any tool, simply output "No tool needed". \ No newline at end of file diff --git a/src/chat/replyer/group_generator.py b/src/chat/replyer/group_generator.py index 054fb101..75ea80e6 100644 --- a/src/chat/replyer/group_generator.py +++ b/src/chat/replyer/group_generator.py @@ -18,7 +18,6 @@ from src.chat.message_receive.uni_message_sender import UniversalMessageSender from src.chat.utils.timer_calculator import Timer # <--- Import Timer from src.chat.utils.utils import get_chat_type_and_target_info, is_bot_self from src.prompt.prompt_manager import prompt_manager -from src.chat.utils.prompt_builder import global_prompt_manager from src.chat.utils.chat_message_builder import ( build_readable_messages, get_raw_msg_before_timestamp_with_chat, @@ -34,13 +33,11 @@ from src.plugin_system.apis import llm_api from src.chat.logger.plan_reply_logger import PlanReplyLogger from src.chat.replyer.prompt.lpmm_prompt import init_lpmm_prompt -from src.chat.replyer.prompt.rewrite_prompt import init_rewrite_prompt from src.memory_system.memory_retrieval import init_memory_retrieval_prompt, build_memory_retrieval_prompt from src.bw_learner.jargon_explainer import explain_jargon_in_context, retrieve_concepts_with_jargon from src.chat.utils.common_utils import TempMethodsExpression init_lpmm_prompt() -init_rewrite_prompt() init_memory_retrieval_prompt() @@ -72,7 +69,7 @@ class DefaultReplyer: from_plugin: bool = True, stream_id: Optional[str] = None, reply_message: Optional[DatabaseMessages] = None, - reply_time_point: Optional[float] = time.time(), + reply_time_point: float = time.time(), think_level: int = 1, unknown_words: Optional[List[str]] = None, log_reply: bool = True, @@ -619,7 +616,7 @@ class DefaultReplyer: # 默认 / context 模式:使用上下文自动匹配黑话 try: - return await explain_jargon_in_context(chat_id, messages_short, chat_talking_prompt_short) + return await explain_jargon_in_context(chat_id, messages_short, chat_talking_prompt_short) or "" except Exception as e: logger.error(f"上下文黑话解释失败: {e}") return "" @@ -762,7 +759,7 @@ class DefaultReplyer: available_actions: Optional[Dict[str, ActionInfo]] = None, chosen_actions: Optional[List[ActionPlannerInfo]] = None, enable_tool: bool = True, - reply_time_point: Optional[float] = time.time(), + reply_time_point: float = time.time(), think_level: int = 1, unknown_words: Optional[List[str]] = None, ) -> Tuple[str, List[int], List[str], str]: @@ -1098,37 +1095,53 @@ class DefaultReplyer: else: reply_target_block = "" - chat_target_1 = await global_prompt_manager.get_prompt_async("chat_target_group1") - chat_target_2 = await global_prompt_manager.get_prompt_async("chat_target_group2") + chat_target_1_prompt = prompt_manager.get_prompt("chat_target_group1") + chat_target_1 = await prompt_manager.render_prompt(chat_target_1_prompt) + chat_target_2_prompt = prompt_manager.get_prompt("chat_target_group2") + chat_target_2 = await prompt_manager.render_prompt(chat_target_2_prompt) - template_name = "default_expressor_prompt" # 根据配置构建最终的 reply_style:支持 multiple_reply_style 按概率随机替换 reply_style = global_config.personality.reply_style - multi_styles = getattr(global_config.personality, "multiple_reply_style", None) or [] - multi_prob = getattr(global_config.personality, "multiple_probability", 0.0) or 0.0 + multi_styles = global_config.personality.multiple_reply_style + multi_prob = global_config.personality.multiple_probability or 0.0 if multi_styles and multi_prob > 0 and random.random() < multi_prob: try: - reply_style = random.choice(list(multi_styles)) + reply_style = random.choice(multi_styles) except Exception: reply_style = global_config.personality.reply_style - return await global_prompt_manager.format_prompt( - template_name, - expression_habits_block=expression_habits_block, - # relation_info_block=relation_info, - chat_target=chat_target_1, - time_block=time_block, - chat_info=chat_talking_prompt_half, - identity=personality_prompt, - chat_target_2=chat_target_2, - reply_target_block=reply_target_block, - raw_reply=raw_reply, - reason=reason, - reply_style=reply_style, - keywords_reaction_prompt=keywords_reaction_prompt, - moderation_prompt=moderation_prompt_block, - ) + # return await global_prompt_manager.format_prompt( + # template_name, + # expression_habits_block=expression_habits_block, + # # relation_info_block=relation_info, + # chat_target=chat_target_1, + # time_block=time_block, + # chat_info=chat_talking_prompt_half, + # identity=personality_prompt, + # chat_target_2=chat_target_2, + # reply_target_block=reply_target_block, + # raw_reply=raw_reply, + # reason=reason, + # reply_style=reply_style, + # keywords_reaction_prompt=keywords_reaction_prompt, + # moderation_prompt=moderation_prompt_block, + # ) + prompt_template = prompt_manager.get_prompt("default_expressor_prompt") + prompt_template.add_context("expression_habits_block", expression_habits_block) + # prompt_template.add_context("relation_info_block", relation_info) + prompt_template.add_context("chat_target", chat_target_1) + prompt_template.add_context("time_block", time_block) + prompt_template.add_context("chat_info", chat_talking_prompt_half) + prompt_template.add_context("identity", personality_prompt) + prompt_template.add_context("chat_target_2", chat_target_2) + prompt_template.add_context("reply_target_block", reply_target_block) + prompt_template.add_context("raw_reply", raw_reply) + prompt_template.add_context("reason", reason) + prompt_template.add_context("reply_style", reply_style) + prompt_template.add_context("keywords_reaction_prompt", keywords_reaction_prompt) + prompt_template.add_context("moderation_prompt", moderation_prompt_block) + return await prompt_manager.render_prompt(prompt_template) async def _build_single_sending_message( self, @@ -1143,7 +1156,7 @@ class DefaultReplyer: """构建单个发送消息""" bot_user_info = UserInfo( - user_id=global_config.bot.qq_account, + user_id=str(global_config.bot.qq_account), user_nickname=global_config.bot.nickname, platform=self.chat_stream.platform, ) @@ -1201,18 +1214,21 @@ class DefaultReplyer: if global_config.lpmm_knowledge.lpmm_mode == "agent": return "" - time_now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) - - bot_name = global_config.bot.nickname - - prompt = await global_prompt_manager.format_prompt( - "lpmm_get_knowledge_prompt", - bot_name=bot_name, - time_now=time_now, - chat_history=message, - sender=sender, - target_message=target, - ) + template_prompt = prompt_manager.get_prompt("lpmm_get_knowledge_prompt") + template_prompt.add_context("bot_name", global_config.bot.nickname) + template_prompt.add_context("time_now", lambda _: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + template_prompt.add_context("chat_history", message) + template_prompt.add_context("sender", sender) + template_prompt.add_context("target_message", target) + # prompt = await global_prompt_manager.format_prompt( + # "lpmm_get_knowledge_prompt", + # bot_name=bot_name, + # time_now=time_now, + # chat_history=message, + # sender=sender, + # target_message=target, + # ) + prompt = await prompt_manager.render_prompt(template_prompt) _, _, _, _, tool_calls = await llm_api.generate_with_model_with_tools( prompt, model_config=model_config.model_task_config.tool_use, diff --git a/src/chat/replyer/private_generator.py b/src/chat/replyer/private_generator.py index 52bf9c68..9ba88f00 100644 --- a/src/chat/replyer/private_generator.py +++ b/src/chat/replyer/private_generator.py @@ -18,6 +18,7 @@ from src.chat.message_receive.uni_message_sender import UniversalMessageSender from src.chat.utils.timer_calculator import Timer # <--- Import Timer from src.chat.utils.utils import get_chat_type_and_target_info, is_bot_self from src.chat.utils.prompt_builder import global_prompt_manager +from src.prompt.prompt_manager import prompt_manager from src.chat.utils.common_utils import TempMethodsExpression from src.chat.utils.chat_message_builder import ( build_readable_messages, @@ -35,13 +36,11 @@ from src.plugin_system.apis import llm_api from src.chat.replyer.prompt.lpmm_prompt import init_lpmm_prompt from src.chat.replyer.prompt.replyer_private_prompt import init_replyer_private_prompt -from src.chat.replyer.prompt.rewrite_prompt import init_rewrite_prompt from src.memory_system.memory_retrieval import init_memory_retrieval_prompt, build_memory_retrieval_prompt from src.bw_learner.jargon_explainer import explain_jargon_in_context init_lpmm_prompt() init_replyer_private_prompt() -init_rewrite_prompt() init_memory_retrieval_prompt() @@ -801,11 +800,11 @@ class PrivateReplyer: # 根据配置构建最终的 reply_style:支持 multiple_reply_style 按概率随机替换 reply_style = global_config.personality.reply_style - multi_styles = getattr(global_config.personality, "multiple_reply_style", None) or [] - multi_prob = getattr(global_config.personality, "multiple_probability", 0.0) or 0.0 + multi_styles =global_config.personality.multiple_reply_style + multi_prob = global_config.personality.multiple_probability or 0.0 if multi_styles and multi_prob > 0 and random.random() < multi_prob: try: - reply_style = random.choice(list(multi_styles)) + reply_style = random.choice(multi_styles) except Exception: # 兜底:即使 multiple_reply_style 配置异常也不影响正常回复 reply_style = global_config.personality.reply_style @@ -864,7 +863,6 @@ class PrivateReplyer: ) -> str: # sourcery skip: merge-else-if-into-elif, remove-redundant-if chat_stream = self.chat_stream chat_id = chat_stream.stream_id - is_group_chat = bool(chat_stream.group_info) sender, target = self._parse_reply_target(reply_to) target = replace_user_references(target, chat_stream.platform, replace_bot_name=True) @@ -927,10 +925,12 @@ class PrivateReplyer: chat_target_name = "对方" if self.chat_target_info: chat_target_name = self.chat_target_info.person_name or self.chat_target_info.user_nickname or "对方" - chat_target_1 = await global_prompt_manager.format_prompt("chat_target_private1", sender_name=chat_target_name) - chat_target_2 = await global_prompt_manager.format_prompt("chat_target_private2", sender_name=chat_target_name) - - template_name = "default_expressor_prompt" + chat_target_1_template = prompt_manager.get_prompt("chat_target_private1") + chat_target_1_template.add_context("sender_name", chat_target_name) + chat_target_1 = await prompt_manager.render_prompt(chat_target_1_template) + chat_target_2_template = prompt_manager.get_prompt("chat_target_private2") + chat_target_2_template.add_context("sender_name", chat_target_name) + chat_target_2 = await prompt_manager.render_prompt(chat_target_2_template) # 根据配置构建最终的 reply_style:支持 multiple_reply_style 按概率随机替换 reply_style = global_config.personality.reply_style @@ -943,22 +943,37 @@ class PrivateReplyer: # 兜底:即使 multiple_reply_style 配置异常也不影响正常回复 reply_style = global_config.personality.reply_style - return await global_prompt_manager.format_prompt( - template_name, - expression_habits_block=expression_habits_block, - # relation_info_block=relation_info, - chat_target=chat_target_1, - time_block=time_block, - chat_info=chat_talking_prompt_half, - identity=personality_prompt, - chat_target_2=chat_target_2, - reply_target_block=reply_target_block, - raw_reply=raw_reply, - reason=reason, - reply_style=reply_style, - keywords_reaction_prompt=keywords_reaction_prompt, - moderation_prompt=moderation_prompt_block, - ) + # return await global_prompt_manager.format_prompt( + # template_name, + # expression_habits_block=expression_habits_block, + # # relation_info_block=relation_info, + # chat_target=chat_target_1, + # time_block=time_block, + # chat_info=chat_talking_prompt_half, + # identity=personality_prompt, + # chat_target_2=chat_target_2, + # reply_target_block=reply_target_block, + # raw_reply=raw_reply, + # reason=reason, + # reply_style=reply_style, + # keywords_reaction_prompt=keywords_reaction_prompt, + # moderation_prompt=moderation_prompt_block, + # ) + prompt_template = prompt_manager.get_prompt("default_expressor_prompt") + prompt_template.add_context("expression_habits_block", expression_habits_block) + # prompt_template.add_context("relation_info_block", relation_info) + prompt_template.add_context("chat_target", chat_target_1) + prompt_template.add_context("time_block", time_block) + prompt_template.add_context("chat_info", chat_talking_prompt_half) + prompt_template.add_context("identity", personality_prompt) + prompt_template.add_context("chat_target_2", chat_target_2) + prompt_template.add_context("reply_target_block", reply_target_block) + prompt_template.add_context("raw_reply", raw_reply) + prompt_template.add_context("reason", reason) + prompt_template.add_context("reply_style", reply_style) + prompt_template.add_context("keywords_reaction_prompt", keywords_reaction_prompt) + prompt_template.add_context("moderation_prompt", moderation_prompt_block) + return await prompt_manager.render_prompt(prompt_template) async def _build_single_sending_message( self, @@ -973,7 +988,7 @@ class PrivateReplyer: """构建单个发送消息""" bot_user_info = UserInfo( - user_id=global_config.bot.qq_account, + user_id=str(global_config.bot.qq_account), user_nickname=global_config.bot.nickname, platform=self.chat_stream.platform, )