当音乐不合心意时,AI能帮忙吗? - Filip Makraduli | 向量空间对话
Demetrios Brinkmann
·2024年1月9日

“有没有可能找到一种方法来传递我们拥有的这种感觉、这种氛围,并借助 AI 来理解我们在那一刻到底需要什么样的歌曲?”
– Filip Makraduli
想象一下,如果推荐系统能够理解口头指令或哼唱的旋律。这将极大地影响用户体验和推荐的准确性。
Filip Makraduli,一位来自北马其顿斯科普里的电气工程毕业生,通过在伦敦帝国学院获得生物医学数据科学硕士学位,拓宽了他的学术视野。
他目前是玛莎百货 (Marks and Spencer, M&S) 数字与技术团队的一员,深入零售数据科学领域,为各种机器学习和人工智能项目做出贡献。他的专长涵盖因果机器学习、XGBoost 模型、自然语言处理和生成式人工智能,目前专注于改进服装推荐系统。
Filip 不仅在专业上投入,还对科技初创企业、创业和机器学习研究充满热情,这体现在他对 Qdrant 的兴趣,这是一个他钦佩的初创企业。
在 Spotify, Apple Podcast, Podcast addicts, Castbox 上收听本期节目。您也可以在 YouTube 上观看本期节目。
主要要点
快来看看 Filip Makraduli 创建的歌曲氛围推荐系统。了解它是如何工作的!
Filip 讨论了 AI 如何帮助找到适合任何心情的完美歌曲。他带我们了解了他独特的方法,即使用人类语言和 AI 模型来捕捉歌曲的本质并生成个性化推荐。
您将从本视频中学到 5 个关键点
- AI 如何帮助我们理解和捕捉歌曲的氛围与感觉
- 使用语言来传递歌曲的体验和感觉
- 数据集和描述在构建非传统歌曲推荐系统中的作用
- 文本编码和使用句子转换器生成歌曲嵌入的重要性
- 如何使用向量空间和余弦相似度搜索来生成歌曲推荐
有趣事实:Filip 在视频中根据 Demetrios 描述的氛围和心情实时创建了一个 Spotify 歌单,展示了这个 AI 音乐推荐系统是多么强大和互动!
节目笔记
01:25 使用 AI 捕捉想要的音乐氛围。
06:17 更快更准确的模型。
10:07 句子嵌入模型映射歌曲描述。
14:32 改进音乐推荐,用户个性化。
15:49 Qdrant Python 客户端创建用户推荐。
21:26 关于如何为歌曲获得更好嵌入的问题。
25:04 用于个性化步行推荐的上下文信息。
26:00 需要预测、语音输入和音乐选项。
Filip 的更多语录
“当你用 Spotify 登录时,你可以获得与你在 Spotify 或任何你听音乐的应用上的偏好相关的推荐。”
– Filip Makraduli
“一旦用户输入一个查询,并且查询提到了某种心情,例如,我感觉很开心,天气晴朗等等,你就会获得与描述中包含这种语言解释和语言复杂性的歌曲的相似度。”
– Filip Makraduli
“我探索了 Qdrant,正如我所说,结合 Spotify Web API,针对这些特定的用户创建的推荐还有很多工作要做。”
– Filip Makraduli
文字记录
Demetrios:所以对于那些不知道的人,你将和我们讨论我们听的音乐不合心意时该怎么办。以及我们能否让 AI 来帮助我们?你目前在玛莎百货担任数据科学家。我知道你有一些幻灯片要分享,对吧?那我就让你分享屏幕了。我们可以开始幻灯片演示,然后我们会有一个小型的展示,之后我会回来回答一些问题。如果 Neil 最后还在的话,虽然我不认为他能待到最后,但我们会看看,我们可以把他拉回来,在节目的最后进行一些讨论。
Filip Makraduli:太好了。太好了。好的,没问题。我来分享我的屏幕。
Demetrios:好的。
Filip Makraduli:好的。
Demetrios:来了。
Filip Makraduli:好的。所以我必须用这张幻灯片,因为它作为开场幻灯片做得非常好。谢谢。是的。也谢谢你们做得这么好。是的,想法是,或者说灵感来自音乐,我们都听音乐。它在很多方面是我们生活的一部分。有时就像去健身房一样。
Filip Makraduli:我们准备好出发了,我们都兴奋起来,准备好去锻炼,然后我们点击播放。但是我们听到的音乐和歌单,在那一刻就不是我们 exactly 想要的那种。或者如果我们尝试工作几个小时,努力集中注意力,尝试编程几个小时,我们也可以这样做,然后点击播放,但又不是我们想要的。所以我的灵感来源于此。有没有可能找到一种方法来传递我们拥有的这种感觉、这种氛围,并借助 AI 来理解我们在那一刻到底需要什么样的歌曲?所以第一个显而易见的问题是,我们如何才能捕捉到一首歌的氛围和感觉?起初,一种流行且效果很好的方法是使用包含大量特征的数据集。Spotify 就有这样一个数据集,还有许多其他的开源数据集,它们包含了不同的特征,如响度、调性、节奏、以及与声学、旋律等相关的各种细节。这样做是可行的。
Filip Makraduli:这也是很多歌曲推荐系统构建的方式。然而,我想要做的也许是尝试一种不同的方法。尝试建立一个更非传统的推荐系统,姑且这么说。所以我在这里所做的是,我尝试只专注于语言。所以我的想法是,好的,是否可以使用人类语言来传递这种体验,这种我们拥有的感觉,并只使用这一点来尝试封装歌曲的这些特征。并且不使用数据集,而只有歌曲的描述或解释歌曲不同方面的句子。所以,正如我所说,这有点不太传统,更像是试水,但它在相当程度上是有效的。所以我所做的是,首先我创建了一个数据集,我向一个大型语言模型进行了查询。
Filip Makraduli:我尝试了 llama 和 chat GPT,两者都试过了。想法是提出有针对性的问题,例如,“这首歌让你感觉像哪个电影角色?”或者“这首歌的节奏怎么样?”等等,这些不同的问题可以帮助我们理解可能在什么情况下我们会听这首歌,它会让我们感觉如何?等等。正如我再次强调的,想法是只使用歌曲名称作为查询大型语言模型的输入。所以不是使用包含多种特征的完整数据集,而只使用歌曲名称,并利用这些大型语言模型的预训练能力来获取我正在寻找的信息。所以生成的示例数据是这样的。这首歌叫做 Deep Sea Creature。我们有一小段歌曲的描述。它说这首歌有一种沉重、黑暗、神秘的氛围。
Filip Makraduli:它会让你感觉像是在深入未知等等。所以这里选择的有点黑暗,但这是总体思路。因此,尝试以某种方式进行一些提示工程,以获取歌曲的正确特征,但通过人类语言来实现。这是第一步。那么下一步是如何编码这些文本。所以所有这些查询的方式让我想起了句子。这把我引向了句子转换器和 Sentence-BERT。过去进行这种句子相似性比较时常遇到的问题,就是我在这里突出显示的部分。
Filip Makraduli:所以这实际上是 Nils 几年前发表的一篇论文中的引用。所以,基本上,过去进行这种相似度计算的方法是使用交叉编码器,效果不错,但非常慢且难以扩展。因此,Nils 和他的同事创建了这种模型,这有助于扩展并使其快得多,同时也能保持相当高的准确性。BERT 和 RoBERTa 也被使用过,但正如我所说,它们对大型应用来说不够可扩展或实用。所以 Sentence-BERT 就是这样被创建的。这里的想法是,会有一个 Siamese 网络来训练模型,这样就可以有两个 BERT 模型,然后使用像零、一和二这样的标签进行训练,这些标签用来比较句子,判断它们之间是否存在蕴含、中立或矛盾关系。也就是说这些句子彼此之间的相似程度如何。通过训练这样一个模型并最终进行平均池化,模型的表现相当不错,并且能够很好地封装句子的语言复杂性。
Filip Makraduli:所以我决定在我的用例中使用并尝试句子转换器,这就是编码的部分。所以我们有了模型,我们对文本进行编码,然后我们有了嵌入。那么现在的问题是,我们如何实际生成推荐?相似度是如何实现的?这里的相似度是使用向量空间和余弦相似度搜索来完成的。有多种方法可以做到这一点。首先,我尝试了使用扁平索引,我尝试了 Qdrant 和 FIS。所以我两者都用过。对于扁平索引,效果不错。它工作得很好。
Filip Makraduli:对于少量示例、少量歌曲来说它很快,但在扩展时存在问题。所以一旦向量索引变大,可能会有问题。所以一种流行的索引架构是这里左边的这种。分层可导航小世界图。这里的想法是,你不需要遍历所有的示例,而是在不同的层中搜索示例,这样相似性搜索就更快。这是一种非常流行的方法。Qdrant 在这方面做了一个很好的可定制版本,我认为对于非常大规模的应用来说非常有用。这里的图表很好地说明了这种想法。
Filip Makraduli:所以在这个例子中有一个句子。比如一件条纹蓝色棉衬衫,然后是网络或者编码器。所以在我的例子中,这个句子是歌曲描述,神经网络是句子转换器。然后生成这些嵌入,再映射到向量空间中,然后查询这个向量空间,找到余弦相似度,从而生成推荐,这样一来,当用户输入一个查询,并且查询提到了某种心情,例如,我感觉很开心,天气晴朗等等,你就会获得与描述中包含这种语言解释和语言复杂性的歌曲的相似度。正如 Nils 所提到的,有很多方法可以实现这一点,尤其是在使用不同的嵌入模型和进行上下文相关搜索时。所以即使在我的用例中,这也是一个有趣的改进方向。快速截图看起来是这样的。例如,用户写的心情是,有点下雨,但我感觉需要一个人在伦敦长时间散步。
Filip Makraduli:这些是排名前五的推荐歌曲。这个也在 Streamlit 上可用。最后我会分享所有链接,之后你也可以点击创建 Spotify 歌单,这个歌单将保存到你的 Spotify 账户。正如你在这里看到的,上面写着歌单是今天早些时候生成的。所以是的,我试过这个,它奏效了。我稍后会尝试现场演示。希望它能再次奏效。但这目前还处于测试阶段,所以你无法在家尝试,因为 Spotify 首先需要批准我的应用并通过那个过程,这样我才能完全实现这一部分。
Filip Makraduli:正如我提到的,前端部分是用 Streamlit 完成的。为什么选择 Streamlit?我喜欢它的缓存功能。当然,它的通用性很好,可以非常轻松快捷地进行大量数据仪表盘和数据应用开发来测试模型,这相当不错。但是它提供的缓存选项对于加载 Hugging Face 或其他来源的模型,或者加载不同的数据库非常有帮助。所以如果你正在结合模型和数据。在我的例子中,我有一个索引的二进制文件和模型。所以做这些事情非常有用和快速,可以快速尝试不同的想法。所以这可以说是对我已经提到过的所有内容和整个项目的逐步概述。
Filip Makraduli:所以第一步是将这些描述编码成嵌入向量。然后将这些向量嵌入映射到向量空间中。这里有一些我如何使用 Qdrant 的示例,这相当不错。我觉得对于可扩展性而言,开发者体验非常好。它真的很有用。所以如果歌曲数量持续增加,它的表现会相当好。以及查询并找到更多相似的嵌入。前端使用 Streamlit 和 Spotify API 将歌单保存到 Spotify 账户。
Filip Makraduli:所有这些步骤都可以在某些方面进行改进和调整,我也将对此进行一些讨论。所以还有很多事情要做。目前有 2000 首歌曲,但正如我所提到的,在这个向量空间中,歌曲越多,推荐就会越具有代表性。所以这是我目前正在探索和做的事情,包括生成、过滤和用户特定的个性化。所以一旦你用 Spotify 登录,你可能会获得与你在 Spotify 或任何你听音乐的应用上的偏好相关的推荐。并且参考 Nils 的演讲,更好的模型、嵌入和嵌入模型有很多潜力。因此,对比学习的部分或内容感知的查询,也可能很有用。以及使用向量数据库,因为目前我正在使用一个二进制文件。
Filip Makraduli:但我探索了 Qdrant,正如我所说,结合 Spotify Web API,针对这些特定的用户创建的推荐还有很多工作要做。所以对于 Qdrant,它的 Python 客户端非常好用。《入门指南》帮助很大。所以我写了一些代码。我认为对于生产用例来说,它真的很棒。所以对于我这里的用例,正如你在右边看到的,我只是从一列中读取文本,然后用模型进行编码。所以句子转换器是我用来编码的模型。Qdrant 中有所谓的 collections,它们就像你可以创建的向量空间,你还可以对它们做不同的事情,其中我认为比较有用的一个是 payload 和 batch。
Filip Makraduli:所以你可以批量处理,控制每次请求发送到服务器的向量数量。而且 payload 功能在你想要添加额外上下文时很有帮助。比如我可能想按流派过滤。我可以将有用的信息添加到向量嵌入中。所以这是一个非常酷的功能,我正计划使用它。另一种潜在的方法是将音频波形、歌词和描述结合起来,将所有这些组合成嵌入,然后进行类似的处理。这也是我正在考虑要做的事情。是的,你们可能也注意到了,我是玛莎百货的数据科学家,我只是想说那里有很多有趣的与机器学习和数据相关的工作正在进行。
Filip Makraduli:有很多团队在处理非常有趣的用例,比如推荐系统,优惠的个性化,关于预测的不同东西。因果机器学习方面有很多工作正在进行,是的,数字和技术部门发展得相当好,如果你对零售数据科学用例感兴趣,我认为这是一个有趣的地方去探索。所以,谢谢大家的关注。我来试试演示。这是包含代码库和所有有用链接的二维码。你可以在 LinkedIn 上联系我。这是代码库的截图,二维码里有链接。代码库的名字是 song Vibe。
Filip Makraduli:我有个朋友说,这个代码库名字不太好。也许他说得对。但是,好吧,我们就在这里了。我只想快速演示一下,然后我们可以回到...
Demetrios:兄弟,我得说,我太喜欢了,当你提到你可以自动创建 Spotify 歌单时,我激动得不行。
Filip Makraduli:就像,“哦,太棒了,看看本地是否能运行。”你有什么建议,你现在是什么心情?
Demetrios:伙计,我正希望你问我呢。我现在有点玄妙的心情,我想要那种凯尔特女性的声音,但不是凯尔特音乐,只是凯尔特声音,而且要有大量的和声,厚重的和声。
Filip Makraduli:还有。
Demetrios:你没意识到你是在问一个音乐人吧。看看我们能得到什么。
Filip Makraduli:看看这在 2000 首歌中是否能行得通。好的,这就是结果。好的,是的,你得创建歌单。我们看看。
Demetrios:是的,你能把歌单设为公开吗?这样我就可以现在就去找到了。来了。
Filip Makraduli:我们看看。好的,是的,打开。现在 Spotify 歌单已创建。好的,太棒了。我也可以重命名它。你想把这个歌单命名为什么?
Demetrios:玄妙凯尔特和声。我认为我们应该用 AI。嗯,我的意思是,也许我们可以在括号里加个“也许”。
Filip Makraduli:是的。所以我稍后会把这个分享给你。太好了。但基本上就是这样。
Demetrios:它成功了。给它打十分。运行成功。这也很酷。
Filip Makraduli:现场演示成功。太棒了。现在又变成了无限屏幕,我现在已经停止了。
Demetrios:是的,经典,兄弟。好的,我这里有一些问题进来,聊天区也很活跃。所以我会先问一些聊天区的问题。但在我问这些聊天区的问题之前,有一件事我在想,当你提到下一步是获得更好的嵌入时。那么你只使用歌曲标题是有原因的吗?然后你检查过吗?你说有 2000 首歌,或者多少首歌?你有没有做任何事情来检查这些歌曲描述的输出?
Filip Makraduli:是的,所以我没有进行系统性的测试,比如“哦,是的,输出的结构是这样的”。但是,是的,我粗略地检查了一下,看了几首歌,它们看起来还不错,我的意思是,当然可以添加更多信息,但它们看起来还可以。所以我就想,“好的,让我试试看这个是否可行。”而且,是的,描述很不错。
Demetrios:太棒了。是的。这就涉及到 mornie 问的一个问题了。我看看。你打算把这个和别的什么方法结合起来吗,比如协同过滤、内容嵌入之类的?
Filip Makraduli:是的,我考虑过不同的风格,但我感觉我想先尝试与嵌入和语言相关的东西,因为我觉得在其他方面,在其他进行这些推荐的方法上,其他公司和解决方案已经做得非常出色了。所以我想尝试一些不同的东西,看看这是否也能奏效,或者至少达到类似的程度。这就是为什么我选择了这种方法而不是协同过滤。
Demetrios:是的,感觉你有点想测试边界,看看像这样似乎有点牵强的东西是否真的可能。看来我会给出肯定的回答。
Filip Makraduli:其实,一旦你看到它奏效了,就没那么牵强了。
Demetrios:是的,完全是。另一个问题是,有没有可能将当前的心情,也就是你正在寻找的氛围,与你的音乐偏好结合起来?
Filip Makraduli:是的。所以我在为你创建歌单时想到了这一点,有一种方法可以从 Spotify 获取你的热门前十歌曲或其他歌单等信息。所以我捕捉这个附加元素的想法就是通过 Spotify 来实现。当然,你也可以在应用中的个人资料或其他地方输入这些信息。所以一个想法是,一旦用户存在,你如何捕捉用户的偏好。因此你需要一些用户偏好的数据。这就是问题所在。但当然这是可能的。
Demetrios:你知道我喜欢什么吗?就像在你的例子中,你输入了,“我感觉想去散步,或者正在下雨,但我仍然想在伦敦长途漫步。”对吧。你可能可以直接从我这里获取这些信息,比如我周围的天气是什么,我在哪里?所有这些信息。这样我就不用提供这些上下文了。你只需添加这些上下文信息,特别是天气。我感觉那也将是另一个突破。除非你像,在晴天时你正好和晴天的心情相反。然后你会想,为什么它总是在播放快乐的音乐?我告诉你我很难过。
Filip Makraduli:是的。你不仅在预测歌曲,还在预测心情。
Demetrios:是的,完全正确。
Filip Makraduli:你什么都不用输入,只需打开网站,你就能得到一切。
Demetrios:没错。是的。一开始就给我一些预测,然后也许我们之后可以再深入探讨。我还在想另一件事,可以作为一个很好的补充。我的意思是,无限的功能请求,你可能没意识到你会从我这里收到这么多功能请求,但请记住,如果你来到这里并且我喜欢你的应用,你很可能会从我这里得到一些功能请求。所以我在想,如果我可以直接和它说话而不是输入文本,那将是多好,对吧?我可以解释我的心情或感受,甚至再加上一些我脑海中的旋律,或者我非常喜欢的歌手、词曲作者或歌曲,想要类似的风格,但不是这首歌,然后也可以添加这种类型的信息,做到...
Filip Makraduli:稍微哼哼几声,你弹奏你的旋律,然后你就能得到。
Demetrios:除了我哼唱总是跑调,所以我认为那样效果不会太好。我肯定会得到很多随机的歌曲。它的准确度可能就像你现在的推荐引擎一样。是的。嗯,这太棒了,伙计。非常感谢你来到这里。我只是要确保聊天区没有其他问题了。没有,看起来我们都好了。
Demetrios:对于正在听的所有人,如果你想来谈谈你用 Qdrant 构建的任何很酷的东西,或者你如何使用 Qdrant,或者你希望 Qdrant 在哪些方面做得更好,或者你喜欢的东西,无论是什么,我们都非常欢迎你来到这里。我认为就到这里了。今天的向量空间对话,第二期,到此结束。我们稍后见。Philip,非常感谢你的到来。It’s.