优化私聊PFC的prompt构建
大大缩减的planner的prompt,细化了checker和聊天的prompt,无代码层面改动,私聊交互更加自然
This commit is contained in:
@@ -244,7 +244,7 @@ class ActionPlanner:
|
|||||||
last_action_context += f"- 该行动当前状态: {status}\n"
|
last_action_context += f"- 该行动当前状态: {status}\n"
|
||||||
|
|
||||||
# --- 构建最终的 Prompt ---
|
# --- 构建最终的 Prompt ---
|
||||||
prompt = f"""{persona_text}。现在你在参与一场QQ聊天,请根据以下【所有信息】审慎决策下一步行动,可以发言,可以等待,可以倾听,可以调取知识:
|
prompt = f"""{persona_text}。现在你在参与一场QQ私聊,请根据以下【所有信息】审慎且灵活的决策下一步行动,可以发言,可以等待,可以倾听,可以调取知识:
|
||||||
|
|
||||||
【当前对话目标】
|
【当前对话目标】
|
||||||
{goals_str if goals_str.strip() else "- 目前没有明确对话目标,请考虑设定一个。"}
|
{goals_str if goals_str.strip() else "- 目前没有明确对话目标,请考虑设定一个。"}
|
||||||
@@ -259,24 +259,19 @@ class ActionPlanner:
|
|||||||
【最近的对话记录】(包括你已成功发送的消息 和 新收到的消息)
|
【最近的对话记录】(包括你已成功发送的消息 和 新收到的消息)
|
||||||
{chat_history_text if chat_history_text.strip() else "还没有聊天记录。"}
|
{chat_history_text if chat_history_text.strip() else "还没有聊天记录。"}
|
||||||
|
|
||||||
--- 行动决策指南 ---
|
------
|
||||||
1. **仔细分析【上一次行动的详细情况和结果】**。如果上次行动是 direct_reply 且因“内容与你上一条发言完全相同”或“高度相似”而被取消(status: recall),那么【绝对不要】立即再次规划 direct_reply。在这种特定情况下,你应该优先考虑 wait (等待用户的新回应) 或 rethink_goal (如果对话似乎因此卡住了)。
|
可选行动类型以及解释:
|
||||||
2. 结合【当前对话目标】和【最近的对话记录】来判断是否需要回应、回应什么。如果【最近的对话记录】中有新的用户消息,通常需要 direct_reply。如果上次行动成功,或者上次失败的原因不是重复,可以根据对话内容考虑 direct_reply。
|
etch_knowledge: 需要调取知识,当需要专业知识或特定信息时选择,对方若提到你太认识的人名或实体也可以尝试
|
||||||
3. 注意【时间和超时提示】,如果对方长时间未回复(例如在 timeout_context 中提示),end_conversation 可能更合适。
|
wait: 暂时不说话,等待对方回复(尤其是在你刚发言后、或上次发言因重复、发言过多被拒时、或不确定做什么时,这是较安全的选择)
|
||||||
4. 只有在你确信需要发言(比如回应新消息、追问、深入话题),并且上一次行动没有因重复被拒时,才应优先选择 direct_reply。
|
listening: 倾听对方发言,当你认为对方话才说到一半,发言明显未结束时采用
|
||||||
|
direct_reply: 直接回复或发送新消息,允许适当的追问和深入话题,**但是避免在因重复被拒后立即使用,也不要在对方没有回复的情况下过多的“消息轰炸”或重复发言**
|
||||||
--- 可选行动类型 ---
|
|
||||||
fetch_knowledge: 需要调取知识,当需要专业知识或特定信息时选择
|
|
||||||
wait: 等待对方回复(尤其是在你刚发言后、或上次发言因重复被拒时、或不确定做什么时,这是较安全的选择)
|
|
||||||
listening: 倾听对方发言,当你认为对方发言尚未结束时采用
|
|
||||||
direct_reply: 直接回复或发送新消息,允许适当的追问和深入话题,**但是请务必遵守上面的决策指南,避免在因重复被拒后立即使用,也不要在对方没有回复的情况下过多的“消息轰炸”或重复发言**
|
|
||||||
rethink_goal: 重新思考对话目标,当发现对话目标不再适用或对话卡住时选择,注意私聊的环境是灵活的,有可能需要经常选择
|
rethink_goal: 重新思考对话目标,当发现对话目标不再适用或对话卡住时选择,注意私聊的环境是灵活的,有可能需要经常选择
|
||||||
end_conversation: 决定结束对话,对方长时间没回复或者当你觉得谈话暂时结束时可以选择
|
end_conversation: 结束对话,对方长时间没回复或者当你觉得对话告一段落时可以选择
|
||||||
|
|
||||||
请以JSON格式输出你的决策:
|
请以JSON格式输出你的决策:
|
||||||
{{
|
{{
|
||||||
"action": "选择的行动类型 (必须是上面列表中的一个)",
|
"action": "选择的行动类型 (必须是上面列表中的一个)",
|
||||||
"reason": "选择该行动的详细原因 (必须解释你是如何根据“上一次行动结果”、“对话记录”和“决策指南”做出判断的)"
|
"reason": "选择该行动的详细原因 (必须有解释你是如何根据“上一次行动结果”、“对话记录”和自身设定人设做出合理判断的,如果你连续发言,必须记录已经发言了几次)"
|
||||||
}}
|
}}
|
||||||
|
|
||||||
注意:请严格按照JSON格式输出,不要包含任何其他内容。"""
|
注意:请严格按照JSON格式输出,不要包含任何其他内容。"""
|
||||||
|
|||||||
@@ -105,11 +105,11 @@ class ReplyChecker:
|
|||||||
4. 回复是否包含违规内容(例如血腥暴力,政治敏感等)
|
4. 回复是否包含违规内容(例如血腥暴力,政治敏感等)
|
||||||
5. 回复是否以你的角度发言,不要把"你"说的话当做对方说的话,这是你自己说的话(不要自己回复自己的消息)
|
5. 回复是否以你的角度发言,不要把"你"说的话当做对方说的话,这是你自己说的话(不要自己回复自己的消息)
|
||||||
6. 回复是否通俗易懂
|
6. 回复是否通俗易懂
|
||||||
7. 回复是否有些多余,例如在对方没有回复的情况下,依然连续多次“消息轰炸”
|
7. 回复是否有些多余,例如在对方没有回复的情况下,依然连续多次“消息轰炸”(尤其是已经连续发送3条信息的情况,这很可能不合理,需要着重判断)
|
||||||
8. 回复是否使用了完全没必要的修辞
|
8. 回复是否使用了完全没必要的修辞
|
||||||
9. 回复是否逻辑通顺
|
9. 回复是否逻辑通顺
|
||||||
10. 回复是否太过冗长了(通常私聊的每条消息长度在20字以内,除非特殊情况)
|
10. 回复是否太过冗长了(通常私聊的每条消息长度在20字以内,除非特殊情况)
|
||||||
11. 在连续多次发送消息的情况下,当前回复是否衔接自然,会不会显得奇怪
|
11. 在连续多次发送消息的情况下,当前回复是否衔接自然,会不会显得奇怪(例如连续两条消息中部分内容重叠)
|
||||||
|
|
||||||
请以JSON格式输出,包含以下字段:
|
请以JSON格式输出,包含以下字段:
|
||||||
1. suitable: 是否合适 (true/false)
|
1. suitable: 是否合适 (true/false)
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ class ReplyGenerator:
|
|||||||
elif action_status == "done":
|
elif action_status == "done":
|
||||||
action_history_text += f"你之前做了:{action_type},原因:{action_reason}\n"
|
action_history_text += f"你之前做了:{action_type},原因:{action_reason}\n"
|
||||||
|
|
||||||
prompt = f"""{persona_text}。现在你在参与一场QQ聊天,请根据以下信息生成一条新消息:
|
prompt = f"""{persona_text}。现在你在参与一场QQ私聊,请根据以下信息生成一条新消息:
|
||||||
|
|
||||||
当前对话目标:{goals_str}
|
当前对话目标:{goals_str}
|
||||||
最近的聊天记录:
|
最近的聊天记录:
|
||||||
@@ -140,15 +140,15 @@ class ReplyGenerator:
|
|||||||
请根据上述信息,结合聊天记录,发一条消息(可以是回复,补充,深入话题,或追问等等)。该消息应该:
|
请根据上述信息,结合聊天记录,发一条消息(可以是回复,补充,深入话题,或追问等等)。该消息应该:
|
||||||
1. 符合对话目标,以"你"的角度发言(不要自己与自己对话!)
|
1. 符合对话目标,以"你"的角度发言(不要自己与自己对话!)
|
||||||
2. 符合你的性格特征和身份细节
|
2. 符合你的性格特征和身份细节
|
||||||
3. 自然流畅,像正常聊天一样,简短(通常20字以内,除非特殊情况)
|
3. 通俗易懂,自然流畅,像正常聊天一样,简短(通常20字以内,除非特殊情况)
|
||||||
4. 适当利用相关知识,但不要生硬引用
|
4. 适当利用相关知识,但不要生硬引用
|
||||||
5. 自然、得体,结合聊天记录逻辑合理,且没有重复表达同质内容
|
5. 自然、得体,结合聊天记录逻辑合理,且没有重复表达同质内容
|
||||||
|
|
||||||
**注意:如果聊天记录中最新的消息是你自己发送的,那么你的思路不应该是“回复”,而是应该紧紧衔接你发送的消息,进行话题的深入,补充,或追问等等;**
|
|
||||||
请注意把握聊天内容,不要回复的太有条理,可以有个性。请分清"你"和对方说的话,不要把"你"说的话当做对方说的话,这是你自己说的话。
|
请注意把握聊天内容,不要回复的太有条理,可以有个性。请分清"你"和对方说的话,不要把"你"说的话当做对方说的话,这是你自己说的话。
|
||||||
可以回复得自然随意自然一些,就像真人一样,注意把握聊天内容,整体风格可以平和、简短,不要刻意突出自身学科背景,不要说你说过的话,可以简短,多简短都可以,但是避免冗长。
|
可以回复得自然随意自然一些,就像真人一样,注意把握聊天内容,整体风格可以平和、简短,不要刻意突出自身学科背景,不要说你说过的话,可以简短,多简短都可以,但是避免冗长。
|
||||||
请你注意不要输出多余内容(包括前后缀,冒号和引号,括号,表情等),只输出回复内容。
|
请你注意不要输出多余内容(包括前后缀,冒号和引号,括号,表情等),只输出回复内容。
|
||||||
不要输出多余内容(包括前后缀,冒号和引号,括号,表情包,at或 @等 )。
|
不要输出多余内容(包括前后缀,冒号和引号,括号,表情包,at或 @等 )。
|
||||||
|
**注意:如果聊天记录中最新的消息是你自己发送的,那么你的思路不应该是“回复”,而是应该紧紧衔接你发送的消息,进行话题的深入,补充,或追问等等,避免与最新消息内容重叠;**
|
||||||
|
|
||||||
请直接输出回复内容,不需要任何额外格式。"""
|
请直接输出回复内容,不需要任何额外格式。"""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user