Lazy loaded image
从item2vec到双塔:一次社交推荐系统的游走式思考
Words 2031Read Time 6 min
2026-1-9
2026-3-9
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 召回
例如:
上线后效果还可以,但很快遇到几个问题:
  1. 序列确实建模了,但兴趣信息没有利用
  1. 聊天深度不同,但模型没有区分
  1. 用户点进某个 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。

notion image

 

九、召回其实不止一种

虽然双塔很常见,但工业系统通常不会只有一个召回源。
常见组合:
最后 merge candidate pool。
不同召回源覆盖不同兴趣空间。

 

十、排序阶段的另一种范式

聊到召回,很自然就会问:
排序阶段有没有类似的工业范式?
答案是有的。
排序模型的形态通常是:
输入特征包括:
  • user features
  • candidate features
  • context features
  • sequence features
排序的核心问题是:
的交互建模。
这也是为什么排序系统往往变成一个 巨大的特征工程系统

notion image

 

十一、一个慢慢形成的认知

这次讨论到最后,有一个很清晰的感受。
很多推荐系统问题最后都会收敛到两个核心。
召回阶段:
学一个好的 embedding space。
排序阶段:
学好 feature interaction。
至于模型结构,很多时候反而不是决定性因素。
更关键的是:
  • 正负样本定义
  • 目标函数
  • 数据分布
  • 特征设计
一句稍微夸张但很真实的话是:
好的样本构造,胜过复杂模型。

 

结语

这次讨论从一个很小的问题开始:
如何在 item2vec 的基础上加入兴趣建模?
一路走下来,讨论了:
  • 序列建模
  • attention 变体
  • DSSM
  • 样本构造
  • 权重设计
  • 召回范式
  • 排序范式
很多结论其实并不新,但重新走一遍推理过程,理解会深很多。
推荐系统的很多设计,最终看起来都很简单。
但每一步简单背后,通常都有一段漫长的探索过程。
 
 
本文包含AIGC内容
上一篇
营销算法-增益模型(Uplift Model)
下一篇
一套逐渐成型的多AI学习工作流