3、特征服务架构概览:在线特征存储、离线特征计算、特征路由与一致性保证
特征服务是连接离线特征生产与在线模型推理的中间层。一个成熟的特征服务架构需要同时解决四个核心问题:在线特征存储的低延迟读取、离线特征计算的批处理与回溯、特征路由的灵活分发,以及一致性保证对样本偏差的源头控制。本章从架构视角拆解这四大模块,为后续的偏差检测打下基础。
架构视角提示: 特征服务不是简单的“存-取”系统,而是带有时间戳对齐、数据版本管理和路由策略的中间层。样本偏差往往源于这四层之间的数据不一致。
3.1 在线特征存储:低延迟与高可用
在线特征存储服务于实时推理场景,要求毫秒级响应。常见的存储选型包括 Redis、DynamoDB、HBase 以及专用特征存储(如 Feast、Tecton)。
| 存储类型 | 延迟 | 一致性模型 | 适用场景 |
|---|---|---|---|
| Redis / Redis Cluster | < 5ms | 最终一致性 | 高吞吐、低延迟在线推理 |
| DynamoDB | < 10ms | 最终一致性(可选强一致) | AWS 生态、自动扩缩容 |
| HBase | 10-50ms | 强一致性(行级) | 大规模特征、写密集型 |
| Feast Online Store | < 10ms | 最终一致性(依赖底层存储) | 开源特征平台、统一管理 |
在线存储的核心挑战是特征新鲜度与一致性的平衡。如果在线特征更新延迟,模型可能使用过时特征,导致训练-推理偏差(Training-Serving Skew)。
关键指标: 在线特征存储的 P99 延迟 应控制在 20ms 以内;特征新鲜度(Feature Freshness)应小于模型允许的最大特征延迟窗口(通常为 1-5 分钟)。
3.2 离线特征计算:批处理与时间旅行
离线特征计算负责从原始数据中生成训练用的特征数据集。它通常基于 Spark、Flink 或 SQL 引擎,支持时间旅行(Time Travel)——即回溯到历史某个时间点,生成与当时在线特征一致的训练数据。
- 批处理管道: 每日/每小时运行,计算聚合特征、滑动窗口特征、交叉特征。
- 时间点正确性(Point-in-Time Correctness): 离线特征必须与在线特征使用相同的时间戳逻辑,否则会产生时间偏差。
- 特征回溯: 支持指定时间范围重新计算特征,用于模型回测或偏差分析。
# 离线特征计算示例:Spark 窗口聚合
from pyspark.sql import functions as F
df = spark.table("raw_events")
feature_df = df.groupBy("user_id", F.window("event_time", "1 hour")) \
.agg(
F.count("*").alias("event_count_1h"),
F.avg("amount").alias("avg_amount_1h")
) \
.withColumn("feature_timestamp", F.col("window.end"))
偏差风险: 离线计算使用
event_time 而在线服务使用 server_receive_time,会导致时间戳不一致,产生样本偏差。必须统一时间戳来源。
3.3 特征路由:灵活分发与版本管理
特征路由层负责将特征请求分发到正确的存储后端,并支持特征版本切换、A/B 测试和灰度发布。它是特征服务的“交通枢纽”。
- 路由策略: 基于特征名称、模型 ID、请求来源进行路由。
- 版本管理: 每个特征可同时存在多个版本(V1、V2),路由层根据模型版本选择对应特征版本。
- 降级与熔断: 当在线存储不可用时,路由层可降级到离线缓存或默认值。
3.4 一致性保证:时间戳对齐与数据校验
一致性保证是特征服务中最容易被忽视但影响最大的模块。它确保在线特征与离线特征在时间维度和值维度上保持一致。
| 一致性维度 | 描述 | 偏差风险 |
|---|---|---|
| 时间戳一致性 | 在线与离线使用相同的时间戳字段 | 时间偏差导致特征值不匹配 |
| 特征值一致性 | 同一时刻在线与离线特征值相同 | 计算逻辑差异导致值偏差 |
| 特征新鲜度一致性 | 离线回溯时使用与在线相同的更新延迟 | 新鲜度差异导致训练-推理偏差 |
| 版本一致性 | 训练与推理使用相同特征版本 | 版本错位导致特征含义变化 |
实现一致性保证的常用手段包括:
- 时间点查询(Point-in-Time Query): 离线训练时,对每个样本使用其对应时间戳查询在线特征存储的快照。
- 特征日志(Feature Logging): 在线推理时,将使用的特征值写入日志,用于离线校验。
- 一致性校验管道: 定期对比在线特征与离线特征的值分布,触发告警。
3.5 架构总结:四大模块的协同关系
在线特征存储、离线特征计算、特征路由与一致性保证并非独立模块,而是相互依赖的整体:
- 离线计算为在线存储提供初始数据和定期更新。
- 特征路由根据请求来源和版本,将流量分发到正确的在线存储或降级策略。
- 一致性保证贯穿所有模块,通过时间戳对齐和日志校验,确保离线特征数据集与在线特征在时间上对齐。