【推荐系统】快手OneSearch 提升3.2%订单量
之前的推荐系统,都是随便弄一个id来代表用户,这里快手进行了改进,利用大模型和bce等模型,将用户点击商品的文本描述,纳入用户和用户行为建模,取得了商品CTR提升1.67%、订单量提升3.22%、买家数提升2.40%的好成绩。
OneSearch 技术详解:KHQE、Mu-Seq 与 PARS 的完整实现机制
本文面向专业计算机工程师,结合论文原文与工程实现细节,对快手《OneSearch》中三大核心技术模块——KHQE(Keyword-enhanced Hierarchical Quantization Encoding)、Mu-Seq(Multi-view User Behavior Sequence Injection) 和 PARS(Preference-Aware Reward System)——进行逐层、逐向量、逐token 的精细还原。重点厘清:
- 哪些环节使用大模型(LLM/Encoder-Decoder);
- 哪些环节依赖传统语义 ID(SID)与量化编码;
- 数据如何构造、训练如何组织、实验有何关键发现。
1. KHQE:关键词增强的层次量化编码
KHQE 的目标是为每个商品/查询生成高质量、抗噪声、保留区分性属性的语义 ID(SID),同时满足强 query-item 相关性约束。整个过程完全离线,不依赖大模型生成 SID。
1.1 关键词提取与匹配机制
商品侧(离线)
- 输入:商品标题、OCR 识别文本、详情页关键词;
- 处理:
- 定义 18 类结构化属性(Table 1):品牌、材质、颜色、季节、受众、场景、价格、型号、系列等;
- 从 过去一年点击日志 中挖掘高频 query-item 对;
- 对每类属性,按 PV(Page Views)降序 提取高频词,构建 关键词池(Keywords Pool);
- 使用 Qwen-VL(多模态大模型) 对商品图文内容进行实体识别,匹配关键词池中的词。
- 输出:每个商品关联一组结构化关键词(如
["Nike", "running", "men", "black", "summer"]
)。
查询侧(在线)
- 输入:用户实时搜索 query(通常 2–3 个词,如 “red nike shoes”);
- 处理:使用 Aho-Corasick 自动机 在关键词池中进行 多模式字符串匹配;
- 输出:匹配到的关键词列表(如
["Nike", "red", "shoes"]
)。
原文 Section 3.1.2:
“For queries, we use the Aho-Corasick Automaton for rapid matching during real-time inference.”
1.2 关键词增强嵌入公式详解
在获得基础嵌入与关键词嵌入后,KHQE 通过以下公式融合两者:
eqo=12(eq+1m∑i=1meki),eio=12(ei+1n∑j=1nekj)(公式 2)e_q^o = \frac{1}{2} \left( e_q + \frac{1}{m} \sum_{i=1}^m e_{k_i} \right), \quad e_i^o = \frac{1}{2} \left( e_i + \frac{1}{n} \sum_{j=1}^n e_{k_j} \right) \tag{公式 2} eqo=21(eq+m1i=1∑meki),eio=21(ei+n1j=1∑nekj)(公式 2)
- eq,eie_q, e_ieq,ei:由 蒸馏版 BGE 模型 生成的基础嵌入(768 维);
- {eki},{ekj}\{e_{k_i}\}, \{e_{k_j}\}{eki},{ekj}:匹配到的关键词嵌入(同样来自 BGE);
- 公式含义:等权重平均,突出核心属性,抑制无关噪声。
实验效果(Table 2):+keywords 使 独立编码率(ICR)从 36.67% → 40.25%。
1.3 三层 RQ-Kmeans 聚类与 SID Token 生成
聚类流程(逐层)
设输入为增强后的商品嵌入 eio∈R768e_i^o \in \mathbb{R}^{768}eio∈R768。
-
L1(粗粒度):
- K-means 聚类,K=4096;
- 输出 第一个 SID token:
<a_N>
,N∈[0,4095]N \in [0, 4095]N∈[0,4095]; - 残差:r1=eio−c1r_1 = e_i^o - c_1r1=eio−c1。
-
L2(中粒度):
- 对 全量商品的残差 r1r_1r1 进行 K-means,K=1024;
- 输出 第二个 SID token:
<b_M>
,M∈[0,1023]M \in [0, 1023]M∈[0,1023]; - 残差:r2=r1−c2r_2 = r_1 - c_2r2=r1−c2。
-
L3(细粒度):
- 对 全量商品的残差 r2r_2r2 进行 K-means,K=512;
- 输出 第三个 SID token:
<c_P>
,P∈[0,511]P \in [0, 511]P∈[0,511]; - 最终残差:r3=r2−c3r_3 = r_2 - c_3r3=r2−c3。
关键点:三层均为全局聚类,非嵌套局部聚类。
1.4 两层 OPQ 对残差向量的量化
问题
- r3r_3r3 包含商品独有特征(如“限量联名款”);
- 若丢弃,会导致不同商品共享相同 SID。
OPQ(Optimized Product Quantization)方案
- 输入:残差向量 r3∈R768r_3 \in \mathbb{R}^{768}r3∈R768;
- 步骤:
- 将 r3r_3r3 分成 2 个子向量(前 384 维 + 后 384 维);
- 对每个子向量独立进行 Product Quantization(PQ),K=256;
- 输出 第 4、5 个 token:
<d_Q><e_R>
,Q,R∈[0,255]Q,R \in [0, 255]Q,R∈[0,255]; - OPQ 优化:在 PQ 前加入 旋转矩阵 RRR,使子空间更易聚类。
最终 SID:
<a_N><b_M><c_P><d_Q><e_R>
(5-tuple),整个 SID 是一个 长度为 5 的整数序列,例如:N代表L1 层 4096 个聚类中心的编号,M代表L2 层 1024 个聚类中心的编号,几乎每个商品都有独属于自己的 SID
实验验证(Table 3):RQ-OPQ 的 CURTotal = 91.91%,Recall@10 = 0.3369。
Product Quantization(PQ) 将高维向量(如 768 维)切分为若干子向量(如 2 段,每段 384 维);
对每段独立聚类(如各聚 256 类);
用子码本索引组合表示原向量(如 <23, 187>);
目的:用少量离散 ID 高效近似连续向量,节省存储并支持快速检索。
OPQ(Optimized Product Quantization) 是 PQ 的改进版:
在切分子向量前,先对原向量做旋转(乘以可学习正交矩阵 R);
使得子空间内方差更小、聚类更紧凑;
结果:量化误差更低,重建精度更高;
引用自 Tiezheng Ge et al., TPAMI 2014(论文 [9])。
2. Mu-Seq:多视角用户行为序列注入
Mu-Seq 从三个视角建模用户,将行为信息注入大模型输入。
2.1 行为序列构造的用户 ID
输入
- 点击商品 sis_isi:其 5-tuple SID;
- 通过码本查找,映射为 768 维向量 vsi=c1+c2+c3v_{s_i} = c_1 + c_2 + c_3vsi=c1+c2+c3。
计算
- 加权平均:
vˉ=∑i=1mλi⋅vsi,λi=exp(i)∑jexp(j)\bar{v} = \sum_{i=1}^m \lambda_i \cdot v_{s_i}, \quad \lambda_i = \frac{\exp(\sqrt{i})}{\sum_j \exp(\sqrt{j})} vˉ=i=1∑mλi⋅vsi,λi=∑jexp(j)exp(i) - 离散化:将 vˉ\bar{v}vˉ 重新量化为 10 个 SID token(通过 RQ-OPQ nearest search)。在1.3节中,你得到了RQ-Kmeans(3 层) + OPQ(2 层),一共5层,用这个vˉ\bar{v}vˉ 向量 就能找到5个对应的质心的编号。但是论文却得到了10个,我估计是每层找两个最近邻质心。
输出:10 个离散整数 token,非向量。论文未明确说明如何从 5 扩展到 10,但关键点是:用户 ID 的生成方式与商品 SID 一致,均基于 RQ-OPQ 的 nearest search,保证语义空间对齐。
2.2 显式短序列
内容
- 历史查询序列 Seqq={q1,...,qn}\text{Seq}_q = \{q_1, ..., q_n\}Seqq={q1,...,qn};
- 近期点击商品序列 Seqshort={s1,...,sm}\text{Seq}_{\text{short}} = \{s_1, ..., s_m\}Seqshort={s1,...,sm};
- 每项均转换为 5-tuple SID,也就是五个数,类似于<a_382><b_104><c_29><d_5><e_12>。
输入大模型形式
- 离散 token 序列,拼入 prompt:
[uid][query][SID_q][q1][s1][q2][s2]...[qn][sn]
其中:
uid:行为构造的 10-token 用户 ID(Section 3.2.1)
query:当前查询文本(字符串)
SID_q:当前查询的 5-token SID
q1, s1, q2, s2, ...:历史查询与点击商品的 SID 序列对
- 大模型接受方式:通过 Embedding Lookup Table 映射为 768 维向量,与标准 NLP 一致。
目的:提供近期兴趣强监督,支持滑动窗口数据增强。
2.3 隐式长序列
三类长序列
- Click Seq.、Order Seq.、RSU Seq.(长度 ~1000)。
向量生成
- 每个商品 sss → SID → RQ 质心向量 [c1,c2,c3][c_1, c_2, c_3][c1,c2,c3];
- 按层级聚合:
Mclick=(∑c1,∑c2,∑c3)M_{\text{click}} = \left( \sum c_1, \sum c_2, \sum c_3 \right) Mclick=(∑c1,∑c2,∑c3)
(同理 Morder,MRSUM_{\text{order}}, M_{\text{RSU}}Morder,MRSU)
Q-Former 压缩
- 输入:Mclick,Morder,MRSUM_{\text{click}}, M_{\text{order}}, M_{\text{RSU}}Mclick,Morder,MRSU(共 9 个 768 维向量);
- 输出:Q∈RN×768Q \in \mathbb{R}^{N \times 768}Q∈RN×768(论文中取N=2N=2N=2);
- 注入 Encoder 作为 隐式长序列表示。
Q-Former 是轻量 Transformer,非 LLM。
3. PARS:偏好感知奖励系统
PARS 包含 多阶段 SFT + 奖励模型微调,用于提升个性化排序能力。为提升模型对兴趣演化和新用户的泛化能力,可以采用滑动窗口(Sliding Window) 策略进行数据增强。
3.1 多阶段监督微调(SFT)
阶段 1:语义对齐
教会模型:“一段文本 ↔ 它的语义 ID(SID)” 是什么样子
- 输入:文本(字符串);
- 输出:5-tuple SID(5 个整数 token);
- 反向任务:SID → 文本。
- 例子
输入(文本):“red nike running shoes”
输出(SID):<a_382><b_104><c_29><d_5><e_12>
阶段 2:共现同步
- 输入:query/item 的文本;
- 输出:item/query的 SID;
- 目标:学习全局协同关系,忽略用户 ID。
- 例子:
输入(query 文本):“wireless bluetooth earbuds”
输出(item SID):<a_721><b_88><c_15><d_3><e_9>
(这是某款“无线蓝牙耳机”商品的 KHQE 编码)
阶段 3:用户个性化建模
- 输入:
uid
:10 个整数 token,代表用户q
:字符串,用户搜的内容SID_q
:5 个整数 token,代表候选商品Seq_q
,Seq_short
:整数 token 序列,历史查询 SID + 点击商品 SID 交替拼接;Seq_emb_long
:向量 Q∈RN×768Q \in \mathbb{R}^{N \times 768}Q∈RN×768。
- 输出:目标商品 SID(5-tuple 整数),即用户下一步点击/下单商品的 KHQE 编码。
目标商品 SID 是语义编码,非原始商品 ID。
3.2 自适应奖励系统
3.2.1. 六级用户行为等级及其用途
行为等级定义(Table 4(f))
等级 | 行为描述 | 基础权重 λ |
---|---|---|
L1 | 搜索场景下单 | 2.0 |
L2 | 推荐场景同品类下单 | 1.5 |
L3 | 点击 | 1.0 |
L4 | 曝光未点击 | 0.5 |
L5 | 同品类未曝光 | 0.2 |
L6 | 随机商品 | 0.0 |
用途
- 作为基础奖励权重 λ,用于计算每个 query-item 对的 原始奖励值 r(q, i)(公式 8);
- 在第二阶段 DPO 训练中,直接作为正负样本标签:
- 正样本:L1–L3(用户有积极交互);
- 负样本:L4–L6(无交互或随机)。
原文 Section 3.4.2:
“In the second phase, we train the model using pure user interactions. Specifically, we collect positive samples from the first three interactive levels and negative samples from the last three levels…”
3.2.2. CTR/CVR 校准:公式与动机
问题:原始 CTR/CVR 估计有偏
- 新商品曝光 1 次、点击 1 次 → CTR = 100%(虚高);
- 热门商品被 MCA 在无关 query 下曝光 → CTR 被拉低。
校准方法(公式 6–7)
-
总频次平滑:
CntT=log((Cntpos+10)⋅(Cntclk+10)⋅(Cntorder+10))\text{CntT} = \log((\text{Cnt}_{\text{pos}} + 10) \cdot (\text{Cnt}_{\text{clk}} + 10) \cdot (\text{Cnt}_{\text{order}} + 10)) CntT=log((Cntpos+10)⋅(Cntclk+10)⋅(Cntorder+10)) -
校准后指标:
Ctri=log(Cntclk+10)CntT,Cvri=log(Cntorder+10)log(Cntclk+10)\text{Ctr}_i = \frac{\log(\text{Cnt}_{\text{clk}} + 10)}{\text{CntT}}, \quad \text{Cvr}_i = \frac{\log(\text{Cnt}_{\text{order}} + 10)}{\log(\text{Cnt}_{\text{clk}} + 10)} Ctri=CntTlog(Cntclk+10),Cvri=log(Cntclk+10)log(Cntorder+10) -
最终奖励(公式 8):
r(q,i)=2λ⋅Ctri⋅CvriCtri+Cvrir(q, i) = 2\lambda \cdot \frac{\text{Ctr}_i \cdot \text{Cvr}_i}{\text{Ctr}_i + \text{Cvr}_i} r(q,i)=2λ⋅Ctri+CvriCtri⋅Cvri- 使用调和平均,避免单一指标主导;
- λ 来自六级行为权重。
目的:使奖励更稳定、抗稀疏、反映真实用户偏好。
3.2.3. 三塔 SIM 架构:结构与输入
基于 Search-based Interest Model(SIM) [28],专为搜索场景设计。
三塔结构(Figure 4(f) 右下)
塔 | 预测目标 | 损失函数 |
---|---|---|
CTR Tower | 点击概率 | Binary Cross-Entropy (BCE) |
CVR Tower | 下单概率(给定点击) | BCE |
CTCVR Tower | 点击且下单概率 | BCE |
输入特征(与 OneSearch 完全对齐)
- 用户 ID(10 个整数 token)
- 当前 query 文本 + 其 SID
- 短行为序列(SID)
- 长行为序列表示(Q-Former 输出向量)
- 用户画像(平台人群标签)
关键设计:特征空间与 OneSearch 一致,确保奖励信号可迁移。
最终得分(公式 10)
Rscore=λ1⋅CTR+λ2⋅CVR+λ3⋅CTCVR+10⋅λ4⋅SRelR_{\text{score}} = \lambda_1 \cdot \text{CTR} + \lambda_2 \cdot \text{CVR} + \lambda_3 \cdot \text{CTCVR} + 10 \cdot \lambda_4 \cdot S_{\text{Rel}} Rscore=λ1⋅CTR+λ2⋅CVR+λ3⋅CTCVR+10⋅λ4⋅SRel
- SRelS_{\text{Rel}}SRel:离线计算的 query-item 相关性分数;
- 权重 10:强制模型遵守相关性约束,防止为提升转化而牺牲相关性。
3.2.4. 最终奖励分数(Rscore)的用途
核心作用:为 List-wise DPO 提供排序监督信号
- 对 OneSearch 生成的候选列表,用 SIM 模型重排序;
- 高 Rscore → 更可能被点击/下单 → 正样本;
- 低 Rscore → 负样本;
- 构造 排序偏好对,用于 DPO 训练。
原文 Section 3.4.2:
“We collect entered queries from real search logs and use the reward model to rerank items output by the fine-tuned OneSearch. We then select samples where ranking changes occur for list-wise DPO training.”
3.2.5. 混合排序训练(List-wise DPO)流程
阶段一:奖励模型引导训练(Reward-guided Training)
在这个阶段,奖励模型基于 SIM 三塔架构,使用 BCE 损失独立训练,SIM的作用是为 OneSearch 生成的候选商品列表打分,得到偏好列表,OneSearch 模型去学习SIM的打分(DPO训练)。
-
输入:OneSearch 生成的候选列表(如 top-512 SID);
-
重排序:用 SIM 模型计算每个 item 的 Rscore;独立训练;
-
构造样本:
- 正样本:被 SIM 提升排名 or 被点击的 item;
- 负样本:被 SIM 降低排名 or 未点击的 item;
-
优化目标(公式 11):
L=−E[logσ(log∑il∈Ilexp(rwΔmax(0,r^θ(xu,iw)−r^θ(xu,il)−δ)))]+αlogπθ(iw∣xu)\mathcal{L} = -\mathbb{E}\left[ \log \sigma\left( \log \sum_{i_l \in I_l} \exp(r_{w\Delta} \max(0, \hat{r}_\theta(x_u, i_w) - \hat{r}_\theta(x_u, i_l) - \delta)) \right) \right] + \alpha \log \pi_\theta(i_w | x_u) L=−E[logσ(logil∈Il∑exp(rwΔmax(0,r^θ(xu,iw)−r^θ(xu,il)−δ)))]+αlogπθ(iw∣xu)- r^θ\hat{r}_\thetar^θ:隐式奖励(来自 SFT 模型的 log-likelihood,公式 12);
- rwΔr_{w\Delta}rwΔ:显式奖励差(来自 SIM,公式 9);
- 第二项:保留 SFT 阶段的语言建模能力。
-
公式11的解释:
-
内层:max(0,r^θ(iw)−r^θ(il)−δ)\max(0, \hat{r}_\theta(i_w) - \hat{r}_\theta(i_l) - \delta)max(0,r^θ(iw)−r^θ(il)−δ)
→若当前模型已能区分(差值 > δ),则 loss ≈ 0;
→ 否则,需增大正样本奖励、减小负样本奖励。 -
中间层:∑ilexp(⋯)\sum_{i_l} \exp(\cdots)∑ilexp(⋯)
→对所有负样本求和,实现 list-wise 对比(而非 pairwise);
→ 更符合真实排序场景(top-k 候选列表)。 -
外层:logσ(log(⋅))\log \sigma(\log(\cdot))logσ(log(⋅))
→ 将 list-wise 指数和映射到 (0,1) 区间,稳定梯度。 -
第二项:αlogπθ(iw∣xu)\alpha \log \pi_\theta(i_w \mid x_u)αlogπθ(iw∣xu)
→ 鼓励模型仍能高概率生成正样本,防止过度优化偏好而丧失生成能力;
→ 类似 KL 散度正则,避免偏离 SFT 初始分布太远。
-
阶段二:纯用户交互训练(User Interaction Training)
- 不再依赖 SIM;
- 直接用模型直接使用真实用户行为日志,结合 六级行为标签 作为监督信号,构造正负标签,通过 List-wise DPO 损失(公式 11) 更新 OneSearch 的参数;;
- 目的:突破 MCA 性能天花板,发现新优解。
原文 Section 3.4.2:
“Since the reward model is trained on user interaction data from the traditional search system, it inherently limits OneSearch’s ability to exceed Online MCA’s performance ceiling. Therefore, in the second phase, we train the model using pure user interactions.”
总结:奖励系统全流程
- 六级行为 → 定义基础权重 λ;
- CTR/CVR 校准 → 计算稳定奖励 r(q, i);
- 三塔 SIM → 输出 Rscore,融合相关性约束;
- Rscore → 用于 List-wise DPO 构造排序偏好;
- 混合训练 → 先学 SIM 排序,再突破其上限。
该设计使 OneSearch 在保持 query-item 相关性的前提下,实现强个性化排序能力,是其在线指标(+3.22% 订单量)提升的核心驱动力。