大促价格计算引擎 - 题解

一、题目分析

本题要求根据《大促优惠叠加规范 v2.0》计算购物车最终实付金额。规则链路:

  1. [R.5] 秒杀商品隔离(不参与任何折扣,不计入满减门槛)
  2. [R.2] 品类直降(图书 5 折,数码 9 折)
  3. [R.3] 满减券(折后总额 ≥300 减 50,仅一次)
  4. [R.4] VIP 折上折(95 折)
  5. 秒杀商品原价加回
  6. [R.6] 运费(非 VIP 且 <99 元加 6 元,VIP 永远免运费)

输出 total_payment、shipping_fee、applied_discounts 三个字段。

二、难点分析

  1. 秒杀商品的隔离逻辑:秒杀商品不参与品类折扣、不计入满减门槛、不享受 VIP 折扣,但要计入最终总额。这种"免疫但不消失"的逻辑容易出错
  2. 满减门槛判断基准:是折后的普通商品总额,不含秒杀商品,模型容易用原价或含秒杀的总价判断
  3. VIP vs 普通会员:必须是"VIP会员"才打 95 折,"普通会员"不打折,模型容易把普通会员也当 VIP
  4. 运费的双重条件:VIP 永远免运费(无论金额),非 VIP 看最终金额是否 <99
  5. 图书半价的大幅折扣:200 元图书→100 元,容易被模型低估折扣力度

三、Prompt 设计思路

3.1 六步流水线设计

将复杂的多层优惠拆成 6 个清晰步骤,关键创新是把秒杀商品在 Step1 就分离出来,Step4 才加回,形成"分离→计算→合并"的流程。

3.2 秒杀隔离的物理分离

在 Step1 就把商品分为"普通商品"和"秒杀商品"两组,subtotal 只累加普通商品。Step2-Step3 只作用于 subtotal。Step4 才把秒杀原价加回。这种物理分离比在每步检查"是否秒杀"更不容易出错。

3.3 显式标注"普通会员≠VIP"

在多个示例中反复强调"普通会员≠VIP→不打折",直接对抗模型将"普通会员"误认为 VIP 的倾向。

3.4 边界值示例覆盖

  • 图书 198 元→折后 99 元,恰好 ≥99 不收运费
  • 图书 180 元→折后 90 元,<99 收运费 6 元
  • 满减门槛边界:300 元恰好满减
  • 含秒杀的混合购物车

3.5 applied_discounts 规则明确

逐条说明每个规则编号何时列入,特别指出 [R.5] 只在有秒杀商品时列入,[R.6] 始终列入。

四、关键技巧

  1. 思维链引导:要求在 <thinking> 中按步骤计算
  2. 品类扩展识别:图书类扩展为"书/教材/画册/工具书",数码类扩展为"键盘/鼠标/耳机"
  3. 数值强调:用感叹号标注"200元图书→100元!600元图书→300元!",强化半价概念
  4. 满减条件精确化subtotal ≥ 300 → -50< 300 → 不减,用数学不等式而非自然语言
  5. 大量完整计算示例:5 个示例覆盖不同会员类型、不同品类组合、不同金额区间
  6. 输出模板锚定:结尾给出空 JSON 模板统一格式