刷到一条好内容,看起来只是“模型猜你喜欢”。但打分之前,系统就已经决定了去哪里找、哪些内容有资格出现;打分以后,还得把候选(candidate)排成一屏。

这一组先跟着一次刷新,看候选怎样被找出、打分,再组成一屏。之后再回来看:为什么把计算分成这几步,换一种模型或索引会影响什么。

先分清请求、更新和训练

下面用一套教学架构说明 3 条路径,不是 Twitter / X 的线上部署图。先看“用户刷新”,再切到“内容更新”和“模型训练”,比较哪些步骤不需要每次请求都重做。在线路径里还可以模拟超时和过滤,看看为什么候选会变少。

在线:请求 → 召回 → 去重与补特征 → 打分 → 列表 → 反馈。更新:内容变化 → 编码 → 索引 → 配套发布。学习:曝光与反馈 → 样本 → 训练 → 评估 → 配套发布。

先记住:一个框不一定是一台独立服务;更新内容向量,也不等于重新训练模型。 架构导读会展开这两个区别。

按你现在的问题来读

第一次读,建议按 架构导读 → 01 → 02 → 03 → 05 走一遍。之后用 04 对照新方法,用 06–08 深挖设计。不必一次把所有代码读完。

每一期解决一个问题

章节 这次要想清楚什么 读完试着做什么
00 · 架构导读 请求、更新、学习怎样接在一起? 标出每个组件何时运行、交出什么
01 · 一次刷新 为什么推荐不是一个模型? 追踪一条候选的来源、特征和去向
02 · 多路召回 多加一路到底补了什么? 固定预算,检查独有相关候选
03 · 排序与列表 单条不错,为什么一屏仍然无聊? 拖动惩罚权重,区分模型分数和列表选择
04 · 新方法放在哪 Transformer、生成式检索(retrieval)替换了哪一层? 把新模型放回架构,而不是只记名字
05 · 评估实验 分数变了,模型一定变了吗? 切换候选池、Top-K 和分母
06 · 为什么是双塔 省掉什么计算,放弃什么交互? 比较一条混合查询与分开查询
07 · 组件怎么选 同一个框有哪些合理实现? 先写约束,再写方案与退出条件
08 · 工程落地 接口成功,为什么结果仍可能错? 检查版本、超时、新鲜度(freshness)与回滚

每篇都会比较可选方案,也会算一笔计算、延迟或候选预算。实验用的是小型教学数据,帮助理解机制;真实用户是否喜欢这些结果,还需要另外验证。

用到了哪些公开资料

材料 怎么用 不据此推断什么
Twitter 2023 · ee5e7fc 01–03 的公开组件阅读 今天 X 的完整线上架构
X 公开快照 · 77d431a 04 的版本对照,核验于 2026-09-30 真实训练数据、所有实验配置或生产收益
官方论文与工程资料 比较不同设计的前提 某一家公司的做法代表唯一答案
本站架构图、代码与交互 用虚构数据检查机制 任何公司的业务结果或内部实现

版本固定在链接里,不把不同时期的模块偷偷拼成一套“最新系统”。这里不使用内部项目、私有数据或非公开面试材料。

想先自己画一版,可以做推荐 Feed 练习;对向量还不熟,先读向量与相似度。

本页术语 3
候选 candidate
召回阶段捞出来、等待精排挑选的内容
检索 retrieval
从外部语料里找出相关内容
新鲜度 freshness
内容产生到可被检索之间的延迟