选择是优步吃体验的基础。在任何给定的地点,都可能有数千家餐厅,甚至有更多单独的菜单供食客选择。许多因素都会影响他们的选择。例如,一天中的时间、他们的饮食偏好和当前的情绪都可以发挥作用。在Uber Eats,我们努力帮助食客尽可能轻松地找到他们想要的食物。
我们通过搜索和推荐技术以及机器学习的最新进展来完成这项任务。从食客输入查询的那一刻起,我们就试图根据我们对食物的了解来理解他们的意图,然后使用一种习得的食客意图表示来扩展这个查询,并将最相关的结果呈现出来。Uber Eats的发现过程很大一部分来自于我们构建的推荐系统,该系统旨在吸引食客,并帮助我们的餐厅合作伙伴。通过框架,比如多目标优化而且multi-armed强盗在美国,我们平衡了Uber Eats市场中餐厅和食客的需求。
在这个由两部分组成的系列文章中,我们将深入了解Uber Eats应用程序,并介绍我们在帮助食客做决策过程中所做的努力。本系列文章的第一部分着重于通过内部食物知识图为Uber Eats构建查询理解引擎,以及通过基于表示学习的查询扩展来帮助理解明确的食客意图所做的相关工作。的本系列的第二篇文章描述我们如何使用多目标优化来构建推荐引擎,根据食客的订单历史向他们展示新的餐厅。
理解意图
在帮助我们的顾客发现完美餐食时,我们试图理解的第一个问题是:吃东西的人在找什么?例如,我们办公室的一些工程师中午会点珍珠奶茶提神。当他们打开优步外卖应用程序时,他们的意图很明确,他们知道他们只想要奶茶。然而,当食客打开应用程序点餐时,他们的意图可能就不那么明确了。食客可能脑海中有一个大致的菜系,比如亚洲菜还是美国菜,但需要有人帮忙决定是选择中式还是日式,是选择三明治还是烧烤。
另一种情况是,食客可能在脑海中有某种类型的食物,但在浏览应用程序时却选择了其他食物乌冬面,但最后还是点餐荞麦面.在这种情况下,食客可能一直在寻找类似乌冬面的东西,比如荞麦面和拉面,而不仅仅是对乌冬面感兴趣。作为人类,这似乎是显而易见的;乌冬面和荞麦面有点相似,中国和日本都是亚洲菜。然而,机器仅根据文本信息就很难理解这些相似之处。事实上,我们做了大量的工作来训练它们在语义层面上做出这类智能决策。
通常情况下,食客会在Uber Eats应用程序中以搜索查询的形式通过文本说明他们的意图。因此,我们使用查询了解找出吃人的意图。尽管对于不同类型的搜索引擎来说,查询理解是一个共同的问题,但当面对食物和餐馆时,它提出了独特的挑战和额外的机会。餐厅可以根据特定的菜肴类型进行分类,但也可以在菜单上包括其他类型的菜肴。单个食品可以有足够的相似之处,使它们成为搜索查询的相关结果,尽管它们的名称可能完全不同。潜在结果集的地理边界产生了一个限制,这可能导致对查询没有明显的响应。
建立食品知识图谱
通过文本匹配来理解查询的经典方法自然语言处理(NLP)有效的前提是食用者的意图是明确和具体的。但是在意图不明确的情况下,例如上面概述的场景,仅应用经典的NLP方法是不够的。在我们可以采取的替代方法中,大多数方法都需要通过构建一个模型来建立对食物领域内实体的智能理解知识库.许多公司花费大量时间建立跨多个领域的知识库,使用谷歌知识库作为最知名的之一。
在优步,我们正在建立一个以食品为重点的知识库,以便更好地理解与食品相关的查询。
在食物领域,我们处理不同种类的实体,如餐馆、菜系和菜单项。由于这些实体具有自然的关系,我们可以将它们建模为图形。图是用于表示知识库中实体之间复杂关系的最常用形式。这个图表使得建模和链接数据更加直观。
建立知识库是一个非常具有挑战性的过程。为了有效地利用数据,知识库需要采用半结构化的形式:足够通用和灵活,可以轻松添加更多事实,但又足够具体,不只是一团数据。实现这种平衡需要建立一个本体或语言来描述图形,包括不同实体的属性以及它们之间的关系。
有了这个本体,我们的离线管道可以转换来自多个来源的消费数据,以符合其定义。一旦摄取离线管道的组件转换数据以适应我们的本体,然后运行一组分类器来消除数据的重复,并建立跨源连接,以利用图的抽象能力。例如,这个阶段涉及到在Foursquare(我们的数据源之一)上建立一个给定的餐馆与内部帐户数据中的餐馆相同。最后,一旦所有这些阶段都完成了,数据就会以一种能够以低延迟实时查询的方式存储。
有了一个已建立的图表,我们的下一个任务是利用它来优化食客的搜索结果。离线时,我们可以用非常描述性的标签广泛地注释餐馆和菜单项。在网上,我们可以实时重写食客的查询,以优化返回结果的质量。我们将这两种方法结合起来,以保证高精度和低延迟。
离线标记和在线查询重写都需要对数据中的实体以及它们之间的关系有语义上的理解。要在餐厅和项目级别构建丰富的标签和注释集,我们需要了解菜肴和菜肴类型之间的区别,以及某些菜肴与国家和子地理位置之间的关联。我们的图表使我们能够更好地理解这些不同的菜肴和菜系之间的关系。例如,如果食客询问“亚洲”菜肴,该图表可以推断“中国”和“日本”是“亚洲”的子集,并适当地显示餐馆。
如果它正在处理一个关于“乌冬面”的查询,该图表将使用在线查询重写来扩展搜索,以包括“拉面”、“荞麦面”和“日本”等相关术语;然而,如果餐馆没有在我们的底层数据库中正确标记,将很难确保所有相关餐馆的全部召回。这就是离线标签发挥作用的地方,它能让餐馆尽快向食客出售乌冬面或乌冬面相关菜肴。
此外,我们使用该图来解决搜索的另一个常见问题:零结果问题。当食客搜索的餐厅不在我们的平台上,或者任何匹配的餐厅都在食客的配送半径之外时,通常会出现结果缺失的情况。例如,“上海饺子王”对送货地址设置为旧金山的食客来说是可用的,但这家餐厅对送货地址设置为圣何塞的食客来说是不可用的。
我们不是简单地返回没有结果,而是利用图的跨域特性来显示该地区类似的餐馆。我们的图表不仅映射了菜系的节点,还映射了该地区的餐厅。这些餐厅节点与各自的菜系相关联,这让我们可以根据建议的结果找出该地区其他菜系相似的餐厅。
从数据中学习
除了创建一个图表,通过搜索查询来了解食客的意图,如前所述,另一种方法是直接利用食客的搜索行为数据。在下一节中,我们将讨论表示学习的方法。
表示学习
表示学习算法学习特性实体,通常通过潜向量空间嵌入。一个很好的例子是手套算法,该算法将单词嵌入到一个潜在的向量空间中,通过利用单词在语料库.重要的是,在学习的潜在向量空间中,单词之间的距离具有语义意义。受到GloVe和其他相关工作的启发,我们设计了以下内容query2vec模型与我们的食客搜索行为数据。
为了理解query2vec模型是如何工作的,我们首先解释从手套的论文:词而且上下文.为词,我们将整个查询建模为一个单一的查询,而不是将查询的每个标记建模为一个单词词.和上下文,我们说两个查询出现在同一个地方上下文如果它们指向同一家餐厅的订单。或者,把每个餐厅想象成上下文每个查询都是词,以及两个查询出现在餐馆里,如果它能让你点单。下面的图4说明了这个概念:
在利用query2vec时,导致类似餐馆订单的查询应该在嵌入式潜在空间中关闭。注意,在图4中,我们只讨论了词而且上下文没有具体的模型。这是因为,给定不同的产品需求,我们可以通过在线A/B测试探索表示学习的不同类型的进步。例如,在查询扩展用例中,我们发现GloVe的一个变体是有效的。
更具体地说,我们首先构造一个点互信息(PMI)矩阵与搜索查询如下:
![]()
在哪里一个而且b是两个调优参数,p(问1,问2)为查询的联合分布问1而且问2,
![]()
边际分布是p1.注意在我们的例子中p(问1,问2)可与查询的同现频率近似问1而且问2在相同的上下文中,如上所述。
对于PMI矩阵,我们使用基于手套的分解模型学习所有查询的向量表示。这样的查询向量表示可以作为下游机器学习模型的特征。
查询扩展
我们在Uber Eats面临的一个挑战是,我们不仅要为用餐者的查询提供尽可能好的结果,而且我们还必须面对一个事实,即潜在结果的世界仅限于特定区域的餐厅和菜单项。因此,由于与查询的直接匹配可能不存在,我们使用查询扩展来查找相关的匹配,这可以帮助我们的客户找到他们没有考虑过,但可能会感到满意的食物选择。下面我们以查询扩展为例,说明如何应用表示学习来改善食客的搜索体验。
查询扩展QE是搜索引擎中常用的一种技术,用于提高召回覆盖率和搜索质量。QE在以下两种情况下特别有用:1)食客的搜索意图不明确,查询本身无法完全捕获;2)从查询中检索到的结果质量有限。例如,当一个食客搜索“镡镡面,很可能食客也会对辛辣的中国菜或其他四川餐馆感兴趣;此外,可能没有多少餐馆卖“炒面”。
查询扩展中的一个关键组件是根据原始查询查找相似的查询。使用查询的向量表示,我们可以度量两个查询在它们的向量空间中的相似性。然而,仍然存在一个挑战:如何有效地实时查找与原始查询相似的查询。最近的邻居搜索是默认选项,还有一些快速/近似的变量可用。例如,对查询向量进行聚类以减少搜索空间,可以达到我们想要的效率。
在下面的图5中,我们演示了基于表示学习的查询扩展在实践中是如何工作的。一位食客搜索“炒面”,但在他的送货地址附近没有卖炒面的餐馆。查询扩展不是返回零结果,而是使我们能够检索与扩展查询相关的结果并对结果进行排序,例如“四川”、“中国”和“辛辣食物”。在后端,将原始查询扩展到类似的查询,并首先检索扩展查询中的相关餐厅,然后进行组合和排序,然后才显示给食客。
两全其美
虽然表示学习可以确定两个术语之间的关系有多密切,但它不能推断出它们是如何相关的。这在处理饮食限制时尤其成问题,比如清真食品。这个术语可能最终会扩展到“中东”、“地中海”或某些南亚菜肴,因为许多被归类为“清真”的餐厅也恰好属于这些其他类别之一。然而,反过来也不一定正确。非清真餐馆和菜肴的表面,特别是试图过滤清真的食客可能是非常误导,将导致一个糟糕的食客体验。
上述表示学习还需要食客行为数据的存在,当我们在一个几乎没有数据的新城市推出Uber Eats时,这就成了一个问题。考虑到平台的快速扩张,我们必须考虑到这种情况。即使在我们已经运营了一年多的城市,当食客搜索不在平台上的餐厅时,我们仍然会看到数据丢失的情况。在这种情况下,这些搜索通常会产生零结果,这意味着没有什么东西可以输入到我们的表示学习模型中。
考虑到这种局限性,知识图和表示学习方法是互补的,可以帮助我们有效地重写查询。随着召回率的增加,我们就可以使用learning-to-rank模型将扩展的结果与原始结果相结合,这有助于我们为优步吃的客户提供两个世界最好的东西。
前进
优步外卖探索团队一直在努力打造最好的应用体验,帮助我们的客户发现美味的食物。在这篇文章中,我们介绍了如何使用知识图和表示学习来理解显式的食客意图。考虑到我们平台的复杂性,我们在这个领域仍有许多挑战需要解决。例如,我们正在进一步发展我们的知识图谱库,以完善我们对食客意图的语义理解。在下一篇文章中,我们将讨论我们的推荐系统,并解释我们如何提供更个性化的优步吃体验。
为了进一步发展我们的愿景,我们正在寻找有才华的数据科学家和工程师加入我们的团队。如果您有兴趣帮助我们解决这些类型的问题,请考虑申请加入团队!
我们要感谢《Eater Discovery》的整个团队(工程、数据科学、设计、产品和产品运营)的辛勤工作,让这篇文章成为可能。
订阅我们的通讯以跟上优步工程公司的最新创新。






