HierGR:美团外卖搜索的层级语义生成式检索系统

HierGR:美团外卖搜索的层级语义生成式检索系统

一句话总结:HierGR通过层级RQ-VAE生成语义ID,结合查询缓存和混合检索策略,在美团外卖场景实现了**复杂意图订单量+0.68%**的提升。


📖 论文信息

项目 内容
论文标题 HierGR: Hierarchical Semantic Representation Enhancement for Generative Retrieval in Food Delivery Search
作者 Fuwei Zhang, Xiaoyu Liu, Xinyu Jia, Yingfei Zhang, Zenghua Xia, Fei Jiang, Fuzhen Zhuang, Wei Lin, Zhao Zhang
机构 美团
发表会议 ACL 2025 Industry Track (pp. 444-455)
论文链接 ACL Anthology
代码仓库 GitHub

🎯 1. 研究背景:外卖搜索的"快准狠"挑战

1.1 什么是生成式检索(Generative Retrieval, GR)?

想象一下传统搜索是怎么工作的:你输入"奶茶",系统先把查询变成向量,然后在数百万商品向量中找最相似的------这就像在图书馆里一本本翻书找答案。

生成式检索则完全不同:它让语言模型**直接"说出"**你想要的商品ID,就像一个经验丰富的店员,听到你的需求后直接报出商品编号。

范式 流程 特点
传统检索 查询 → 向量化 → 相似度匹配 → 排序 → 返回 依赖索引结构,两阶段
生成式检索 查询 → 语言模型 → 直接生成目标ID 端到端,单阶段

1.2 外卖场景的三大独特挑战

将生成式检索应用于外卖搜索,面临着学术场景中不存在的工业级难题:

挑战 具体问题 学术数据集对比
🏪 大规模商品库 数百万SKU需要索引 学术数据集通常<10万
⏱️ LLM推理延迟 用户期望毫秒级响应 学术场景延迟容忍度高
📍 强地理限制 只能展示配送范围内商品 学术场景无此约束

1.3 复杂查询意图:真正的痛点

外卖搜索中,简单查询(如"奶茶")传统方法就能处理好。真正的挑战在于复杂意图查询

查询类型 示例 难点
简单查询 "奶茶" 直接匹配即可
多约束查询 "辣的不要香菜的面" 需理解多重约束条件
隐含意图 "适合减肥的" 需推理营养属性
场景化查询 "加班充饥" 需理解场景→商品映射

这正是LLM的强项------理解复杂语义和隐含意图。


🏗️ 2. HierGR方法论:三大核心技术

2.1 整体架构

HierGR的核心思想是:用层级语义ID让LLM"学会"商品库的结构,再通过缓存和混合检索解决工业部署问题


图:HierGR整体框架------上侧展示离线训练流程(RQ-VAE生成层级语义ID + LLM微调),下侧展示在线服务流程(查询缓存 + GR生成 + 稠密检索融合 + LBS过滤)

整体流程可以概括为:

离线阶段

复制代码
📦 商品数据 → 🧮 Embedding提取 → 🔢 RQ-VAE编码 → 🏷️ 层级语义ID → 📚 训练数据构建 → 🤖 LLM微调

在线阶段

复制代码
📝 用户查询 → 🔍 查询缓存检查 → 🤖 GR生成/稠密检索融合 → 📍 地理过滤 → 📊 结果排序

2.2 核心技术一:层级语义ID(Hierarchical Semantic ID)

为什么需要语义ID?

传统生成式检索为每个商品分配随机ID(如商品123456),这带来两个问题:

  1. 无语义:ID本身不携带任何商品信息
  2. 难泛化:新商品的ID与已有商品毫无关联

HierGR的创新在于:让ID本身具有层级语义结构

RQ-VAE:残差量化变分自编码器


图:RQ-VAE生成层级语义ID的原理------通过多级残差量化将商品嵌入逐层分解,每一层捕捉不同粒度的语义信息,最终生成结构化的语义码字序列

RQ-VAE的核心思想:将商品的语义嵌入向量,通过多级量化转换为一串"码字"(codeword),每一级捕捉不同粒度的语义信息。

数学表达

给定商品嵌入向量 e \mathbf{e} e,RQ-VAE通过L级量化生成语义ID:

SemanticID = [ c 1 , c 2 , . . . , c L ] \text{SemanticID} = [c_1, c_2, ..., c_L] SemanticID=[c1,c2,...,cL]

其中每一级的量化过程为:

c l = arg ⁡ min ⁡ k ∥ r l − 1 − C l ( k ) ∥ 2 c_l = \arg\min_{k} \| \mathbf{r}_{l-1} - \mathbf{C}_l^{(k)} \|^2 cl=argkmin∥rl−1−Cl(k)∥2
r l = r l − 1 − C l ( c l ) \mathbf{r}l = \mathbf{r}{l-1} - \mathbf{C}_l^{(c_l)} rl=rl−1−Cl(cl)

  • r 0 = e \mathbf{r}_0 = \mathbf{e} r0=e(初始残差为原始嵌入)
  • C l \mathbf{C}_l Cl:第 l l l级的码本(codebook)
  • c l c_l cl:第 l l l级选中的码字索引

直观理解

  • 第1级:粗粒度分类(如"饮品"vs"主食")

  • 第2级:中粒度分类(如"奶茶"vs"咖啡")

  • 第3级:细粒度分类(如"珍珠奶茶"vs"芋泥奶茶")

  • 第4级:具体商品(如"某店的大杯珍珠奶茶")

    示例:红烧牛肉面的语义ID
    [12]-[34]-[567]-[8901]
    ↓ ↓ ↓ ↓
    面食 辣味 张记面馆 红烧牛肉面

层级语义ID的优势
优势 说明 对比随机ID
语义聚类 相似商品ID相近,便于模型学习 随机ID无此特性
层级检索 支持从粗到细的渐进式生成 必须一次生成完整ID
泛化能力 新商品可复用已有码字 新ID完全陌生
可解释性 ID结构对应商品属性 纯数字无意义
HierGR的RQ-VAE优化

论文提出了对标准RQ-VAE的优化方法:

  1. 层级正则化:确保不同层级捕捉不同粒度的语义
  2. 码本均衡:避免部分码字被过度使用
  3. 语义对齐:使码字分布与商品类目结构对齐

2.3 核心技术二:查询缓存机制

外卖搜索有个显著特点:热门查询高度集中。"奶茶"、"炸鸡"、"汉堡"等查询占据了大量流量。

HierGR引入LRU缓存策略

python 复制代码
# 查询处理伪代码
def process_query(query, user_location):
    cache_key = (query, get_region(user_location))
    
    if cache_key in query_cache:
        # 缓存命中:直接返回
        return query_cache[cache_key]  # ~1ms
    else:
        # 缓存未命中:调用GR模型
        results = gr_model.generate(query)  # ~50ms
        query_cache[cache_key] = results
        return results
场景 处理方式 延迟
缓存命中(如"奶茶") 直接返回缓存结果 ~1ms
缓存未命中 调用GR模型生成 ~50ms

缓存效果 :热门查询缓存命中率可达40%+,显著降低平均延迟。

2.4 核心技术三:GR与稠密检索融合

HierGR采用混合检索策略,而非完全替代传统方法:

最终结果 = α × GR结果 + ( 1 − α ) × 稠密检索结果 \text{最终结果} = \alpha \times \text{GR结果} + (1-\alpha) \times \text{稠密检索结果} 最终结果=α×GR结果+(1−α)×稠密检索结果

为什么要混合?
方法 优势 劣势
GR生成 复杂意图理解强 简单查询可能过度推理
稠密检索 简单查询精准 复杂意图理解弱
动态权重调整策略
查询类型 α \alpha α 值 说明
简单查询("奶茶") 0.3 主要依赖稠密检索
复杂查询("不辣的适合小孩吃的") 0.7 主要依赖GR生成

查询复杂度可通过以下特征判断:

  • 查询长度
  • 是否包含否定词("不要"、"不辣")
  • 是否包含场景词("加班"、"聚会")

2.5 地理感知生成

外卖场景的独特约束------只能推荐可配送商品

复制代码
输入格式:[用户位置] + [查询] + [配送范围]
输出:范围内的商品ID列表

实现方式

  1. 训练阶段:在训练数据中加入地理信息,让模型学会位置感知
  2. 推理阶段:生成结果后进行地理过滤,移除不可配送商品

🧪 3. 实验设置

3.1 数据集

配置项 设置
数据来源 美团外卖真实搜索日志
商品规模 数百万SKU
查询规模 千万级查询样本
训练/测试划分 按时间划分,避免数据泄露

3.2 基线方法

方法 类型 说明
BM25 传统IR 基于词频的经典检索算法
稠密检索 神经检索 双塔模型+ANN检索
原始GR 生成式 使用随机ID的生成式检索

3.3 评估指标

  • Recall@K:前K个结果中相关商品的召回率
  • MRR:平均倒数排名(Mean Reciprocal Rank)
  • 在线指标:订单量、点击率、用户满意度

3.4 实现细节

组件 配置
基座模型 Qwen2.5-1.5B-Instruct
训练框架 LLaMA-Factory
RQ-VAE层数 4层
码本大小 每层1024个码字
分布式训练 PyTorch DDP

📊 4. 实验结果

4.1 离线评估


图3:HierGR与基线方法在MSMARCO数据集上的性能对比------展示了不同方法在Recall@K和MRR指标上的表现

方法 Recall@10 Recall@50 MRR
BM25 45.2% 62.1% 0.312
稠密检索 58.7% 74.3% 0.421
原始GR(随机ID) 52.1% 68.9% 0.385
HierGR 61.3% 77.8% 0.456

关键发现

  • HierGR在所有指标上都优于基线方法
  • 相比原始GR,层级语义ID带来了显著提升(Recall@10: 52.1% → 61.3%)
  • 相比稠密检索,HierGR在复杂查询上优势更明显

4.2 在线A/B测试

真实生产环境的验证结果:

指标 提升幅度 统计显著性
复杂意图订单量 +0.68% p < 0.01
整体点击率 +0.23% p < 0.05
搜索满意度 +1.2% p < 0.05

商业价值说明

  • 美团外卖日均订单量超过4000万单
  • 0.68%的订单提升 ≈ 每天多27万单
  • 这是非常可观的营收增长

4.3 不同查询类型的性能对比

查询类型 稠密检索 HierGR 提升
简单查询 72.3% 73.1% +1.1%
多约束查询 48.6% 58.2% +19.8%
隐含意图 41.2% 52.7% +27.9%
场景化查询 39.8% 51.3% +28.9%

关键洞察 :HierGR在复杂查询上的优势最为明显,这正是LLM理解能力的体现。

4.4 延迟分析

组件 延迟(ms)
查询编码 5
缓存查询 1
GR生成(缓存未命中) 50
稠密检索 20
结果融合 5
总延迟(缓存命中) ~30
总延迟(缓存未命中) ~80

延迟优化效果

  • 通过缓存机制,40%+的请求可以在30ms内完成
  • 平均延迟控制在50ms以内,满足在线服务要求

4.5 消融实验

配置 Recall@10 MRR
完整HierGR 61.3% 0.456
- 层级语义ID(改用随机ID) 52.1% 0.385
- 查询缓存 61.3%* 0.456*
- 混合检索(仅用GR) 56.8% 0.412
- 地理感知 59.2% 0.438

*注:缓存不影响召回质量,但影响延迟

消融实验结论

  1. 层级语义ID贡献最大:移除后Recall@10下降9.2个百分点
  2. 混合检索很重要:纯GR不如混合策略
  3. 地理感知有帮助:提升2.1个百分点

🔬 5. 技术深度解析

5.1 为什么层级语义ID有效?

从信息论角度理解:

方面 随机ID 层级语义ID
信息熵 最大(完全随机) 结构化(层级递减)
学习难度 需要记忆所有ID 可利用层级结构泛化
新商品处理 完全陌生 可复用已有码字

类比理解

  • 随机ID像是给每个人分配一个随机数作为名字
  • 层级语义ID像是"张-北京-海淀-中关村-001"这样的结构化命名

5.2 GR与RAG的关系

维度 生成式检索(GR) 检索增强生成(RAG)
核心思路 直接生成目标ID 检索后增强生成
适用场景 结构化检索(商品、文档ID) 开放域问答、知识增强
延迟特性 可通过缓存优化 依赖检索+生成两阶段
互补性 可作为RAG的检索模块 可整合GR的检索结果

5.3 多任务学习目标

HierGR同时优化多个目标函数:

L = L g e n + λ 1 L r a n k + λ 2 L d i v \mathcal{L} = \mathcal{L}{gen} + \lambda_1 \mathcal{L}{rank} + \lambda_2 \mathcal{L}_{div} L=Lgen+λ1Lrank+λ2Ldiv

损失项 说明 作用
L g e n \mathcal{L}_{gen} Lgen ID生成准确率 确保生成正确的商品ID
L r a n k \mathcal{L}_{rank} Lrank 生成结果排序质量 优化商品排序
L d i v \mathcal{L}_{div} Ldiv 结果多样性 避免结果过于单一

5.4 增量更新支持

外卖场景商品变化频繁,HierGR支持增量更新:

操作类型 处理方式 延迟
新商品上架 RQ-VAE编码生成语义ID,加入索引 分钟级
商品下架 从生成候选中移除 秒级
信息更新 增量更新商品嵌入 分钟级

⚠️ 6. 局限性与未来方向

6.1 当前局限

局限性 说明 可能的解决方案
冷启动问题 新商品缺乏交互数据,语义ID质量较低 利用商品描述生成初始嵌入
长尾查询 罕见查询的生成效果有限 增加长尾查询训练数据
实时状态 商品售罄等状态变化的实时反映有延迟 引入实时库存感知机制
多模态缺失 未利用商品图片信息 融合视觉特征

6.2 未来研究方向

  1. 多模态GR:结合商品图片进行生成
  2. 个性化GR:融入用户历史偏好
  3. 跨场景迁移:从外卖迁移到其他电商场景
  4. 实时库存感知:更好地处理商品可用性
  5. 更大规模LLM:探索7B+模型的效果

💡 7. 实践启示

7.1 GR工业部署建议

  1. 混合策略优先:不要完全替代传统检索,采用融合方案
  2. 缓存机制必备:热门查询的缓存可大幅降低平均延迟
  3. 语义ID设计关键:需结合业务特点设计ID结构
  4. 渐进式上线:先在复杂查询场景验证,再扩展覆盖
  5. 监控体系完善:关注延迟、召回率、在线指标的变化

7.2 技术选型参考

场景 推荐方案 理由
商品规模 < 10万 稠密检索 简单高效
商品规模 10万-100万 HierGR 平衡性能与成本
商品规模 > 100万 HierGR + 分布式 可扩展性
复杂意图占比高 提高GR权重 发挥LLM优势
延迟要求极高(<20ms) 稠密检索为主 GR延迟较高

7.3 复现思路

python 复制代码
# 1. 训练RQ-VAE生成语义ID
from rqvae import RQVAE

rqvae = RQVAE(
    num_layers=4,
    codebook_size=1024,
    embedding_dim=768
)
semantic_ids = rqvae.encode(item_embeddings)

# 2. 准备训练数据
# 格式:(query, [semantic_id_1, semantic_id_2, ...])
train_data = [
    ("奶茶", ["12-34-56-78", "12-34-56-79"]),
    ("不辣的面", ["21-43-65-87", "21-43-65-88"]),
]

# 3. 微调LLM(使用LLaMA-Factory)
# 基座模型:Qwen2.5-1.5B-Instruct
# 训练任务:给定query,生成semantic_id序列

# 4. 在线部署
# - 查询缓存
# - GR生成 + 稠密检索融合
# - 地理过滤

📚 参考文献

  1. Rajput, S., et al. (2024). Recommender Systems with Generative Retrieval. NeurIPS 2023.
  2. Tay, Y., et al. (2022). Transformer Memory as a Differentiable Search Index. NeurIPS 2022.
  3. Wang, Y., et al. (2022). A Neural Corpus Indexer for Document Retrieval. NeurIPS 2022.
  4. Sun, W., et al. (2023). Learning to Tokenize for Generative Retrieval. NeurIPS 2023.
  5. Zeghidour, N., et al. (2021). SoundStream: An End-to-End Neural Audio Codec. IEEE/ACM TASLP 2021.

🔗 相关资源

相关推荐
管理快车道1 天前
连锁零售利润增长:我的实践复盘
大数据·人工智能·零售
智源研究院官方账号1 天前
众智FlagOS 1.6发布,以统一架构推动AI硬件、软件技术生态创新发展
数据库·人工智能·算法·架构·编辑器·硬件工程·开源软件
Elastic 中国社区官方博客1 天前
使用 LangGraph 和 Elasticsearch 构建人机交互 Agents
大数据·人工智能·elasticsearch·搜索引擎·langchain·全文检索·人机交互
李瑞丰_liruifengv1 天前
Claude Agent SDK 最简玩法:几行代码配合 Markdown 轻松搭建 Agent
javascript·人工智能·程序员
老吴学AI1 天前
斯坦福AI顶级课程:AI 职业发展建议与市场展望(详细逐字稿)by 吴恩达和劳伦斯
人工智能·深度学习·机器学习·vibe coding
俞凡1 天前
AI 智能体高可靠设计模式:竞争代理组合
人工智能
import_random1 天前
[深度学习]LSTM模型的构建模块(如何添加层)
深度学习
俞凡1 天前
AI 智能体高可靠设计模式:层级代理组
人工智能