同城急送定价引擎 - 题解

一、题目分析

本题要求根据闪电送计费规则v4.0,解析用户的自然语言订单描述,计算预估运费。涉及5条规则:距离起步价、超程附加费、重量附加费、高峰期溢价、违禁品管控。输出包含final_price(保留1位小数)和status(NORMAL/SURGE/REJECTED)。

二、难点分析

  1. 高峰溢价的作用范围:高峰期1.5倍仅作用于距离费用(L.1+L.2),重量附加费(L.3)明确不参与翻倍。LLM容易把1.5倍应用到总价上。
  2. 规则优先级:违禁品检查(L.5)优先级最高,需要先判断再计算。如果同时命中违禁品和高峰期,应该直接拒单而非继续计算。
  3. 重量取整方向:超过5kg的部分不足1kg按1kg算(向上取整),例如5.1kg超出0.1kg,按1kg计费收5元。LLM容易按实际值计算。
  4. 高峰时间边界:07:00-09:00和17:00-19:00的边界判定,整点是否包含在内需要LLM准确理解。

三、Prompt设计思路

  1. 角色定位:直接定义为"自动报价引擎",明确系统化处理身份。
  2. 知识库结构化呈现:将5条规则用标签编号(L.1~L.5)呈现,每条规则附带计算公式,如Distance_Fee = 12 + max(0, (Distance - 5) * 2),减少LLM自行推导公式的出错概率。
  3. 显式计算流水线(Calculation Pipeline):按6步顺序强制LLM执行:违禁检查 -> 基础运费 -> 高峰溢价 -> 重量附加 -> 汇总 -> 输出。这是本题最关键的设计——把计算顺序写死,避免LLM跳步或乱序。
  4. 在规则中嵌入易错提醒:L.3处标注"此项费用不参与高峰期翻倍"重量取整用Ceil函数表达:Ceil(Weight - 5)高峰溢价明确只乘Distance_Fee
  5. 思维链字段设计:输出schema中加入final_pricethinking字段,强制LLM先写出思考过程再给出数值,降低计算跳步风险。

四、关键技巧

  • 公式化表达:用伪代码/数学公式替代自然语言描述规则,如Distance_Fee = 12 + max(0, (Distance-5)*2),消除歧义。
  • 流水线式CoT:将计算拆分为有序步骤,每步有明确的输入输出,模型按部就班执行而非自由发挥。
  • 作用域隔离:反复强调重量附加费"不参与"高峰翻倍,通过在多处重复这条约束来强化LLM的注意力。
  • 优先级前置:违禁品检查放在流水线第一步,命中即终止,避免模型浪费token在无效计算上。
  • 输出schema内嵌思考:用thinking字段让模型"边算边写",比纯CoT提示更可控,且最终输出仍是结构化JSON。