核心概念:离线特征与在线特征、特征组、特征视图、特征服务

在金融 Feature Store 的架构中,理解核心概念是构建高效、可靠特征工程流水线的基础。本章将深入剖析四个关键概念:离线特征与在线特征、特征组(Feature Group)、特征视图(Feature View)以及特征服务(Feature Service)。这些概念共同构成了特征存储的逻辑骨架,决定了特征从生产到消费的全生命周期管理方式。

1. 离线特征与在线特征

特征根据其计算与存储的时效性,分为离线特征与在线特征。两者在计算引擎、存储介质、延迟要求和使用场景上存在显著差异。

维度 离线特征 在线特征
计算引擎 Spark、Hive、Flink Batch Redis、Memcached、本地缓存
存储介质 HDFS、对象存储(S3/OSS)、Hive 表 键值存储(KV Store)、内存数据库
延迟要求 分钟级 ~ 小时级 毫秒级(< 10ms)
数据量级 全量历史数据(TB ~ PB) 最新快照或近期窗口数据(GB ~ TB)
典型用途 模型训练、回测、批量评分 实时推理、在线决策、风控拦截
金融场景 贷前模型训练、反欺诈规则挖掘 实时交易反欺诈、授信额度实时计算
关键原则:离线特征与在线特征应保持计算逻辑一致,即“离线-在线一致性”(Offline-Online Consistency)。训练时使用的特征逻辑必须与线上推理时完全对齐,否则会导致训练-推理偏差(Training-Serving Skew)。

2. 特征组(Feature Group)

特征组是特征的逻辑集合,通常对应一个业务实体(如用户、设备、交易)或一个数据源表。它将一组在逻辑上紧密相关的特征聚合在一起,便于管理和复用。

  • 实体绑定:每个特征组必须关联一个主键(Primary Key),例如 user_id、device_id、transaction_id。
  • 时间戳:特征组通常包含事件时间戳(Event Timestamp),用于支持时间旅行(Time Travel)和点查询(Point-in-Time Query)。
  • 版本控制:特征组支持 Schema 演进和版本管理,确保特征定义的变更可追溯。
# 特征组定义示例(Python DSL 风格)
feature_group = FeatureGroup(
    name="user_transaction_aggregates",
    entity="user_id",
    primary_key=["user_id", "event_date"],
    features=[
        Feature(name="total_transaction_amount_7d", dtype=Float64),
        Feature(name="transaction_count_7d", dtype=Int64),
        Feature(name="max_transaction_amount_7d", dtype=Float64),
    ],
    event_timestamp_column="event_date",
    online_enabled=True,  # 支持在线服务
)

3. 特征视图(Feature View)

特征视图是面向模型的特征抽象层。它从一个或多个特征组中选取特征,并定义特征的时间窗口、聚合逻辑以及特征与模型之间的映射关系。特征视图是模型训练和推理的直接数据源。

  • 特征选择:从特征组中挑选模型所需的特征子集。
  • 时间窗口:定义特征的时间范围(如近 7 天、近 30 天),确保训练和推理使用相同的时间逻辑。
  • 特征变换:支持在视图层进行简单的特征变换(如归一化、分箱),但复杂变换建议在特征组层完成。
# 特征视图定义示例
feature_view = FeatureView(
    name="user_risk_features_v1",
    feature_groups=["user_transaction_aggregates", "user_profile_features"],
    features=[
        "user_transaction_aggregates.total_transaction_amount_7d",
        "user_transaction_aggregates.transaction_count_7d",
        "user_profile_features.credit_score",
        "user_profile_features.income_level",
    ],
    ttl=timedelta(days=30),  # 特征有效时间
    online_serving=True,
)
最佳实践:一个特征视图通常对应一个模型版本。当模型迭代时,建议创建新的特征视图版本,而不是修改现有视图,以保持实验的可复现性。

4. 特征服务(Feature Service)

特征服务是特征存储对外提供在线特征读取的接口层。它封装了特征视图的在线存储细节,提供低延迟、高并发的特征检索能力。特征服务通常暴露 gRPC 或 HTTP API,供在线推理服务调用。

  • 批量获取:支持一次请求获取多个实体的多个特征,减少网络开销。
  • 特征缓存:内置本地缓存(如 LRU Cache)和分布式缓存(如 Redis Cluster),降低后端存储压力。
  • 降级策略:当在线存储不可用时,可降级到离线存储或返回默认值,保证服务可用性。
# 特征服务调用示例(gRPC 风格)
request = GetOnlineFeaturesRequest(
    feature_view="user_risk_features_v1",
    entity_keys=[
        EntityKey(entity_id="user_123"),
        EntityKey(entity_id="user_456"),
    ],
    features=[
        "total_transaction_amount_7d",
        "transaction_count_7d",
        "credit_score",
    ]
)
response = feature_service.get_online_features(request)
# 返回:{ "user_123": { "total_transaction_amount_7d": 15000.0, ... }, ... }

5. 概念关系与架构总览

以下 SVG 图展示了四个核心概念之间的层级关系与数据流向,帮助理解它们在 Feature Store 中的定位。

Feature Store 核心概念关系图 数据源层(Data Sources) 交易流水表 | 用户画像表 | 设备指纹表 | 外部征信数据 特征组(Feature Group) 用户交易聚合特征组 | 用户画像特征组 | 设备风险特征组 实体绑定:user_id / device_id | 时间戳:event_date 特征视图(Feature View) 用户风险特征 v1 | 交易反欺诈特征 v2 | 额度模型特征 v3 特征选择 | 时间窗口(TTL) | 模型映射 特征服务(Feature Service) gRPC / HTTP API | 批量获取 | 缓存降级 说明:数据从数据源流入特征组进行聚合,特征视图按模型需求选择特征,特征服务提供在线读取接口。

6. 金融场景中的概念映射

以“实时交易反欺诈”场景为例,展示上述概念如何落地:

概念 金融实例 说明
数据源 交易流水 Kafka Topic、用户信息 MySQL 表 实时流与离线批数据
特征组 transaction_agg_feature_group 按 user_id 聚合近 1 小时/24 小时交易金额、次数、设备变化
特征视图 fraud_detection_feature_view_v2 选取交易聚合特征 + 用户历史行为特征 + 设备风险评分
特征服务 fraud_feature_service 风控引擎在每笔交易到达时,毫秒级获取该用户的最新特征
常见陷阱:在金融场景中,特征视图的 TTL(Time-To-Live)设置不当会导致特征过期或数据泄露。例如,在贷前审批模型中,如果 TTL 设置过长,可能会引入未来信息(Look-ahead Bias),导致模型在回测时表现优异,上线后效果大幅下降。建议 TTL 严格对齐业务时间窗口。

7. 离线与在线特征的一致性保障

为了确保离线训练与在线推理的特征一致,Feature Store 通常采用以下机制:

  • 同一份特征定义:特征组和特征视图的 Schema 在离线与在线之间共享,避免手工复制逻辑。
  • 特征计算管道复用:使用同一套特征计算代码(如 Spark 作业)生成离线训练数据,同时将结果写入在线 KV 存储。
  • 点查询验证:在模型上线前,对同一实体的离线特征与在线特征进行逐字段比对,确保数值一致。
# 离线-在线一致性校验示例(伪代码)
def validate_offline_online_consistency(entity_id, feature_view):
    offline_features = get_offline_features(entity_id, feature_view, timestamp="2025-01-15")
    online_features = get_online_features(entity_id, feature_view)
    for feature_name in offline_features.keys():
        if abs(offline_features[feature_name] - online_features[feature_name]) > 1e-6:
            raise ValueError(f"Feature {feature_name} mismatch: offline={offline_features[feature_name]}, online={online_features[feature_name]}")
    print("Consistency check passed.")

通过上述四个核心概念的清晰划分与协作,金融 Feature Store 能够同时支撑离线模型训练的高吞吐需求与在线推理的低延迟要求,成为金融科技中台的关键基础设施。