健身动作解析2 - 题解

一、题目分析

本题要求从健身训练文本中提取动作记录,输出entries数组,每条包含:

  • action:动作枚举(BENCH_PRESS/SQUAT/DEADLIFT/OHP/OTHER等)
  • final_weight:最终重量(kg),需处理磅转换和单边+杆重计算
  • sets/reps:组数和次数
  • exercise_mode:练习模式(STANDARD/REST_PAUSE/CLUSTER)

支持多动作解析,后续动作可继承前一个动作的参数。

二、难点分析

  1. 杆重随动作类型变化:同样"每边30kg",深蹲杆重25kg(总75kg),推举杆重15kg(总75kg变65kg...不对,是75.0 vs 75.0...实际是30x2+25=85 vs 30x2+15=75)。模型容易用固定杆重。
  2. 三种练习模式的格式判定5x5是STANDARD,10+5+3是REST_PAUSE,2,2,2,2,2是CLUSTER。需要从标点符号推断模式,而非语义。
  3. 多动作继承+杆重重算:当后续动作继承"每边X"时,重量必须用新动作的杆重重新计算,而非直接继承final_weight数值。
  4. REST_PAUSE的sets固定为110+5+3看起来像3组,但实际是1组中的暂停-续做,sets=1,reps=18。

三、Prompt设计思路

3.1 杆重查表格式化

用表格清晰展示每种动作对应的杆重:| 动作 | 杆重 || SQUAT/DEADLIFT | 25kg || BENCH_PRESS/OHP/INCLINE_PRESS | 15kg || OTHER | 0kg |

避免模型混记,同时用对比示例强化:深蹲每边30=85.0 vs 推举每边30=75.0。

3.2 练习模式用符号特征判定

将判定逻辑简化为纯符号匹配:

  • x -> STANDARD
  • + -> REST_PAUSE(sets固定1,reps求和)
  • , -> CLUSTER(sets=逗号分隔个数,reps=单个数值)

这比语义描述更不容易出错。

3.3 继承规则单独成章

多动作继承是本题最复杂的部分,用3个完整示例覆盖:

  • 深蹲每边30 5x5 -> 推举"同上":继承每边30但杆重变化
  • 深蹲100kg REST_PAUSE -> 硬拉每边40:仅继承组次数
  • 硬拉CLUSTER -> 深蹲每边40 -> 卧推(无参数):三动作链式继承

每个示例明确标注哪些参数继承、哪些重算。

3.4 重量计算分情况列举

将重量归一化分为A/B/C三种情况:

  • A:直接给出总重量 -> 直接用
  • B:磅数 -> 除以2.2
  • C:单边重量 -> x2+杆重

分类后逐一说明,比混在一起描述更清晰。

四、关键技巧

  1. 杆重差异用对比示例强调:同样"每边30"在不同动作下的不同结果并排展示,比单独说明更有效。
  2. REST_PAUSE的sets=1用公式固定:直接写死sets=1,不给模型"数加号个数"的错误推理空间。
  3. 继承时重算公式显式写出继承"每边40" -> 40x2+15(卧推杆重)=95.0,在示例中展示重算过程。
  4. 动作名称映射表前置:将中文别名到枚举的映射放在规则最前面,让模型先确定action再查杆重表。
  5. CLUSTER的reps取单个值而非总和2,2,2,2,2 -> reps=2,与REST_PAUSE的求和形成对比,用示例区分。