#AI#DevOps

特征库 Point-in-Time Join 正确性:事件时间、可用时间与训练泄漏门禁

只按 entity 和最近时间连接特征,仍可能把标签发生后才到达的数据泄漏进训练集。本文冻结事件时间、可用时间、TTL 与快照水位,并让离线训练和在线服务消费同一特征定义代际。

本文要点

  • 主题聚焦:AI、DevOps
  • 适合人群:独立开发者、全栈工程师、AI 应用开发者
  • 核心价值:快速理解背景、实践路径、常见误区和工程建议
作者 @admin·发布于 2026年4月26日·更新于 2026年7月20日

欺诈模型的标签时间是周五 10:00,客户余额事件发生在 09:58,却到周五 10:06 才进入仓库。若训练查询只取 event_timestamp <= label_timestamp,这条余额会被当成“当时已知”,形成线上永远拿不到的未来信息。反过来,在线 store 若只保留最新值,回放旧订单又会读到未来状态。Point-in-time join 不是一条窗口 SQL,而是一份关于“何时发生、何时可知、哪版定义可用”的合同。

训练数据集快照固定样本集合,训练数据 Schema 演进控制字段语义;本文进一步约束标签行怎样和历史特征相遇。Feast 的 point-in-time join 用实体键和事件时间选择标签时刻之前的特征,并可借助 created timestamp 处理同一事件时间的修订,但平台仍需明确业务可用时间和迟到政策。

同时版本化三种时间

发布 featureViewRelease.v1,绑定 entity key schema、feature field ID、source snapshot、transform digest、eventTimeField、recordedTimeField、created/revision 规则、TTL、时区、null 语义、离线查询实现、在线物化策略及 owner。eventTime 表示业务事实生效,recordedTime 表示仓库接纳修订;二者都不证明预测服务已经能读取该值。每个 audience 和 online generation 还必须保存逐值首次成功物化的 servableAt receipt,训练 eligibility 同时要求 eventTime 与对应 audience 的 servableAt 不晚于样本 cutoff。

yaml
schema: featureViewRelease.v1
view: account-risk@12
entityKeys: [tenant_id, account_id]
eventTime: balance_changed_at
recordedTime: warehouse_committed_at
ttl: 30d
sourceSnapshot: iceberg:snapshot-8841
transformDigest: sha256:6a1...
online: { audience: fraud-api, generation: 57, receipts: materialization-ledger@57 }

异步物化时,warehouse commit 与 servableAt 可以相差数分钟。receipt 绑定 entity、feature revision、audience、online generation、首次可读时间和写入确认摘要;只有生产读路径确实以该 generation 返回相同规范值,才可签发。若历史系统没有这种证据,只能把相关样本标为 AVAILABILITY_UNPROVEN,不能用整体 materialization watermark 为每个值虚构可见时间。

标签样本也要携带 predictionAt、实体 schema 和允许的 source watermark。相同 event time 的多次修订按稳定 source revision 仲裁,不能依赖数据库返回顺序。TTL 从合同指定的业务时间计算;缺失、过期与尚未可用分别编码,不能都填成零。动态权限和删除仍遵守训练数据删除传播,旧快照可复现不代表可以继续训练。

一份 release 连接离线与在线

状态为 DRAFT -> MATERIALIZED -> LEAKAGE_TESTED -> PARITY_TESTED -> APPROVED -> ACTIVE -> RETIRED。离线 builder 输出训练矩阵 root、每列最大 event/recorded/servable time、source watermark 和泄漏审计;在线 builder 输出相同 release digest、entity coverage、materialization watermark 与 receipt root。唯一接受点是 registry 按模型 audience CAS 激活闭合 release,模型包同时引用 feature release,不能各自追 latest。

训练查询只能从固定 source snapshot 读取。迟到修订创建新的 dataset generation,不原地改旧矩阵;需要重训时明确记录差异。在线更新以 (entity, featureView, sourceRevision) 去重,并在发布前确认未越过删除或授权 generation。数据库 CDC负责送达变化,缓存 Revalidation可复用 generation fence,但特征 registry 才定义哪个值对哪次预测有效。

用泄漏夹具攻击时间边界

测试构造标签后一秒才入仓的旧事件、入仓后延迟十分钟才在线可读、同 event time 两个 created revision、时钟回拨、DST、本地日期误当 UTC、TTL 恰好等号、回填覆盖在线新值、离线 null 被在线默认零、source snapshot 过期及删除 outbox 迟到。独立 oracle 同时检查 event、recorded 和 audience-specific servableAt;删掉 receipt 或换错 online generation 时,release 必须拒绝而不是退化到 event time 或 warehouse commit。

发布门可要求:十万组生成式时间案例与 oracle 一致率 100%;任何 feature 的 servableAt(audience,generation) > predictionAt 接受数为 0;缺失或错代物化 receipt 接受数为 0;离线/在线规范值差异为 0;强制实体切片 coverage 不低于 99.5%;删除 generation 之后旧特征服务为 0;新物化 P99 落后低于已声明 SLO。样本不足或 source 无法提供可用时间时标 LEAKAGE_UNPROVEN,不能进入训练门。

上线先对现有训练任务 shadow 生成新矩阵并比较选择的 source revision,再只让一个低风险模型读取新在线 generation,按 5%、25% 扩大。异常时把模型与 feature alias 一起切回上一闭合 release;旧矩阵和审计保持只读。回滚不能把已经删除的数据重新物化,也不能让旧在线值跨越当前授权 floor。RAG 知识新鲜度关注文档证据时效,这里的验收对象是预测时真实可获得的结构化事实。

Related

相关推荐