PromptManager再修改,测试更新;将主程序的prompt独立到文件(部分)

This commit is contained in:
UnCLAS-Prommer
2026-01-20 22:15:27 +08:00
parent c15b77907e
commit 761e4c8940
12 changed files with 772 additions and 716 deletions

View File

@@ -13,7 +13,8 @@ from src.config.config import global_config, model_config
from src.common.logger import get_logger
from src.chat.logger.plan_reply_logger import PlanReplyLogger
from src.common.data_models.info_data_model import ActionPlannerInfo
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
# from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.prompt.prompt_manager import prompt_manager
from src.chat.utils.chat_message_builder import (
build_readable_messages_with_id,
get_raw_msg_before_timestamp_with_chat,
@@ -35,69 +36,6 @@ logger = get_logger("planner")
install(extra_lines=3)
def init_prompt():
Prompt(
"""
{time_block}
{name_block}
{chat_context_description},以下是具体的聊天内容
**聊天内容**
{chat_content_block}
**可选的action**
reply
动作描述:
1.你可以选择呼叫了你的名字,但是你没有做出回应的消息进行回复
2.你可以自然的顺着正在进行的聊天内容进行回复或自然的提出一个问题
3.最好一次对一个话题进行回复,免得啰嗦或者回复内容太乱。
4.不要选择回复你自己发送的消息
5.不要单独对表情包进行回复
6.将上下文中所有含义不明的疑似黑话的缩写词均写入unknown_words中
{reply_action_example}
no_reply
动作描述:
保持沉默,不回复直到有新消息
控制聊天频率,不要太过频繁的发言
{{"action":"no_reply"}}
{action_options_text}
**你之前的action执行和思考记录**
{actions_before_now_block}
请选择**可选的**且符合使用条件的action并说明触发action的消息id(消息id格式:m+数字)
先输出你的简短的选择思考理由再输出你选择的action理由不要分点精简。
**动作选择要求**
请你根据聊天内容,用户的最新消息和以下标准选择合适的动作:
{plan_style}
{moderation_prompt}
target_message_id为必填表示触发消息的id
请选择所有符合使用要求的action每个动作最多选择一次但是可以选择多个动作
动作用json格式输出用```json包裹如果输出多个json每个json都要单独一行放在同一个```json代码块内:
**示例**
// 理由文本(简短)
```json
{{"action":"动作名", "target_message_id":"m123", .....}}
{{"action":"动作名", "target_message_id":"m456", .....}}
```""",
"planner_prompt",
)
Prompt(
"""
{action_name}
动作描述:{action_description}
使用条件{parallel_text}
{action_require}
{{"action":"{action_name}",{action_parameters}, "target_message_id":"消息id(m+数字)"}}
""",
"action_prompt",
)
class ActionPlanner:
def __init__(self, chat_id: str, action_manager: ActionManager):
self.chat_id = chat_id
@@ -663,19 +601,31 @@ class ActionPlanner:
reply_action_example += ', "quote":"如果需要引用该message设置为true"'
reply_action_example += "}"
planner_prompt_template = await global_prompt_manager.get_prompt_async("planner_prompt")
prompt = planner_prompt_template.format(
time_block=time_block,
chat_context_description=chat_context_description,
chat_content_block=chat_content_block,
actions_before_now_block=actions_before_now_block,
action_options_text=action_options_block,
moderation_prompt=moderation_prompt_block,
name_block=name_block,
interest=interest,
plan_style=global_config.personality.plan_style,
reply_action_example=reply_action_example,
)
# planner_prompt_template = await global_prompt_manager.get_prompt_async("planner_prompt")
# prompt = planner_prompt_template.format(
# time_block=time_block,
# chat_context_description=chat_context_description,
# chat_content_block=chat_content_block,
# actions_before_now_block=actions_before_now_block,
# action_options_text=action_options_block,
# moderation_prompt=moderation_prompt_block,
# name_block=name_block,
# interest=interest,
# plan_style=global_config.personality.plan_style,
# reply_action_example=reply_action_example,
# )
planner_prompt_template = prompt_manager.get_prompt("planner_prompt")
planner_prompt_template.add_context("time_block", time_block)
planner_prompt_template.add_context("chat_context_description", chat_context_description)
planner_prompt_template.add_context("chat_content_block", chat_content_block)
planner_prompt_template.add_context("actions_before_now_block", actions_before_now_block)
planner_prompt_template.add_context("action_options_text", action_options_block)
planner_prompt_template.add_context("moderation_prompt", moderation_prompt_block)
planner_prompt_template.add_context("name_block", name_block)
planner_prompt_template.add_context("interest", interest)
planner_prompt_template.add_context("plan_style", global_config.personality.plan_style)
planner_prompt_template.add_context("reply_action_example", reply_action_example)
prompt = await prompt_manager.render_prompt(planner_prompt_template)
return prompt, message_id_list
except Exception as e:
@@ -759,16 +709,23 @@ class ActionPlanner:
parallel_text = ""
# 获取动作提示模板并填充
using_action_prompt = await global_prompt_manager.get_prompt_async("action_prompt")
using_action_prompt = using_action_prompt.format(
action_name=action_name,
action_description=action_info.description,
action_parameters=param_text,
action_require=require_text,
parallel_text=parallel_text,
)
# using_action_prompt = await global_prompt_manager.get_prompt_async("action_prompt")
# using_action_prompt = using_action_prompt.format(
# action_name=action_name,
# action_description=action_info.description,
# action_parameters=param_text,
# action_require=require_text,
# parallel_text=parallel_text,
# )
using_action_prompt = prompt_manager.get_prompt("action_prompt")
using_action_prompt.add_context("action_name", action_name)
using_action_prompt.add_context("action_description", action_info.description)
using_action_prompt.add_context("action_parameters", param_text)
using_action_prompt.add_context("action_require", require_text)
using_action_prompt.add_context("parallel_text", parallel_text)
using_action_rendered_prompt = await prompt_manager.render_prompt(using_action_prompt)
action_options_block += using_action_prompt
action_options_block += using_action_rendered_prompt
return action_options_block
@@ -994,6 +951,3 @@ class ActionPlanner:
logger.debug(f"处理不完整的JSON代码块时出错: {e}")
return json_objects, reasoning_content
init_prompt()

View File

@@ -17,6 +17,7 @@ from src.chat.message_receive.chat_stream import ChatStream
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,
@@ -33,14 +34,12 @@ 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.replyer_prompt import init_replyer_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_replyer_prompt()
init_rewrite_prompt()
init_memory_retrieval_prompt()
@@ -947,6 +946,7 @@ class DefaultReplyer:
else:
reply_target_block = ""
dialogue_prompt: str = ""
if message_list_before_now_long:
latest_msgs = message_list_before_now_long[-int(global_config.chat.max_context_size) :]
dialogue_prompt = build_readable_messages(
@@ -980,33 +980,55 @@ class DefaultReplyer:
# 兜底:即使 multiple_reply_style 配置异常也不影响正常回复
reply_style = global_config.personality.reply_style
return (
await global_prompt_manager.format_prompt(
prompt_name,
expression_habits_block=expression_habits_block,
tool_info_block=tool_info,
bot_name=global_config.bot.nickname,
knowledge_prompt=prompt_info,
# relation_info_block=relation_info,
extra_info_block=extra_info_block,
jargon_explanation=jargon_explanation,
identity=personality_prompt,
action_descriptions=actions_info,
sender_name=sender,
dialogue_prompt=dialogue_prompt,
time_block=time_block,
reply_target_block=reply_target_block,
reply_style=reply_style,
keywords_reaction_prompt=keywords_reaction_prompt,
moderation_prompt=moderation_prompt_block,
memory_retrieval=memory_retrieval,
chat_prompt=chat_prompt_block,
planner_reasoning=planner_reasoning,
),
selected_expressions,
timing_logs,
almost_zero_str,
)
# return (
# await global_prompt_manager.format_prompt(
# prompt_name,
# expression_habits_block=expression_habits_block,
# tool_info_block=tool_info,
# bot_name=global_config.bot.nickname,
# knowledge_prompt=prompt_info,
# # relation_info_block=relation_info,
# extra_info_block=extra_info_block,
# jargon_explanation=jargon_explanation,
# identity=personality_prompt,
# action_descriptions=actions_info,
# sender_name=sender,
# dialogue_prompt=dialogue_prompt,
# time_block=time_block,
# reply_target_block=reply_target_block,
# reply_style=reply_style,
# keywords_reaction_prompt=keywords_reaction_prompt,
# moderation_prompt=moderation_prompt_block,
# memory_retrieval=memory_retrieval,
# chat_prompt=chat_prompt_block,
# planner_reasoning=planner_reasoning,
# ),
# selected_expressions,
# timing_logs,
# almost_zero_str,
# )
prompt = prompt_manager.get_prompt(prompt_name)
prompt.add_context("expression_habits_block", expression_habits_block)
prompt.add_context("tool_info_block", tool_info)
prompt.add_context("bot_name", global_config.bot.nickname)
prompt.add_context("knowledge_prompt", prompt_info)
# prompt.add_context("relation_info_block", relation_info)
prompt.add_context("extra_info_block", extra_info_block)
prompt.add_context("jargon_explanation", jargon_explanation)
prompt.add_context("identity", personality_prompt)
prompt.add_context("action_descriptions", actions_info)
prompt.add_context("sender_name", sender)
prompt.add_context("dialogue_prompt", dialogue_prompt)
prompt.add_context("time_block", time_block)
prompt.add_context("reply_target_block", reply_target_block)
prompt.add_context("reply_style", reply_style)
prompt.add_context("keywords_reaction_prompt", keywords_reaction_prompt)
prompt.add_context("moderation_prompt", moderation_prompt_block)
prompt.add_context("memory_retrieval", memory_retrieval)
prompt.add_context("chat_prompt", chat_prompt_block)
prompt.add_context("planner_reasoning", planner_reasoning)
formatted_prompt = await prompt_manager.render_prompt(prompt)
return (formatted_prompt, selected_expressions, timing_logs, almost_zero_str)
async def build_prompt_rewrite_context(
self,

View File

@@ -1,48 +0,0 @@
from src.chat.utils.prompt_builder import Prompt
# from src.chat.memory_system.memory_activator import MemoryActivator
def init_replyer_prompt():
Prompt(
"""{knowledge_prompt}{tool_info_block}{extra_info_block}
{expression_habits_block}{memory_retrieval}{jargon_explanation}
你正在qq群里聊天下面是群里正在聊的内容其中包含聊天记录和聊天中的图片
其中标注 {bot_name}(你) 的发言是你自己的发言,请注意区分:
{time_block}
{dialogue_prompt}
{reply_target_block}
{planner_reasoning}
{identity}
{chat_prompt}你正在群里聊天,现在请你读读之前的聊天记录,然后给出日常且口语化的回复,
尽量简短一些。{keywords_reaction_prompt}
请注意把握聊天内容,不要回复的太有条理。
{reply_style}
请注意不要输出多余内容(包括不必要的前后缀冒号括号表情包at或 @等 ),只输出发言内容就好。
最好一次对一个话题进行回复,免得啰嗦或者回复内容太乱。
现在,你说:""",
"replyer_prompt_0",
)
Prompt(
"""{knowledge_prompt}{tool_info_block}{extra_info_block}
{expression_habits_block}{memory_retrieval}{jargon_explanation}
你正在qq群里聊天下面是群里正在聊的内容其中包含聊天记录和聊天中的图片
其中标注 {bot_name}(你) 的发言是你自己的发言,请注意区分:
{time_block}
{dialogue_prompt}
{reply_target_block}
{planner_reasoning}
{identity}
{chat_prompt}你正在群里聊天,现在请你读读之前的聊天记录,把握当前的话题,然后给出日常且简短的回复。
最好一次对一个话题进行回复,免得啰嗦或者回复内容太乱。
{keywords_reaction_prompt}
请注意把握聊天内容。
{reply_style}
请注意不要输出多余内容(包括不必要的前后缀冒号括号at或 @等 ),只输出发言内容就好。
现在,你说:""",
"replyer_prompt",
)