智能补货系统的设计思路
目录
零售业和制造业,离不开供应链。搞供应链,离不开库存计划。简单来说,就是要回答好两个问题:什么时候进货?进货量是多少?下一个进货订单,从生产到运输和入库,需要一定的时间,短则数天,长则数月。
所以,需要提前进货。其中提前期依赖生产的耗时,进货量依赖未来的需求量。可以尝试预测需求,但是测不准。货进多了,资金周转慢,库存成本高;货进少了,卖得少,赚得少。总之,库存量把握不好就容易亏本。
所以说,做库存计划很难。
本文分享一些大规模商品补货的实践经验,主要思路是用数学模型和软件系统,目标是解决效率和成本问题。
业务背景
先介绍一下业务背景。假设我们是一家零售公司,有自营品牌,也有代销商品;有线上业务,也有线下业务;有传统打法,也有互联网玩法。
销售品类
有丰富的销售品类,涵盖生活的方方面面,比如居家用品、服装配饰、美食酒水、个护清洁、数码家电、运动旅行等等。

这意味着不同的商品,有不同的销售规律(比如季节性)、不同的采购周期、不同的供应商、以及不同的限制条件。
销售渠道
有多样化的销售渠道,例如:
- 官方线上渠道:APP、小程序、网页
- 第三方线上渠道:京东、淘宝、拼多多等
- 官方线下门店
- 合作线下门店
不同的渠道,用户群不同,因而主卖的商品也不同,导致渠道的销售规律也不同。渠道之间的销售存在互补,也存在竞争。渠道之间可以共享库存,也可以隔离库存。
库存类型
商品分为自营品牌和代销品牌。库存类型主要有自营仓库和外部仓库。综合来看,主要有以下几种类型:
- 自营品入自营仓
- 自营品入外部仓库
- 代销品入自营仓
- 代销品入外部仓库
- 线下店库存(可直接销售)
从仓促角度来看,商品类型还可以分为食品和百货,因为食品存储要求高,需要用单独的仓库。
自营仓库和外部仓库有多个,不同仓库大小不同,存放的商品也不完全相同。这意味着哪怕是同一款商品,它在不同仓库的仓储成本,是存在差异的。
此外,仓库的耗材也需要补充,比如纸箱、塑料袋、共挤膜袋、气垫等。
促销玩法
电商玩法虽然复杂,但万变不离“价格营销”。而营销活动会带来剧烈的销售波动,因此特别容易造成极端的库存状态,比如要么压仓,要么售罄。
下面这些促销,不过是冰山一角。
- 电商大促:618、双11、双12等
- 中国的节日:春节、元宵节、中秋节、国庆等
- 国外的节日:父亲节、母亲节、圣诞节、情人节等
- 营销事件:开学季、读书日、年货节、开门红等
- 日常玩法:加价购、限时购、直播、买赠、满赠、满减等
真正让人头疼的是,很难提前知道参加活动的商品。这种不确定性给库存计划带来巨大的挑战。
成本结构
库存管理做得好不好,常用的衡量指标是库存周转天数和缺货率。前者代表成本,库存周转天数越小,意味着资金周转越快;后者代表收益,缺货率越低,销售损失越小。
这两个指标容易计算,但不见得适用于所有场景。例如,它不能回答如何在库存周转天数和缺货率之间做取舍。当我们需要做大规模的商品补货时,这样的指标就显得很粗糙。
事实上,库存管理的最终目标是最小化成本。建立适合的补货模型,可以得到(或者逼近)最优解。
应该根据业务情况,去梳理各项成本。我们可以把成本分成如下几类:
- 固定成本:仓储、人力、设备等费用
- 采购成本:采购管理、物流运输、入库等费用
- 履约成本:订单捡货、打包、配送等费用
- 资金成本:借贷利息、融资成本、机会成本等
- 持有成本:持有商品的成本,例如遗失、损坏、变质、过期等
- 销售损失:销售亏损、缺货损失等
不同商品的成本不同、销售利润不同,因此最优的库存水位也不同。当成本或利润发生变化时,补货模型计算出新的最优解,从而适应变化。
以上是关于业务的介绍。用一句话总结,业务很复杂。在这样的背景下,我们应该如何制定补货计划?
问题描述
为了设计满足业务要求的补货系统,接下来需要把问题进一步明确。主要从目标、功能、约束三个维度来看。
目标
业务目标是最小化成本(含销售损失)。成本项可以是所有与库存相关的成本,也可以是几项最关键的成本,还可以用库存周转天数和缺货率等间接指标来近似地表示。
成本梳理是一项复杂而且长期的工作。应该做到什么程度,取决于业务现状以及数据基建能力。从这个角度来看,补货系统要能适应业务目标的变化。
功能
补货系统应该具备如下能力:
- 多渠道补货:可根据销售渠道、仓库、供应商等多个维度进行补货
- 批量化:自动生成十万(甚至百万)商品的补货计划
- 效果可见:事前可评估补货计划,事后可复盘业务结果
- 可干预:人工可以对补货计划进行调整
- 风险可控:计算结果稳定可靠
总结一下,就是做到三点:可扩展、可解释和可控制。换句话说,系统功能要灵活,人要搞得明白结果,还要好用又可靠。
约束
在下补货单时,还要考虑业务上的约束。下面是一些常见的因素:
最小起订量:一个订单的采购量不得低于最小采购量。
提前期:从下订单到入库所耗费的总时长,其中包括可能涉及生产、运输等一系列中间环节。
最小采购频次:因为某些业务原因,使得采购行为不能太频繁,例如要求最多一周采购一次。
箱规:采购量一般是以件为单位,但运输时一般是以箱为单位。
值得注意的是,不同商品(不同供应商或不同的入库仓),对应的约束条件可能是不同的,所以补货系统需要能处理差异化的约束。
以上就是要解决的补货问题,其中还有很多细节待补充,但不影响我们去思考解决方案。因为实际业务会不断变化,细节变多,越变越复杂。
算法架构
我们看到,这个补货问题很复杂,梳理清楚都不容易。那么如何解决它?
下面分享一下我的思路。
用一句话描述,就是化繁为简。细节太多不好设计;太简单又解决不了问题。难点在于如何把握这个度。
第一,抓重点。
先搭框架,后处理细节,重点是把补货计划做好。要做补货计划,重点是做好需求预测,另外就是把预测结果转化成补货量。
于是我们得到两个核心模块:预测和决策。如果能把这两个问题解决好,库存成本就不是问题,剩下的就只有工程和体验问题。
此外,要做好预测,特征工程很重要,可以再单独拆出一个“特征”模块。
第二,完善框架。
前面说,补货系统的计算结果要可靠,还要能评估效果。我们引入仿真、监控和分析模块:
- 仿真:用来验证预测模型和补货模型的效果,离线验证效果和可靠性。
- 监控:自动检测各模块的数据异常,发现异常报警或者中止流程,防止造成资金损失。
- 分析:事前解释补货原因,事后分析补货效果。
第三,补充细节。
根据前面的分析,我们得到下图所示的算法架构。

架构图只是对技术模块的一个高度抽象,它不足以指导开发实施。接下来还要细化每个模块,具体来说,就是要定义各模块的接口。下文以预测模型和决策模型为例,来说明如何细化各模块。
第四,落地实施。
这一步不多说,大多是标准流程,比如验证思路、工程化、交互设计、评审、开发、测试等。
预测模型
设计模块与设计系统,其思路是类似的。先明确预测问题,例如,输出一个商品、一段时间(历史或未来)的总销量(或者销量的分位数)。
考虑如下因素:
支持概率分布,即输出分位数 $\alpha$ 对应的销量值 $x$,满足 $P(X\leq x) = \alpha$,其中 $X$ 代表销量的随机变量。
支持俺渠道预测,其中渠道可以是销售渠道,也可以是仓库或者线下店。
支持不同版本的预测。
我们得到下面的接口定义。
输入
参数 | 类型 | 说明 | 必填 |
---|---|---|---|
skuId | integer | 商品ID | 是 |
startDate | date | 开始日期 | 是 |
endDate | date | 截至日期 | 是 |
channel | List<string> | 渠道列表 | 否,默认输出所有渠道的预测值 |
alpha | double | 分位数 | 否,默认采用点预测 |
model | string | 预测模型的名称 | 否,不指定则采用默认的预测模型 |
version | string | 版本号 | 否,默认使用最新的版本 |
输出
参数 | 类型 | 说明 |
---|---|---|
skuId | integer | 商品ID |
channel | string | 渠道名称 |
value | double | 预测值 |
这样一来,我们要实现一个预测模型,只需要满足上述输入和输出即可。在实际中,不同商品(不同渠道)销售规律不同,建议实现多种预测模型,比如规则模型、时间序列模型、统计模型、神经网络模型等。
决策模型
决策模型的功能是计算补货量,它是预测模型的下游,因为预测结果是它的输入之一。此外,它还要考虑业务约束。不同商品可能由不同的决策模型来处理。
例如,要实现如下补货功能:
- 支持多种最小起订量的度量,例如按SKU件数、按SPU件数、按重量等。
- 支持多供应商,例如同一商品有多个供应商。
- 支持分批次到货。
- 支持俺仓库补货。
决策模型的接口定义如下。
输入
参数 | 类型 | 说明 | 必填 |
---|---|---|---|
skuId | integer | 商品ID | 是 |
lt | integer | 提前期 | 是 |
moq | integer | 最小起订量 | 是 |
moqType | integer | 0 - 件数;1 - 重量 | 否,默认0 |
Constraints | List<string> | 约束条件,例如 moq_by_spu:spu维度共享moq moq_by_vendor: 供应商共享moq | 否,默认按SKU/供应商维度定义moq |
值得注意的是,不同决策模型的输入参数可能有差异。因此,在定义输入参数时,我们把差异化的参数一律放在 Constraints
中,从而保证决策模型的灵活性。
输出
参数 | 类型 | 说明 |
---|---|---|
skuId | Integer | sku id |
validDate | date | 生效日期 |
vendor | string | 供应商 |
value | double | 采购量 |
inboundDate | date | 期望入库日期 |
warehouseId | string | 仓库id |
inboundQuantity | Integer | 入库量 |
要实现决策模型,主要工作是定义符合业务情况的优化目标和约束条件,然后用数学语言进行表达。前文提到要最小化各项成本以及销售损失,就是通过求解这样的数学模型来实现。
已经介绍完预测和决策模块的设计思路,其余模块的设计思路是相似的,我们不赘述。剩下的就是去工程化,以及迭代各个模型,我们不展开讨论。
总结
本文介绍了智能补货系统的设计思路:先了解业务背景,然后提炼问题,进而抽象出功能模块,再把各模块具象化,最后是实现这个系统。希望这些经验能帮大家去解决业务中遇到的类似问题。
这个智能补货计划系统,相比传统的人工计划,有如下优势:
1、效率非常高。系统可以自动分析和处理数据,自动决策,可应用于大规模的商品(原材料)补货。
2、结果稳定可靠。预测模型和算法模型可以演进,从而让业务经验沉淀下来。
3、目标导向。业务目标、成本结构以及销售利润变化时,系统计算出的补货量会随之变化。从这个角度来看,模型正确的前提下,补货策略能保证最优。
4、试错成本低。系统的仿真能力可以让业务模拟不同的补货策略和销售策略,并得出分析结论,甚至可以为上游业务提供决策依据。