From cf5b2b581154d25c9d6f008eb7607f98221747c8 Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Sun, 2 Nov 2025 09:33:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(replyer):=20=E4=BC=98=E5=8C=96=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E5=99=A8=E6=8F=90=E7=A4=BA=E8=AF=8D=E4=BB=A5=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=88=B3=E4=B8=80=E6=88=B3=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - **问题现象:** 回复模型(Replyer)在接收到“戳一戳”事件时,会错误地生成如“[戳了戳]”之类的文本回复,而不是交由动作执行器(Planner)处理`poke_user`动作。 - **根本原因:** 1. 回复提示词模板中没有明确禁止输出此类文本,导致模型将其视为普通消息进行模仿。 2. 模板中关于“可用动作”的描述不够明确,可能让回复模型误以为自己需要处理或决定这些动作。 - **解决方案:** 1. **增强指令:** 在所有核心回复模板 (`default_expressor_prompt`, `s4u_style_prompt`, `normal_style_prompt`) 中,明确增加了“‘戳一戳’不是文本消息,而是由`poke_user`动作处理的特殊互动,因此绝对禁止在回复中输出相关文字”的规则。 2. **明确职责:** 修改了 `build_prompt_reply_context` 方法中生成`action_descriptions`的逻辑,向回复模型强调其职责仅是生成回复文本,而动作的决策与执行由独立的模型负责,严禁其在回复中模仿或调用动作。 - **影响:** - 修复了“戳一戳”互动被错误处理为文本回复的BUG。 - 增强了提示词的鲁棒性,明确了回复模型与决策模型之间的职责边界,降低了未来类似问题的发生概率。 --- src/chat/replyer/default_generator.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index c76af925f..8b76e7a71 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -72,7 +72,7 @@ def init_prompt(): 不要浮夸,不要夸张修辞,平淡且不要输出多余内容(包括前后缀,冒号和引号,括号,表情包,at或 @等 ),只输出一条回复就好。 **【重要】不要在回复中输出任何格式化标记**: -- 不要输出类似 [表情包:xxx]、[图片:xxx]、[回复:xxx] 这样的格式 +- 不要输出类似 [表情包:xxx]、[图片:xxx]、[回复:xxx] 这样的格式。**特别注意**:“戳一戳”不是文本消息,而是由`poke_user`动作处理的特殊互动,因此绝对禁止在回复中输出“[戳了戳]”或“[poke]”这样的文字。 - 如果想表达笑的情绪,直接说"哈哈"、"笑死"等,不要说"[表情包:笑哭]" - 如果想提到某人,直接说"你"、或者他的名字,不要说"[回复<某人>]" - 说什么就直接输出什么,不要加任何格式化标记 @@ -145,7 +145,7 @@ def init_prompt(): 请注意不要输出多余内容(包括前后缀,冒号和引号,at或 @等 )。只输出回复内容。 **【重要】不要在回复中输出任何格式化标记**: -- 不要输出类似 [表情包:xxx]、[图片:xxx]、[回复:xxx] 这样的格式 +- 不要输出类似 [表情包:xxx]、[图片:xxx]、[回复:xxx] 这样的格式。**特别注意**:“戳一戳”不是文本消息,而是由`poke_user`动作处理的特殊互动,因此绝对禁止在回复中输出“[戳了戳]”或“[poke]”这样的文字。 - 如果想表达笑的情绪,直接说"哈哈"、"笑死"等,不要说"[表情包:笑哭]" - 如果想提到某人,直接说"你"、"他",不要说"[回复<某人>]" - 说什么就直接输出什么,不要加任何标记或括号 @@ -218,7 +218,7 @@ If you need to use the search tool, please directly call the function "lpmm_sear 请注意不要输出多余内容(包括前后缀,冒号和引号,at或 @等 )。只输出回复内容。 **【重要】不要在回复中输出任何格式化标记**: -- 不要输出类似 [表情包:xxx]、[图片:xxx]、[回复:xxx] 这样的格式 +- 不要输出类似 [表情包:xxx]、[图片:xxx]、[回复:xxx] 这样的格式。**特别注意**:“戳一戳”不是文本消息,而是由`poke_user`动作处理的特殊互动,因此绝对禁止在回复中输出“[戳了戳]”或“[poke]”这样的文字。 - 如果想表达笑的情绪,直接说"哈哈"、"笑死"等,不要说"[表情包:笑哭]" - 如果想提到某人,直接说"你"、"他",不要说"[回复<某人>]" - 说什么就直接输出什么,不要加任何标记或括号 @@ -1273,7 +1273,7 @@ class DefaultReplyer: # 构建action描述 (如果启用planner) action_descriptions = "" if available_actions: - action_descriptions = "你有以下的动作能力,但执行这些动作不由你决定,由另外一个模型同步决定,因此你只需要知道有如下能力即可:\n" + action_descriptions = "以下是系统中可用的动作列表。**【重要】**这些动作将由一个独立的决策模型决定是否执行,**并非你的职责**。你只需要了解这些能力的存在,以便更好地理解对话情景,**严禁**在你的回复中模仿、调用或提及这些动作本身。\n" for action_name, action_info in available_actions.items(): action_description = action_info.description action_descriptions += f"- {action_name}: {action_description}\n"