零售AI的两大支柱是推荐系统(把对的商品放到对的人眼前)与需求预测(把对的货放到对的仓里)。本节审计两者的成色:离线指标与在线增益的落差、长尾商品的数据饥饿、以及预测精度提升到底省了谁的钱。
一家电商平台上线新的推荐模型,算法团队汇报:离线召回率提升了百分之十二。两周后在线A/B实验的结果却是:点击率几乎没动,转化率微降。这类落差在零售AI审计里是最常见的第一现场。原因不神秘:离线评测用的是历史日志,历史日志里充满曝光偏差——老模型没推过的商品根本没有被点击的机会,新模型把这些商品召回回来,离线指标涨了,在线用户却未必买账。落差本身不是造假,但只报离线数字不报在线实验,就是成色问题。
审计推荐系统第一问:增益是在什么口径上测的。是点击率还是转化率?是整体还是新用户分群?实验跑了几周、有没有避开大促周期?第二问:基线是什么。和一个随机推荐比提升百分之三十毫无意义,和一个"热销榜"基线比才有信息量。
推荐系统的公开成绩单几乎都在头部商品上挣的。销量前百分之十的SKU贡献了大部分交互数据,模型对它们了如指掌;而利润更分散的长尾商品处于数据饥饿状态——一个月三次点击的商品,任何深度模型都学不出东西。审计时要看分层的增益报告:头部、腰部、尾部商品的推荐效果各提升多少。不少"整体提升"的项目拆开看,尾部甚至是负贡献(把本来的自然流量挤掉了)。
import random random.seed(31) def make_catalog(n=1000): """模拟商品交互量:典型的幂律分布,头部吃掉大部分曝光。""" items = [] for i in range(n): popularity = 1000.0 / (i + 3) ** 1.1 # 幂律:排名越靠后交互越少 items.append(("item_%d" % i, int(popularity))) return items catalog = make_catalog() total = sum(c for _, c in catalog) head = sum(c for i, (_, c) in enumerate(catalog) if i < 100) # 前10% tail = sum(c for i, (_, c) in enumerate(catalog) if i >= 700) # 后30% print("头部 10%% 商品占总交互 %.1f%%" % (head / total * 100)) print("尾部 30%% 商品占总交互 %.1f%%" % (tail / total * 100)) # 典型输出:头部约 55%,尾部约 5%。 # 深度模型在尾部 5% 的数据上训练,本质是在拟合噪声。
应对长尾饥饿的常规手段是分层策略:头部用复杂模型,腰部用协同过滤,尾部干脆用内容特征或人工规则兜底。这个"不统一"的架构在工程上显得不优雅,却比"一个统一大模型"的方案成色好——第1.2节的选型阶梯在这里落地为同一个系统内的分层。
需求预测的审计焦点是换算链。预测精度从百分之七十提到百分之八十五,省下来的不是抽象的"效率",而是三笔具体的钱:安全库存占用的资金、缺货损失的销售额、临期报废的货值。不同品类这三笔钱的权重完全不同——生鲜报废是大头,家电缺货是大头,图书两笔都小。所以同一个精度提升,在不同品类上的价值可以差一个数量级。审计时先让业务方给出这三笔钱的系数,再看精度提升值多少钱。
def stock_cost(forecast_error, price=10, holding_rate=0.02, stockout_loss=3, spoil_rate_multiplier=1.0): """把预测误差换算成三项成本(参数为示意口径)。 forecast_error: 预测的平均绝对百分比误差,如 0.30 表示 30%。""" safety_stock_cost = price * holding_rate * forecast_error * 52 # 周转资金占用 stockout_cost = price * stockout_loss * forecast_error * 0.5 spoil_cost = price * spoil_rate_multiplier * forecast_error * 0.3 return safety_stock_cost + stockout_cost + spoil_cost old = stock_cost(0.30, spoil_rate_multiplier=1.5) # 生鲜类:报废敏感 new = stock_cost(0.15, spoil_rate_multiplier=1.5) print("生鲜品类:误差从30%%降到15%%,每SKU每年省 %.0f 元" % (old - new)) old2 = stock_cost(0.30, price=3000, spoil_rate_multiplier=0.1) # 家电:缺货敏感 new2 = stock_cost(0.15, price=3000, spoil_rate_multiplier=0.1) print("家电品类:同样精度提升,每SKU每年省 %.0f 元" % (old2 - new2)) # 同样的模型改进,品类不同价值差数倍——决定立项优先级的是这个换算, # 不是模型排行榜上的名次。
还有一个常被漏记的成本项:架构的复杂度税。分层策略意味着三套系统、三条监控、三倍的故障面。日活一百万以下的业务,一套协同过滤加规则兜底往往已经拿到八成收益;上不上深度模型,取决于增量收益能不能覆盖这份复杂度税。审计推荐项目时,先量业务体量,再评架构是否过度——过度架构化是小平台AI项目最体面的一种死法。
背景(两套数字的落差)、操作(分层增益与成本换算)、结果(长尾饥饿的量化与品类价值差)齐备。解读:零售AI的成色在于"在线实验口径诚实"和"精度进步算得成钱"。变式:便利店选品、直播间排品、跨境电商备货是同构问题,共同点都是幂律分布加换算链。下一节走进工厂,看同样的视觉与预测技术在没有点击日志、只有油污和粉尘的产线上的成色。