feat(affinity_flow_chatter): 优化动作提示词,为 LLM 提供完整 JSON 范例

为了提升语言模型在选择和执行动作时的稳定性和格式准确性,对动作提示词的生成方式进行了重构。

旧的实现仅提供动作和参数的文本描述,这使得模型在生成动作 JSON 时容易出错。

新的实现为每个可用动作动态构建一个完整的 JSON 使用范例,包含 `action_type`、附带示例值的参数和 `reason` 字段。这种更明确的格式指导旨在显著降低模型输出格式错误的风险。
This commit is contained in:
tt-P607
2025-09-24 03:17:11 +08:00
parent ce7d0dead4
commit d666773f1f
2 changed files with 70 additions and 9 deletions

View File

@@ -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

View File

@@ -66,6 +66,9 @@ def init_prompts():
* **使用昵称**: 在你的思绪流中,请直接使用用户的昵称来指代他们,而不是`<m1>`, `<m2>`这样的消息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()