前言采购企业订阅包资源包时销售给的通常是一句单价打七折。但折扣不等于省钱——包有有效期用不完的额度就是沉没成本。真正该问的是必须用掉几成才不亏本文带你写一个命令行计算器输入历史用量和报价输出四个结论用完率门槛、买包后悔概率、建议容量、以及是否值得买。全部代码可直接运行无第三方依赖。环境Python 3.9标准库即可。mkdir pack_calc cd pack_calc步骤一写出两种付费方式的成本函数新建cost_model.py。这是整个计算器的基础。def payg_cost(usage: float, unit_price: float) - float: 按量付费线性无沉没成本。 return usage * unit_price def pack_cost(usage: float, pack_price: float, pack_quota: float, overflow_price: float) - float: 订阅包固定费用无条件计入超出部分按量补。 overflow max(0.0, usage - pack_quota) return pack_price overflow * overflow_price注意第二个函数里pack_price是无条件加上的——不管你用了多少这笔钱都花了。这一行是所有选包误判的根源。顺手写一个揭示真相的函数def effective_unit_price(usage: float, pack_price: float, pack_quota: float) - float: 你实际承担的单价随用完率变化。 if usage 0: return float(inf) billed min(usage, pack_quota) return pack_price / billed跑一下就知道差距有多大if __name__ __main__: PRICE, QUOTA 16_000, 1_000_000_000 for rate in (1.0, 0.8, 0.5, 0.3): u QUOTA * rate print(f用完率 {rate:.0%} → 实际单价 f{effective_unit_price(u, PRICE, QUOTA)*1e6:.1f} 元/百万)输出用完率 100% → 实际单价 16.0 元/百万 用完率 80% → 实际单价 20.0 元/百万 用完率 50% → 实际单价 32.0 元/百万 用完率 30% → 实际单价 53.3 元/百万宣传单价 16 元用满一半就变 32 元——比按量付费的 20 元还贵。步骤二算用完率门槛新建breakeven.pydef breakeven_usage(pack_price: float, payg_unit_price: float) - float: 用量超过此值买包总成本才低于纯按量。 return pack_price / payg_unit_price def breakeven_ratio(pack_price: float, pack_quota: float, payg_unit_price: float) - float: 换算成必须用掉的百分比——这才是决策依据。 return breakeven_usage(pack_price, payg_unit_price) / pack_quota代入一组报价PACK_PRICE 16_000 # 订阅包价格元 PACK_QUOTA 1_000_000_000 # 包含额度Token PAYG_UNIT 20 / 1e6 # 按量单价元 / Token ratio breakeven_ratio(PACK_PRICE, PACK_QUOTA, PAYG_UNIT) print(f用完率门槛{ratio:.0%})输出用完率门槛80%。这个 80% 就是第一道筛子。它意味着必须用掉八成以上才不亏不是用得越多越省。折扣越小门槛越高九折包要用到九成几乎没有容错空间。不少采购决策看到这个数就该停下来。步骤三加波动模拟输出后悔概率上面的算法需要一个预期用量。但实际用量是分布拿均值代进去会系统性高估买包收益——因为盈亏不对称用不满的钱直接沉没用超的部分只是按原价补没有额外惩罚。新建simulate.pyimport random import statistics from cost_model import pack_cost, payg_cost def simulate(monthly_mean: float, monthly_std: float, months: int, pack_price: float, pack_quota: float, payg_unit: float, trials: int 10_000) - dict: 蒙特卡洛模拟输出期望成本与后悔概率。 pack_costs, payg_costs, regrets [], [], 0 for _ in range(trials): usage sum(max(0.0, random.gauss(monthly_mean, monthly_std)) for _ in range(months)) cp pack_cost(usage, pack_price, pack_quota, payg_unit) cg payg_cost(usage, payg_unit) pack_costs.append(cp) payg_costs.append(cg) if cp cg: regrets 1 return { pack_mean: round(statistics.mean(pack_costs)), payg_mean: round(statistics.mean(payg_costs)), regret_prob: round(regrets / trials, 3), }regret_prob是这个计算器最有用的输出买包之后总成本反而更高的概率。均值告诉你期望省多少这个数告诉你有多大机会真的亏。用两组月均完全相同、只有波动不同的数据对比if __name__ __main__: args (3, 16_000, 1_000_000_000, 20 / 1e6) print(用量稳定:, simulate(300e6, 30e6, *args)) print(用量波动:, simulate(300e6, 150e6, *args))波动大的那组后悔概率显著更高。结论用量波动本身就是不买包的理由和用量大小无关。这也解释了为什么刚上线、流量还在调整的业务不该买包——不是量不够是量不稳。步骤四给出建议容量选容量的原则和直觉相反宁可选小一档。理由是亏损不对称——买小了超出部分按原价补损失为零只是没享受那部分折扣买大了用不完损失是实打实的钱。新建recommend.pydef recommend_quota(monthly_usages: list[float], months_covered: int 3) - float: 按历史低分位估稳定基线保守选包。 s sorted(monthly_usages) idx max(0, int(len(s) * 0.3) - 1) # p30 作为基线 return s[idx] * months_covered def pick_best_pack(monthly_usages: list[float], candidates: list[tuple], payg_unit: float) - tuple: 在候选档位里选期望成本最低的含不买包。 from cost_model import pack_cost, payg_cost total sum(monthly_usages) best (None, payg_cost(total, payg_unit)) for quota, price in candidates: c pack_cost(total, price, quota, payg_unit) if c best[1]: best ((quota, price), c) return best用 p30 而不是均值是把某几个月是低谷提前认了剩下的高峰月份让按量兜住。步骤五组装成命令行工具新建main.py把前面四步串起来from breakeven import breakeven_ratio from simulate import simulate from recommend import recommend_quota, pick_best_pack def advise(monthly_usages: list[float], pack_price: float, pack_quota: float, payg_unit: float) - None: import statistics mean statistics.mean(monthly_usages) std statistics.pstdev(monthly_usages) if len(monthly_usages) 1 else 0.0 ratio breakeven_ratio(pack_price, pack_quota, payg_unit) sim simulate(mean, std, 3, pack_price, pack_quota, payg_unit) suggest recommend_quota(monthly_usages) print(f用完率门槛 : {ratio:.0%}) print(f预期用完率 : {min(mean*3/pack_quota, 1):.0%}) print(f买包后悔概率 : {sim[regret_prob]:.1%}) print(f建议容量(3个月): {suggest/1e6:.0f} 百万 Token) print(f结论 : , end) if sim[regret_prob] 0.3: print(不建议买包用量波动过大) elif mean * 3 / pack_quota ratio: print(不建议买包预期用完率低于门槛) else: print(可以买但按建议容量选小一档) if __name__ __main__: history [280e6, 310e6, 295e6, 330e6, 290e6, 305e6] advise(history, 16_000, 1_000_000_000, 20 / 1e6)这就是完整的计算器。把history换成你自己的月度用量即可。数据从哪来需要平台能导出按月的用量明细最好有查询接口而不是只能看控制台图表。选平台时确认这项否则你只能手抄数字。国内常见平台如 jiekou.vip在控制台里把订阅包额度和按量余额放在同一个用量视图也提供明细查询导出后直接喂给这个脚本就行。步骤六买了之后加一个用完率监控买完不是结束。有效期过半时用完率明显落后于时间进度说明这档买大了下期要调小。新建fill_rate.pydef fill_rate_alert(used: float, quota: float, elapsed_days: int, total_days: int) - str | None: 用完率落后于时间进度就预警。 if total_days 0 or quota 0: return None time_progress elapsed_days / total_days fill_progress used / quota if time_progress 0.5 and fill_progress time_progress * 0.7: return (f用完率 {fill_progress:.0%} 落后于时间进度 f{time_progress:.0%}本档偏大下期调小) return None if __name__ __main__: print(fill_rate_alert(3.2e8, 1e9, 60, 90))输出用完率 32% 落后于时间进度 67%本档偏大下期调小。这段的价值是把包买大了的发现时点从过期那天提前到有效期中段——还有时间调整下一期或者把原本走别处的流量并过来消化额度。挂进日常看板每天跑一次。used和quota两个入参要从平台的订阅包详情里取所以选平台时留意额度消耗是否能按包查询、而不是只给一个总用量。像 jiekou.vip 这类平台在订阅包页面直接显示单个包的已用额度和剩余有效期取这两个值填进来就能跑。附组合方案的成本对比订阅包和按量付费不是二选一。把用量拆成稳定基线和波动峰值用包覆盖基线拿折扣用按量承接峰值保灵活方案折扣过期风险适用纯按量无无用量不稳、刚上线纯买包全额高用量极稳且能确定用满包覆盖基线 按量兜峰值部分低大多数情况第三种在pick_best_pack里已经体现了——超出容量的部分自动按payg_unit计价所以你只要把候选档位都传进去它会自己选出最优组合。小结这个计算器的六个部分成本函数揭示实际单价是包价 / 实际用量不是宣传的那个数用完率门槛第一道筛子通常七到九成波动模拟输出后悔概率比拿均值代单点可靠建议容量按 p30 基线永远偏保守命令行组装输入历史用量直接出结论用完率监控买了之后持续校准下一期最关键的一件事是第六步。没有用完率监控包买大了这个事实要到过期那天才会浮出水面那时候已经没有任何补救空间。前五步是买之前算一次第六步要一直跑着。