推荐系统数据建模新范式:ByteDance维度建模全实践
你是否还在为推荐系统的数据复杂性而困扰?用户行为、物品属性、场景特征交织成的数据迷宫,如何转化为精准推荐的引擎?本文将带你深入ByteDance推荐系统(GitHub_Trending/monolith4/monolith)的维度建模实践,从特征工程到模型落地,一站式解决高维数据治理难题。
维度建模核心架构
维度建模是推荐系统的"数据骨架",通过事实表(用户-物品交互记录)与维度表(用户、物品、场景属性)的关联,构建可解释、易扩展的分析框架。ByteDance采用增强型星型模型,在经典维度建模基础上引入动态特征槽(FeatureSlot)机制,支持万亿级特征规模。
graph TD
subgraph 事实表
F[用户行为事实表] -->|关联| U[用户ID]
F -->|关联| I[物品ID]
F -->|关联| C[场景上下文]
end
subgraph 维度表
U --> UD[用户维度表<br>年龄/兴趣/活跃度]
I --> ID[物品维度表<br>类别/标签/热度]
C --> CD[场景维度表<br>时间/地域/设备]
end
subgraph 特征工程层
UD --> FS[特征槽(FeatureSlot)<br>用户 embedding]
ID --> FS
CD --> FS
end
FS --> M[Monolith模型<br>点击率预估/排序]
核心模块解析
-
特征槽机制:monolith/core/feature.py中定义的
FeatureSlot类,将同类维度特征聚合为统一接口,支持动态扩展维度属性。例如用户维度槽包含基础属性(年龄、性别)和行为特征(最近点击、兴趣标签),通过add_feature_slice方法灵活扩展维度空间。 -
动态哈希表:monolith/native_training/runtime/hash_table实现的自适应哈希表,支持维度特征的动态增删与过期淘汰,解决传统维度表的存储爆炸问题。
实践指南:从数据到特征
1. 事实表设计
推荐系统的事实表记录用户-物品交互事件,ByteDance采用稀疏存储+列存优化方案,核心字段包括:
# 简化版事实表结构 [monolith/native_training/data/datasets.py]
features = {
"user_id": tf.ragged.constant([[324], [75]], dtype=tf.int64), # 稀疏用户ID
"item_id": tf.ragged.constant([[155], [13]], dtype=tf.int64), # 稀疏物品ID
"context": {
"timestamp": tf.constant([1620000000, 1620000100], dtype=tf.int64),
"location": tf.constant(["北京", "上海"], dtype=tf.string)
},
"label": tf.constant([1.0, 0.0], dtype=tf.float32) # 点击/曝光标签
}
2. 维度表实现
ByteDance创新性地将维度表抽象为特征槽配置,通过deploy/config/samples/mlplatform_v1_mlservice.yaml定义维度属性:
# 物品维度槽配置示例
apiVersion: mlplatform.volcengine.com/v1
kind: MLService
metadata:
name: item-feature-slot
spec:
featureSlot:
slotId: 1001 # 物品维度槽ID
dim: 128 # 嵌入维度
optimizer:
type: "Adagrad"
learningRate: 0.01
expireTime: 365 # 特征自动过期时间(天)
3. 特征工程流水线
(1)特征提取
使用input_fn将原始数据转换为模型输入格式,支持RaggedTensor处理变长特征:
# [markdown/input_and_model_fn.md](https://gitcode.com/GitHub_Trending/monolith4/monolith/blob/135c491a52b151772b976af989d8bc938c44d210/markdown/input_and_model_fn.md?utm_source=gitcode_repo_files)
def input_fn(self, mode):
features = {
"user_id": tf.ragged.constant([[324], [75]], dtype=tf.int64),
"item_id": tf.ragged.constant([[155], [13]], dtype=tf.int64),
"rating": tf.constant([5.0, 2.0], dtype=tf.float32)
}
return tf.data.Dataset.from_tensors(features)
(2)维度组合
通过FeatureColumn实现多维度交叉,支持sum/mean/FirstN等组合策略:
# [monolith/native_training/feature.py](https://gitcode.com/GitHub_Trending/monolith4/monolith/blob/135c491a52b151772b976af989d8bc938c44d210/monolith/native_training/feature.py?utm_source=gitcode_repo_files)
user_fc = FeatureColumn(user_slot, "user_id", combiner=FeatureColumn.reduce_sum())
item_fc = FeatureColumn(item_slot, "item_id", combiner=FeatureColumn.first_n(10))
user_emb = user_fc.embedding_lookup(user_slice) # (batch_size, 64)
item_emb = item_fc.embedding_lookup(item_slice) # (batch_size, 64)
模型落地最佳实践
特征监控与治理
ByteDance构建了全链路特征监控体系,通过monolith/agent_service/agent_controller.py实现:
- 特征覆盖率:实时监控各维度特征的出现频率,对覆盖率低于0.1%的长尾维度自动降级
- 漂移检测:通过KL散度监测维度分布变化,触发特征重训练
- 异常值过滤:基于monolith/core/feature_test.py的校验规则,过滤异常维度值(如用户年龄>120岁)
性能优化技巧
- 维度裁剪:对用户维度表采用"近期优先"策略,仅保留最近30天活跃用户的完整维度属性
- 混合精度存储:monolith/native_training/feature.py中的
Compressor类支持float16/int8量化,降低维度特征存储成本 - 预计算缓存:热门维度组合(如"25-30岁女性+美妆品类")的embedding向量预计算,通过monolith/agent_service/model_manager.py实现LRU缓存
案例:点击率预估模型
基于维度建模的点击率预估模型结构如下:
# [monolith/native_training/native_model.py](https://gitcode.com/GitHub_Trending/monolith4/monolith/blob/135c491a52b151772b976af989d8bc938c44d210/monolith/native_training/native_model.py?utm_source=gitcode_repo_files)
def model_fn(features, mode):
# 1. 维度特征 lookup
user_emb = self.lookup_embedding_slice(features=['user_id'], slice_name='vec', slice_dim=64)
item_emb = self.lookup_embedding_slice(features=['item_id'], slice_name='vec', slice_dim=64)
# 2. 特征交互
cross_emb = tf.multiply(user_emb, item_emb) # 元素积交叉
concat_emb = tf.concat([user_emb, item_emb, cross_emb], axis=-1) # (batch_size, 192)
# 3. MLP预测
logits = tf.keras.layers.Dense(1)(
tf.keras.layers.ReLU()(
tf.keras.layers.Dense(256)(concat_emb)
)
)
return {'click_prob': tf.sigmoid(logits)}
该模型通过维度特征的低维嵌入与交叉,在公开Criteo数据集上实现89.7%的AUC,较传统FM模型提升4.2个百分点。
总结与展望
ByteDance的维度建模实践,通过特征槽抽象+动态哈希表+全链路监控三大创新,解决了推荐系统中的高维稀疏数据治理难题。核心经验包括:
- 维度即服务:将维度特征视为可扩展服务,通过FeatureSlot解耦模型与数据schema
- 存储计算分离:维度表存储与embedding计算分离,支持弹性扩展
- 数据驱动迭代:基于维度特征的反馈闭环,持续优化特征权重与维度组合
未来方向将聚焦自监督维度发现,通过monolith/native_training/unsupervised模块自动挖掘潜在维度(如"工作日通勤时段"场景维度),进一步释放维度建模的价值。
推荐系统官方文档:markdown/serving.md
特征工程源码:monolith/core/
模型训练教程:markdown/demo/
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00