feat(proactive_thinker): 在主动思考中融入情绪状态

将情绪状态整合到主动思考的上下文和提示词中。这使得AI在主动发起对话时,其语气和内容能够更好地反映当前的情绪,使交互更加生动和人性化。

主要变更:
- 在上下文收集中增加当前的情绪状态。
- 将情绪状态变量加入到私聊和群聊的提示词模板中,引导模型生成符合情绪的回复。
- 优化了最终的输出指令,使其更清晰、更严格,以提高生成内容的质量。
This commit is contained in:
minecraft1024a
2025-10-03 17:41:58 +08:00
parent 923b989657
commit f4079f10fe

View File

@@ -5,6 +5,7 @@ import orjson
from src.common.logger import get_logger
from src.config.config import global_config, model_config
from src.mood.mood_manager import mood_manager
from src.person_info.person_info import get_person_info_manager
from src.plugin_system.apis import (
chat_api,
@@ -110,8 +111,8 @@ class ProactiveThinkerExecutor:
elif stream_type == "group":
return chat_api.ChatManager.get_group_stream_by_group_id(platform=platform, group_id=chat_id)
except Exception as e:
logger.error(f"解析 stream_id ({stream_id}) 或获取 stream 失败: {e}")
return None
logger.error(f"获取 stream_id ({stream_id}) 失败: {e}")
return None
async def _gather_context(self, stream_id: str) -> dict[str, Any] | None:
"""
@@ -157,10 +158,12 @@ class ProactiveThinkerExecutor:
)
# 2. 构建基础上下文
mood_state = mood_manager.get_mood_by_chat_id(stream_id).mood_state
base_context = {
"schedule_context": schedule_context,
"recent_chat_history": recent_chat_history,
"action_history_context": action_history_context,
"mood_state": mood_state,
"persona": {
"core": global_config.personality.personality_core,
"side": global_config.personality.personality_side,
@@ -230,6 +233,8 @@ class ProactiveThinkerExecutor:
- 核心人设: {persona["core"]}
- 侧面人设: {persona["side"]}
- 身份: {persona["identity"]}
你的当前情绪状态是: {context["mood_state"]}
"""
# 根据聊天类型构建任务和情境
if chat_type == "private":
@@ -359,7 +364,7 @@ class ProactiveThinkerExecutor:
# 对话指引
- 你的目标是“破冰”,让对话自然地开始。
- 你应该围绕这个话题展开: {topic}
- 你的语气应该符合你的人设,友好且真诚。
- 你的语气应该符合你的人设和你当前的心情({context["mood_state"]}),友好且真诚。
"""
else: # wake_up
return f"""
@@ -383,7 +388,7 @@ class ProactiveThinkerExecutor:
# 对话指引
- 你决定和Ta聊聊关于“{topic}”的话题。
- 请结合以上所有情境信息,自然地开启对话。
- 你的语气应该符合你的人设以及你对Ta的好感度。
- 你的语气应该符合你的人设({context["mood_state"]})以及你对Ta的好感度。
"""
def _build_group_plan_prompt(self, context: dict[str, Any], topic: str, reason: str) -> str:
@@ -408,6 +413,7 @@ class ProactiveThinkerExecutor:
# 情境分析
1. **你的日程**:
你当前的心情({context["mood_state"]}
{context["schedule_context"]}
2. **群聊信息**:
- 群名称: {group_info["group_name"]}
@@ -418,8 +424,9 @@ class ProactiveThinkerExecutor:
# 对话指引
- 你决定和大家聊聊关于“{topic}”的话题。
- 你的语气应该更活泼、更具包容性,以吸引更多群成员参与讨论。
- 你的语气应该更活泼、更具包容性,以吸引更多群成员参与讨论。你的语气应该符合你的人设)。
- 请结合以上所有情境信息,自然地开启对话。
- 可以分享你的看法、提出相关问题,或者开个合适的玩笑。
"""
def _build_plan_prompt(self, context: dict[str, Any], start_mode: str, topic: str, reason: str) -> str:
@@ -453,8 +460,17 @@ class ProactiveThinkerExecutor:
prompt += self._build_group_plan_prompt(context, topic, reason)
# 3. 添加通用结尾
prompt += "\n- 直接输出你要说的第一句话,不要包含任何额外的前缀或解释。"
final_instructions = """
# 输出要求
- **简洁**: 不要输出任何多余内容如前缀、后缀、冒号、引号、at/@等)。
- **原创**: 不要重复之前的内容,即使意思相近也不行。
- **直接**: 只输出最终的回复文本本身。
- **风格**: 回复需简短、完整且口语化。
现在,你说:"""
prompt += final_instructions
if global_config.debug.show_prompt:
logger.info(f"主动思考回复器原始提示词:{prompt}")
return prompt
return prompt