广告位 · 页头(后台-模块管理-新建模块后替换此区域)

如何用AI推理实现供应链需求预测与库存优化?

供应链管理中的需求预测并不只是对未来销量给出一个数字,它直接决定采购计划、仓储容量、运输调度和资金占用。当预测偏低时容易出现断货,错失销售机会;预测偏高又会造成库存积压,增加持有成本和过期损耗。AI推理的价值在于把传统经验判断转变为基于数据和约束的计算过程,让每个SKU的补货量都有可追溯的决策依据。

如何用AI推理实现供应链需求预测与库存优化?

一、从传统预测到AI推理:为什么需要改变

传统供应链预测大多依赖移动平均、指数平滑或ARIMA等时间序列方法。这些模型假设需求变化主要受历史趋势和周期影响,适合平稳序列,但面对电商大促、天气突变、区域封控等外部冲击时,误差会迅速放大。更重要的是,它们很难把价格调整、陈列位置、库存深度、评价数量等业务变量同时纳入计算。

AI推理并不是要完全替代传统模型,而是提供一种更灵活的映射能力。以梯度提升树为例,它可以自动学习销量与数十个特征之间的非线性关系,不需要预先假设数据分布。训练阶段在离线环境完成,推理阶段只做前向计算,单次预测耗时通常在毫秒级,适合每天定时跑批或实时补货接口调用。与训练不同,推理不更新参数,因此可以部署成轻量服务,也可以导出为ONNX格式嵌入现有ERP或WMS系统。

需要厘清的一点是,AI推理不是黑箱。通过特征重要度、SHAP值等工具,可以看出促销、价格、星期几、滞后销量等变量对预测结果的贡献方向。这种可解释性在供应链中尤其重要,因为补货计划需要采购和运营团队理解并信任模型输出,而不是盲目执行一个数字。

二、需求预测的AI推理实现:特征、模型与部署

构建SKU级需求预测的第一步是整理训练数据。历史销量表至少应包含日期、SKU编码、销量、价格、促销标识、库存水平等字段。特征工程可以分成三类:时间特征如星期几、月份、是否节假日;滞后特征如前7天、前14天、前30天销量;业务特征如折扣力度、页面曝光位置、缺货时长。需要注意的是,滞后特征在推理时必须有对应历史窗口,否则线上预测会因数据缺失报错。

模型选择上,如果SKU数量达到数千以上且需要快速迭代,梯度提升树通常比深度学习更实用。它的训练成本低,对缺失值容忍度高,样本量在几十万级别时也能稳定收敛。下面是一个简化的训练与推理示例:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_absolute_error
# 读取历史销售数据,字段包括日期、SKU、销量、价格、促销标识等
df = pd.read_csv('sales_history.csv')
df['day_of_week'] = pd.to_datetime(df['date']).dt.dayofweek
df['month'] = pd.to_datetime(df['date']).dt.month
features = ['price', 'promotion_flag', 'day_of_week', 'month', 'lag_7_sales']
target = 'sales'
train = df[df['date'] < '2024-01-01']
test = df[df['date'] >= '2024-01-01']
model = GradientBoostingRegressor(n_estimators=300, learning_rate=0.05, max_depth=4)
model.fit(train[features], train[target])
pred = model.predict(test[features])
print('MAE:', mean_absolute_error(test[target], pred))
# 推理阶段:只调用predict,不需要重新训练
new_row = pd.DataFrame([[29.9, 1, 2, 7, 152]], columns=features)
demand_pred = model.predict(new_row)[0]
print('预测需求:', demand_pred)

上面代码里日期比较使用了转义符号,实际脚本中应写为小于号和大于号。训练完成后可以把模型导出为ONNX格式,推理服务加载后不需要依赖sklearn完整环境。对于日更补货场景,还可以用定时任务每天读取最新销量,更新滞后特征并批量输出未来7天的预测值,写入数据库供优化模块调用。

推理部署中另一个常见问题是特征一致性。训练时如果对价格做了标准化,推理时也必须使用同一套均值和标准差;训练时如果对促销标识做了独热编码,推理时也要保持相同的列顺序。这些细节比换模型更容易导致线上预测偏差,建议把特征处理逻辑封装成pipeline对象,与模型一起保存和加载。

三、从预测到优化:库存补货的数学建模

拿到预测需求量后,不能直接按预测值补货,因为预测存在误差,补货决策还需要考虑提前期、服务水平、持有成本、缺货成本等约束。优化模型的目标通常是最小化总成本,决策变量包括每个SKU的建议补货量和安全库存水平。一个简化形式可以写成:总成本等于持有成本乘以平均库存,加上缺货成本乘以预计缺货数量。

下面用线性规划做一个演示,假设有5个SKU,已知预测需求、持有成本系数和缺货成本系数,总库存容量有限,求每个SKU的建议补货量:

from scipy.optimize import linprog
demand = [120, 85, 200, 60, 150]
holding_cost = [2, 1.5, 3, 2.5, 2]
stockout_cost = [8, 7, 10, 9, 8]
# 目标函数系数:持有成本部分加缺货风险部分
c = holding_cost + [stockout_cost[i] * demand[i] for i in range(len(demand))]
# 约束:所有SKU的补货量总和不超过仓库容量800单位
A_ub = [[1, 1, 1, 1, 1, 0, 0, 0, 0, 0]]
b_ub = [800]
# 实际中安全库存与补货量需要分别约束,这里简化变量边界
bounds = [(0, 300), (0, 200), (0, 400), (0, 150), (0, 300),
          (0, 200), (0, 180), (0, 300), (0, 150), (0, 250)]
result = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs')
print('优化结果状态:', result.message)
print('建议补货量:', result.x[:5])
print('建议动态安全库存:', result.x[5:])

这个示例为了说明思路,把补货量和安全库存放在同一个线性规划里优化,实际业务中安全库存通常根据需求分布和提前期公式单独计算,然后作为约束加入模型。例如某SKU的周需求标准差为30,提前期为7天,目标服务水平95%,安全库存可以近似为1.65乘以标准差乘以根号提前期。优化层只要保证补货后可用库存不低于安全库存线即可。

优化结果还需要与业务规则对齐,比如最小起订量、整箱包装、供应商档期等。这些离散约束会把线性规划转化为混合整数规划,可以使用PuLP或OR-Tools求解。实际项目里不建议一开始就上复杂整数规划,先用线性规划验证成本结构,再逐步加入整数变量,更容易排查问题。

四、落地注意事项与效果评估

AI推理在供应链中落地后,最重要的是建立一套评估闭环。预测精度可以用MAE、RMSE、MAPE等指标衡量,但供应链真正关心的是库存周转率、缺货率、资金占用和报废金额。因此评估时要同时观察预测指标和业务指标,避免出现预测误差下降但缺货率反而上升的情况。

另一个关键点是概念漂移。消费习惯变化、平台规则调整、新品替换都会让历史数据与当前分布不一致。建议每月重新训练模型,并监控线上预测误差趋势。如果某个SKU连续两周误差超过阈值,就应该触发重新训练或人工复核。推理服务保持模型版本管理,同一个预测请求能追踪到具体模型版本和特征快照。

最后,AI推理给出的建议补货量不应直接覆盖人工决策,而应作为计划员的辅助参考。可以在系统里同时展示预测销量、安全库存、建议补货量及理由,计划员可以调整并记录原因。这样既能利用模型算力,又能保留业务经验,形成的反馈数据还会反过来提升下一轮模型质量。

广告位 · 文章底部(后台-模块管理替换此区域)