之前的推荐系统,都是随便弄一个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 识别文本、详情页关键词;
  • 处理:
    1. 定义 18 类结构化属性(Table 1):品牌、材质、颜色、季节、受众、场景、价格、型号、系列等;
    2. 从 过去一年点击日志 中挖掘高频 query-item 对;
    3. 对每类属性,按 PV(Page Views)降序 提取高频词,构建 关键词池(Keywords Pool);
    4. 使用 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​+m1​i=1∑m​eki​​),eio​=21​(ei​+n1​j=1∑n​ekj​​)(公式 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;
  • 步骤:
    1. 将 r3r_3r3​ 分成 2 个子向量(前 384 维 + 后 384 维);
    2. 对每个子向量独立进行 Product Quantization(PQ),K=256;
    3. 输出 第 4、5 个 token:<d_Q><e_R>,Q,R∈[0,255]Q,R \in [0, 255]Q,R∈[0,255];
    4. 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​=∑j​exp(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)

  1. 总频次平滑:
    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))

  2. 校准后指标:
    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)​

  3. 最终奖励(公式 8):
    r(q,i)=2λ⋅Ctri⋅CvriCtri+Cvri r(q, i) = 2\lambda \cdot \frac{\text{Ctr}_i \cdot \text{Cvr}_i}{\text{Ctr}_i + \text{Cvr}_i} r(q,i)=2λ⋅Ctri​+Cvri​Ctri​⋅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⋅SRel R_{\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训练)。

  1. 输入:OneSearch 生成的候选列表(如 top-512 SID);

  2. 重排序:用 SIM 模型计算每个 item 的 Rscore;独立训练;

  3. 构造样本:

    • 正样本:被 SIM 提升排名 or 被点击的 item;
    • 负样本:被 SIM 降低排名 or 未点击的 item;
  4. 优化目标(公式 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 阶段的语言建模能力。
  5. 公式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)∑il​​exp(⋯)
      →对所有负样本求和,实现 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.”


总结:奖励系统全流程

1. 模型本身训练的目标是什么?

OneSearch 的核心训练目标是将传统的多阶段召回-排序(MCA)流程,统一为一个端到端的生成式检索(Generative Retrieval)任务。具体来说,其训练目标可以分解为:

  1. 语义对齐 (Semantic Alignment):让模型学会将用户查询的文本(如“红色耐克运动鞋”)与商品的语义ID(SID)(如 <a_382><b_104><c_29><d_5><e_12>)进行精确的双向映射。这确保了模型理解SID编码所代表的语义。
  2. 共现同步 (Co-occurrence Synchronization):在忽略用户个性化信息的前提下,让模型学习查询与商品之间固有的、全局的协同关系。例如,模型学习到“蓝牙耳机”这个查询通常对应着特定类别的商品SID。
  3. 用户个性化建模 (User Personalization Modeling):这是最终也是最重要的目标。模型需要学习如何综合用户上下文(包括用户ID、历史查询、点击/购买行为序列)来直接生成最符合该用户当前意图的商品SID列表。训练的标签(Label)就是用户实际点击或下单的商品的SID。

总结:OneSearch 的训练不是为了预测一个分数,而是为了学习一个从“用户输入 + 行为历史”到“商品SID序列”的生成函数,其最终目标是在一次推理中,直接输出一个排序好的、高度相关且个性化的商品列表。


2. 训练完成后,当用户输入搜索项时,后续如何进行相应?

训练完成后,OneSearch 的推理(Inference)过程是单次、端到端的,与传统MCA的多阶段流水线截然不同:

  1. 输入构建:当用户输入一个查询(Query)时,系统会立即构建一个完整的输入序列:

    • 用户ID (uid):根据该用户的历史点击行为,通过KHQE编码生成的10个token的SID。
    • 当前查询 (q):用户输入的原始文本。
    • 查询SID (SID_q):将当前查询文本通过KHQE编码得到的5个token。
    • 短行为序列 (Seq_q, Seq_short):用户最近几次的查询SID和点击商品SID,按顺序拼接。
    • 长行为序列 (Seq_emb_long):通过Q-Former对用户长期的点击、下单、RSU行为序列进行压缩后得到的向量。
    • (可选)用户画像信息 (U)。
  2. 端到端生成:这个完整的、包含丰富上下文的输入序列,被一次性输入到训练好的编码器-解码器(Encoder-Decoder)模型(如BART或Qwen3)中。

  3. 输出结果:模型的输出是一个由5-tuple SID组成的序列,例如:[<a_123><b_456>...], [<a_789><b_012>...], ...。这串SID序列直接代表了系统为该用户推荐的、按相关性和个性化程度排序的候选商品列表。

  4. 最终展示:系统将这些SID通过码本查找(Lookup) 映射回具体的商品,然后将这些商品按生成的顺序(即模型的预测排序)展示给用户。

总结:用户输入查询后,OneSearch 不再进行召回、预排序、精排的多轮筛选,而是一步到位,利用其强大的生成能力,直接输出一个经过个性化排序的、高质量的商品SID列表,从而实现了“输入查询,输出排序商品”的终极目标。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐