实时数仓与 AI 特征平台联动落地

日期:2026-09-03

本文为工程实践复盘,客户信息已脱敏,文中数据均为项目复盘口径的脱敏示意值。

一、项目背景

我们的推荐和风控模型要的实时特征,过去全靠 T+1 离线任务算,用户刚下的单、刚点的商品,要等第二天凌晨批处理跑完才进模型。体验明显滞后,新客冷启动尤其吃亏,因为他没有任何历史特征,只能吃默认策略。根因是我们压根没有实时特征管线,模型吃的是隔夜数据,业务侧的实时信号全浪费了。

这件事在风控上更致命。一笔可疑交易发生时,模型如果只能看到昨天的行为特征,根本拦不住实时作案。我们评估过,离线特征导致风控对新型欺诈的响应延迟接近一天,这个窗口足够坏人试很多次,损失是按小时滚动累积的。推荐侧也一样,用户刚加购的商品,列表页半天不反应,转化白白流失。

更隐蔽的问题在模型迭代效率。数据科学家每次想试一个新特征,都要等当天批任务跑完才能看到效果,一天最多验证一两个想法,迭代速度被数据管线卡死。我们意识到,实时特征不只是体验问题,它直接决定了整个 AI 团队的试错速度,这笔账比表面的转化损失更大。

二、落地场景

我们接了实时数仓,把交易、点击、浏览等事件流接进来,在特征平台做实时计算和落库。在线推理时直接读在线特征服务,离线训练则读同一份特征定义,保证线上线下同源。特征带版本号,方便回滚和比对,血缘可追溯。

落地时我们没一股脑把所有特征都实时化,而是按价值分层。高价值、强时效的特征走实时,长周期统计走近线,纯历史聚合继续走离线。这样既拿到了实时收益,又没把成本烧爆,财务那边也过得去。我们还给每个特征打了业务负责人标签,谁定义谁负责,避免出问题互相推。

为了让算法团队用得顺,我们做了一份特征定义即代码的工作流, scientists 在 Python 里写好特征逻辑,一键同时生成离线 SQL 和在线计算任务,不用分头维护两份。这一步把特征从数据工程师的私活变成了算法团队自己的生产资料,新特征从想法到上线从一周压到了一天。

三、关键技术挑战与解决思路

实时与离线特征一致是最深的坑。我们离线和在线各写了一套计算逻辑,结果模型训练时效果漂亮,一上线就飘,排查两周才发现两份实现对某个时间窗口的取整不一样,离线按天、在线按滚动窗口,边界值差了一个量级。后来我们把特征计算逻辑收敛成一份定义,离线和在线都调用它,彻底消除分歧。

特征时效和成本要权衡,不是所有特征都值得实时算。我们按业务价值分层,高价值特征走实时,长周期统计走近线。在线服务低延迟靠特征预聚合加本地缓存扛住,避免每次推理都去查原始流。血缘和版本是排障的救命绳,一开始就得建,否则哪天特征漂移了都没法回溯是哪次变更引起的。我们还加了特征监控,分布的 PSI 超标自动告警。

我们后来补了一道离线回填机制,新特征上线后能用历史数据回算过去一段时间的在线值,这样算法团队不用等实时数据攒够才能评估,当天就能拿到完整回测。这个能力看着是锦上添花,实则是让实时特征真正可用的关键,因为新特征最怕的就是上线后等不到足够样本就无法判断好坏。

案例片段(已脱敏):实时特征计算与一致性校验配置。

yaml feature:  def: shared_one_def  online_ttl: 300  consistency_check: daily  tier: [realtime, nearline]

一段排障记录很能说明问题:某天风控模型准确率掉了两个点,顺着特征血缘查,发现是实时链路一次升级改了窗口定义但没同步离线,日报的 consistency_check 标红才定位到,回滚后当天恢复。

四、效果数据

特征刷新时延从 T+1 降到秒级,线上线下一致性偏差从约 9% 收敛到 1% 以内。在线特征服务 P99 约 12 毫秒。特征复用率提升到六成,新模型接入周期缩短约四成。风控对实时欺诈的拦截响应从接近一天缩到分钟级。特征漂移引发的无声劣化次数归零。这些数字为示意值。

五、可复用经验总结

实时特征最坑的就是线上线下口径不一,这种不一致不会报错,只会让模型悄悄变差,特别难查。我们后来立了条铁律:任何特征只准有一份定义,谁想在线重写一个实时版就过不了评审。

特征分层也别省,全量实时算既烧钱又没必要,按价值分档后成本和时效都好看。一致性校验要做成日常自动化,别等模型掉了两个点才人工去翻,我们那次幸亏日报有标红,否则能查一周。血缘信息越早建越省事,等特征上百个再去补,基本补不动。

结语

实时特征平台跑了一段时间,最让我们意外的是它顺带治好了模型漂移的排查难题,血缘一拉就定位到哪次特征变更。以前这种问题要查一周,现在当天就能闭环。业务侧也尝到了甜头,新客冷启动的体验肉眼可见地好起来。如果重来,我会在立项时就强制线上线下同定义,而不是先各写一遍再返工,那两周的排查其实本可以避免,纯粹是架构上的偷懒付出的代价。