From d666773f1f517c4f3ec5b4bd4892fd6e0d69e56a Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Wed, 24 Sep 2025 03:17:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(affinity=5Fflow=5Fchatter):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=8A=A8=E4=BD=9C=E6=8F=90=E7=A4=BA=E8=AF=8D=EF=BC=8C?= =?UTF-8?q?=E4=B8=BA=20LLM=20=E6=8F=90=E4=BE=9B=E5=AE=8C=E6=95=B4=20JSON?= =?UTF-8?q?=20=E8=8C=83=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为了提升语言模型在选择和执行动作时的稳定性和格式准确性,对动作提示词的生成方式进行了重构。 旧的实现仅提供动作和参数的文本描述,这使得模型在生成动作 JSON 时容易出错。 新的实现为每个可用动作动态构建一个完整的 JSON 使用范例,包含 `action_type`、附带示例值的参数和 `reason` 字段。这种更明确的格式指导旨在显著降低模型输出格式错误的风险。 --- .../affinity_flow_chatter/plan_filter.py | 60 ++++++++++++++++--- .../affinity_flow_chatter/planner_prompts.py | 19 ++++++ 2 files changed, 70 insertions(+), 9 deletions(-) diff --git a/src/plugins/built_in/affinity_flow_chatter/plan_filter.py b/src/plugins/built_in/affinity_flow_chatter/plan_filter.py index eef8089a0..c05cc1372 100644 --- a/src/plugins/built_in/affinity_flow_chatter/plan_filter.py +++ b/src/plugins/built_in/affinity_flow_chatter/plan_filter.py @@ -531,18 +531,60 @@ class ChatterPlanFilter: async def _build_action_options(self, current_available_actions: Dict[str, ActionInfo]) -> str: action_options_block = "" for action_name, action_info in current_available_actions.items(): - param_text = "" + # 构建参数的JSON示例 + params_json_list = [] if action_info.action_parameters: - param_text = "\n" + "\n".join( - f' "{p_name}":"{p_desc}"' for p_name, p_desc in action_info.action_parameters.items() - ) - require_text = "\n".join(f"- {req}" for req in action_info.action_require) - using_action_prompt = await global_prompt_manager.get_prompt_async("action_prompt") + for p_name, p_desc in action_info.action_parameters.items(): + # 为参数描述添加一个通用示例值 + example_value = f"<{p_desc}>" + params_json_list.append(f' "{p_name}": "{example_value}"') + + # 基础动作信息 + action_description = action_info.description + action_require = "\n".join(f"- {req}" for req in action_info.action_require) + + # 构建完整的JSON使用范例 + json_example_lines = [ + " {", + f' "action_type": "{action_name}"', + ] + # 将参数列表合并到JSON示例中 + if params_json_list: + # 移除最后一行的逗号 + json_example_lines.extend([line.rstrip(',') for line in params_json_list]) + + json_example_lines.append(' "reason": "<执行该动作的详细原因>"') + json_example_lines.append(" }") + + # 使用逗号连接内部元素,除了最后一个 + json_parts = [] + for i, line in enumerate(json_example_lines): + # "{" 和 "}" 不需要逗号 + if line.strip() in ["{", "}"]: + json_parts.append(line) + continue + + # 检查是否是最后一个需要逗号的元素 + is_last_item = True + for next_line in json_example_lines[i+1:]: + if next_line.strip() not in ["}"]: + is_last_item = False + break + + if not is_last_item: + json_parts.append(f"{line},") + else: + json_parts.append(line) + + json_example = "\n".join(json_parts) + + # 使用新的、更详细的action_prompt模板 + using_action_prompt = await global_prompt_manager.get_prompt_async("action_prompt_with_example") action_options_block += using_action_prompt.format( action_name=action_name, - action_description=action_info.description, - action_parameters=param_text, - action_require=require_text, + action_description=action_description, + action_require=action_require, + json_example=json_example, ) return action_options_block diff --git a/src/plugins/built_in/affinity_flow_chatter/planner_prompts.py b/src/plugins/built_in/affinity_flow_chatter/planner_prompts.py index 8556697f2..f660f1cd0 100644 --- a/src/plugins/built_in/affinity_flow_chatter/planner_prompts.py +++ b/src/plugins/built_in/affinity_flow_chatter/planner_prompts.py @@ -66,6 +66,9 @@ def init_prompts(): * **使用昵称**: 在你的思绪流中,请直接使用用户的昵称来指代他们,而不是``, ``这样的消息ID。 * **严禁技术术语**: 严禁在思考中提及任何数字化的度量(如兴趣度、分数)或内部技术术语。请完全使用角色自身的感受和语言来描述思考过程。 +## 可用动作列表 +{action_options_text} + ```json {{ "thinking": "在这里写下你的思绪流...", @@ -264,6 +267,22 @@ def init_prompts(): "action_prompt", ) + # 带有完整JSON示例的动作提示词模板 + Prompt( + """ +动作: {action_name} +动作描述: {action_description} +动作使用场景: +{action_require} + +你应该像这样使用它: +{{ +{json_example} +}} +""", + "action_prompt_with_example", + ) + # 确保提示词在模块加载时初始化 init_prompts()