全部prompt独立
This commit is contained in:
@@ -8,7 +8,7 @@ from peewee import fn
|
||||
from src.common.logger import get_logger
|
||||
from src.config.config import global_config, model_config
|
||||
from src.common.database.database_model import ChatHistory
|
||||
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
|
||||
from src.prompt.prompt_manager import prompt_manager
|
||||
from src.llm_models.payload_content.message import MessageBuilder, RoleType, Message
|
||||
from src.plugin_system.apis import llm_api
|
||||
from src.dream.dream_generator import generate_dream_summary
|
||||
@@ -27,60 +27,6 @@ from src.dream.tools.update_jargon_tool import make_update_jargon
|
||||
logger = get_logger("dream_agent")
|
||||
|
||||
|
||||
def init_dream_prompts() -> None:
|
||||
"""初始化 dream agent 的提示词"""
|
||||
Prompt(
|
||||
"""
|
||||
你的名字是{bot_name},你现在处于"梦境维护模式(dream agent)"。
|
||||
你可以自由地在 ChatHistory 库中探索、整理、创建和删改记录,以帮助自己在未来更好地回忆和理解对话历史。
|
||||
|
||||
本轮要维护的聊天ID:{chat_id}
|
||||
本轮随机选中的起始记忆 ID:{start_memory_id}
|
||||
请优先以这条起始记忆为切入点,先理解它的内容与上下文,再决定如何在其附近进行创建新概括、重写或删除等整理操作;如果起始记忆为空,则由你自行选择合适的切入点。
|
||||
|
||||
你可以使用的工具包括:
|
||||
**ChatHistory 维护工具:**
|
||||
- search_chat_history:根据关键词或参与人搜索该 chat_id 下的历史记忆概括列表
|
||||
- get_chat_history_detail:查看某条概括的详细内容
|
||||
- create_chat_history:根据整理后的理解创建一条新的 ChatHistory 概括记录(主题、概括、关键词、关键信息等)
|
||||
- update_chat_history:在不改变事实的前提下重写或精炼主题、概括、关键词、关键信息
|
||||
- delete_chat_history:删除明显冗余、噪声、错误或无意义的记录,或者非常有时效性的信息,或者无太多有用信息的日常互动。
|
||||
你也可以先用 create_chat_history 创建一条新的综合概括,再对旧的冗余记录执行多次 delete_chat_history 来完成“合并”效果。
|
||||
|
||||
**Jargon(黑话)维护工具(只读,禁止修改):**
|
||||
- search_jargon:根据一个或多个关键词搜索Jargon 记录,通常是含义不明确的词条或者特殊的缩写
|
||||
|
||||
**通用工具:**
|
||||
- finish_maintenance:当你认为当前维护工作已经完成,没有更多需要整理的内容时,调用此工具来结束本次运行
|
||||
|
||||
**工作目标**:
|
||||
- 发现冗余、重复或高度相似的记录,并进行合并或删除;
|
||||
- 发现主题/概括过于含糊、啰嗦或缺少关键信息的记录,进行重写和精简;
|
||||
- summary要尽可能保持有用的信息;
|
||||
- 尽量保持信息的真实与可用性,不要凭空捏造事实。
|
||||
|
||||
**合并准则**
|
||||
- 你可以新建一个记录,然后删除旧记录来实现合并。
|
||||
- 如果两个或多个记录的主题相似,内容是对主题不同方面的信息或讨论,且信息量较少,则可以合并为一条记录。
|
||||
- 如果两个记录冲突,可以根据逻辑保留一个或者进行整合,也可以采取更新的记录,删除旧的记录
|
||||
|
||||
**轮次信息**:
|
||||
- 本次维护最多执行 {max_iterations} 轮
|
||||
- 每轮开始时,系统会告知你当前是第几轮,还剩多少轮
|
||||
- 如果提前完成维护工作,可以调用 finish_maintenance 工具主动结束
|
||||
|
||||
**每一轮的执行方式(必须遵守):**
|
||||
- 第一步:先用一小段中文自然语言,写出你的「思考」和本轮计划(例如要查什么、准备怎么合并/修改);
|
||||
- 第二步:在这段思考之后,再通过工具调用来执行你的计划(可以调用 0~N 个工具);
|
||||
- 第三步:收到工具结果后,在下一轮继续先写出新的思考,再视情况继续调用工具。
|
||||
|
||||
请不要在没有先写出思考的情况下直接调用工具。
|
||||
只输出你的思考内容或工具调用结果,由系统负责真正执行工具调用。
|
||||
""",
|
||||
name="dream_react_head_prompt",
|
||||
)
|
||||
|
||||
|
||||
class DreamTool:
|
||||
"""dream 模块内部使用的简易工具封装"""
|
||||
|
||||
@@ -278,17 +224,17 @@ async def run_dream_agent_once(
|
||||
tool_registry = get_dream_tool_registry()
|
||||
tool_defs = tool_registry.get_tool_definitions()
|
||||
|
||||
bot_name = global_config.bot.nickname
|
||||
time_now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
||||
|
||||
head_prompt = await global_prompt_manager.format_prompt(
|
||||
"dream_react_head_prompt",
|
||||
bot_name=bot_name,
|
||||
time_now=time_now,
|
||||
chat_id=chat_id,
|
||||
start_memory_id=start_memory_id if start_memory_id is not None else "无(本轮由你自由选择切入点)",
|
||||
max_iterations=max_iterations,
|
||||
head_prompt_template = prompt_manager.get_prompt("dream_react_head_prompt")
|
||||
head_prompt_template.add_context("bot_name", global_config.bot.nickname)
|
||||
head_prompt_template.add_context("time_now", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
|
||||
head_prompt_template.add_context("chat_id", chat_id)
|
||||
head_prompt_template.add_context(
|
||||
"start_memory_id",
|
||||
str(start_memory_id) if start_memory_id is not None else "无(本轮由你自由选择切入点)",
|
||||
)
|
||||
head_prompt_template.add_context("max_iterations", str(max_iterations))
|
||||
|
||||
head_prompt = await prompt_manager.render_prompt(head_prompt_template)
|
||||
|
||||
conversation_messages: List[Message] = []
|
||||
|
||||
@@ -575,10 +521,6 @@ async def start_dream_scheduler(
|
||||
raise
|
||||
|
||||
|
||||
# 初始化提示词
|
||||
init_dream_prompts()
|
||||
|
||||
|
||||
class TempMethodsDream:
|
||||
@staticmethod
|
||||
def is_in_dream_time() -> bool:
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import random
|
||||
from typing import List, Optional
|
||||
import random
|
||||
import json
|
||||
|
||||
from src.common.logger import get_logger
|
||||
from src.config.config import global_config, model_config
|
||||
from src.chat.utils.prompt_builder import Prompt
|
||||
from src.llm_models.payload_content.message import RoleType, Message
|
||||
from src.prompt.prompt_manager import prompt_manager
|
||||
from src.llm_models.utils_model import LLMRequest
|
||||
from src.chat.message_receive.chat_stream import get_chat_manager
|
||||
from src.plugin_system.apis import send_api
|
||||
@@ -44,27 +45,6 @@ def get_random_dream_styles(count: int = 2) -> List[str]:
|
||||
"""从梦境风格列表中随机选择指定数量的风格"""
|
||||
return random.sample(DREAM_STYLES, min(count, len(DREAM_STYLES)))
|
||||
|
||||
def init_dream_summary_prompt() -> None:
|
||||
"""初始化梦境总结的提示词"""
|
||||
Prompt(
|
||||
"""
|
||||
你刚刚完成了一次对聊天记录的记忆整理工作。以下是整理过程的摘要:
|
||||
整理过程:
|
||||
{conversation_text}
|
||||
|
||||
请将这次整理涉及的相关信息改写为一个富有诗意和想象力的"梦境",请你仅使用具体的记忆的内容,而不是整理过程编写。
|
||||
要求:
|
||||
1. 使用第一人称视角
|
||||
2. 叙述直白,不要复杂修辞,口语化
|
||||
3. 长度控制在200-800字
|
||||
4. 用中文输出
|
||||
梦境风格:
|
||||
{dream_styles}
|
||||
请直接输出梦境内容,不要添加其他说明:
|
||||
""",
|
||||
name="dream_summary_prompt",
|
||||
)
|
||||
|
||||
|
||||
async def generate_dream_summary(
|
||||
chat_id: str,
|
||||
@@ -74,8 +54,7 @@ async def generate_dream_summary(
|
||||
) -> None:
|
||||
"""生成梦境总结,输出到日志,并根据配置可选地推送给指定用户"""
|
||||
try:
|
||||
import json
|
||||
from src.chat.utils.prompt_builder import global_prompt_manager
|
||||
|
||||
|
||||
# 第一步:建立工具调用结果映射 (call_id -> result)
|
||||
tool_results_map: dict[str, str] = {}
|
||||
@@ -164,14 +143,13 @@ async def generate_dream_summary(
|
||||
dream_styles_text = "\n".join([f"{i + 1}. {style}" for i, style in enumerate(selected_styles)])
|
||||
|
||||
# 使用 Prompt 管理器格式化梦境生成 prompt
|
||||
dream_prompt = await global_prompt_manager.format_prompt(
|
||||
"dream_summary_prompt",
|
||||
chat_id=chat_id,
|
||||
total_iterations=total_iterations,
|
||||
time_cost=time_cost,
|
||||
conversation_text=conversation_text,
|
||||
dream_styles=dream_styles_text,
|
||||
)
|
||||
dream_prompt_template = prompt_manager.get_prompt("dream_summary_prompt")
|
||||
dream_prompt_template.add_context("chat_id", chat_id)
|
||||
dream_prompt_template.add_context("total_iterations", str(total_iterations))
|
||||
dream_prompt_template.add_context("time_cost", str(time_cost))
|
||||
dream_prompt_template.add_context("conversation_text", conversation_text)
|
||||
dream_prompt_template.add_context("dream_styles", dream_styles_text)
|
||||
dream_prompt = await prompt_manager.render_prompt(dream_prompt_template)
|
||||
|
||||
# 调用 utils 模型生成梦境
|
||||
summary_model = LLMRequest(
|
||||
@@ -199,9 +177,7 @@ async def generate_dream_summary(
|
||||
else:
|
||||
platform, user_id = parts[0].strip(), parts[1].strip()
|
||||
if not platform or not user_id:
|
||||
logger.warning(
|
||||
f"[dream][梦境总结] dream_send 平台或用户ID为空,当前值: {dream_send_raw!r}"
|
||||
)
|
||||
logger.warning(f"[dream][梦境总结] dream_send 平台或用户ID为空,当前值: {dream_send_raw!r}")
|
||||
else:
|
||||
# 默认为私聊会话
|
||||
stream_id = get_chat_manager().get_stream_id(
|
||||
@@ -227,9 +203,7 @@ async def generate_dream_summary(
|
||||
f"[dream][梦境总结] 已将梦境结果发送给配置的目标用户: {platform}:{user_id}"
|
||||
)
|
||||
else:
|
||||
logger.error(
|
||||
f"[dream][梦境总结] 向 {platform}:{user_id} 发送梦境结果失败"
|
||||
)
|
||||
logger.error(f"[dream][梦境总结] 向 {platform}:{user_id} 发送梦境结果失败")
|
||||
except Exception as send_exc:
|
||||
logger.error(f"[dream][梦境总结] 发送梦境结果到配置用户时出错: {send_exc}", exc_info=True)
|
||||
else:
|
||||
@@ -237,6 +211,3 @@ async def generate_dream_summary(
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"[dream][梦境总结] 生成梦境总结失败: {e}", exc_info=True)
|
||||
|
||||
|
||||
init_dream_summary_prompt()
|
||||
|
||||
Reference in New Issue
Block a user