PROMPT9. 健身动作解析
提示词工程题 · 答案是一段提示词(Prompt),由大模型评测,不含可运行代码。
题目描述
给定一段非结构化的健身训练文本,根据以下规则提取信息并输出 JSON:
- 动作名称映射:将文本中的动作映射为标准枚举值 ——
「卧推 / 平板卧推 / Bench Press」→
BENCH_PRESS;「上斜 / 上胸」→INCLINE_PRESS; 「深蹲 / 蹲腿 / Squat」→SQUAT;「硬拉 / 拉背 / Deadlift」→DEADLIFT; 「推举 / 肩推」→OHP;其它 →OTHER。 - 组数与次数:出现「AxB」格式(如「5x5」)时,组数
Sets = A、次数Reps = B。 - 重量归一化:目标单位为千克(kg)。出现「磅 / lbs」时除以 2.2;
出现「一边20kg」这类单边重量时,
重量 = 单边重量 × 2 + 20(默认空杆 20kg)。 - 容量计算:
训练容量 = 重量(kg) × 组数 × 次数。 - 多动作处理:文本包含多个动作时分别解析,输出多条记录。
输入格式
一段自然语言描述的健身训练文本。
输出格式
{
"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」作为兜底, 避免模型自创枚举值。
第二步:把「多来源数字」算成统一单位
这题的计算有三处容易错:
- 单位换算:磅要除以 2.2;
- 单边重量的语义:
一边20kg指的是「左右各 20kg 的配重」, 还要算上空杆,所以是20 × 2 + 20 = 60kg,不能直接把 20 当总重量; - 容量公式:
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字段,先定契约再给例子。