type
Post
status
Published
date
Jan 9, 2026
slug
summary
tags
思考
开发
文字
category
知行合一
icon
password
这篇文章的叙事逻辑是我博客中的一种“新范式”的尝试。是围绕我跟ChatGPT探讨这个问题的一次长对话总结。它没有严格按章节推进,纯粹是想到哪就问到哪:从 item2vec 开始,逐渐走到双塔模型、attention、样本构造,再到排序阶段的工业范式。
有时候真正理解一个系统,不是从论文开始,而是从一个很具体的问题开始。
从item2vec到双塔:一次社交推荐系统的游走式思考
比如这样一个场景:用户点进某个用户的 profile 页面,页面底部需要推荐更多“可能聊得来的人”。
很多社交产品都有类似模块。我最初的问题其实很简单:
我们已经在用 item2vec 做用户 i2i 召回,但感觉兴趣建模很弱。有没有办法同时做 用户序列建模 + 社交兴趣建模?
一、一个典型的社交推荐问题
先说最初的系统,功能很简单,用户进入某个 profile 页面,底部出现一个模块:
“猜你喜欢”
推荐的是更多用户。
当前做法是:
- 每个用户有聊天历史序列
- 用聊天对象序列训练 item2vec
- 得到用户 embedding
- 做 i2i ANN 召回
例如:
上线后效果还可以,但很快遇到几个问题:
- 序列确实建模了,但兴趣信息没有利用
- 聊天深度不同,但模型没有区分
- 用户点进某个 profile 时,当前意图没有体现
于是问题开始变多。
二、item2vec 算不算序列建模?
答案其实有点微妙。
严格来说:
- item2vec 使用 窗口共现
- 没有真正利用顺序信息
但它确实利用了 序列统计结构。
所以更准确的说法是:
item2vec 是一种 弱序列建模。
它捕捉的是经常一起出现的用户,并且不关注具体的行为顺序
对于很多推荐问题,这其实已经足够。
但社交推荐有一个特殊点:互动质量差异很大。
比如:
item2vec 会认为:
显然不太合理。
三、序列建模该做到什么程度?
接下来问题自然变成:
要不要上 Transformer?
这个问题在推荐系统里出现过无数次。
现实经验通常是:
- mean pooling:baseline
- attention pooling:常用
- Transformer:收益不稳定
原因也很简单。
推荐系统里的行为序列通常:
- 不太长
- 噪声很多
- 目标不一定是顺序预测
因此很多工业系统会使用 attention pooling,而不是完整的 Transformer。
例如:
权重通过 attention 学习。
这个设计简单稳定,训练成本也低。
四、attention 其实有很多种
聊到 attention,很快会出现新的疑问。
Q:attention pooling、target-aware attention、self-attention 到底有什么区别?
可以简单理解为三种。
1 self-attention pooling
权重只取决于历史行为:
它解决的问题是:
哪些行为更重要。
2 target-aware attention
权重同时依赖:
- 历史行为
- 当前候选
典型公式:
其中
q 是 target。这是 DIN 模型的核心思想。
3 user-aware attention
还有一种比较容易被忽略:
让 用户自己作为 query。
直觉很简单:
用户整体兴趣决定哪些历史行为更代表他。
在 profile 推荐场景里,其实还有第四种:
历史行为会根据 当前 profile 调整权重。
这一点在社交推荐中非常自然。
五、一个重要转折:模型逐渐变成 DSSM
讨论到这里时,出现了一个很有意思的观察。
Q:怎么感觉做着做着变成 DSSM 了?
这个感觉非常真实。
因为一旦开始:
- 引入 label
- 构造正负样本
- 使用 pairwise loss
模型几乎必然会变成:
也就是 双塔模型。
原因其实很工程。
召回阶段必须满足:candidate embedding 可预计算,否则无法做 ANN 检索。
于是所有复杂模型最终都会被约束成:
很多看起来复杂的模块,其实只是在用户塔里堆 encoder。
六、样本构造才是关键
模型结构聊到一半,注意力突然转向了另一件事。
样本怎么组织?
这是很多系统真正的难点。
在社交推荐里,交互信号可以分层:
行为 | 意义 |
chat_start | 发起聊天 |
reply | 获得回复 |
deep_chat | 深度聊天 |
一个简单的 label 体系是:
训练时可以:
- 用 pairwise loss
- 或 InfoNCE
关键是正负样本的选择。
例如:
构造:
七、为什么到处都在加权
在这个讨论过程中,很快发现一个现象。
很多地方都在用权重:
- 聊天深度
- 回复行为
- hard negative
- 时间衰减
于是一个新的问题出现了。
Q:这么多权重,会不会把模型搞乱?
实际上不会。
训练目标只是:
权重只是表达:
例如:
深聊样本自然更重要。
一个经验规则是:
模型通常会很稳定。
八、召回模型的真实形态
走到这里,会突然发现一件事。
很多推荐系统召回模型最后都会长这样:
然后:
看起来是很多模块,其实只是:
user representation learning。

九、召回其实不止一种
虽然双塔很常见,但工业系统通常不会只有一个召回源。
常见组合:
最后 merge candidate pool。
不同召回源覆盖不同兴趣空间。
十、排序阶段的另一种范式
聊到召回,很自然就会问:
排序阶段有没有类似的工业范式?
答案是有的。
排序模型的形态通常是:
输入特征包括:
- user features
- candidate features
- context features
- sequence features
排序的核心问题是:
的交互建模。
这也是为什么排序系统往往变成一个 巨大的特征工程系统。

十一、一个慢慢形成的认知
这次讨论到最后,有一个很清晰的感受。
很多推荐系统问题最后都会收敛到两个核心。
召回阶段:
学一个好的 embedding space。
排序阶段:
学好 feature interaction。
至于模型结构,很多时候反而不是决定性因素。
更关键的是:
- 正负样本定义
- 目标函数
- 数据分布
- 特征设计
一句稍微夸张但很真实的话是:
好的样本构造,胜过复杂模型。
结语
这次讨论从一个很小的问题开始:
如何在 item2vec 的基础上加入兴趣建模?
一路走下来,讨论了:
- 序列建模
- attention 变体
- DSSM
- 样本构造
- 权重设计
- 召回范式
- 排序范式
很多结论其实并不新,但重新走一遍推理过程,理解会深很多。
推荐系统的很多设计,最终看起来都很简单。
但每一步简单背后,通常都有一段漫长的探索过程。
本文包含AIGC内容
- Author:YelloooBlue
- URL:https://tangly1024.com/article/31ee32f0-1b7f-801b-b57b-dd577f4a2603
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!










