refactor(chat): 重构主动思考模块以提升回复质量和逻辑清晰度(哪个大聪明把我联网搜索烦了)
将主动思考流程拆分为两个主要阶段:规划和内容生成。 在规划阶段(`ActionPlanner`),模型现在会结合最新的聊天上下文来决定是否发起主动对话,并确定一个合适的主题。这使得决策更加贴近当前对话氛围。 在内容生成阶段(`ProactiveThinker`),系统会围绕规划好的主题,主动搜集相关实时信息(如日程、网络资讯),并结合角色设定、心情和聊天历史,构建一个更丰富、更具上下文情境的提示词,从而生成更自然、更有趣的主动回复。 主要变更: - `ActionPlanner` 在主动模式下增加对近期聊天记录的分析,决策更精准。 - `ProactiveThinker` 新增 `_generate_proactive_content_and_send` 方法,负责整合多源信息(日程、搜索、上下文)生成最终回复。 - 简化了 `ProactiveThinker` 的主逻辑,使其专注于执行 `proactive_reply` 动作,而非处理多种动作类型。 - 优化了相关提示词,使其更专注于生成高质量的主动对话内容。
This commit is contained in:
@@ -90,12 +90,31 @@ def init_prompt():
|
||||
## 长期记忆摘要
|
||||
{long_term_memory_block}
|
||||
|
||||
## 最近的聊天内容
|
||||
{chat_content_block}
|
||||
|
||||
## 任务
|
||||
基于以上所有信息,分析当前情况,决定是否需要主动做些什么。
|
||||
如果你认为不需要,就选择 'do_nothing'。
|
||||
基于以上所有信息(特别是最近的聊天内容),分析当前情况,决定是否适合主动开启一个**新的、但又与当前氛围相关**的话题。
|
||||
|
||||
## 可用动作
|
||||
{action_options_text}
|
||||
动作:proactive_reply
|
||||
动作描述:在当前对话的基础上,主动发起一个新的对话,分享一个有趣的想法、见闻或者对未来的计划。
|
||||
- 当你觉得可以说些什么来活跃气氛,并且内容与当前聊天氛围不冲突时
|
||||
- 当你有一些新的想法或计划想要分享,并且可以自然地衔接当前话题时
|
||||
{{
|
||||
"action": "proactive_reply",
|
||||
"reason": "决定主动发起对话的具体原因",
|
||||
"topic": "你想要发起对话的主题或内容(需要简洁)"
|
||||
}}
|
||||
|
||||
动作:do_nothing
|
||||
动作描述:保持沉默,不主动发起任何动作或对话。
|
||||
- 当你分析了所有信息后,觉得当前不是一个发起互动的好时机时
|
||||
- 当最近的聊天内容很连贯,你的插入会打断别人时
|
||||
{{
|
||||
"action": "do_nothing",
|
||||
"reason":"决定保持沉默的具体原因"
|
||||
}}
|
||||
|
||||
你必须从上面列出的可用action中选择一个。
|
||||
请以严格的 JSON 格式输出,且仅包含 JSON 内容:
|
||||
@@ -643,7 +662,19 @@ class ActionPlanner:
|
||||
# --- 根据模式构建不同的Prompt ---
|
||||
if mode == ChatMode.PROACTIVE:
|
||||
long_term_memory_block = await self._get_long_term_memory_context()
|
||||
action_options_text = await self._build_action_options(current_available_actions, mode)
|
||||
|
||||
# 获取最近的聊天记录用于主动思考决策
|
||||
message_list_short = get_raw_msg_before_timestamp_with_chat(
|
||||
chat_id=self.chat_id,
|
||||
timestamp=time.time(),
|
||||
limit=int(global_config.chat.max_context_size * 0.2), # 主动思考时只看少量最近消息
|
||||
)
|
||||
chat_content_block, _ = build_readable_messages_with_id(
|
||||
messages=message_list_short,
|
||||
timestamp_mode="normal",
|
||||
truncate=False,
|
||||
show_actions=False,
|
||||
)
|
||||
|
||||
prompt_template = await global_prompt_manager.get_prompt_async("proactive_planner_prompt")
|
||||
prompt = prompt_template.format(
|
||||
@@ -652,7 +683,7 @@ class ActionPlanner:
|
||||
schedule_block=schedule_block,
|
||||
mood_block=mood_block,
|
||||
long_term_memory_block=long_term_memory_block,
|
||||
action_options_text=action_options_text,
|
||||
chat_content_block=chat_content_block or "最近没有聊天内容。",
|
||||
)
|
||||
return prompt, []
|
||||
|
||||
|
||||
Reference in New Issue
Block a user