跳到主要内容

PROMPT9. 健身动作解析

提示词工程题 · 答案是一段提示词(Prompt),由大模型评测,不含可运行代码。

题目描述​

给定一段非结构化的健身训练文本,根据以下规则提取信息并输出 JSON:

  1. 动作名称映射:将文本中的动作映射为标准枚举值 —— 「卧推 / 平板卧推 / Bench Press」→ BENCH_PRESS;「上斜 / 上胸」→ INCLINE_PRESS; 「深蹲 / 蹲腿 / Squat」→ SQUAT;「硬拉 / 拉背 / Deadlift」→ DEADLIFT; 「推举 / 肩推」→ OHP;其它 → OTHER。
  2. 组数与次数:出现「AxB」格式(如「5x5」)时,组数 Sets = A、次数 Reps = B。
  3. 重量归一化:目标单位为千克(kg)。出现「磅 / lbs」时除以 2.2; 出现「一边20kg」这类单边重量时,重量 = 单边重量 × 2 + 20(默认空杆 20kg)。
  4. 容量计算:训练容量 = 重量(kg) × 组数 × 次数。
  5. 多动作处理:文本包含多个动作时分别解析,输出多条记录。

输入格式​

一段自然语言描述的健身训练文本。

输出格式​

{
"exercises": [
{
"name": "ENUM",
"data": {"weight_kg": "float,一位小数", "sets": "int", "reps": "int"},
"volume_calc": "float,容量计算"
}
]
}

示例​

示例 1​

输入:

今天练胸,平板卧推 100kg 5x5,感觉状态不错。

输出:

{"exercises":[{"name":"BENCH_PRESS","data":{"weight_kg":100.0,"sets":5,"reps":5},"volume_calc":2500.0}]}

说明: 「平板卧推」映射为 BENCH_PRESS;「5x5」得组数 5、次数 5; 重量 100kg 无需换算;容量 = 100 × 5 × 5 = 2500.0。


提示词方案​

你是健身训练数据解析助手。请把一段非结构化的训练文本解析成 JSON。

# 动作名称映射(必须以枚举值输出)
- 「卧推」「平板卧推」「Bench Press」 → BENCH_PRESS
- 「上斜」「上胸」 → INCLINE_PRESS
- 「深蹲」「蹲腿」「Squat」 → SQUAT
- 「硬拉」「拉背」「Deadlift」 → DEADLIFT
- 「推举」「肩推」 → OHP
- 其它动作 → OTHER

# 解析规则
1. 组数×次数:文本中出现「AxB」格式(如「5x5」)时,sets=A、reps=B。
2. 重量统一成千克(kg):
- 出现「lbs」或「磅」时,除以 2.2 换算成 kg。
- 出现「一边20kg」这类单边重量时,weight_kg = 单边重量 × 2 + 20(默认空杆 20kg)。
3. 容量 volume_calc = weight_kg × sets × reps。
4. 文本包含多个动作时,逐个解析,按出现顺序放进 exercises 数组。

# 输出格式(严格 JSON,不要代码块,不要解释)
{"exercises":[{"name":"ENUM","data":{"weight_kg":float,"sets":int,"reps":int},"volume_calc":float}]}
weight_kg 与 volume_calc 保留一位小数(例如 100 输出 100.0)。

# 输入
{{input}}

设计思路​

第一步:枚举映射表要「穷举 + 兜底」​

动作名称是自由文本,模型不可能猜准映射,所以要把规则里给出的 同义词原样抄进提示词,并明确要求「其它一律 OTHER」作为兜底, 避免模型自创枚举值。

第二步:把「多来源数字」算成统一单位​

这题的计算有三处容易错:

  1. 单位换算:磅要除以 2.2;
  2. 单边重量的语义:一边20kg 指的是「左右各 20kg 的配重」, 还要算上空杆,所以是 20 × 2 + 20 = 60kg,不能直接把 20 当总重量;
  3. 容量公式:weight × sets × reps,要按计算后的 kg 去乘。

提示词必须把这三步逐条写清楚,因为它们是领域知识,模型不会自明。

第三步:约束数值格式​

weight_kg 要求「一位小数」,示例里 100 要写成 100.0。 这是 JSON 与 Python 的表示差异,必须显式规定, 否则模型很可能输出整数 100 导致判分失败。

第四步:多动作用数组承接​

规定 exercises 是数组、按出现顺序排列, 让「一个动作一条记录」这件事有确定的落地方式。


易错点总结​

1. 单边重量直接当总重量​

一边20kg 是单边配重,总重量 = 20×2 + 20(空杆)。漏掉空杆会算错。

2. 忘了一位小数​

要求 100.0 却输出 100,评测会判格式不符。

3. 动作没映射或映射错​

必须严格用题目给的枚举,BENCH_PRESS 不能写成 bench_press。

4. 多动作只输出第一条​

文本里可能一次练了好几个动作,要全部解析进数组。


扩展思考​

  • 可以扩展映射表覆盖更多动作(如「划船」→ ROW),思路不变。
  • 若文本里出现「热身组」,可增加一个 is_warmup 字段,先定契约再给例子。

相关题目​

加载评论中...