趋近智
现代机器学习系统经常处理文本、图像、音频和图等复杂的非结构化数据源。将这类数据表示为数值通常需要生成嵌入:一种密集、低维的向量表示,能够捕获语义信息。例如,自然语言处理模型可能将句子转换为512维向量,或者计算机视觉模型可能将图像表示为2048维向量。尽管这些嵌入特征功能强大,但与传统的标量特征(如计数或平均值)相比,它们在特征存储中带来了特殊的管理难题。本节讨论了有效存储、检索和管理嵌入以及其他源自非结构化数据特征的方法。
嵌入与典型的特征类型有很大不同:
这些特性影响了特征存储架构中的存储选择、检索延迟、计算工作流程和版本控制方法。
将嵌入成功集成到特征存储中,需要仔细考虑存储、访问模式和元数据管理。
嵌入通常在专门的上游流程中计算,例如使用Spark结合TensorFlow/PyTorch的批处理管道,或通过专门的模型服务端点。然后,这些预计算的向量会被摄入到特征存储中。
预计算嵌入摄入特征存储的管道。
在特征存储注册表中为嵌入定义特征时,需要指定适当的数据类型。许多特征存储支持数组类型(例如,List[float]、numpy.ndarray)。
# 特征定义示例 (SDK)
from my_feature_store_sdk import FeatureGroup, Feature, FloatList
product_embeddings_fg = FeatureGroup(
name="product_embeddings",
entities=["product_id"],
features=[
Feature(name="description_embedding_bert_v1", dtype=FloatList(size=768)),
Feature(name="image_embedding_resnet_v2", dtype=FloatList(size=2048)),
Feature(name="embedding_model_versions", dtype=String) # 元数据
],
online=True,
offline=True,
source=batch_pipeline_output, # 对上游数据源的引用
ttl=timedelta(days=30)
)
# 在特征存储中注册特征组
feature_store.register_feature_group(product_embeddings_fg)
# 摄入(通常在批处理/流式作业中完成)
embedding_data = [
{"product_id": 101,
"description_embedding_bert_v1": [0.1, 0.5, ..., -0.2], # 768个浮点数
"image_embedding_resnet_v2": [0.9, -0.1, ..., 0.3], # 2048个浮点数
"embedding_model_versions": "bert_v1;resnet_v2",
"event_timestamp": "2023-10-27T10:00:00Z"},
# ... 更多产品
]
feature_store.ingest("product_embeddings", embedding_data)
product_id),特征存储服务API从低延迟在线存储中检索相应的嵌入向量。在此环节,最小化反序列化开销和网络传输大小很重要。虽然对于高分辨率图像或长文档等原始、大型非结构化数据来说不太常见,但一些特征存储可能通过转换函数管理直接源自非结构化输入的数据特征。例如,特征存储转换可能会调用外部情感分析服务处理文本,或者运行简单的图像哈希函数。
然而,通常不建议在特征存储中存储原始非结构化数据本身。更好的做法是,如果需要,存储指向原始数据在其主要存储位置的标识符(例如,S3 URL、数据库ID),并仅将派生特征或嵌入摄入到特征存储中。
由于嵌入与创建它们的模型相关联,因此跟踪其出处很重要。
product_description_embedding_bert_v1)视为一个独立的特征。当引入新的模型版本(例如,bert_v2)时,注册一个新的特征(例如,product_description_embedding_bert_v2)。这使得使用这些特征的模型可以显式选择所需的版本。在通用特征存储中管理嵌入,为模型统一特征访问提供了便利。然而,需要考虑以下权衡:
请根据您对延迟、查询模式(ID查找与相似性搜索)以及您愿意管理的运营开销的具体要求来选择方法。对于许多需要嵌入特征以及其他特征类型通过实体ID查找进行模型推理的应用,将预计算的嵌入集成到特征存储中提供了一个统一且易于管理的方案。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造