Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

📖 ⏱️ ~45 min read 🎯 Intermediate-Advanced

端到端生成式搜索

📝 Before You Continue: 建议先读 8.1 的语义 ID 与 Encoder-Decoder 思路——本节把同一套生成式哲学迁移到「文本查询 → 商品结果」的跨模态匹配,但业务约束更尖锐。

8.1 的 OneRec 输入与输出都是 封闭词表 的物品 ID。电商搜索则截然不同:用户用 明确的文本查询 表达意图,系统需在强相关性约束下从海量商品库返回精准匹配。这种「文本查询 → 商品结果」涉及 开放词表 (任意查询)与 封闭词表 (有限商品库)的混合,以及查询理解、语义匹配、个性化排序等多层次任务。

传统电商搜索同样是 MCA:查询理解(纠错/改写/意图)→ 召回(倒排+向量)→ 预排序 → 精排,存在查询与商品检索解耦、冷启动长尾、标题关键词堆砌噪声三大问题。OneSugOneSearch 分别针对搜索链路的前半段(查询补全)与后半段(商品检索)提出端到端生成式方案,共享统一架构哲学,但在输入输出空间、ID 设计上有不同权衡。

读完本章,你将能够:

  • 说明 OneSug 如何把查询补全重定义为条件文本生成,并用 PRE 模块增强短前缀
  • 描述 RWR 策略 如何用六级交互反馈把业务价值注入排序
  • 解释 OneSearch 的 KHQE 如何用「3 层语义 + 2 层 OPQ」平衡语义层次与商品独特性
  • 复述 Mu-Seq 的三视角用户建模与 PARS 的偏好感知奖励
  • 完成 5 道分层练习题,巩固前缀增强、语义 ID 编码与约束解码

8.2.0 电商搜索的三大独特挑战

与视频推荐相比,电商商品检索约束更复杂:

  1. 强相关性是第一优先级。 推荐可基于历史推风格相似但类目不同的商品;搜索则不可妥协——用户搜「红色连衣裙」,即便他常买蓝色商品,返回「蓝色连衣裙」也是严重相关性违反。系统必须 先满足相关性,再优化个性化
  2. 商品信息充斥噪声与冗余。 商家在标题堆砌大量关键词(「2024新款韩版修身显瘦长袖连衣裙女学生小个子甜美气质裙子百搭」),传统文本编码器被冗余淹没,难识别核心属性。
  3. 语义层次与商品独特性的平衡。 既要理解类目层次(服装→女装→连衣裙→韩版连衣裙)做粗粒度匹配,又要保留每件商品的独特属性(款式/品牌/价格),否则所有「韩版连衣裙」会被映射到相同表示。

💡 Key Insight: 搜索的端到端难点,本质是在「生成」与「强约束」之间走钢丝——生成的自由度高,但相关性是不可逾越的底线。这正是 OneSearch 在奖励系统中把相关性权重放大 10 倍的原因。


8.2.1 OneSug:查询补全生成

查询补全是搜索第一道关口:用户输入前缀「红色连」,系统需实时生成完整查询候选(「红色连衣裙」「红色连帽衫」)。传统 MCA 用前缀树(Trie)从 候选粗召回到 ,再预排序到 、精排展示 16 个,存在前序性能瓶颈限制后续上界、各阶段目标冲突两大问题。

OneSug 把查询补全重定义为 端到端的条件文本生成任务

绕过传统多阶段链路。其核心挑战:短前缀语义歧义(「苹」可能指水果或手机)、个性化与流行度平衡、多级反馈精细化建模、100ms 实时性约束。

编码器:前缀增强与多源特征

前缀-查询语义对齐。 对纯文本前缀 用预训练 Text Encoder(BGE)提取 。但通用 NLP 模型在电商语义空间有偏差,OneSug 对 BGE 做领域对齐微调:从日志挖高质量 prefix-query 与 query-query 共现对,对比学习拉近协同相关查询:

对齐后 BGE 在查询检索任务上的语义相关性从 0.67 升至 0.81。

前缀表示增强(PRE 模块)。 短前缀表示不足,PRE 从历史日志检索与此外共现的高质量查询集合 ,平均嵌入加权融合:

消融显示 时 MRR 比无增强提升 2.3%,但 引入噪声致性能下降。为高效检索,OneSug 用 RQ-VAE 把查询编码为分层离散码(4 层,每层码本 512),推理时从粗到细层级匹配,复杂度从向量检索的 为全部候选物品数)降为逐层码本查找的 ——与候选规模 无关,只随层数 和码本大小 线性增长。

用户特征。 整合短期历史查询 (最近 条,超过会引噪声使 MRR 降 1.2%)与静态画像 。注意 OneSug 不引入商品交互特征——查询补全发生在用户输入阶段,尚无商品曝光。编码器输入构造为:

OneSug 架构:PRE 增强前缀 + Encoder-Decoder 生成 + RWR 排序

解码器与 RWR 排序策略

解码器用标准 Causal Transformer 自回归生成子词,训练最小化 NTP 损失。推理用 Beam Search (束宽 ),并引入长度归一化避免偏好短查询:

仅靠 NTP 的生成模型无法区分候选的业务价值。RWR(Reward-Weighted Ranking) 把六级交互反馈转为精细化偏好信号:

层级反馈类型业务含义基础权重
Level 1Order通过该查询完成购买2.0
Level 2Item Click点击查询返回的商品1.5
Level 3Click点击该查询1.0
Level 4Show展示未点击0.5
Level 5Not Show召回池未展示0.2
Level 6Rand随机负样本0.0

对每个 <前缀, 查询> 对,奖励 是该查询在对应层级的归一化频率),使高频交互查询获更高奖励。从 6 层构造 9 类偏好对,偏好差异 。最终在 DPO 损失上引入奖励加权与边界

Analysis: OneSug 把查询补全从 MCA 变为端到端生成式。PRE 解决短前缀歧义,六级反馈构建的奖励系统精准建模偏好差异。统一框架不仅简化架构,更能全局优化、避免前序瓶颈。代价是 Beam Search 与 RWR 对齐需额外推理开销,须控制在 100ms 内。


8.2.2 OneSearch:商品检索生成

用户敲下「红色连衣裙」后,系统需一秒内从数亿商品中找最相关结果。OneSearch 把「查询 → 召回 → 预排序 → 精排」统一为端到端序列生成:

即直接输入查询文本与用户行为特征,输出有序商品列表。它设计四个核心模块: KHQE (关键词增强分层量化编码)、Mu-Seq (多视角行为序列注入)、统一 Encoder-Decoder 生成架构PARS (偏好感知奖励系统)。

KHQE:关键词增强的分层量化编码

核心问题:在生成式框架中,如何表示数亿个商品? 原子 ID 有两大致命问题:词表 使 Softmax 不可行;原子 ID 是随机数字,不含语义。

OneSearch 用 分层语义 ID :商品映射为多层离散码序列 。例如某韩版连衣裙编码为 ,词表约 6000 个唯一 Token,远小于数亿。前 3 层保语义层次,后 2 层保商品独特性。

商品表示学习。 文本、结构化属性、统计特征经蒸馏 BGE 得初始嵌入 ,再用多类对齐任务同时捕获语义与协同:query-query / item-item 对比、query-item 对比、分层反馈对齐(曝光/点击/下单赋不同 Margin)、难样本相关性校正(用 LLM 评边界样本)。

核心关键词增强。 标题的营销词(「爆款」「包邮」)稀释核心属性。OneSearch 用 NER 构建 18 类属性词表,以 Aho-Corasick 自动机 多模式匹配)在标题快速匹配核心词,50%-50% 加权增强:

KHQE:商品分层语义 ID 编码(3 层 RQ-Kmeans + 2 层 OPQ)

RQ-Kmeans 语义层次编码。 逐层提取语义、残差传下层:L1(码本 4096)捕最粗类目(服装/数码/食品),L2(1024)细分层(女装/男装),L3(512)捕细粒度(连衣裙/ T 恤)。关键优化: 仅在 L3 应用平衡 K-means——早期层强制平衡会导致层次聚类崩溃、丧失语义区分度。

OPQ 商品独特性编码。 3 层 RQ 后残差仍含独特属性(款式/品牌/价格)。若只用前 3 层,两件「韩版连衣裙」(一件 Zara 299 元、一件无牌 99 元)会被视为完全相同。于是引入 OPQ(Optimized Product Quantization) 把残差切分 子向量分别 K-means(码本 256):

为何不对所有层用 OPQ?实验发现会破坏层次语义性、性能大幅下降——失去「粗到细」的渐进生成模式。

Mu-Seq:多视角行为序列注入

行为序列驱动的用户 ID。 不用随机哈希 ID,而用行为序列构造 User ID:短期点击 与长期点击 各自加权求和(权重 ,越近权重越高但不激进),向上取整后拼接(总长 10)。好处:兴趣相似用户得相近 ID;冷启动可用平台「查询→Top 点击」作默认序列。

显式短期序列注入。 最近历史查询与点击商品显式放入输入:查询用原始文本(短,直接 Tokenize),商品用语义 ID(标题冗长,更紧凑);长度限制(查询 、点击 )。

滑动窗口数据增强。 完整序列 传统只生成 1 样本,OneSearch 用最大窗口 生成多个,让模型学习兴趣演化、自然处理冷启动。

Q-Former 长期序列压缩。 活跃用户可能有数千至上万长期行为。按行为类型(点击/下单/RSU)分层聚合为 个向量,再用 个可学习查询向量经交叉注意力提取固定长度表示 ,无论历史多长都不显著增加计算。

统一 Encoder-Decoder 生成架构

OneSearch 选 BART (Encoder-Decoder,编码器双向建模、解码器自回归,且有良好预训练权重与工业加速优化)。编码器输入异构序列(离散 Token + 连续向量),输出

解码器逐 Token 生成目标商品 5 层语义 ID,以 为例:

步骤 0:输入 [BOS]           → 预测 L1 = 3856
步骤 1:输入 [BOS, 3856]    → 预测 L2 = 724
步骤 2:输入 [BOS, 3856, 724] → 预测 L3 = 385
步骤 3:输入 [BOS, ..., 385] → 预测 OPQ1 = 142
步骤 4:输入 [BOS, ..., 142] → 预测 OPQ2 = 201

每步经 Causal Self-Attention 与 Cross-Attention,Softmax 预测下一 Token:

训练目标为最大化真实 SID 对数似然 。推理用 Beam Search ,可选约束搜索(强制每层 Token 来自有效 SID 池,确保对应真实商品)或非约束搜索。

OneSearch 端到端生成架构:编码查询与用户上下文 → 自回归生成商品语义 ID

PARS:偏好感知奖励系统

仅靠 NTP 的模型只学到「哪些商品与查询共现」,没学到「用户更偏好哪些」。PARS 含 多阶段监督微调自适应奖励系统

多阶段 SFT。 阶段一语义内容对齐(文本↔SID、文本→类目),阶段二共现关系同步(query↔item 文本与 SID 层面的协同),阶段三用户个性化建模(引入完整用户上下文)。

自适应奖励信号。 用户交互分 6 层(搜索下单 2.0 / 推荐同类目下单 1.5 / 点击 1.0 / 曝光未点 0.5 / 同类目未展示 0.2 / 随机 0.0)。为避免新商品曝光少致偏差,用对数平滑算 CTR、CVR,奖励为调和平均:

奖励模型(三塔 SIM)。 CTR 塔 / CVR 塔 / CTCVR 塔分别预测,综合分数 ——离线相关性分数 权重放大 10 倍 ,确保先满足相关性再优化个性化。

混合排序框架。 基于奖励模型做 List-wise DPO :采样 512 候选,对排序发生变化的样本训练,损失结合 DPO 与 SFT 目标,既学偏好排序又保持生成能力。上线后持续用真实交互(Level 1-3 正、Level 4-6 负)做近实时在线学习。

Analysis: OneSearch 用 KHQE 的「3+2」语义 ID 优雅平衡了语义层次与商品独特性;Mu-Seq 三视角建模兼顾相关性与个性化;PARS 把相关性作为硬约束(×10)嵌入奖励。整条链路从 MCA 的多阶段变为单一生成模型,但代价是训练数据工程(对齐、滑动窗口、多阶段 SFT)与推理时 Beam Search 的延迟控制。


⚠️ Common Mistakes in 8.2

#MistakeExampleWhy It's WrongFix
1把搜索当推荐优化「搜红色连衣裙也推蓝色款」搜索强相关性不可妥协先满足相关性再个性化(奖励×10)
2忽视前缀语义歧义OneSug 直接编码 1 字前缀短前缀无明确意图信号用 PRE 模块检索共现查询增强
3KHQE 全用 OPQ「5 层都 OPQ 更细」破坏粗→细层次语义前 3 层 RQ 保层次,后 2 层 OPQ 保独特
4L1/L2 强制平衡 K-means「每层都平衡更均匀」早期层平衡致层次聚类崩溃仅在 L3 应用平衡约束
5混淆 SID 与原子 ID「直接用 item_123 当词表」数亿词表使 Softmax 爆炸分层语义 ID 压缩到约 6000 词表

本章小结

📌 Key Takeaways

ConceptKey PointsWhy It Matters
OneSug条件文本生成 + PRE 前缀增强 + RWR 六级反馈查询补全从 MCA 变端到端生成
KHQE3 层 RQ-Kmeans(语义)+ 2 层 OPQ(独特)数亿商品压缩到可控语义 ID
Mu-Seq行为序列 UserID + 短期显式 + Q-Former 长期压缩相关性优先下的个性化建模
PARS多阶段 SFT + 自适应奖励 + 相关性×10先保相关性,再优化偏好
Beam Search约束/非约束两种,SID 池过滤非法生成真实商品、控延迟

❓ FAQ

Q1: OneSug 为何不引入商品交互特征?

A: 查询补全发生在用户输入阶段,此时还没有商品曝光行为。引入商品特征既无数据支撑,也会让前缀表示被无关信号污染。它只用前缀、历史查询与静态画像。

Q2: 为什么 KHQE 前 3 层用 RQ-Kmeans、后 2 层用 OPQ,而不是全部 RQ?

A: 前 3 层要表达「服装→女装→连衣裙」的渐进类目层次,RQ 的残差传递天然契合;后 2 层要编码残差中的独特属性,OPQ 的子向量独立量化更适配。全 OPQ 会丢失层次语义性。

Q3: PARS 把相关性权重放大 10 倍,会不会伤害个性化?

A: 恰恰是保护个性化——它先保证「不返回不相关商品」,再在相关集合内用 CTR/CVR 等优化个性化。这避免了推荐系统常见的「相关性漂移」。

🔗 前后关联

  • 8.1 (端到端生成式推荐)的语义 ID 与 Enc-Dec 是本节的方法基础,OneSug/OneSearch 是其跨模态延伸。
  • 8.3 (端到端生成式广告)在生成式中再叠加竞价机制与经济学约束。
  • 2.3 (双塔)的向量检索思路,被 OneSearch 用语义 ID + Beam Search 的「生成式检索」替代。
  • 6.x (生成式基础)的 RQ-VAE 量化,在本节以 RQ-Kmeans(OneSearch)/ RQ-VAE(OneSug)两种形态出现。

Practice Problems

Work through all problems in order — they get progressively harder. Each has a complete solution you can reveal after trying it yourself.


Problem 8.2.1 — PRE 增强计算 🟢 Easy

前缀嵌入 ,相关查询平均嵌入 。PRE 模块权重 ,求增强后 。若 会有什么趋势?

💡 Solution (click to reveal)

Approach: 加权平均。

,前缀自身信号被大幅稀释,过度依赖共现查询——正是文中 引入噪声、性能下降的原因。

Key points:

  • 是经验最优平衡点。
  • 过大 让前缀「变成别人」,丢失用户真实输入信号。

Problem 8.2.2 — KHQE 编码空间 🟢 Easy

某商品经 KHQE 得 SID ,各层码本大小分别为 4096 / 1024 / 512 / 256 / 256。问:(a) 总词表唯一 Token 数约多少?(b) 该编码如何同时体现「语义层次」与「商品独特性」?

💡 Solution (click to reveal)

Approach: 词表唯一 Token 数为各层码本之和(不同层码字独立编号)。

  • (a) 个唯一 Token。
  • (b) 前 3 层 RQ-Kmeans:L1=2341(服装)、L2=567(女装-裙装)、L3=89(连衣裙-韩版)体现由粗到细的类目层次;后 2 层 OPQ 编码残差中的独特属性(款式/品牌/价格),使两件同「韩版连衣裙」也能被区分。

Key points:

  • 总词表远小于数亿原子 ID,Softmax 可行。
  • 「层次 + 独特」是 KHQE 设计的核心张力平衡。

Problem 8.2.3 — 行为序列 User ID 构造 🟡 Medium

用户短期点击商品的语义 ID 为 (按时间从早到晚),权重 。求归一化权重 (保留 3 位小数),并说明为何用 而非线性

💡 Solution (click to reveal)

Approach: 计算 再归一化。

越近行为权重越高(0.218 < 0.329 < 0.453)。用 而非线性 :线性衰减(如 )会让最近行为权重爆炸式主导、早期行为几乎归零; 是「温和递增」,既体现时序远近,又保留较早行为的贡献,避免过激遗忘长期兴趣。

Key points:

  • 权重反映时间远近但不激进。
  • 这是用「软衰减」平衡短期意图与长期偏好。

Problem 8.2.4 — 约束 Beam Search 的非法过滤 🔴 Hard

OneSearch 解码生成 5 层 SID,约束搜索要求每层 Token 必须来自有效 SID 池(真实商品集合)。假设第 1 层候选 Token 共 4096 个,其中有效 SID 池在第 1 层只覆盖 2000 个;Beam 宽度 。对比「约束搜索」与「非约束搜索」在 (a) 生成合法性、(b) 单步候选数上的差异,并说明为何约束搜索能降延迟。

💡 Solution (click to reveal)

Approach: 分析搜索空间与后处理。

  • (a) 约束搜索:每层只在有效池(第 1 层 2000 个、逐层收窄)内解码,生成序列必对应真实商品,无「幻觉 SID」;非约束搜索:允许任意 Token 组合,可能生成不映射真实商品的非法 SID,需在后处理过滤。
  • (b) 单步候选:约束搜索第 1 步最多 2000 候选(且后续层随树收窄更小);非约束搜索每步固定 4096 候选。约束搜索实际搜索空间 ,远小于
  • 延迟:约束搜索在解码早期就剔除非法分支,避免非约束生成大量无效候选后再过滤;结合 Trie 前缀树(见 8.3 的 GPR),可将搜索空间从 缩到有效商品数,显著降低每步计算。

Key points:

  • 约束搜索 = 把「合法性」做成解码时的硬 mask。
  • 这是生成式检索落地的关键工程技巧。

🏆 Challenge: 设计搜索端到端落地论证

某电商搜索当前 MCA 在「红色连衣裙」查询下常返回蓝色款(相关性漂移)。请写约 160 字,说明引入 OneSearch 类端到端生成式架构时:(1) 应优先改哪一环节;(2) KHQE 与 PARS 中哪两个设计能直接缓解该问题;(3) 需警惕什么新风险?

💡 Hint

(1) 优先替换「查询理解 + 召回 + 精排」为统一 Enc-Dec 生成,消除意图在阶段间损失。(2) KHQE 的分层语义 ID 让「红色连衣裙」与「蓝色连衣裙」在 L3 层即区分;PARS 把离线相关性分数 权重放大 10 倍,强制先满足相关性。(3) 新风险:Beam Search 延迟、训练数据工程复杂(多阶段 SFT、滑动窗口)、以及生成式检索的不可解释性带来的bad case 定位困难。