Spotify正在构建统一的生成式推荐系统,通过将用户行为和内容转化为向量嵌入,利用LLM架构实现个性化推荐,已覆盖7.5亿用户和1亿曲库。
👤 WHO: Shiobam,Spotify人工智能基础架构团队中用户表征组技术负责人,来自伦敦
🎯 WHAT: 揭秘Spotify在LLMs时代如何通过统一模型和生成式推荐提升个性化体验
⏰ WHEN: 当前技术已部分投入生产**,如“收听下一集”功能
🌐 WHERE: 覆盖184个地区市场,服务7.5亿**用户,涉及音乐、播客、有声书等内容
❓ WHY: 从孤岛式推荐转向LLM统一骨干架构,解决传统方法无法很好融合用户隐式和显式反馈的难题
🔧 HOW: 采用Transformer模型进行对比预训练和监督微调,将用户行为编码为用户嵌入,内容压缩为语义ID;再通过软token注入实现个性化预测
💡 SO WHAT: Spotify用户将获得更准确、可解释的推荐,比如“多放贾斯汀·比伯**”这样的聊天反馈可优化模型
(视频中没有明显特别的演讲者金句,暂且留白。)
准时开始。大家好,我是Shiobam,来自Spotify。今天我的演讲主题是Spotify如何实现个性化推荐,尤其是在LLMs时代。在座各位中有Spotify用户吗?请举手。很好,感谢大家使用Spotify。今天的分享与传统agentic意义上的上下文工程不同,会更侧重我们在建模层面的上下文工程实践。如果你对Spotify应用的工作原理感兴趣,想知道我们如何推荐歌曲、节目等内容,这场演讲将帮助你理解我们如何利用你的数据,为你推荐你喜欢的内容。
嗯,简单介绍一下我自己。我是Spotify人工智能基础架构团队中用户表征组的技术负责人。这个团队负责构建所有前沿基础模型,这些模型被用于Spotify整个推荐系统栈。我们主要做用户表征、内容表征,以及适配开源权重等工作。我们进行对比预训练、监督微调等前沿实验室和竞争对手都在做的各种工作。我们努力确保为大家打造最好的音乐推荐系统。我的背景是机器学习工程师,曾在Twitter工作过,目前住在伦敦。
所以如果你有空来喝杯咖啡聊聊天,我很乐意在演讲结束后或平时聊聊这些内容,因为这真的很酷。今天我要讲三件事。第一件事是关于基础用户建模。这是什么意思呢?本质上就是我们试图了解你,也就是用户。我们认为,在LLMs时代,个性化未来的三个关键方面包括用户建模部分。然后是内容方面。也就是如何让LLMs了解你拥有的内容,比如Spotify上的曲库,或者你平台上的任何内容。
最后一步,当你有了这两块拼图后,要将它们整合成可操控且个性化的系统。尽可能实现灵活操控,这部分我会详细说明。大致可以理解为:从动作序列转化为向量,再通过向量生成token,最后将向量和token与已有的LLM结合,形成一条尽可能个性化的处理流程。
嗯,简单介绍一下Spotify。对于还没用过的人,我们现在大约有7.5亿用户,曲库超过1亿首。目前约有35万本有声书——可能更接近40万本,还有数百万播客和大量视频内容。越来越多的创作者开始转向视频形式,我们也在全力支持这种转变。目前业务覆盖约184个市场。正如大家所见,我们拥有海量用户、数据和内容。那么问题来了:如何整合这些资源,为用户打造最实用的产品?
嗯,我们的做法是,显然我们使用机器学习模型至少已经十年了,甚至更久。你可能听说过“每周发现”这个功能,或者你很可能就是它的用户。这个功能大概从2015年就有了,那时我还在读研究生。当时对我来说,它是我用过的最酷的产品之一,因为它与我当时使用的文本堆栈中的交互方式相结合,而且它是个性化的,还会不断变化。在过去的十年左右,我们在应用中加入了越来越多的个性化和产品功能。所以我们有多个垂直领域,也有许多新的产品界面。
我们有个叫AI DJ的功能,你可以跟它对话,它会推荐内容或播放音乐。此外还有提示歌单功能,你可以像跟Spotify模型对话那样输入提示词,它就能根据你的需求生成定制歌单。这周开始这个功能还支持播客了——如果你愿意,直接输入提示词,它就会根据你的需求为你创建一集集播客组成的播放列表。这就是我们正在迈向的未来:用户拥有可操控性。用户可以用自然语言与Spotify对话,现在我们还有了"品味档案"功能。
目前这项功能只在少数市场推出,但今年晚些时候会逐步扩展。我们的核心理念是:向用户透明展示我们所掌握的关于你的信息,然后由你自主决定哪些信息需要我们保留,哪些需要遗忘。简而言之,就是尽可能赋予你最大的控制权。在此过程中,考虑到部分同仁可能不熟悉推荐系统和机器学习领域,我简单说明一下背景:我们称之为"Tradex"的架构——直到几年前还是构建推荐系统的主流范式——本质上是一个多步骤的流水线,需要处理海量的项目目录。
嗯,我们有一个候选生成步骤,能把物品空间从数百万缩减到几百个,然后进入排序阶段,有时还会用多个排序器进一步筛选,最终生成推荐给你的歌单,比如你最想听的歌曲。这个流程在不同产品中都有应用,比如首页推荐排序、个性化歌单、搜索、播客、广告等等。基本上每个产品都有自己的团队和模型,所以这些工作分散在不同团队中。有些模型表现更好,有些则拥有不同的特征。
我们正在从那种孤岛式的运作模式转向一个统一的模型,这个模型类似于LLMs的工作方式,支持类似LLM的骨干架构,让用户能够引导它生成你想要的推荐。其中一个关键组成部分是用户建模部分。这正是我所在的团队的工作——我们构建用户嵌入,这些嵌入本质上是向量表示,能够告诉Spotify用户在所有历史数据中的品味,包括多年来用户与我们的各种互动记录。
嗯,这就像下游所有模型的基础,那些真正推荐内容或让你搜索内容的模型。嗯,这些模型非常复杂。所以,嵌入模型会为超过十亿用户生成嵌入向量,因为我们整体上有很多用户,有些是月活跃用户,有些不是。嗯,我们每天都会做这件事。所以这就像一条庞大的流水线,成本非常高。
多年来,我们逐渐摒弃了那种泛化的用户表征方式——这曾是机器学习的主流范式。比如我们团队去年发表的一篇论文中,就公开讨论了当时采用的用户嵌入模型。那本质上是一个自编码器模型。简单来说,它会提取你的所有特征,压缩成一个小型向量,再从这个向量重建原始特征。这种压缩-解压过程能让模型学习用户特征,最终以向量形式呈现用户交互行为。
所以,这是相当标准的内容,很多人在自然语言处理和计算机视觉领域也会做类似的事情,这也与过去的方式和推荐系统的发展方向一致。嗯,我们正在逐渐摆脱这种方式,转向基础模型的方向。所以现在我们有了这种单一的序列模型,正如你所看到的,整个行业都在向transformers迈进,这种转变不仅发生在普通的科技行业,也发生在那些使用推荐系统并将其作为主要业务的公司中。嗯,我们也是其中之一,我们也在转向使用transformers来处理这类事情。
核心思路是将用户交互行为融入提示词中。这本质上就是上下文——当我们讨论上下文工程时,指的就是这种语境。此外还有请求上下文,包括查询内容、产品界面等要素,以及推荐对象本身。当把这些元素整合起来,叠加transformer层和多个注意力头等结构,再通过数百万乃至数亿用户数据进行训练后,最终会得到非常惊艳的成果。比如像这样的效果——
U 所以这张图来自我们较新的模型之一,它展示的是模型所学内容的压缩版本。图中蓝色代表曲目,粉色代表播客剧集,而绿色则是用户。其中那个绿色点是我,其他绿色点是我团队里的同事。这大致说明了我们正在做跨内容建模,将用户、曲目和剧集嵌入到相同的内容空间,或者说嵌入空间中。
嗯,你大概能从这个图像中想象出,在超球面上,你与不同内容共处,哪些内容离你近,哪些离你远,以及你如何探索那个邻近区域,还有你所在的位置如何被朋友的位置等因素所影响。这就像是模型学习内容的一种可视化呈现。以我为例,我是一名机器学习工程师,非常关注Anthropic的动态以及科技行业的最新发展。因此,我的特定嵌入向量与这个大型科技播客非常接近。
在右侧你可以看到,那些线条扩散的点就是我,粉色的线条代表曲目流,蓝色的线条代表剧集流。哦,抱歉,我说反了。你可以直观地看到,无论你在听什么或没在听什么,都能通过嵌入空间来理解用户的状态。这些模型非常智能。一旦你向它们提供用户信息,它们就能学会将所有内容映射到同一个空间中,这真的很酷。接下来这部分更多是关于目录理解。现在我们有了用户,我们理解了用户,也建立了他们的模型。
我们如何理解目录呢?嗯,目录理解通常有多种方式。最常见的方法类似于用户侧的处理,比如训练一个向量来理解内容。也就是说,你会有一个代表项目的向量,无论是一首歌、一位艺术家、一个播客还是一集节目。嗯,你拥有这个向量,同时还有一个用户向量。这就是所谓的Spotify知识,也就是我们对所处理的内容或不同实体的了解。嗯,然后还有世界知识,这部分并非来自Spotify,而是来自我们正在使用的这些开源权重模型。
嗯,像Llama或Quen这样的模型,或者其他开源模型。我们做的是对这些模型进行fine-tune,然后通过某种方式将Spotify的知识嵌入到这些模型中——具体方法我稍后会谈到。这样做能带来可操控性,能提供更好的推荐,还能实现可解释性。所以当你使用语言模型进行推荐时,会免费获得很多好处。不过这里也存在权衡,比如模型最终会出现遗忘问题,灾难性遗忘就是一个典型问题。
嗯,但总体来看,根据我们观察到的现象,这类模型非常擅长将世界知识与平台自身积累的知识相结合,从而构建出能全面应用于推荐系统的解决方案。现在要讨论的是上一张幻灯片提到的内容——我们究竟如何让这些模型理解内容本身?先从这点说起吧。我们采用的方法是使用语义ID。语义ID是个相对较新的概念,我记得几年前YouTube团队发表过一篇论文,首次在视频平台场景中提出了这个概念。
嗯,它的作用是这样的:当你有一个代表某段内容的向量时——比如我们这里的一首曲目或一集节目——我们会像处理单词那样对它进行token化处理。这个过程相当于把那个庞大的向量(比如一千维)压缩成四到六个token。这样一来,我们就能用这些token像训练LLMs那样训练LLM,让LLM能够自动回归生成下一个token——不过这里的下一个token不是单词,而是你接下来要听的下一首歌或下一集节目。嗯,大致就是我们在做的事情。
我们正在进行后训练,或者说,我们是在持续利用Spotify拥有的目录数据来训练这些LLMs模型。
我们使用语义ID将向量压缩成语义ID。底部可以看到Ariana Grande和Bruno Mars的例子,我们用六个token来表示他们。这些数字实际上是token的ID。前两个token是共享的,因为他们都是流行歌手,有共同点。但其他token不同,因为它们代表更细分的领域。这有点像分层结构,将嵌入压缩成这六个token,并形成层级关系。这样模型就能自回归地生成你接下来会听的歌手或歌曲。
嗯,这正好强调了我们的做法。我们利用用户上下文,比如这里有个意大利用户,他们的收听历史被标记化,我们将这些收听历史发送出去,并用于训练数据中。这样我们教会模型如何使用语义ID进行交流,这也就是我之前在幻灯片中提到的领域适应。最终输出本质上是生成下一个项目,无论是下一集节目还是一首曲目,比如这个人可能听什么。举个例子,一个意大利人可能会听一集意大利播客。
嗯,这是一个我们提供给模型的提示示例。可以看到左侧的提示包含Spotify URI,这是我们用来表示项目(此处指单集)的标识符。我们将其转换为语义ID,也就是模型实际关注的token符号,并最终用于预测用户接下来会收听的下一集。这就是目录理解部分的内容。现在我们已经完成了用户建模和目录理解,下一步本质上就是将这些组件整合起来,形成一个可操控的个性化生成推荐系统。
这其实是从传统的推荐系统模型转向生成式模型。这就是我提到的几周前推出的产品,叫做“品味档案”。它的核心理念是,有一段文本能够代表用户的身份特征。我们会把这个文本展示给你,也就是用户本人,然后你可以通过聊天、发送消息或添加一些文字来告诉Spotify,比如你想多听贾斯汀·比伯的歌,或者你不喜欢推荐给你的某个特定播客。
这样做的目的是让模型能够接收经过编辑或处理的数据,并将其反馈到生成模型中,从而提升模型理解用户需求、推荐更合适内容的能力。本质上,我们目前掌握了内容层面的部分,但用户层面的部分尚未完善。用户层面的缺失是因为这些模型最终只能基于有限数量的训练数据进行训练——我们无法针对超过7.5亿用户逐一训练模型。因此,需要引入某种程度的协同过滤机制。模型有望实现一定程度的泛化,但同时也必须具备个性化能力。
嗯,实现这一点的方法又回到了用户模型的概念上。嗯,所以你有那个LLM,你有用户表征。你要做的是将用户表征投影到LLM的空间中。嗯,这样做的作用是,它能在模型内部创建所谓的软token。这本质上是一个代表用户的token,显然会根据我们为其生成响应的用户而进行上下文调整。嗯,这就能让模型实现个性化。
这就像是拼图的最后一块,你有一个常规的LLM向量投影,然后还有一个用户向量被投影到LLM的空间中,并嵌入到提示词里。最终当模型实际生成推荐时,由于它包含了关于你的上下文信息——也就是我们正在为其生成推荐的那个人——模型就实现了个性化。这是我们早期取得的一些成果,内部指标显示效果相当积极。如果你使用Spotify,比如收听下一集功能,或者你在Spotify上听播客,这项技术实际上已经投入生产了。
所以,如果你收到推荐,它正是来自这样的机制。这可以说是最后的关键环节。我们拥有代表用户的嵌入向量,代表内容压缩版本的语义ID,以及这种软token化方法——它允许你将用户投射到模型的token空间中。这种方法突破了传统推荐系统模型的框架,转向了序列建模的体系。这正是我们非常兴奋的方向。我认为随着我们持续推进,将这种技术更深入地融入现有的所有推荐系统,未来一定会非常令人期待。
嗯,我们非常激动很快就能推出这个。好的,我的发言就到这里。很高兴能与大家交流,如果各位有任何问题,欢迎在演讲结束后随时联系我。