X 推荐算法特征系统详解:230+ 特征全解析
目录
- [X 推荐算法特征系统详解:230+ 特征全解析](#X 推荐算法特征系统详解:230+ 特征全解析)
-
- 前言
- 一、特征系统概述
-
- [1.1 什么是特征?](#1.1 什么是特征?)
- [1.2 特征分类](#1.2 特征分类)
- [1.3 特征统计](#1.3 特征统计)
- [二、候选特征详解(160+ 个)](#二、候选特征详解(160+ 个))
-
- [2.1 基础信息特征(8个)](#2.1 基础信息特征(8个))
- [2.2 作者相关特征(15个)](#2.2 作者相关特征(15个))
- [2.3 对话相关特征(6个)](#2.3 对话相关特征(6个))
- [2.4 搜索与评分特征(4个)](#2.4 搜索与评分特征(4个))
- [2.5 交互统计特征(10个)](#2.5 交互统计特征(10个))
- [2.6 内容安全特征(Grok)(12个)](#2.6 内容安全特征(Grok)(12个))
- [2.7 去重特征(2个)](#2.7 去重特征(2个))
- [2.8 话题与上下文特征(4个)](#2.8 话题与上下文特征(4个))
- [2.9 推文类型特征(15个)](#2.9 推文类型特征(15个))
- [2.10 评分相关特征(6个)](#2.10 评分相关特征(6个))
- [2.11 内容特征(15个)](#2.11 内容特征(15个))
- [2.12 媒体特征(18个)](#2.12 媒体特征(18个))
- [2.13 社交图谱特征(5个)](#2.13 社交图谱特征(5个))
- [2.14 Tweetypie 相关特征(5个)](#2.14 Tweetypie 相关特征(5个))
- [2.15 其他候选特征(10个)](#2.15 其他候选特征(10个))
- [2.16 对话模块相关特征(7个)](#2.16 对话模块相关特征(7个))
- [2.17 用户相关特征(2个)](#2.17 用户相关特征(2个))
- [2.18 社交证明特征(3个)](#2.18 社交证明特征(3个))
- [三、查询特征详解(60+ 个)](#三、查询特征详解(60+ 个))
-
- [3.1 用户基础信息特征(12个)](#3.1 用户基础信息特征(12个))
- [3.2 用户偏好与设置特征(5个)](#3.2 用户偏好与设置特征(5个))
- [3.3 用户行为特征(8个)](#3.3 用户行为特征(8个))
- [3.4 用户兴趣特征(2个)](#3.4 用户兴趣特征(2个))
- [3.5 请求上下文特征(20个)](#3.5 请求上下文特征(20个))
- [3.6 时间相关特征(4个)](#3.6 时间相关特征(4个))
- [3.7 已服务内容特征(6个)](#3.7 已服务内容特征(6个))
- [3.8 缓存与持久化特征(3个)](#3.8 缓存与持久化特征(3个))
- [3.9 过滤与去重特征(3个)](#3.9 过滤与去重特征(3个))
- [3.10 用户健康与信号特征(3个)](#3.10 用户健康与信号特征(3个))
- [3.11 配置与模型特征(2个)](#3.11 配置与模型特征(2个))
- [3.12 嵌入特征(2个)](#3.12 嵌入特征(2个))
- [3.13 注册与来源特征(2个)](#3.13 注册与来源特征(2个))
- [3.14 其他查询特征(3个)](#3.14 其他查询特征(3个))
- 四、结果特征详解(10个)
-
- [4.1 统计特征(5个)](#4.1 统计特征(5个))
- [4.2 对话模块结果特征(4个)](#4.2 对话模块结果特征(4个))
- 五、特征在推荐流程中的使用
-
- [5.1 特征提取阶段](#5.1 特征提取阶段)
- [5.2 模型评分阶段](#5.2 模型评分阶段)
- [5.3 过滤阶段](#5.3 过滤阶段)
- [5.4 排序阶段](#5.4 排序阶段)
- 六、关键特征深度解析
-
- [6.1 评分特征体系](#6.1 评分特征体系)
- [6.2 用户行为特征](#6.2 用户行为特征)
- [6.3 内容安全特征](#6.3 内容安全特征)
- [6.4 社交图谱特征](#6.4 社交图谱特征)
- 七、特征提取流程
-
- [7.1 特征提取 Pipeline](#7.1 特征提取 Pipeline)
- [7.2 特征提取器类型](#7.2 特征提取器类型)
- [7.3 特征提取优化](#7.3 特征提取优化)
- 八、特征与模型的关系
-
- [8.1 DataRecord 兼容特征](#8.1 DataRecord 兼容特征)
- [8.2 模型输入特征](#8.2 模型输入特征)
- [8.3 模型输出特征](#8.3 模型输出特征)
- 九、特征使用最佳实践
-
- [9.1 特征命名规范](#9.1 特征命名规范)
- [9.2 特征类型选择](#9.2 特征类型选择)
- [9.3 特征提取优化](#9.3 特征提取优化)
- [9.4 特征访问模式](#9.4 特征访问模式)
- 十、总结
-
- [10.1 特征系统特点](#10.1 特征系统特点)
- [10.2 关键特征总结](#10.2 关键特征总结)
- [10.3 特征数量统计](#10.3 特征数量统计)
- [10.4 学习建议](#10.4 学习建议)
- 附录:完整特征列表
-
- [A. 候选特征完整列表(160个)](#A. 候选特征完整列表(160个))
-
- [A.1 基础信息(8个)](#A.1 基础信息(8个))
- [A.2 作者相关(15个)](#A.2 作者相关(15个))
- [A.3 对话相关(6个)](#A.3 对话相关(6个))
- [A.4 搜索与评分(4个)](#A.4 搜索与评分(4个))
- [A.5 交互统计(10个)](#A.5 交互统计(10个))
- [A.6 内容安全(Grok)(12个)](#A.6 内容安全(Grok)(12个))
- [A.7 去重(2个)](#A.7 去重(2个))
- [A.8 话题与上下文(4个)](#A.8 话题与上下文(4个))
- [A.9 推文类型(15个)](#A.9 推文类型(15个))
- [A.10 评分相关(6个)](#A.10 评分相关(6个))
- [A.11 内容特征(15个)](#A.11 内容特征(15个))
- [A.12 媒体特征(18个)](#A.12 媒体特征(18个))
- [A.13 社交图谱(5个)](#A.13 社交图谱(5个))
- [A.14 Tweetypie 相关(5个)](#A.14 Tweetypie 相关(5个))
- [A.15 其他候选特征(10个)](#A.15 其他候选特征(10个))
- [A.16 对话模块(7个)](#A.16 对话模块(7个))
- [A.17 用户相关(2个)](#A.17 用户相关(2个))
- [A.18 社交证明(3个)](#A.18 社交证明(3个))
- [B. 查询特征完整列表(60个)](#B. 查询特征完整列表(60个))
-
- [B.1 用户基础信息(12个)](#B.1 用户基础信息(12个))
- [B.2 用户偏好与设置(5个)](#B.2 用户偏好与设置(5个))
- [B.3 用户行为(8个)](#B.3 用户行为(8个))
- [B.4 用户兴趣(2个)](#B.4 用户兴趣(2个))
- [B.5 请求上下文(18个)](#B.5 请求上下文(18个))
- [B.6 时间相关(4个)](#B.6 时间相关(4个))
- [B.7 已服务内容(6个)](#B.7 已服务内容(6个))
- [B.8 缓存与持久化(3个)](#B.8 缓存与持久化(3个))
- [B.9 过滤与去重(3个)](#B.9 过滤与去重(3个))
- [B.10 用户健康与信号(3个)](#B.10 用户健康与信号(3个))
- [B.11 配置与模型(2个)](#B.11 配置与模型(2个))
- [B.12 嵌入特征(2个)](#B.12 嵌入特征(2个))
- [B.13 注册与来源(2个)](#B.13 注册与来源(2个))
- [B.14 其他查询特征(2个)](#B.14 其他查询特征(2个))
- [C. 结果特征完整列表(10个)](#C. 结果特征完整列表(10个))
-
- [C.1 统计特征(5个)](#C.1 统计特征(5个))
- [C.2 对话模块结果(4个)](#C.2 对话模块结果(4个))
- 十一、特征系统架构图
- 十二、常见问题
-
- [Q1: 为什么需要这么多特征?](#Q1: 为什么需要这么多特征?)
- [Q2: 特征是如何提取的?](#Q2: 特征是如何提取的?)
- [Q3: 特征和模型的关系是什么?](#Q3: 特征和模型的关系是什么?)
- [Q4: 如何添加新特征?](#Q4: 如何添加新特征?)
- 结语
前言
在 X(原 Twitter)的推荐系统中,特征(Features)是连接数据和模型的核心桥梁。HomeFeatures.scala 文件定义了 Home Mixer 服务中使用的所有特征,这些特征在推荐 Pipeline 的各个阶段发挥着关键作用。本文将详细介绍这 230+ 个特征,帮助读者深入理解推荐系统的数据流。
一、特征系统概述
1.1 什么是特征?
在推荐系统中,特征是描述候选内容(推文)和用户上下文的属性。例如:
- 推文的点赞数
- 作者是否认证
- 用户的历史行为
- 请求的时间戳
这些特征被用于:
- 模型评分:输入到机器学习模型进行预测
- 内容过滤:判断内容是否符合展示条件
- 业务规则:应用各种启发式规则
1.2 特征分类
Home Mixer 的特征系统将特征分为三大类:
- 候选特征(Candidate Features):绑定到推文候选,描述推文的各种属性
- 查询特征(Query Features):绑定到查询请求,描述用户和请求上下文
- 结果特征(Result Features):用于结果统计和呈现
1.3 特征统计
- 总特征数:约 230 个
- 候选特征:约 160 个
- 查询特征:约 60 个
- 结果特征:约 10 个
二、候选特征详解(160+ 个)
候选特征绑定到 TweetCandidate,用于描述推文候选的各种属性。
2.1 基础信息特征(8个)
这些特征描述推文的基本信息:
| 特征名称 | 类型 | 说明 |
|---|---|---|
AncestorsFeature |
Seq[TweetAncestor] |
祖先推文列表(用于对话模块) |
AudioSpaceMetaDataFeature |
Option[AudioSpaceMetaData] |
音频空间元数据 |
ListIdFeature |
Option[Long] |
列表 ID(如果来自列表) |
ListNameFeature |
Option[String] |
列表名称 |
ValidLikedByUserIdsFeature |
Seq[Long] |
有效点赞用户 ID 列表 |
BookmarkedTweetTimestamp |
Option[Long] |
收藏推文的时间戳 |
ArticleIdFeature |
Option[Long] |
文章 ID(如果是文章推文) |
ArticlePreviewTextFeature |
Option[String] |
文章预览文本 |
2.2 作者相关特征(15个)
作者特征描述推文作者的各种属性,是推荐系统的重要信号:
| 特征名称 | 类型 | 说明 |
|---|---|---|
AuthorIdFeature |
Option[Long] |
作者 ID(DataRecord 兼容) |
AuthorAccountAge |
Option[Duration] |
作者账户年龄 |
AuthorIsBlueVerifiedFeature |
Boolean |
是否蓝标认证 |
AuthorIsGoldVerifiedFeature |
Boolean |
是否金标认证 |
AuthorIsGrayVerifiedFeature |
Boolean |
是否灰标认证 |
AuthorIsLegacyVerifiedFeature |
Boolean |
是否传统认证 |
AuthorIsCreatorFeature |
Boolean |
是否创作者 |
AuthorIsProtectedFeature |
Boolean |
是否受保护账户 |
AuthorFollowersFeature |
Option[Long] |
作者粉丝数 |
ViralContentCreatorFeature |
Boolean |
是否病毒内容创作者 |
GrokContentCreatorFeature |
Boolean |
是否 Grok 内容创作者 |
GorkContentCreatorFeature |
Boolean |
是否 Gork 内容创作者 |
AuthoredByContextualUserFeature |
Boolean |
是否由上下文用户创作 |
AuthorSafetyLabels |
Option[Seq[String]] |
作者安全标签 |
SourceUserIdFeature |
Option[Long] |
源用户 ID(转发时使用) |
使用场景:
- 判断作者的可信度
- 应用作者多样性规则
- 过滤低质量作者的内容
2.3 对话相关特征(6个)
对话特征用于处理回复和对话模块:
| 特征名称 | 类型 | 说明 |
|---|---|---|
ConversationFeature |
Option[ConversationFeatures] |
对话特征对象 |
ConversationModuleFocalTweetIdFeature |
Option[Long] |
对话模块焦点推文 ID |
ConversationModuleIdFeature |
Option[Long] |
对话模块 ID(根推文 ID) |
DirectedAtUserIdFeature |
Option[Long] |
定向用户 ID(@提及) |
ExclusiveConversationAuthorIdFeature |
Option[Long] |
独占对话作者 ID |
InReplyToTweetIdFeature |
Option[Long] |
回复的推文 ID |
InReplyToUserIdFeature |
Option[Long] |
回复的用户 ID |
使用场景:
- 构建对话模块
- 判断推文是否为回复
- 处理对话上下文
2.4 搜索与评分特征(4个)
这些特征来自 Earlybird 搜索索引:
| 特征名称 | 类型 | 说明 |
|---|---|---|
EarlybirdFeature |
Option[ThriftTweetFeatures] |
Earlybird 搜索特征 |
EarlybirdScoreFeature |
Option[Double] |
Earlybird 搜索分数 |
EarlybirdSearchResultFeature |
Option[ThriftSearchResult] |
Earlybird 搜索结果 |
EntityTokenFeature |
Option[String] |
实体令牌 |
使用场景:
- 从搜索索引获取候选
- 使用 Earlybird 分数进行初步排序
2.5 交互统计特征(10个)
交互特征统计推文的各种交互数据:
| 特征名称 | 类型 | 说明 |
|---|---|---|
FavoritedByCountFeature |
Double |
点赞数(DataRecord 兼容) |
FavoritedByUserIdsFeature |
Seq[Long] |
点赞用户 ID 列表 |
RetweetedByCountFeature |
Double |
转发数(DataRecord 兼容) |
RetweetedByEngagerIdsFeature |
Seq[Long] |
转发用户 ID 列表 |
RepliedByCountFeature |
Double |
回复数(DataRecord 兼容) |
RepliedByEngagerIdsFeature |
Seq[Long] |
回复用户 ID 列表 |
FollowedByUserIdsFeature |
Seq[Long] |
关注用户 ID 列表 |
NonSelfFavoritedByUserIdsFeature |
Seq[Long] |
非自己点赞用户 ID 列表 |
FeedbackHistoryFeature |
Seq[FeedbackEntry] |
反馈历史 |
ViewCountFeature |
Option[Long] |
观看次数 |
使用场景:
- 作为模型输入特征
- 计算内容热度
- 社交证明(显示谁点赞/转发了推文)
2.6 内容安全特征(Grok)(12个)
Grok 是 X 的内容理解系统,提供内容安全检测:
| 特征名称 | 类型 | 说明 |
|---|---|---|
GrokTranslatedPostIsCachedFeature |
Boolean |
Grok 翻译推文是否缓存 |
GrokVideoMetadataFeature |
Option[AnnotatedVideoDeserialized] |
Grok 视频元数据 |
GrokCategoryDataRecordFeature |
Map[String, Double] |
Grok 类别分数(DataRecord 兼容) |
GrokTagsFeature |
Set[String] |
Grok 标签(DataRecord 兼容) |
GrokIsGoreFeature |
Option[Boolean] |
是否血腥内容(DataRecord 兼容) |
GrokIsNsfwFeature |
Option[Boolean] |
是否 NSFW(DataRecord 兼容) |
GrokIsSoftNsfwFeature |
Option[Boolean] |
是否软 NSFW(DataRecord 兼容) |
GrokIsSpamFeature |
Option[Boolean] |
是否垃圾内容(DataRecord 兼容) |
GrokIsViolentFeature |
Option[Boolean] |
是否暴力内容(DataRecord 兼容) |
GrokIsLowQualityFeature |
Option[Boolean] |
是否低质量(DataRecord 兼容) |
GrokIsOcrFeature |
Option[Boolean] |
是否 OCR(DataRecord 兼容) |
GrokSunnyScoreFeature |
Option[Double] |
Grok 阳光分数(DataRecord 兼容) |
GrokPoliticalInclinationFeature |
Option[PoliticalInclination] |
Grok 政治倾向(仅用于指标) |
GrokSlopScoreFeature |
Option[Long] |
Grok Slop 分数 |
GrokAnnotationsFeature |
Option[GrokAnnotations] |
Grok 注释 |
GrokTopCategoryFeature |
Option[Long] |
Grok 顶级类别 |
使用场景:
- 内容安全过滤
- 用户偏好设置(NSFW 过滤)
- 内容质量评估
2.7 去重特征(2个)
用于内容去重:
| 特征名称 | 类型 | 说明 |
|---|---|---|
DedupClusterIdFeature |
Option[Long] |
去重聚类 ID |
DedupClusterId88Feature |
Option[Long] |
去重聚类 ID 88 |
使用场景:
- 避免展示相似内容
- 基于聚类的内容去重
2.8 话题与上下文特征(4个)
描述推文的话题和上下文信息:
| 特征名称 | 类型 | 说明 |
|---|---|---|
TopicIdSocialContextFeature |
Option[Long] |
话题社交上下文 ID |
TopicContextFunctionalityTypeFeature |
Option[TopicContextFunctionalityType] |
话题上下文功能类型 |
BasketballContextFeature |
Option[BasketballContext] |
篮球上下文 |
GenericPostContextFeature |
Option[GenericContext] |
通用推文上下文 |
2.9 推文类型特征(15个)
判断推文的类型和属性:
| 特征名称 | 类型 | 说明 |
|---|---|---|
FromInNetworkSourceFeature |
Boolean |
是否来自内部网络源 |
FullScoringSucceededFeature |
Boolean |
完整评分是否成功 |
HasDisplayedTextFeature |
Boolean |
是否有显示文本 |
IsArticleFeature |
Boolean |
是否是文章 |
IsAncestorCandidateFeature |
Boolean |
是否是祖先候选 |
IsBoostedCandidateFeature |
Boolean |
是否是推广候选 |
IsExtendedReplyFeature |
Boolean |
是否是扩展回复(DataRecord 兼容) |
IsInReplyToReplyOrDirectedFeature |
Boolean |
是否回复回复或定向 |
IsInReplyToRetweetFeature |
Boolean |
是否回复转发 |
IsRandomTweetFeature |
Boolean |
是否随机推文(DataRecord 兼容) |
IsReadFromCacheFeature |
Boolean |
是否从缓存读取 |
IsRetweetFeature |
Boolean |
是否是转发 |
IsRetweetedReplyFeature |
Boolean |
是否是转发的回复 |
IsSupportAccountReplyFeature |
Boolean |
是否是支持账户回复 |
IsColdStartPostFeature |
Boolean |
是否是冷启动推文 |
2.10 评分相关特征(6个)
这些是推荐系统的核心评分特征:
| 特征名称 | 类型 | 说明 |
|---|---|---|
PredictionRequestIdFeature |
Option[Long] |
预测请求 ID(用于追踪) |
PhoenixScoreFeature |
Option[Double] |
Phoenix 模型分数 |
ScoreFeature |
Option[Double] |
最终排序分数(最重要) |
WeightedModelScoreFeature |
Option[Double] |
加权模型分数(重排序使用) |
TweetMixerScoreFeature |
Option[Double] |
Tweet Mixer 分数(DataRecord 兼容) |
LastScoredTimestampMsFeature |
Option[Long] |
最后评分时间戳 |
使用场景:
ScoreFeature:最终排序的依据WeightedModelScoreFeature:重排序阶段的分数PhoenixScoreFeature:Phoenix 模型的预测分数
2.11 内容特征(15个)
描述推文的内容属性:
| 特征名称 | 类型 | 说明 |
|---|---|---|
SemanticCoreIdFeature |
Option[Long] |
语义核心 ID |
SimclustersTweetTopKClustersWithScoresFeature |
Map[String, Double] |
SimClusters 推文 TopK 聚类分数 |
SourceTweetIdFeature |
Option[Long] |
源推文 ID(转发时) |
OriginalTweetIdFeature |
Option[Long] |
原始推文 ID(DataRecord 兼容) |
TweetLanguageFeature |
Option[String] |
推文语言 |
TweetTextFeature |
Option[String] |
推文文本 |
TweetTextTokensFeature |
Option[Seq[Int]] |
推文文本令牌 |
TweetUrlsFeature |
Seq[String] |
推文 URL 列表 |
TweetLanguageFromTweetypieFeature |
Option[String] |
来自 Tweetypie 的推文语言 |
QuotedTweetIdFeature |
Option[Long] |
引用推文 ID |
QuotedUserIdFeature |
Option[Long] |
引用用户 ID |
TweetTypeMetricsFeature |
Option[Seq[Byte]] |
推文类型指标 |
SourceSignalFeature |
Option[SourceSignal] |
源信号 |
DebugStringFeature |
Option[String] |
调试字符串 |
EntityTokenFeature |
Option[String] |
实体令牌 |
2.12 媒体特征(18个)
描述推文的媒体内容:
| 特征名称 | 类型 | 说明 |
|---|---|---|
TweetMediaIdsFeature |
Seq[Long] |
推文媒体 ID 列表 |
TweetMediaClusterIdsFeature |
Map[Long, Long] |
推文媒体聚类 ID |
TweetMediaCompletionRateFeature |
Option[Double] |
推文媒体完成率 |
ClipImageClusterIdsFeature |
Map[Long, Long] |
剪辑图片聚类 ID |
MultiModalEmbeddingsFeature |
Option[Seq[Double]] |
多模态嵌入 |
FirstMediaIdFeature |
Option[Long] |
第一个媒体 ID(DataRecord 兼容) |
NumImagesFeature |
Option[Int] |
图片数量 |
HasImageFeature |
Boolean |
是否有图片 |
HasVideoFeature |
Boolean |
是否有视频 |
HasMultipleMedia |
Boolean |
是否有多个媒体 |
VideoDurationMsFeature |
Option[Int] |
视频时长(毫秒) |
VideoAspectRatioFeature |
Option[Float] |
视频宽高比 |
VideoDisplayTypeFeature |
Option[ModuleDisplayType] |
视频显示类型 |
VideoHeightFeature |
Option[Short] |
视频高度 |
VideoWidthFeature |
Option[Short] |
视频宽度 |
MediaIdFeature |
Option[Long] |
媒体 ID |
MediaCategoryFeature |
Option[MediaCategory] |
媒体类别 |
MediaUnderstandingAnnotationIdsFeature |
Seq[Long] |
媒体理解注释 ID |
使用场景:
- 视频内容推荐
- 媒体质量评估
- 媒体去重
2.13 社交图谱特征(5个)
描述推文在社交图谱中的关系:
| 特征名称 | 类型 | 说明 |
|---|---|---|
MentionUserIdFeature |
Seq[Long] |
提及用户 ID 列表 |
MentionScreenNameFeature |
Seq[String] |
提及用户名列表 |
InNetworkFeature |
Boolean |
是否在内部网络(带默认值 true) |
SGSValidLikedByUserIdsFeature |
Seq[Long] |
SGS 有效点赞用户 ID |
SGSValidFollowedByUserIdsFeature |
Seq[Long] |
SGS 有效关注用户 ID |
使用场景:
- 判断内容来源(内部网络 vs 外部网络)
- 社交证明(显示谁点赞/关注了)
2.14 Tweetypie 相关特征(5个)
来自 Tweetypie 服务的特征:
| 特征名称 | 类型 | 说明 |
|---|---|---|
IsHydratedFeature |
Boolean |
是否已水合(数据是否完整) |
OonNsfwFeature |
Boolean |
是否 OON NSFW |
QuotedTweetDroppedFeature |
Boolean |
引用推文是否被丢弃 |
AuthorEnabledPreviewsFeature |
Boolean |
作者是否启用预览 |
IsTweetPreviewFeature |
Boolean |
是否是推文预览 |
2.15 其他候选特征(10个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
SlopAuthorFeature |
Boolean |
Slop 作者标识 |
SlopAuthorScoreFeature |
Option[Double] |
Slop 作者分数 |
CachedCandidatePipelineIdentifierFeature |
Option[String] |
缓存的候选 Pipeline 标识符 |
PositionFeature |
Option[Int] |
位置(在候选列表中的位置) |
ServedTypeFeature |
ServedType |
服务类型 |
TSPMetricTagFeature |
Set[MetricTag] |
TSP 指标标签 |
SemanticAnnotationIdsFeature |
Seq[Long] |
语义注释 ID |
CurrentPinnedTweetFeature |
Option[Long] |
当前置顶推文 |
RequestJoinIdFeature |
Option[Long] |
请求加入 ID |
AdTagUrlFeature |
Option[String] |
广告标签 URL |
2.16 对话模块相关特征(7个)
用于对话模块的呈现:
| 特征名称 | 类型 | 说明 |
|---|---|---|
ServedInConversationModuleFeature |
Boolean |
是否在对话模块中服务 |
ConversationModule2DisplayedTweetsFeature |
Boolean |
对话模块显示推文数 |
ConversationModuleHasGapFeature |
Boolean |
对话模块是否有间隙 |
FocalTweetAuthorIdFeature |
Option[Long] |
焦点推文作者 ID |
FocalTweetInNetworkFeature |
Option[Boolean] |
焦点推文是否在内部网络 |
FocalTweetRealNamesFeature |
Option[Map[Long, String]] |
焦点推文真实姓名 |
FocalTweetScreenNamesFeature |
Option[Map[Long, String]] |
焦点推文用户名 |
2.17 用户相关特征(2个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
ViewerIdFeature |
Long |
查看者 ID(DataRecord 兼容) |
IsColdStartPostFeature |
Boolean |
是否是冷启动推文 |
2.18 社交证明特征(3个)
用于显示社交证明信息:
| 特征名称 | 类型 | 说明 |
|---|---|---|
ScreenNamesFeature |
Map[Long, String] |
用户名映射 |
RealNamesFeature |
Map[Long, String] |
真实姓名映射 |
TweetAgeFeature |
Option[Long] |
推文年龄 |
三、查询特征详解(60+ 个)
查询特征绑定到 PipelineQuery,描述用户和请求的上下文信息。
3.1 用户基础信息特征(12个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
AccountAgeFeature |
Option[Time] |
账户年龄 |
UserFollowingCountFeature |
Option[Int] |
用户关注数 |
UserFollowersCountFeature |
Option[Int] |
用户粉丝数 |
UserScreenNameFeature |
Option[String] |
用户屏幕名称 |
UserStateFeature |
Option[UserState] |
用户状态 |
UserTypeFeature |
Option[UserType] |
用户类型 |
UuaUserGenderFeature |
Option[String] |
UUA 用户性别(DataRecord 兼容) |
UuaUserStateFeature |
Option[Long] |
UUA 用户状态(DataRecord 兼容) |
UuaUserAgeBucketFeature |
Option[String] |
UUA 用户年龄分组(DataRecord 兼容) |
ViewerSafetyLabels |
Option[Seq[String]] |
查看者安全标签 |
ViewerIsRateLimited |
Boolean |
查看者是否被限流 |
ViewerHasJobRecommendationsEnabled |
Boolean |
查看者是否启用工作推荐 |
3.2 用户偏好与设置特征(5个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
ViewerHasPremiumTier |
Boolean |
查看者是否有高级会员 |
ViewerHasRecruitingOrganizationRecommendationsEnabled |
Boolean |
查看者是否启用招聘组织推荐 |
ViewerAllowsAdsPersonalizationFeature |
Option[Boolean] |
查看者是否允许广告个性化 |
ViewerAllowsForYouRecommendationsFeature |
Option[Boolean] |
查看者是否允许"为你推荐" |
ViewerAllowsDataSharingFeature |
Option[Boolean] |
查看者是否允许数据共享 |
3.3 用户行为特征(8个)
这些是推荐系统的核心用户信号:
| 特征名称 | 类型 | 说明 |
|---|---|---|
UserActionsFeature |
Option[UserActionSequence] |
用户行为序列(最重要) |
UserActionsByteArrayFeature |
Option[Array[Byte]] |
用户行为字节数组 |
UserActionsSizeFeature |
Option[Int] |
用户行为大小 |
UserActionsContainsExplicitSignalsFeature |
Boolean |
用户行为是否包含显式信号 |
UserRecentEngagementTweetIdsFeature |
Seq[Long] |
用户最近参与推文 ID |
UserLastExplicitSignalTimeFeature |
Option[Time] |
用户最后显式信号时间 |
UserEngagedLanguagesFeature |
Set[String] |
用户参与语言(DataRecord 兼容) |
UserUnderstandableLanguagesFeature |
Seq[String] |
用户可理解语言 |
使用场景:
UserActionsFeature:Phoenix 模型的主要输入- 个性化推荐
- 语言匹配
3.4 用户兴趣特征(2个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
UserFollowedTopicsCountFeature |
Option[Int] |
用户关注话题数 |
FollowsSportsAccountFeature |
Boolean |
是否关注体育账户 |
3.5 请求上下文特征(20个)
描述请求的上下文信息:
| 特征名称 | 类型 | 说明 |
|---|---|---|
ClientIdFeature |
Option[Long] |
客户端 ID(DataRecord 兼容) |
DeviceCountryFeature |
Option[String] |
设备国家(DataRecord 兼容) |
DeviceLanguageFeature |
Option[String] |
设备语言(DataRecord 兼容) |
GuestIdFeature |
Option[Long] |
访客 ID(DataRecord 兼容) |
TimestampFeature |
Long |
时间戳(DataRecord 兼容) |
TimestampGMTDowFeature |
Long |
GMT 星期几(DataRecord 兼容) |
TimestampGMTHourFeature |
Long |
GMT 小时(DataRecord 兼容) |
GetInitialFeature |
Boolean |
是否获取初始(DataRecord 兼容) |
GetMiddleFeature |
Boolean |
是否获取中间(DataRecord 兼容) |
GetNewerFeature |
Boolean |
是否获取更新(DataRecord 兼容) |
GetOlderFeature |
Boolean |
是否获取更旧(DataRecord 兼容) |
IsForegroundRequestFeature |
Boolean |
是否前台请求 |
IsLaunchRequestFeature |
Boolean |
是否启动请求 |
HasDarkRequestFeature |
Option[Boolean] |
是否有暗色请求 |
PollingFeature |
Boolean |
是否轮询 |
PullToRefreshFeature |
Boolean |
是否下拉刷新 |
ServedIdFeature |
Option[Long] |
服务 ID |
TweetLanguageFromLanguageSignalFeature |
Option[String] |
来自语言信号的推文语言 |
使用场景:
- 时间相关的推荐(工作日 vs 周末)
- 地理位置相关的推荐
- 请求类型判断
3.6 时间相关特征(4个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
LastNonPollingTimeFeature |
Option[Time] |
最后非轮询时间 |
LastNegativeFeedbackTimeFeature |
Option[Time] |
最后负反馈时间 |
FollowingLastNonPollingTimeFeature |
Option[Time] |
关注最后非轮询时间 |
NonPollingTimesFeature |
Seq[Long] |
非轮询时间列表 |
3.7 已服务内容特征(6个)
用于去重和避免重复展示:
| 特征名称 | 类型 | 说明 |
|---|---|---|
ServedTweetIdsFeature |
Seq[Long] |
已服务推文 ID 列表 |
ServedAuthorIdsFeature |
Map[Long, Seq[Long]] |
已服务作者 ID 映射 |
ServedTweetPreviewIdsFeature |
Seq[Long] |
已服务推文预览 ID |
TimelineServiceTweetsFeature |
Seq[Long] |
时间线服务推文 |
TLSOriginalTweetsWithAuthorFeature |
Seq[(Long, Option[Long])] |
TLS 原始推文与作者 |
TLSOriginalTweetsWithConfirmedAuthorFeature |
Seq[(Long, Long)] |
TLS 原始推文与确认作者 |
使用场景:
- 去重过滤
- 避免重复展示相同内容
3.8 缓存与持久化特征(3个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
CachedScoredTweetsFeature |
Seq[ScoredTweet] |
缓存的评分推文 |
PersistenceEntriesFeature |
Seq[TimelineResponseV3] |
持久化条目 |
HasRecentFeedbackSinceCacheTtlFeature |
Boolean |
是否有缓存 TTL 后的最近反馈 |
3.9 过滤与去重特征(3个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
DismissInfoFeature |
Map[SuggestType, Option[DismissInfo]] |
dismiss 信息(带默认值) |
ImpressionBloomFilterFeature |
ImpressionBloomFilterSeq |
印象布隆过滤器(带默认值) |
ImpressedMediaIds |
Seq[Long] |
已印象媒体 ID(带默认值) |
3.10 用户健康与信号特征(3个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
LowSignalUserFeature |
Boolean |
是否低信号用户 |
NSFWConsumerScoreFeature |
Double |
NSFW 消费者分数 |
NSFWConsumerFollowerScoreFeature |
Double |
NSFW 消费者粉丝分数 |
使用场景:
- 低信号用户使用不同的推荐策略
- NSFW 内容过滤
3.11 配置与模型特征(2个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
NaviClientConfigFeature |
NaviClientConfig |
Navi 客户端配置 |
RealGraphInNetworkScoresFeature |
Map[UserId, Double] |
Real Graph 内部网络分数 |
3.12 嵌入特征(2个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
ImmersiveClientEmbeddingsFeature |
Map[Long, Seq[Double]] |
沉浸式客户端嵌入 |
TweetAuthorFollowersFeature |
Map[Long, Option[Long]] |
推文作者粉丝映射 |
3.13 注册与来源特征(2个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
SignupSourceFeature |
Option[SignupSource] |
注册来源 |
SignupCountryFeature |
Option[String] |
注册国家 |
3.14 其他查询特征(3个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
WhoToFollowExcludedUserIdsFeature |
Seq[Long] |
关注推荐排除用户 ID(带默认值) |
CurrentDisplayedGrokTopicFeature |
Option[(Long, String)] |
当前显示的 Grok 话题(带默认值) |
四、结果特征详解(10个)
结果特征用于结果统计和呈现。
4.1 统计特征(5个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
ServedSizeFeature |
Option[Int] |
服务大小 |
UniqueAuthorCountFeature |
Option[Int] |
唯一作者数 |
MaxSingleAuthorCountFeature |
Option[Int] |
单个作者最大数量 |
UniqueCategoryCountFeature |
Option[Int] |
唯一类别数 |
MaxSingleCategoryCountFeature |
Option[Int] |
单个类别最大数量 |
使用场景:
- 监控多样性指标
- 确保作者多样性
- 确保内容类别多样性
4.2 对话模块结果特征(4个)
| 特征名称 | 类型 | 说明 |
|---|---|---|
ServedInConversationModuleFeature |
Boolean |
是否在对话模块中服务 |
ConversationModule2DisplayedTweetsFeature |
Boolean |
对话模块显示推文数 |
ConversationModuleHasGapFeature |
Boolean |
对话模块是否有间隙 |
五、特征在推荐流程中的使用
5.1 特征提取阶段
在 FeatureHydrator 中,系统从各种数据源提取特征:
scala
// 示例:提取作者特征
class AuthorFeatureHydrator extends CandidateFeatureHydrator {
override val features: Set[Feature[_, _]] = Set(
HomeFeatures.AuthorIdFeature,
HomeFeatures.AuthorFollowersFeature,
HomeFeatures.AuthorIsBlueVerifiedFeature
)
override def apply(
query: PipelineQuery,
candidates: Seq[CandidateWithFeatures[TweetCandidate]]
): Stitch[Seq[FeatureMap]] = {
// 从 Gizmoduck 服务获取作者信息
// 填充到 FeatureMap 中
}
}
5.2 模型评分阶段
在 Scorer 中,特征被转换为 DataRecord 输入模型:
scala
// 示例:使用特征进行评分
class NaviModelScorer extends Scorer {
override def apply(
query: PipelineQuery,
candidates: Seq[CandidateWithFeatures[TweetCandidate]]
): Stitch[Seq[FeatureMap]] = {
// 1. 提取特征
val dataRecords = candidates.map { candidate =>
// 将候选特征转换为 DataRecord
candidateAdapter(candidate.features)
}
// 2. 调用模型服务
modelClient.getPredictionsForBatch(dataRecords)
// 3. 提取预测分数
// 存储到 PredictedScoreFeatures 中
}
}
5.3 过滤阶段
在 Filter 中,使用特征进行内容过滤:
scala
// 示例:NSFW 过滤
class NsfwFilter extends Filter {
override def apply(
query: PipelineQuery,
candidates: Seq[CandidateWithFeatures[TweetCandidate]]
): Stitch[Seq[CandidateWithFeatures[TweetCandidate]]] = {
candidates.filter { candidate =>
// 检查 NSFW 特征
val isNsfw = candidate.features.getOrElse(
HomeFeatures.GrokIsNsfwFeature,
false
)
// 检查用户设置
val allowNsfw = query.features.getOrElse(
HomeFeatures.ViewerAllowsNsfwFeature,
false
)
!isNsfw || allowNsfw
}
}
}
5.4 排序阶段
在排序中,使用评分特征进行排序:
scala
// 使用 ScoreFeature 进行排序
val sortedCandidates = candidates.sortBy { candidate =>
-candidate.features.getOrElse(
HomeFeatures.ScoreFeature,
None
).getOrElse(0.0)
}
六、关键特征深度解析
6.1 评分特征体系
推荐系统使用多层次的评分特征:
EarlybirdScoreFeature (搜索索引分数)
↓
TweetMixerScoreFeature (Tweet Mixer 分数)
↓
PhoenixScoreFeature (Phoenix 模型分数)
↓
WeightedModelScoreFeature (加权模型分数)
↓
ScoreFeature (最终排序分数)
ScoreFeature 是最终用于排序的特征,由多个模型分数加权组合而成。
6.2 用户行为特征
UserActionsFeature 是推荐系统的核心输入之一:
- 包含用户的历史行为序列
- 用于 Phoenix 模型预测
- 支持个性化推荐
6.3 内容安全特征
Grok 特征系统提供多层次的内容安全检测:
- GrokIsNsfwFeature: 检测 NSFW 内容
- GrokIsSpamFeature: 检测垃圾内容
- GrokIsViolentFeature: 检测暴力内容
- GrokIsLowQualityFeature: 检测低质量内容
这些特征用于:
- 内容过滤
- 用户偏好设置
- 合规性检查
6.4 社交图谱特征
InNetworkFeature 是重要的社交图谱特征:
true: 推文来自用户关注的账户false: 推文来自外部网络
系统使用这个特征来:
- 平衡内部网络和外部网络内容
- 应用不同的推荐策略
七、特征提取流程
7.1 特征提取 Pipeline
用户请求
↓
【查询特征提取】
├─ 用户基础信息
├─ 用户行为序列
├─ 请求上下文
└─ 已服务内容
↓
候选生成
↓
【候选特征提取】
├─ 作者特征
├─ 内容特征
├─ 交互特征
├─ 媒体特征
└─ 安全特征
↓
模型评分
↓
【评分特征提取】
├─ 模型预测分数
└─ 加权组合分数
↓
排序与过滤
7.2 特征提取器类型
- QueryFeatureHydrator: 提取查询特征
- CandidateFeatureHydrator: 提取候选特征
- BulkCandidateFeatureHydrator: 批量提取候选特征
- DependentBulkCandidateFeatureHydrator: 依赖其他特征的批量提取
7.3 特征提取优化
- 批量提取: 减少 RPC 调用
- 缓存: 缓存常用特征
- 异步提取: 并行提取独立特征
- 条件提取: 根据配置决定是否提取
八、特征与模型的关系
8.1 DataRecord 兼容特征
约 40 个特征兼容 DataRecord 格式,可以直接用于模型:
AuthorIdFeatureFavoritedByCountFeatureGrokIsNsfwFeatureTimestampFeature- 等等
8.2 模型输入特征
模型使用约 6000 个特征,包括:
- 从
HomeFeatures中提取的特征 - 派生特征(由基础特征计算得出)
- 聚合特征(实时或批量计算)
8.3 模型输出特征
模型预测结果存储在 PredictedScoreFeatures 中:
PredictedFavoriteScoreFeaturePredictedReplyScoreFeaturePredictedRetweetScoreFeature- 等等
九、特征使用最佳实践
9.1 特征命名规范
- 使用描述性名称
- 遵循命名约定(Feature 后缀)
- 区分候选特征和查询特征
9.2 特征类型选择
- Option 类型: 特征可能不存在
- 带默认值 : 使用
FeatureWithDefaultOnFailure - DataRecord 兼容: 需要输入模型的特征
9.3 特征提取优化
- 批量提取减少网络调用
- 使用缓存避免重复提取
- 异步提取提高性能
9.4 特征访问模式
scala
// 推荐方式:使用 getOrElse 提供默认值
val authorId = candidate.features.getOrElse(
HomeFeatures.AuthorIdFeature,
None
)
// 不推荐:直接访问可能抛出异常
val authorId = candidate.features.get(HomeFeatures.AuthorIdFeature)
十、总结
10.1 特征系统特点
- 类型安全: 所有特征都有明确的类型定义
- 分类清晰: 按候选/查询/结果分类
- 功能完整: 覆盖推荐系统的各个方面
- 可扩展: 易于添加新特征
10.2 关键特征总结
- 评分特征: ScoreFeature, WeightedModelScoreFeature
- 用户信号: UserActionsFeature, LowSignalUserFeature
- 内容安全: GrokIsNsfwFeature, GrokIsSpamFeature
- 社交图谱: InNetworkFeature, FavoritedByUserIdsFeature
- 内容属性: HasVideoFeature, TweetTextFeature
10.3 特征数量统计
- 总特征数: 约 230 个
- 候选特征: 约 160 个
- 查询特征: 约 60 个
- 结果特征: 约 10 个
10.4 学习建议
- 理解特征分类: 区分候选特征和查询特征
- 掌握关键特征: 重点关注评分、用户信号、内容安全特征
- 了解特征提取: 理解特征如何从数据源提取
- 实践特征使用: 在代码中查看特征的实际使用
附录:完整特征列表
A. 候选特征完整列表(160个)
A.1 基础信息(8个)
- AncestorsFeature
- AudioSpaceMetaDataFeature
- ListIdFeature
- ListNameFeature
- ValidLikedByUserIdsFeature
- BookmarkedTweetTimestamp
- ArticleIdFeature
- ArticlePreviewTextFeature
A.2 作者相关(15个)
- AuthorIdFeature
- AuthorAccountAge
- AuthorIsBlueVerifiedFeature
- AuthorIsGoldVerifiedFeature
- AuthorIsGrayVerifiedFeature
- AuthorIsLegacyVerifiedFeature
- AuthorIsCreatorFeature
- AuthorIsProtectedFeature
- AuthorFollowersFeature
- ViralContentCreatorFeature
- GrokContentCreatorFeature
- GorkContentCreatorFeature
- AuthoredByContextualUserFeature
- AuthorSafetyLabels
- SourceUserIdFeature
A.3 对话相关(6个)
- ConversationFeature
- ConversationModuleFocalTweetIdFeature
- ConversationModuleIdFeature
- DirectedAtUserIdFeature
- ExclusiveConversationAuthorIdFeature
- InReplyToTweetIdFeature
- InReplyToUserIdFeature
A.4 搜索与评分(4个)
- EarlybirdFeature
- EarlybirdScoreFeature
- EarlybirdSearchResultFeature
- EntityTokenFeature
A.5 交互统计(10个)
- FavoritedByCountFeature
- FavoritedByUserIdsFeature
- RetweetedByCountFeature
- RetweetedByEngagerIdsFeature
- RepliedByCountFeature
- RepliedByEngagerIdsFeature
- FollowedByUserIdsFeature
- NonSelfFavoritedByUserIdsFeature
- FeedbackHistoryFeature
- ViewCountFeature
A.6 内容安全(Grok)(12个)
- GrokTranslatedPostIsCachedFeature
- GrokVideoMetadataFeature
- GrokCategoryDataRecordFeature
- GrokTagsFeature
- GrokIsGoreFeature
- GrokIsNsfwFeature
- GrokIsSoftNsfwFeature
- GrokIsSpamFeature
- GrokIsViolentFeature
- GrokIsLowQualityFeature
- GrokIsOcrFeature
- GrokSunnyScoreFeature
- GrokPoliticalInclinationFeature
- GrokSlopScoreFeature
- GrokAnnotationsFeature
- GrokTopCategoryFeature
A.7 去重(2个)
- DedupClusterIdFeature
- DedupClusterId88Feature
A.8 话题与上下文(4个)
- TopicIdSocialContextFeature
- TopicContextFunctionalityTypeFeature
- BasketballContextFeature
- GenericPostContextFeature
A.9 推文类型(15个)
- FromInNetworkSourceFeature
- FullScoringSucceededFeature
- HasDisplayedTextFeature
- IsArticleFeature
- IsAncestorCandidateFeature
- IsBoostedCandidateFeature
- IsExtendedReplyFeature
- IsInReplyToReplyOrDirectedFeature
- IsInReplyToRetweetFeature
- IsRandomTweetFeature
- IsReadFromCacheFeature
- IsRetweetFeature
- IsRetweetedReplyFeature
- IsSupportAccountReplyFeature
- IsColdStartPostFeature
A.10 评分相关(6个)
- PredictionRequestIdFeature
- PhoenixScoreFeature
- ScoreFeature ⭐
- WeightedModelScoreFeature ⭐
- TweetMixerScoreFeature
- LastScoredTimestampMsFeature
A.11 内容特征(15个)
- SemanticCoreIdFeature
- SimclustersTweetTopKClustersWithScoresFeature
- SourceTweetIdFeature
- OriginalTweetIdFeature
- TweetLanguageFeature
- TweetTextFeature
- TweetTextTokensFeature
- TweetUrlsFeature
- TweetLanguageFromTweetypieFeature
- QuotedTweetIdFeature
- QuotedUserIdFeature
- TweetTypeMetricsFeature
- SourceSignalFeature
- DebugStringFeature
- EntityTokenFeature
A.12 媒体特征(18个)
- TweetMediaIdsFeature
- TweetMediaClusterIdsFeature
- TweetMediaCompletionRateFeature
- ClipImageClusterIdsFeature
- MultiModalEmbeddingsFeature
- FirstMediaIdFeature
- NumImagesFeature
- HasImageFeature
- HasVideoFeature
- HasMultipleMedia
- VideoDurationMsFeature
- VideoAspectRatioFeature
- VideoDisplayTypeFeature
- VideoHeightFeature
- VideoWidthFeature
- MediaIdFeature
- MediaCategoryFeature
- MediaUnderstandingAnnotationIdsFeature
A.13 社交图谱(5个)
- MentionUserIdFeature
- MentionScreenNameFeature
- InNetworkFeature ⭐
- SGSValidLikedByUserIdsFeature
- SGSValidFollowedByUserIdsFeature
A.14 Tweetypie 相关(5个)
- IsHydratedFeature
- OonNsfwFeature
- QuotedTweetDroppedFeature
- AuthorEnabledPreviewsFeature
- IsTweetPreviewFeature
A.15 其他候选特征(10个)
- SlopAuthorFeature
- SlopAuthorScoreFeature
- CachedCandidatePipelineIdentifierFeature
- PositionFeature
- ServedTypeFeature
- TSPMetricTagFeature
- SemanticAnnotationIdsFeature
- CurrentPinnedTweetFeature
- RequestJoinIdFeature
- AdTagUrlFeature
A.16 对话模块(7个)
- ServedInConversationModuleFeature
- ConversationModule2DisplayedTweetsFeature
- ConversationModuleHasGapFeature
- FocalTweetAuthorIdFeature
- FocalTweetInNetworkFeature
- FocalTweetRealNamesFeature
- FocalTweetScreenNamesFeature
A.17 用户相关(2个)
- ViewerIdFeature
- IsColdStartPostFeature
A.18 社交证明(3个)
- ScreenNamesFeature
- RealNamesFeature
- TweetAgeFeature
B. 查询特征完整列表(60个)
B.1 用户基础信息(12个)
- AccountAgeFeature
- UserFollowingCountFeature
- UserFollowersCountFeature
- UserScreenNameFeature
- UserStateFeature
- UserTypeFeature
- UuaUserGenderFeature
- UuaUserStateFeature
- UuaUserAgeBucketFeature
- ViewerSafetyLabels
- ViewerIsRateLimited
- ViewerHasJobRecommendationsEnabled
B.2 用户偏好与设置(5个)
- ViewerHasPremiumTier
- ViewerHasRecruitingOrganizationRecommendationsEnabled
- ViewerAllowsAdsPersonalizationFeature
- ViewerAllowsForYouRecommendationsFeature
- ViewerAllowsDataSharingFeature
B.3 用户行为(8个)
- UserActionsFeature ⭐
- UserActionsByteArrayFeature
- UserActionsSizeFeature
- UserActionsContainsExplicitSignalsFeature
- UserRecentEngagementTweetIdsFeature
- UserLastExplicitSignalTimeFeature
- UserEngagedLanguagesFeature
- UserUnderstandableLanguagesFeature
B.4 用户兴趣(2个)
- UserFollowedTopicsCountFeature
- FollowsSportsAccountFeature
B.5 请求上下文(18个)
- ClientIdFeature
- DeviceCountryFeature
- DeviceLanguageFeature
- GuestIdFeature
- TimestampFeature
- TimestampGMTDowFeature
- TimestampGMTHourFeature
- GetInitialFeature
- GetMiddleFeature
- GetNewerFeature
- GetOlderFeature
- IsForegroundRequestFeature
- IsLaunchRequestFeature
- HasDarkRequestFeature
- PollingFeature
- PullToRefreshFeature
- ServedIdFeature
- TweetLanguageFromLanguageSignalFeature
B.6 时间相关(4个)
- LastNonPollingTimeFeature
- LastNegativeFeedbackTimeFeature
- FollowingLastNonPollingTimeFeature
- NonPollingTimesFeature
B.7 已服务内容(6个)
- ServedTweetIdsFeature ⭐
- ServedAuthorIdsFeature
- ServedTweetPreviewIdsFeature
- TimelineServiceTweetsFeature
- TLSOriginalTweetsWithAuthorFeature
- TLSOriginalTweetsWithConfirmedAuthorFeature
B.8 缓存与持久化(3个)
- CachedScoredTweetsFeature
- PersistenceEntriesFeature
- HasRecentFeedbackSinceCacheTtlFeature
B.9 过滤与去重(3个)
- DismissInfoFeature
- ImpressionBloomFilterFeature
- ImpressedMediaIds
B.10 用户健康与信号(3个)
- LowSignalUserFeature ⭐
- NSFWConsumerScoreFeature
- NSFWConsumerFollowerScoreFeature
B.11 配置与模型(2个)
- NaviClientConfigFeature
- RealGraphInNetworkScoresFeature
B.12 嵌入特征(2个)
- ImmersiveClientEmbeddingsFeature
- TweetAuthorFollowersFeature
B.13 注册与来源(2个)
- SignupSourceFeature
- SignupCountryFeature
B.14 其他查询特征(2个)
- WhoToFollowExcludedUserIdsFeature
- CurrentDisplayedGrokTopicFeature
C. 结果特征完整列表(10个)
C.1 统计特征(5个)
- ServedSizeFeature
- UniqueAuthorCountFeature ⭐
- MaxSingleAuthorCountFeature ⭐
- UniqueCategoryCountFeature
- MaxSingleCategoryCountFeature
C.2 对话模块结果(4个)
- ServedInConversationModuleFeature
- ConversationModule2DisplayedTweetsFeature
- ConversationModuleHasGapFeature
十一、特征系统架构图
┌─────────────────────────────────────────────────────────┐
│ 特征定义层 │
│ HomeFeatures.scala │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 候选特征 │ │ 查询特征 │ │ 结果特征 │ │
│ │ ~160个 │ │ ~60个 │ │ ~10个 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 特征提取层 │
│ FeatureHydrator (各种提取器) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ QueryFeature │ │ Candidate │ │ Bulk │ │
│ │ Hydrator │ │ Feature │ │ Feature │ │
│ │ │ │ Hydrator │ │ Hydrator │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 特征存储层 │
│ FeatureMap │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Map[Feature[_, _], Any] │ │
│ │ - 类型安全的特征存储 │ │
│ │ - 支持默认值 │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 特征使用层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Scorer │ │ Filter │ │ Selector │ │
│ │ (模型评分) │ │ (内容过滤) │ │ (候选选择) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
十二、常见问题
Q1: 为什么需要这么多特征?
A: 推荐系统需要从多个维度理解内容和用户:
- 内容维度: 文本、媒体、作者、交互等
- 用户维度: 行为、偏好、上下文等
- 关系维度: 社交图谱、相似性等
每个特征都提供了不同的信息,组合起来才能做出准确的推荐。
Q2: 特征是如何提取的?
A: 特征通过 FeatureHydrator 提取:
- 从外部服务获取数据(Tweetypie、Gizmoduck 等)
- 计算派生特征
- 填充到
FeatureMap中
Q3: 特征和模型的关系是什么?
A:
- 特征 → DataRecord → 模型输入
- 模型输出 → PredictedScoreFeatures → 最终分数
Q4: 如何添加新特征?
A:
- 在
HomeFeatures.scala中定义新特征 - 创建对应的
FeatureHydrator - 在 Pipeline 配置中添加 Hydrator
结语
X 推荐算法的特征系统是一个庞大而精密的工程,230+ 个特征覆盖了推荐系统的各个方面。理解这些特征的含义和使用方式,是深入理解推荐系统的关键。
参考文件:
home-mixer/server/src/main/scala/com/twitter/home_mixer/model/HomeFeatures.scalahome-mixer/server/src/main/scala/com/twitter/home_mixer/model/PredictedScoreFeature.scala