DACRI(Decision-Aware Causal Intervention Ranking,决策感知的因果干预排序)这类方法,最早引起我注意,不是因为它名字新,而是因为它恰好踩中了供应链落地里的一个真实痛点:你知道自己该干预,但资源有限,不知道先干预谁。传统预测模型能告诉你某个关键物料下个月大概率会缺货,却不能直接告诉你该换供应商、加安全库存,还是启动第二货源。DACRI 的思路,就是把这些候选动作当成干预变量,用因果推断估计每个干预的真实效果,再按决策成本和可行性排序,最后输出一份“先做什么、后做什么”的行动清单。
这个主题适合谁看?一类是供应链计划、采购和运营团队,想从“拍脑袋排序”过渡到“数据驱动排序”;另一类是数据科学和分析团队,正在做预测但发现预测结果没法直接指导动作。这篇文章不点评任何具体论文,只按我自己落地这类因果排序方法的经验,把概念、流程、参数、坑和排查顺序拆开讲。
1. 先想明白:DACRI 解决的是“做什么”而不是“会发生什么”
1.1 关键供应链里的三类问题
关键供应链指什么?通常指那些一旦断供就会导致生产停线、业务中断、甚至公共安全风险的物料链条,典型的有电子元器件、汽车关键零部件、医疗耗材、特殊化学品等。这类供应链有一个共同特点:替代性差、切换成本高、库存回旋余地小。
运营团队每天面对的问题,其实可以分成三层。
第一层是“会发生什么”。比如下个月某款主控芯片的需求量是多少,现有库存能不能撑到新批次到货。这一层是预测问题,主流做法是时间序列、需求预测、机器学习回归。
第二层是“为什么会这样”。比如这周缺货是因为供应商产能不足,还是因为销售预测偏低导致采购计划滞后。这一层是归因问题,通常靠根因分析、流程回溯和数据下钻。
第三层是“现在应该干预谁”。预算有限、谈判能力有限、仓库空间有限,时间窗口也就一两周,手上有三五个候选动作:给A供应商加急订单、给B物料补安全库存、给C品类找第二货源。到底先做哪个?这一层才是 DACRI 真正聚焦的地方。
很多团队的问题是,前三层都做了,第三层靠开会拍板。拍板不是不行,但动作一多、品类一杂,经验就覆盖不过来了,这时候才需要一套基于因果推断的干预排序方法。
1.2 预测、归因和干预排序不是一回事
这里要特别强调一个容易混淆的点:预测准不等于知道怎么干预。模型预测某物料下周缺货概率 80%,这只是信息。真正的问题是:如果我把安全库存从 7 天加到 14 天,缺货概率能不能降到 20%?如果我把订单从供应商A转到供应商B,交期会不会从 40 天变成 25 天?这些问题问的是“如果我做了某个动作,结果会不会变”,也就是因果干预效果。
普通机器学习模型学的是相关性。历史数据里,供应商A的交期长和缺货高可能同时出现,但交期长是缺货的因还是果,或者背后还有一个被忽略的产能利用率变量在同时影响两者,模型并不知道。因果推断要做的,就是把这层关系拆开:要么通过实验,要么通过合理的因果结构假设,估计出“动作→结果”的真实效应。
DACRI 里的 Ranking 也很关键。它不追求把所有干预都做一遍,而是在有限资源下给出优先级。所以它的输出不是一张相关性热力图,而是一张按预期净收益排序的行动清单。
2. 为什么不能直接拿历史相关性和普通评分来排序
2.1 相关性背后的混杂因素
假设我们想评估“增加安全库存”这个干预的效果。如果只看历史数据,库存高的物料缺货率确实低,于是很容易得出“安全库存越高越好”的结论。但这里有个明显的混杂:需求波动大的物料,计划员本来就会设置更高的安全库存,而需求波动大本身就会导致更高的缺货风险。也就是说,库存水平和缺货率同时受“需求波动”这个变量影响,直接比较会产生偏差。
供应链数据里混杂因素非常多:季节因素、促销节奏、供应商产能周期、汇率波动、客户信用变化,还有计划员自己的操作习惯。这些变量如果没进模型,干预效果的估计就可能偏掉。DACRI 这类方法的做法,是先画一张因果结构图,把哪些变量影响干预、哪些变量影响结果、哪些变量同时影响两者,全部显式列出来,再决定哪些变量要在估计时控制住。
2.2 反事实:历史上没发生过的干预怎么估计
另一个难题是反事实。因果干预效果的定义是:同一批物料,在“做了干预”和“没做干预”两种情况下结果之差。但在现实中,同一批物料要么做了干预,要么没做,你永远只能观测到其中一种。这就是为什么常说因果推断的核心是处理缺失的对照。
关键是,很多干预在历史上根本没有发生过,或者只发生过一两次。比如某个关键品类从来没有导入过第二货源,那你拿历史数据怎么估计“导入第二货源”的效果?这靠传统回归是做不到的。可行的思路有几条:
第一,找近似场景。看看其他品类、其他产品线,甚至行业内的公开案例,有没有做过类似动作,把那些结果作为先验信息。
第二,缩小干预的定义粒度。把“导入第二货源”拆成“引入备用批准供应商”“降低单一供应商份额”“建立合格供应商池”等更细的动作,历史数据里可能能找到这些子动作的记录。
第三,用小规模试点和影子运行补数据。这也是我更推荐的方式:与其在模型里硬推一个没发生过的干预,不如设计一个最小可行试点,先在一个物料号上验证,把观测数据积累起来,再回填模型。
2.3 决策感知的真正含义:错误代价是不对称的
“Decision-Aware”这个词,我理解下来核心是:排序的目标不是让预测误差最小,而是让决策损失最小。
举个例子。假设两个物料都有 10% 的缺货风险。对物料 A,多备一周库存的成本很低,仓库也放得下;对物料 B,库存成本极高,而且货值大、保质期短。这时候普通预测模型会觉得两者风险一样,但决策模型会认为物料 A 更值得干预,因为单位干预成本低、边际收益高。
更典型的是漏报和误报的不对称。漏报一个真实断供风险,可能导致停线,损失可能是几十万;误报一个虚假风险,最多是多付一次加急运费。两个预测误差绝对值一样,但后果差几个数量级。所以决策感知的方法会把成本函数写进目标,排序时直接按“预期干预收益减去预期干预成本”来算,而不是按“得分高者优先”。
这一步看起来简单,实际落地时最容易出错。因为业务部门很难给出精确的成本数字,通常需要供应链、财务、运营一起把每个干预动作的成本边界敲定,哪怕是一个粗略的范围,也比完全忽略好得多。
3. 从数据到干预排序的六步落地流程
3.1 定义干预候选集和结果指标
第一步别急着建模,先把干预候选集列出来。每类供应链的候选动作不一样,但常见类别大致如下:
| 干预类型 | 典型动作 | 适用场景 |
|---|---|---|
| 供应端 | 增加第二货源、更换供应商、扩产提货、优化交期 | 单一来源、交期长、品质不稳定 |
| 库存端 | 提高安全库存、设置缓冲库存、调整补货点 | 需求波动大、供应不确定 |
| 物流端 | 切换运输方式、增加干线频次、提前锁定舱位 | 远距离、时效敏感、港口拥堵 |
| 需求端 | 替代料推广、客户交期承诺调整、需求削峰 | 需求集中在少数大单 |
结果指标也要定义在前面。我建议优先用运营侧指标,而不是纯财务模型指标,常见的有:缺货次数、缺货天数、服务满足率、库存周转天数、加急发货比例、断供导致的停线工时。指标不要贪多,3 到 5 个核心指标足够,否则后面效果评估会变得很分裂。
3.2 收集并清洗数据
DACRI 需要的数据至少覆盖四块:干预记录、结果记录、时变混杂变量、静态属性。
干预记录就是“什么时候对哪个物料做了什么动作”,比如某天给某物料提升了安全库存,某周给某供应商下了加急订单。很多企业的 ERP 订单里有加急标记,但要把它转成结构化的干预事件表,通常需要手工梳理一遍。
结果记录是每个物料每个周期在运营指标上的表现,比如按周汇总的缺货次数和满足率。
时变混杂变量很关键,包括需求预测值、在手订单、供应商产能利用率、交期达成率等。这些变量会随时间变化,会影响干预决策,也会影响结果,需要在估计时控制。
数据清洗时最容易踩的坑是时间错位。干预是第 3 周做的,结果应该看第 4 周到第 6 周,而不是第 3 周本身。曾经我见过一个项目,把干预和结果放在同一周统计,导致几乎所有干预看起来都有效,因为缺货发生了才触发加急,加急当周缺货统计还在。这种时间对齐问题,必须在清洗阶段就定好规则。
3.3 构建因果结构假设
这一步不要省。你不需要画出完美的因果图,但至少要把三件事说清楚。
第一,哪些变量是干预的父节点,也就是会影响“要不要做干预”的因素。比如物料缺货风险越高,越可能被加库存,这就是一个父节点。
第二,哪些变量是结果的父节点,也就是真正驱动缺货或满足率变化的因素。
第三,哪些变量同时影响干预和结果,也就是需要控制的混杂因素。
把这个图画出来,团队就对齐了一个很重要的共识:模型里哪些变量是要估计的效应,哪些变量只是用来做控制。如果这一步省掉,后面所有系数解释都会打架。
3.4 估计干预效果
有了因果结构假设,接下来就是选择估计方法。常见的方法包括倾向得分加权、双重差分、工具变量、结构方程模型等。具体选哪个,取决于数据形态:干预是不是随时间变化、有没有对照组、有没有合适的工具变量。
这里给一个比较通用的操作顺序:先跑一个最简单的版本,把干预作为变量放入模型,调整混杂变量后看效应方向;再用倾向得分匹配或加权做一遍,看结论是否一致;如果结论稳定,再考虑更复杂的模型。结论一致性比单模型精度更重要。
同时要强调一点:不要因为某个方法很炫,就跳过简单版本。先看简单模型给出的效应方向和量级是否合理,再逐步加复杂度,能省掉很多排查时间。
3.5 把决策成本写进评分函数
估计出每个干预的效果之后,还不能直接排序。要把决策成本、执行难度、风险边界一起算进去。
这里用一个示例来说明评分思路,具体公式要看业务口径:
干预优先级得分 = 预期效果权重 * 效果估计值 - 成本权重 * 单次干预成本 - 风险惩罚 * 执行失败概率 + 可行性调整 * 资源可用度这只是示意,不是标准公式。真正落地的关键在于把每个权重和业务口径对齐:效果估计值用什么指标,成本是财务口径还是资源口径,风险惩罚怎么定义,可行性调整是专家打分还是系统数据。权重可以先用简单枚举法:让业务负责人给几个典型场景打分,反推出权重范围,再小范围校准。
3.6 排序、复盘、再训练
排序结果出来后,做两件事:一是给业务团队看排序结果是否合理,二是在过去几周的数据上做回测,看如果当时按这个排序执行,结果会不会比实际执行更好。
回测通过后,可以进入影子模式:系统每周输出一份推荐清单,业务团队按自己的经验执行,但系统同步记录“推荐了什么、实际做了什么、后续结果如何”。跑 4 到 8 个周期后,用新数据重新评估模型效果,再决定是否让推荐清单进入正式决策流程。
4. 关键参数与判断标准:怎么算有效
4.1 结果指标:用一线运营指标而不是学术指标
很多团队一开始会把模型评估指标设成精度、召回、AUC 这类,但业务侧最关心的其实是:缺货次数降了多少、加急订单减少多少、满足率提升多少。我建议评估时至少同时看两层。
第一层是模型指标,验证排序的区分度。可以用排序相关性、Top-K 命中率,即推荐干预的前 10 个物料里有多少确实出现了风险改善。
第二层是业务指标,也就是前面说的缺货次数、满足率、库存周转。这一层直接决定项目能不能继续做下去。
4.2 效果估计的置信度和最小可行改善
因果推断的估计值都带不确定性。排序的时候,不能只看点估计,还要看置信区间。两个干预候选,一个效果均值是 0.3,置信区间很宽;另一个效果均值是 0.25,置信区间很窄。如果预算只能做一个,我大概率会选后者,因为收益更确定,虽然看起来少一点。
同时要定一个“最小可行改善”门槛。比如缺货率至少要降低 5 个百分点才算有效干预,低于这个值不值得组织资源去执行。这个门槛应该由业务和财务一起定,不能交给数据团队拍脑袋。
4.3 排序更新节奏
干预排序不是每天都要重排。任务窗口和决策节奏决定更新频率:如果补货周期是一周,每周重排一次就好;如果是按季度做供应商策略,季度重排一次更合适。
更新太频繁有两个坏处:一是业务团队还没来得及执行,排序就变了,失去参考意义;二是短期波动会导致排名反复跳动,削弱信任。更稳妥的做法是把排序分成两层:长期策略层,比如供应商结构、安全库存策略,每月或每季更新;短期执行层,比如加急、调拨,每周更新。
5. 常见坑与排查链路
5.1 先查数据泄漏和时间错位
如果排序效果在回测里好得不正常,几乎是数据泄漏。常见的泄漏来源有三种。
第一,用了未来信息。清洗时把当期之后的数据混进了特征,比如用第 4 周的实际需求去预测第 3 周的缺货风险。
第二,时间窗口没对齐。干预、混杂变量、结果三个时间点的错位,前面已经提过。
第三,目标泄漏。结果指标本身被当作特征引入,比如用“是否缺货”去预测“是否需要干预”,那就没有任何意义。
排查时先检查特征的时间戳是否严格在预测时点之前;再检查干预事件表和结果表的时间对齐规则;最后用一个随机打乱标签的版本跑一遍,如果模型还是能拿到高精度,说明特征里存在泄漏。
5.2 再查混杂因素和幸存者偏差
如果结果看起来合理但和业务经验冲突,优先怀疑混杂没控制住。比如某供应商的物料看起来交期长导致缺货多,但它供应的本来就是最难做的定制件,交期长和缺货多都是“定制程度高”的结果,而不是因果关系。
幸存者偏差在供应链里也很常见。历史数据里只有存活下来的供应商和物料才有完整记录,那些已经停供、转型、破产的供应商,其数据可能缺失或不再更新。如果只基于现存的供应商做干预效果估计,结果会偏向乐观。处理办法是尽量保留历史供应商的全量记录,哪怕它已经不在当前供应商列表里。
5.3 然后查业务可执行性
模型排在第一位的干预,经常是业务上做不了的。比如某个物料需要双供应商,但该物料有专利或认证壁垒,短期内根本找不到合格的第二家。这种情况不是模型错了,而是约束条件没有进模型。
我建议在排序前,先给每个干预候选打三个标签:能不能做、多久能做、做了会不会有连锁风险。能不能做是硬约束,比如资质、认证、产能、合同条款;多久能做是时间窗,和缺货风险爆发的时点对比;连锁风险是指会不会挤占其他物料的供应资源。这三个标签可以作为排序的过滤条件,而不是全靠模型。
5.4 最后查模型是否在追逐噪音
如果排序结果每期都在剧烈变化,这周第一下周就掉到第十,大概率是模型在追逐短期噪音。供应链数据本身噪声大,尤其是周度数据。处理思路是给结果指标做平滑,比如用四周移动平均,或者缩小估计窗口,用更长周期的数据来减少波动。
另外一个常见问题是在罕见事件上过拟合。关键供应链里真正的大断供是低频事件,样本很少,模型很容易把某次特殊事件学成强规律。这种情况下,宁可降低该类事件的权重,也不要让排序被个别历史灾难主导。
6. 从单类物料试点到全链路推广
6.1 先选一个高价值、干扰少的品类
第一次落地 DACRI,我强烈建议先选一个高价值、历史数据完整、供应商关系相对简单的品类。高价值意味着项目有预算支持;数据完整意味着因果估计不用花大量时间补数;供应商关系简单意味着决策链路短,容易验证。
不要一上来就铺到全品类。全品类意味着要处理完全不同的供应结构和数据质量,排查周期会拉得特别长,项目很容易死在中途。
6.2 建立专家复核和影子模式
模型排序结果上线前,先进入影子模式。系统每周生成推荐清单,但不直接驱动执行,而是由供应链计划员对照自己的判断做一个标注:同意、部分同意、不同意,并写明原因。这些标注是极其宝贵的校准数据。
跑几轮之后,你会发现两类问题:一类是专家掌握了模型没有的特征,比如某供应商老板最近资金链紧张,即将出现撤单风险;另一类是模型捕捉到了专家没注意的规律,比如某个品类的缺货总是集中在特定月份。把这些差异记录下来,是模型迭代最直接的方向。
6.3 监控什么:干预执行率、效果回测、指标漂移
正式上线后,我建议每周或每月固定看三组监控。
第一组是干预执行率。推荐清单里有百分之多少被业务真正执行了。如果执行率很低,说明排序和业务约束脱节,要优先调整过滤条件,而不是调模型。
第二组是效果回测。按周滚动比较“执行了推荐干预的物料”和“没执行干预的物料”之间的结果差异。这个对比不是严格随机实验,但可以作为一种持续监控手段。
第三组是指标漂移。需求模式、供应商产能、运输环境都在变,模型的因果结构假设可能过时。如果发现排序结果和实际结果的差距持续扩大,就要考虑重新估计因果结构,而不只是重新训练参数。
最后留一个我自己的判断:DACRI 这类方法,真正有价值的地方不是把排序做得更花哨,而是逼着团队把“干预动作、结果指标、混杂因素、决策成本、执行约束”这五件事显式地写下来。只要这五件事对齐了,哪怕模型简单一点,落地效果也不会差。反过来,如果这五件事都是黑箱,再先进的因果模型也帮不上忙。