大语言模型驱动的搜索查询理解:从构想到生产实践

本文详细介绍了Yelp如何将大语言模型集成到搜索查询理解系统中,涵盖查询分割、拼写纠正和评论高亮等核心技术任务,分享了从概念验证到全量部署的完整技术架构和实践经验。

搜索查询理解与LLM:从构想到生产

引言

从用户输入搜索查询到我们呈现结果列表的那一刻,理解用户意图对于满足他们的需求至关重要。Yelp已将大语言模型集成到众多功能中,从创建基于一手评论突出商家最知名特点的商家摘要,到智能引导消费者通过个性化相关问题向服务提供商请求报价的Yelp助手。在这些应用中,查询理解是开创性项目,已成为最完善的用例,为Yelp创新使用LLM改善用户搜索体验奠定了基础。

特别是需要查询理解的任务,如拼写纠正、分割、规范化和评论高亮,都具有一些共同且有利的特征。这些包括:(1)所有这些任务都可以在查询级别缓存,(2)需要读取和生成的文本量相对较低,(3)查询分布遵循幂律分布 - 少量查询非常流行。这些特征使查询理解成为使用LLM的高效领域。

任务定义

查询分割

给定查询,我们希望分割并标记该查询的语义部分。例如,“pet-friendly sf restaurants open now"可能有以下分割:{topic} pet-friendly {location} sf {topic} restaurants {time} open now。这可用于在适当时进一步优化搜索位置,隐式重写地理边界框以匹配用户意图。

评论高亮

给定查询,我们希望获得创造性扩展的短语列表以进行匹配 - 特别是帮助我们为每个商家找到有趣的"评论片段”。评论片段帮助用户了解每个显示的商家如何与其搜索查询相关。例如,如果用户搜索"dinner before a broadway show",在简短评论片段中加粗"pre-show dinner"短语对他们的决策非常有帮助。

任务制定

在此步骤中,我们的初始目标是:(1)确定LLM是否适合该问题,(2)定义任务的理想范围和输出格式,(3)评估将多个任务合并到单个提示中的可行性。

查询分割

与传统命名实体识别技术相比,LLM在分割任务中表现出色,并且足够灵活,可以轻松自定义各个类别。经过几次迭代,我们为查询分割确定了六个类别:topic、name、location、time、question和none。

查询分割提示中的少样本示例:

1
2
3
4
5
6
1) chicago riverwalk hotels
   => {location} chicago riverwalk {topic} hotels
2) grand chicago riverwalk hotel
   => {name} grand chicago riverwalk hotel
3) healthy fod near me
   => {topic} healthy food {location} near me [拼写纠正 - 高]

我们还注意到拼写纠正不仅是分割的前提条件,而且是概念上相关的任务。拼写纠正和分割可以由足够强大的模型一起完成,因此我们添加了一个元标签来标记拼写纠正的部分,并决定将这两个任务合并到单个提示中。

在RAG方面,我们使用为该查询查看过的商家名称来增强输入查询文本。这有助于模型学习并从常见主题、位置和拼写错误中区分商家名称的多个方面。

评论高亮

LLM在创造性任务中也表现出色,利用其世界知识扩展概念。在此任务中,我们使用LLM生成适合高亮的术语,并设定了较低的包含门槛 - 选择包含任何比完全不显示片段更好的短语。

此任务最困难的部分是设计出色的短语列表示例。仅使用查询文本中的单词,我们在高亮评论片段方面的选择非常有限。不仅如此,这个复杂任务中还有许多细微差别,使得传统的文本相似性模型难以解决。

评论高亮提示中策划示例的演变:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
2022年5月
查询:healthy food
-> 关键概念:healthy food, healthy, organic

2023年3月
healthy food
-> healthy food, healthy, organic, low calorie, low carb

2023年9月
healthy food
-> healthy food, healthy options, healthy | nutritious, organic, low calorie, low carb, low fat, high fiber | fresh, plant-based, superfood

2023年12月(带RAG)
搜索:healthy food,类别:[healthmarkets, vegan, vegetarian, organicstores]
-> healthy food, healthy options, healthy | nutritious, organic, low calorie, low carb, low fat, high fiber | fresh, plant-based, superfood

在RAG方面,我们使用与该查询最相关的商家类别(来自我们内部预测模型)增强了输入原始查询文本。这有助于LLM为我们的需求生成更相关的短语,特别是对于具有不明显主题(如特定餐厅名称)或模糊搜索(如pool - 游泳vs台球)的搜索。

概念验证

在制定任务并定义输入/输出格式后,我们的重点转向构建概念验证,以证明新方法在实践中的有效性。

查询分割

为了离线评估,我们观察了新分割对下游任务以及专门数据集的影响。我们在名称匹配和位置意图的人类标记数据集上比较了LLM提供的分割与现状系统的准确性。在这种分割信号的不同应用中,我们能够(a)利用(名称)标签的令牌概率改进我们的查询到商家名称匹配和排名系统,以及(b)使用(位置)标签通过隐式位置重写实现在线指标胜利。

原始查询文本 原始位置 重写位置(仅由搜索后端使用)
Restaurants near Chase Center San Francisco, CA 1 Warriors Way, San Francisco, CA 94158
Ramen Upper West Side New York, NY Upper West Side, Manhattan, NY
Epcot restaurants Orlando, FL Epcot, Bay Lake, FL

评论高亮

生成短语质量的离线评估是主观的,需要具有良好产品、定性和工程理解的强大人类注释者。我们交叉检查了人类注释者的意见,并对片段执行了一些定量方法,如查看短语的常见程度。经过彻底审查,我们使用新高亮短语进行了在线A/B实验。

扩展规模

如果概念验证的在线实验显示出有意义的积极影响,就是时候改进模型,并将其利用扩展到更大数量的查询。然而,扩展到数百万查询(或实时模型,以支持前所未见的查询)带来了成本和基础设施挑战。

目前,我们已经确定了一个从原型阶段扩展到服务100%流量的模型的多步骤过程:

  1. 使用"昂贵"模型(GPT-4/o1)迭代提示
  2. 为微调较小模型创建黄金数据集
  3. 在用于微调之前尽可能提高数据集质量
  4. 微调较小的模型(GPT4o-mini),我们可以在数千万的规模上离线运行
  5. 可选地,微调更小、成本更低且速度更快的模型(仅针对长尾查询实时运行)

评论高亮

在微调我们的模型并在多样化和随机测试集上验证响应后,我们通过使用OpenAI的批量调用为这些查询预计算片段扩展,扩展到95%的流量。生成的输出经过质量检查并上传到我们的查询理解数据存储。由于搜索查询的幂律分布,使用基于缓存的系统(如键/值数据库)来改进检索延迟。

通过这个预计算信号,我们进一步利用它们在其他下游任务中拥有的"常识"知识。例如,我们使用相关扩展短语的CTR信号进一步优化我们的排名模型,并另外使用短语(在商家类别上平均)作为启发式方法,为我们预计算未覆盖的剩余5%流量获取高亮短语。

未来工作

将LLM更深地集成到我们的搜索系统中,对于改变用户搜索体验具有巨大潜力。随着LLM格局的发展,我们继续适应这些新功能,这可以解锁使用我们内容的新方式。对于某些需要复杂逻辑推理的搜索任务,与之前的生成模型相比,我们开始看到最新推理模型生成的输出质量带来巨大好处。

结论

LLM在改变用户搜索体验方面具有巨大潜力。要实现这些可能性,涉及构思、概念验证测试和全规模生产推出的战略方法至关重要。这需要持续迭代和适应基础模型的新进展,因为某些查询理解任务可能需要更复杂的逻辑推理,而其他任务则需要更深的知识库。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计