优化私聊PFC的prompt构建

大大缩减的planner的prompt,细化了checker和聊天的prompt,无代码层面改动,私聊交互更加自然
pull/849/head
114514 2025-04-25 21:38:53 +08:00
parent b7938f016f
commit 02cbe6e413
3 changed files with 14 additions and 19 deletions

View File

@ -244,7 +244,7 @@ class ActionPlanner:
last_action_context += f"- 该行动当前状态: {status}\n"
# --- 构建最终的 Prompt ---
prompt = f"""{persona_text}。现在你在参与一场QQ,请根据以下【所有信息】审慎决策下一步行动,可以发言,可以等待,可以倾听,可以调取知识:
prompt = f"""{persona_text}。现在你在参与一场QQ聊,请根据以下【所有信息】审慎且灵活的决策下一步行动,可以发言,可以等待,可以倾听,可以调取知识:
当前对话目标
{goals_str if goals_str.strip() else "- 目前没有明确对话目标,请考虑设定一个。"}
@ -259,24 +259,19 @@ class ActionPlanner:
最近的对话记录(包括你已成功发送的消息 新收到的消息)
{chat_history_text if chat_history_text.strip() else "还没有聊天记录。"}
--- 行动决策指南 ---
1. **仔细分析上一次行动的详细情况和结果**如果上次行动是 direct_reply 且因内容与你上一条发言完全相同高度相似而被取消(status: recall)那么绝对不要立即再次规划 direct_reply在这种特定情况下你应该优先考虑 wait (等待用户的新回应) rethink_goal (如果对话似乎因此卡住了)
2. 结合当前对话目标最近的对话记录来判断是否需要回应回应什么如果最近的对话记录中有新的用户消息通常需要 direct_reply如果上次行动成功或者上次失败的原因不是重复可以根据对话内容考虑 direct_reply
3. 注意时间和超时提示如果对方长时间未回复例如在 timeout_context 中提示end_conversation 可能更合适
4. 只有在你确信需要发言比如回应新消息追问深入话题并且上一次行动没有因重复被拒时才应优先选择 direct_reply
--- 可选行动类型 ---
fetch_knowledge: 需要调取知识当需要专业知识或特定信息时选择
wait: 等待对方回复尤其是在你刚发言后或上次发言因重复被拒时或不确定做什么时这是较安全的选择
listening: 倾听对方发言当你认为对方发言尚未结束时采用
direct_reply: 直接回复或发送新消息允许适当的追问和深入话题**但是请务必遵守上面的决策指南避免在因重复被拒后立即使用也不要在对方没有回复的情况下过多的消息轰炸或重复发言**
------
可选行动类型以及解释
etch_knowledge: 需要调取知识当需要专业知识或特定信息时选择对方若提到你太认识的人名或实体也可以尝试
wait: 暂时不说话等待对方回复尤其是在你刚发言后或上次发言因重复发言过多被拒时或不确定做什么时这是较安全的选择
listening: 倾听对方发言当你认为对方话才说到一半发言明显未结束时采用
direct_reply: 直接回复或发送新消息允许适当的追问和深入话题**但是避免在因重复被拒后立即使用也不要在对方没有回复的情况下过多的消息轰炸或重复发言**
rethink_goal: 重新思考对话目标当发现对话目标不再适用或对话卡住时选择注意私聊的环境是灵活的有可能需要经常选择
end_conversation: 决定结束对话对方长时间没回复或者当你觉得谈话暂时结束时可以选择
end_conversation: 结束对话对方长时间没回复或者当你觉得对话告一段落时可以选择
请以JSON格式输出你的决策
{{
"action": "选择的行动类型 (必须是上面列表中的一个)",
"reason": "选择该行动的详细原因 (必须解释你是如何根据“上一次行动结果”、“对话记录”和“决策指南”做出判断的)"
"reason": "选择该行动的详细原因 (必须解释你是如何根据“上一次行动结果”、“对话记录”和自身设定人设做出合理判断的,如果你连续发言,必须记录已经发言了几次)"
}}
注意请严格按照JSON格式输出不要包含任何其他内容"""

View File

@ -105,11 +105,11 @@ class ReplyChecker:
4. 回复是否包含违规内容例如血腥暴力政治敏感等
5. 回复是否以你的角度发言,不要把""说的话当做对方说的话这是你自己说的话不要自己回复自己的消息
6. 回复是否通俗易懂
7. 回复是否有些多余例如在对方没有回复的情况下依然连续多次消息轰炸
7. 回复是否有些多余例如在对方没有回复的情况下依然连续多次消息轰炸尤其是已经连续发送3条信息的情况这很可能不合理需要着重判断
8. 回复是否使用了完全没必要的修辞
9. 回复是否逻辑通顺
10. 回复是否太过冗长了通常私聊的每条消息长度在20字以内除非特殊情况
11. 在连续多次发送消息的情况下当前回复是否衔接自然会不会显得奇怪
11. 在连续多次发送消息的情况下当前回复是否衔接自然会不会显得奇怪例如连续两条消息中部分内容重叠
请以JSON格式输出包含以下字段
1. suitable: 是否合适 (true/false)

View File

@ -130,7 +130,7 @@ class ReplyGenerator:
elif action_status == "done":
action_history_text += f"你之前做了:{action_type},原因:{action_reason}\n"
prompt = f"""{persona_text}。现在你在参与一场QQ,请根据以下信息生成一条新消息:
prompt = f"""{persona_text}。现在你在参与一场QQ聊,请根据以下信息生成一条新消息:
当前对话目标{goals_str}
最近的聊天记录
@ -140,15 +140,15 @@ class ReplyGenerator:
请根据上述信息结合聊天记录发一条消息可以是回复补充深入话题或追问等等该消息应该
1. 符合对话目标""的角度发言不要自己与自己对话
2. 符合你的性格特征和身份细节
3. 自然流畅像正常聊天一样简短通常20字以内除非特殊情况
3. 通俗易懂自然流畅像正常聊天一样简短通常20字以内除非特殊情况
4. 适当利用相关知识但不要生硬引用
5. 自然得体结合聊天记录逻辑合理且没有重复表达同质内容
**注意如果聊天记录中最新的消息是你自己发送的那么你的思路不应该是回复而是应该紧紧衔接你发送的消息进行话题的深入补充或追问等等**
请注意把握聊天内容不要回复的太有条理可以有个性请分清""和对方说的话不要把""说的话当做对方说的话这是你自己说的话
可以回复得自然随意自然一些就像真人一样注意把握聊天内容整体风格可以平和简短不要刻意突出自身学科背景不要说你说过的话可以简短多简短都可以但是避免冗长
请你注意不要输出多余内容(包括前后缀冒号和引号括号表情等)只输出回复内容
不要输出多余内容(包括前后缀冒号和引号括号表情包at或 @等 )
**注意如果聊天记录中最新的消息是你自己发送的那么你的思路不应该是回复而是应该紧紧衔接你发送的消息进行话题的深入补充或追问等等避免与最新消息内容重叠**
请直接输出回复内容不需要任何额外格式"""