深入解析Twitter推荐算法架构:gh_mirrors/th/the-algorithm项目概览
本文深入分析了Twitter推荐系统的开源实现the-algorithm,该系统采用分层架构设计,结合实时处理、机器学习模型服务和内容编排等多个关键组件,形成了一个高效、可扩展的推荐引擎。文章将从整体架构、核心组件分类、主要工作流程和技术栈构建系统四个方面进行全面解析,揭示Twitter如何为全球数亿用户提供个性化内容推荐。
Twitter推荐系统整体架构与设计理念
Twitter推荐系统是一个高度复杂且分布式的架构体系,旨在为全球数亿用户提供个性化的内容推荐体验。该系统采用了分层架构设计,结合了实时处理、机器学习模型服务和内容编排等多个关键组件,形成了一个高效、可扩展的推荐引擎。
核心架构层次
Twitter推荐系统的整体架构可以分为四个主要层次:
flowchart TD
A[用户请求] --> B[产品混合层<br>Product Mixer]
B --> C[候选生成层<br>Candidate Sources]
C --> D[特征工程层<br>Feature Hydration]
D --> E[模型推理层<br>ML Model Serving]
E --> F[内容过滤与编排<br>Filtering & Mixing]
F --> G[最终响应]
1. 产品混合层(Product Mixer)
Product Mixer是整个推荐系统的核心编排框架,采用基于管道的设计理念:
// Product Mixer管道配置示例
class ForYouProductPipelineConfig extends ProductPipelineConfig {
def pipelines: Seq[BasePipelineConfig] = Seq(
ForYouScoredTweetsMixerPipelineConfig,
ForYouAdsCandidatePipelineConfig,
ForYouWhoToFollowCandidatePipelineConfig
)
}
该框架的主要设计特点包括:
| 设计原则 | 具体实现 | 优势 |
|---|---|---|
| 组件化 | 将业务逻辑拆分为小型、可重用的组件 | 提高代码复用性和可维护性 |
| 管道化 | 通过配置定义执行流程 | 易于理解和调试执行路径 |
| 标准化 | 统一的组件接口和抽象 | 降低团队间协作成本 |
2. 候选生成层
候选生成是推荐系统的第一道工序,Twitter采用了多源并行的策略:
flowchart LR
A[候选请求] --> B[Earlybird搜索索引<br>~50%推文来源]
A --> C[用户推文实体图<br>UTEG服务]
A --> D[CR-Mixer协调层]
A --> E[关注推荐服务<br>FRS]
B & C & D & E --> F[候选集合]
各候选源的特点对比如下:
| 候选源 | 处理方式 | 主要特征 | 适用场景 |
|---|---|---|---|
| Earlybird | 实时搜索索引 | 基于Lucene,处理网络内推文 | 核心内容发现 |
| UTEG | 内存图计算 | 用户-推文交互图分析 | 社交关系推荐 |
| CR-Mixer | 协调服务 | 统一接口,性能优化 | 外部网络内容 |
| FRS | 推荐引擎 | 账户关注推荐 | 用户增长 |
3. 特征工程与模型服务
特征工程阶段涉及约6000个特征的提取和加工,模型服务采用分层推理架构:
sequenceDiagram
participant C as 候选推文
participant F as 特征提取
participant L as 轻量级排序
participant H as 重量级排序
participant R as 排名结果
C->>F: 原始候选
F->>L: 基础特征
L->>H: 预筛选候选
H->>R: 最终评分
特征类型包括:
| 特征类别 | 示例特征 | 数据来源 |
|---|---|---|
| 用户特征 | 活跃度、兴趣标签 | 用户行为日志 |
| 内容特征 | 推文质量、主题分布 | 推文元数据 |
| 交互特征 | 历史互动率、社交关系 | 交互图谱 |
| 上下文特征 | 时间、位置、设备 | 请求上下文 |
4. 内容过滤与编排层
在最终呈现前,系统应用多种过滤和编排策略:
# 过滤规则示例
def apply_filters(candidates):
filtered = diversity_filter(candidates) # 作者多样性
filtered = balance_filter(filtered) # 内容平衡
filtered = fatigue_filter(filtered) # 反馈疲劳
filtered = deduplication_filter(filtered) # 去重
filtered = visibility_filter(filtered) # 可见性过滤
return mixed_content(filtered) # 内容混合
设计理念与原则
Twitter推荐系统的设计遵循以下几个核心原则:
1. 模块化与可组合性 系统采用微服务架构,每个组件都有明确的职责边界,通过标准化的接口进行通信。这种设计使得团队可以独立开发、测试和部署各个组件。
2. 实时性与性能 推荐系统需要处理每秒数百万的请求,因此采用了多种性能优化策略:
- 分层缓存机制
- 并行处理管道
- 增量更新策略
- 分布式计算架构
3. 可观测性与调试 系统内置了完整的监控和调试工具,包括:
- 详细的日志记录
- 实时性能指标
- 请求追踪系统
- A/B测试框架
4. 安全与合规 推荐系统集成了多层次的内容安全机制:
- 自动化内容审核
- 用户偏好尊重
- 法律合规检查
- 隐私保护措施
这种架构设计使得Twitter能够快速迭代推荐算法,同时保持系统的稳定性和可扩展性。每个组件都可以独立优化和升级,而不会影响整个系统的正常运行。
核心组件分类:数据服务、模型服务、软件框架
Twitter推荐算法架构建立在三个核心支柱之上:数据服务层负责处理和存储海量用户行为数据,模型服务层提供智能预测和推荐能力,软件框架层则为整个系统提供高性能的执行环境。这种分层架构设计确保了系统的可扩展性、可维护性和高性能。
数据服务层:实时数据处理与存储
数据服务层是整个推荐系统的基石,负责处理Twitter平台上产生的海量实时数据流。该层包含多个关键组件:
| 组件名称 | 技术栈 | 主要功能 | 数据处理量级 |
|---|---|---|---|
| Tweetypie | Scala/Thrift | 核心Tweet读写服务,处理推文数据的存储和检索 | 日均数十亿次请求 |
| Unified User Actions | Kafka/Thrift | 统一用户行为流,实时收集用户交互数据 | 实时处理百万级事件/秒 |
| User Signal Service | Scala/Thrift | 用户信号平台,聚合显式和隐式用户行为 | 存储PB级用户行为数据 |
Tweetypie架构深度解析:
Tweetypie采用了典型的分层架构设计,其核心处理流程如下:
flowchart TD
A[客户端请求] --> B[GetTweetsHandler]
B --> C[TweetResultRepository]
C --> D[存储层访问<br/>Manhattan/Tbird]
D --> E[数据水合管道<br/>TweetHydration]
E --> F[后端服务调用<br/>用户/媒体/URL等]
F --> G[响应组装]
G --> H[返回客户端]
数据水合(Hydration)过程是Tweetypie的核心机制,通过插件化的水合器(Hydrator)动态丰富推文数据:
// 示例水合器接口
trait TweetHydrator {
def hydrate(tweet: Tweet, ctx: HydrationContext): Future[HydrationResult]
}
// 用户信息水合器
class UserHydrator extends TweetHydrator {
override def hydrate(tweet: Tweet, ctx: HydrationContext): Future[HydrationResult] = {
userService.getUser(tweet.userId).map { user =>
tweet.copy(userInfo = Some(user.toUserInfo))
}
}
}
模型服务层:智能推荐核心引擎
模型服务层集成了Twitter多年积累的机器学习算法和AI技术,为推荐系统提供智能决策能力:
核心模型组件对比分析:
| 模型名称 | 算法类型 | 应用场景 | 性能特点 |
|---|---|---|---|
| SimClusters | 社区检测+稀疏嵌入 | 用户兴趣社区发现 | 处理千万级用户社区 |
| TwHIN | 知识图谱嵌入 | 用户-推文关系建模 | 十亿级节点嵌入 |
| Real-Graph | 图神经网络 | 用户交互预测 | 实时预测响应<100ms |
| Trust & Safety | 多任务深度学习 | 内容安全检测 | 高精度多分类 |
SimClusters社区发现机制:
SimClusters采用改进的LDA算法进行社区发现,其核心数学表示为:
其中 表示用户, 表示社区, 表示用户与社区的关联强度。
# SimClusters社区分配示例
def assign_user_to_clusters(user_embeddings, cluster_centroids):
"""计算用户到各个社区的归属概率"""
similarities = np.dot(user_embeddings, cluster_centroids.T)
probabilities = softmax(similarities, axis=1)
return probabilities
软件框架层:高性能服务基础设施
软件框架层为整个推荐系统提供高性能、可扩展的技术底座:
Navi模型服务框架:
Navi是Twitter自主研发的高性能机器学习服务框架,采用Rust语言编写,具有以下架构特点:
classDiagram
class NaviServer {
+start()
+stop()
+reload_model()
}
class ModelRuntime {
+TensorFlowRuntime
+ONNXRuntime
+PyTorchRuntime
}
class RequestHandler {
+preprocess()
+inference()
+postprocess()
}
class Monitoring {
+metrics_collection
+health_check
+logging
}
NaviServer --> ModelRuntime
NaviServer --> RequestHandler
NaviServer --> Monitoring
性能基准测试数据:
| 框架 | 语言 | QPS (千次请求/秒) |
延迟 (p99毫秒) |
内存使用 (GB) |
|---|---|---|---|---|
| Navi | Rust | 45.2 | 8.3 | 2.1 |
| TensorFlow Serving | C++ | 28.7 | 12.6 | 3.8 |
| Triton | C++ | 36.4 | 9.8 | 2.9 |
Product Mixer流水线架构:
Product Mixer采用声明式流水线设计,通过组件化架构实现业务逻辑的高度复用:
// 候选流水线定义示例
class TweetCandidatePipeline @Inject()(
candidateSource: TweetCandidateSource,
filter: TweetFilter,
decorator: TweetDecorator
) extends CandidatePipeline[TweetQuery, TweetCandidate] {
override def process(query: TweetQuery): Future[Seq[TweetCandidate]] = {
for {
candidates <- candidateSource.getCandidates(query)
filtered <- filter.filter(candidates, query)
decorated <- decorator.decorate(filtered, query)
} yield decorated
}
}
三层架构协同工作机制
数据服务、模型服务和软件框架三层通过精心设计的接口和协议进行协同工作:
- 数据流协同:UUA实时数据流 → 模型训练 → Navi模型服务 → Product Mixer推荐流水线
- 性能优化:通过分层缓存、批量处理和异步流水线实现极致性能
- 容错机制:每层都具备独立的故障隔离和降级策略
这种架构设计使得Twitter推荐系统能够处理日均数千亿次的推荐请求,同时在秒级内完成从用户行为采集到个性化推荐的全流程处理。
For You时间线与推荐通知的主要工作流程
Twitter的推荐系统采用了高度模块化和分层的架构设计,For You时间线和推荐通知作为核心产品功能,各自拥有独立但相互关联的工作流程。这两个系统都遵循相似的推荐范式:候选生成 → 特征提取 → 排名打分 → 过滤混合 → 最终呈现,但在具体实现和优化目标上存在显著差异。
For You时间线工作流程
For You时间线是Twitter首页的核心功能,负责为用户提供个性化的推文内容。其工作流程基于Product Mixer框架构建,采用多层管道架构:
flowchart TD
A[用户请求] --> B[ForYouProductPipelineConfig]
B --> C[ForYouScoredTweetsMixerPipelineConfig]
C --> D[候选源管道]
D --> E[Earlybird搜索索引]
D --> F[用户推文实体图<br/>UTEG]
D --> G[CR-Mixer协调层]
D --> H[关注推荐服务<br/>FRS]
C --> I[特征提取与评分]
I --> J[ScoredTweetsScoringPipelineConfig]
C --> K[过滤与混合]
K --> L[作者多样性过滤]
K --> M[内容平衡<br/>内外网络比例]
K --> N[反馈疲劳处理]
K --> O[去重与可见性过滤]
C --> P[最终呈现]
P --> Q[广告插入]
P --> R[关注推荐模块]
P --> S[对话模块]
核心候选源管道
For You时间线从多个候选源获取推文内容:
- ScoredTweetsInNetworkCandidatePipelineConfig - 从Earlybird搜索索引获取用户关注网络内的推文,约占50%的内容
- ScoredTweetsTweetMixerCandidatePipelineConfig - 通过CR-Mixer协调层获取网络外推荐推文
- ScoredTweetsUtegCandidatePipelineConfig - 基于用户-推文实体图的实时交互数据生成候选
- ScoredTweetsFrsCandidatePipelineConfig - 从关注推荐服务获取基于社交关系的推荐
特征提取与机器学习排名
系统需要提取约6000个特征用于机器学习模型排名,包括:
| 特征类别 | 示例特征 | 重要性 |
|---|---|---|
| 用户特征 | 关注关系、历史互动、地理位置 | 高 |
| 推文特征 | 内容类型、发布时间、语言 | 高 |
| 社交图谱 | 共同关注、社区检测 | 中 |
| 实时信号 | 近期互动、趋势话题 | 中 |
| 内容质量 | NSFW评分、权威性指标 | 高 |
排名过程采用两级模型架构:
- Light Ranker - 轻量级模型用于初步筛选,部署在搜索索引中
- Heavy Ranker - 深度神经网络模型进行精细排名,预测用户参与概率
过滤与混合策略
为确保时间线质量和多样性,系统实施多重过滤策略:
// 多样性控制 - 限制连续外网络推文数量
private val MaxConsecutiveOutOfNetworkCandidates = 2
// 内容平衡 - 内外网络比例调控
DebunchCandidates(
pipelineScope = SpecificPipeline(forYouScoredTweetsCandidatePipelineConfig.identifier),
mustDebunch = {
case item: ItemCandidateWithDetails =>
!item.features.getOrElse(InNetworkFeature, false)
case module: ModuleCandidateWithDetails =>
!module.candidates.last.features.getOrElse(InNetworkFeature, false)
},
maxBunchSize = MaxConsecutiveOutOfNetworkCandidates
)
推荐通知工作流程
推荐通知系统(PushService)专注于通过推送通知形式向用户推荐内容,其工作流程更加注重实时性和精准性:
sequenceDiagram
participant User as 用户设备
participant RefreshHandler as RefreshForPushHandler
participant CandidateSources as 候选源
participant Ranker as 排名引擎
participant Filter as 过滤系统
participant SendHandler as SendHandler
User->>RefreshHandler: 触发推送检查
RefreshHandler->>RefreshHandler: 构建目标用户画像
RefreshHandler->>CandidateSources: 获取候选内容
CandidateSources-->>RefreshHandler: 返回原始候选
RefreshHandler->>RefreshHandler: 候选内容水合
RefreshHandler->>Filter: 轻量过滤(Pre-rank)
Filter-->>RefreshHandler: 过滤后候选
RefreshHandler->>Ranker: 轻量排名(Light Ranking)
Ranker-->>RefreshHandler: 初步排名结果
RefreshHandler->>Ranker: 重量排名(Heavy Ranking)
Ranker-->>RefreshHandler: 最终排名结果
RefreshHandler->>Filter: 重量过滤(Take Step)
Filter-->>RefreshHandler: 合格候选
RefreshHandler->>SendHandler: 发送推送
SendHandler->>User: 交付通知
候选源多样化
PushService支持多种候选源适配器,每种针对不同的推荐场景:
| 适配器类型 | 推荐场景 | 核心技术 |
|---|---|---|
| FRSTweetCandidateAdaptor | 社交关系推荐 | CR-Mixer + 地址簿匹配 |
| EarlyBirdFirstDegreeCandidateAdaptor | 一度关系推荐 | 实时交互图谱 |
| TopTweetsByGeoAdaptor | 地理位置推荐 | 地理聚类算法 |
| TrendsCandidatesAdaptor | 趋势话题推荐 | 话题热度分析 |
| ExploreVideoTweetCandidateAdaptor | 视频内容推荐 | 多媒体内容理解 |
多层次排名架构
推荐通知系统采用三级排名策略确保推送质量:
- Light Ranking - 快速初步筛选,减少后续处理负担
- Heavy Ranking - 多任务学习模型预测用户打开和参与概率
- Re-Ranking - 基于业务规则和实时信号的最终调整
// 多模型评分架构
val scoredCandidatesFut = if (target.params(PushFeatureSwitchParams.EnableQualityUprankingForHeavyRankingParam)) {
weightedOpenOrNtabClickModelScorer.scoreByBatchPredictionForModelVersion(
target = target,
candidatesDetails = candidates,
modelVersionParam = PushFeatureSwitchParams.QualityUprankingModelTypeParam,
overridePushMLModelOpt = Some(PushMLModel.FilteringProbability)
)
} else ooncScoredCandidatesFut
智能过滤与发送策略
Take Step阶段实施严格的逐候选验证:
override def batchForCandidatesCheck(target: Target): Int = {
val fsParam = PushFeatureSwitchParams.NumberOfMaxCandidatesToBatchInRFPHTakeStep
val maxToBatch = target.params(fsParam)
maxCandidatesToBatchInTakeStat.add(maxToBatch)
maxToBatch
}
系统根据用户行为和反馈动态调整发送策略,包括频率限制、内容偏好学习和疲劳度控制。
工作流程对比与协同
虽然For You时间线和推荐通知有各自独立的工作流程,但它们在底层技术和数据共享方面高度协同:
| 维度 | For You时间线 | 推荐通知 |
|---|---|---|
| 实时性要求 | 中等(秒级) | 高(毫秒级) |
| 内容多样性 | 高(混合多种内容) | 中(精选单个内容) |
| 用户交互 | 被动浏览 | 主动触达 |
| 模型复杂度 | 极高(6000+特征) | 高(实时推理) |
| 失败容忍度 | 中等(可降级) | 低(必须成功) |
两个系统共享相同的底层组件:
- SimClusters社区检测和稀疏嵌入
- TwHIN密集知识图谱嵌入
- RealGraph用户交互预测模型
- Trust&Safety内容安全过滤
这种架构设计既保证了各系统的独立性,又通过共享技术栈实现了协同效应,为Twitter的用户提供了连贯而个性化的推荐体验。
开源项目的技术栈与构建系统分析
Twitter推荐算法项目采用了多元化的技术栈和现代化的构建系统,体现了大规模分布式系统的最佳实践。该项目融合了多种编程语言和框架,每种技术都在特定场景下发挥其优势。
多语言技术栈架构
项目采用了多语言混合架构,每种语言都服务于特定的技术领域:
| 语言 | 主要应用领域 | 代表组件 | 技术优势 |
|---|---|---|---|
| Scala | 核心服务层、分布式系统 | cr-mixer、home-mixer | 函数式编程、高并发、JVM生态 |
| Java | 搜索索引、基础服务 | search-index、timelineranker | 企业级稳定性、丰富生态 |
| Python | 机器学习模型、数据处理 | twml、trust_and_safety_models | 数据科学生态、快速迭代 |
| Rust | 高性能模型服务 | navi | 内存安全、极致性能 |
| Thrift | 服务间通信 | 所有服务的thrift定义 | 跨语言RPC、接口契约 |
Bazel构建系统深度解析
项目主要采用Bazel作为构建工具,体现了现代大规模代码库的构建最佳实践:
Bazel配置架构
# 典型的Bazel目标定义示例
jvm_binary(
name = "cr-mixer-bin",
main = "com.twitter.cr_mixer.CrMixerServerMain",
runtime_platform = "java11",
dependencies = [
"3rdparty/jvm/ch/qos/logback:logback-classic",
"finagle/finagle-zipkin-scribe/src/main/scala",
],
)
jvm_app(
name = "cr-mixer-app",
archive = "zip",
binary = ":cr-mixer-bin",
)
构建系统特点
- 模块化构建:每个服务目录包含独立的BUILD.bazel文件
- 平台兼容性:明确指定Java 11运行时平台
- 依赖管理:细粒度的第三方依赖声明
- 打包规范:符合Aurora工作流的标准应用打包
Rust高性能组件技术栈
Navi组件采用Rust编写,展现了现代系统编程语言在机器学习服务中的应用:
graph TD
A[Navi核心引擎] --> B[TensorFlow后端]
A --> C[PyTorch后端]
A --> D[ONNX后端]
B --> E[GPU加速推理]
C --> F[模型热加载]
D --> G[跨框架兼容]
Cargo.toml依赖分析
[features]
default = []
torch = ["tch"] # PyTorch集成
onnx = [] # ONNX运行时支持
tf = ["tensorflow"] # TensorFlow集成
[dependencies]
tch = {version = "0.10.3", optional = true}
tensorflow = { version = "0.18.0", optional = true }
tonic = { version = "0.6.2", features=['compression', 'tls'] }
tokio = { version = "1.17.0", features = ["macros", "rt-multi-thread"] }
Python机器学习生态集成
Python组件主要围绕TensorFlow构建机器学习流水线:
# twml库的依赖配置
install_requires=[
'thriftpy2', # Thrift Python绑定
'numpy', # 数值计算
'pyyaml', # 配置解析
'scikit-learn', # 传统机器学习
'scipy' # 科学计算
]
构建系统架构特点
| 构建工具 | 应用范围 | 配置方式 | 优势 |
|---|---|---|---|
| Bazel | Scala/Java服务 | BUILD.bazel文件 | 增量构建、分布式缓存 |
| Cargo | Rust组件 | Cargo.toml | 依赖管理、特性开关 |
| Setuptools | Python库 | setup.py | Python生态集成 |
跨语言通信架构
项目采用Thrift作为统一的跨语言RPC框架:
flowchart LR
A[Scala服务] --> B[Thrift IDL]
C[Python服务] --> B
D[Rust服务] --> B
B --> E[类型安全的跨语言调用]
这种技术栈选择体现了Twitter工程团队对性能、可靠性和开发效率的平衡考量。Scala处理高并发服务,Python专注数据科学,Rust保障关键路径性能,通过统一的构建系统和通信协议实现有机整合。
项目的构建系统设计支持大规模团队协作,每个组件可以独立开发、测试和部署,同时保持整个系统的协调一致。这种架构为推荐算法的持续迭代和优化提供了坚实的技术基础。
Twitter推荐算法项目展现了一个成熟的大规模分布式系统的最佳实践。其技术架构采用多语言混合策略(Scala、Java、Python、Rust),每种语言在特定领域发挥优势,通过Thrift实现跨语言通信。构建系统采用Bazel、Cargo和Setuptools的混合方案,支持模块化开发和团队协作。核心设计理念强调模块化、实时性、可观测性和安全性,通过分层架构(产品混合层、候选生成层、特征工程层、模型推理层、过滤编排层)实现高效推荐。For You时间线和推荐通知虽然工作流程有所差异,但共享底层技术栈,为用户提供连贯的个性化体验。这种架构设计平衡了性能、可靠性和开发效率,为推荐算法的持续迭代奠定了坚实基础。
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发起,感谢支持!Kotlin07
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00