最近,我在浏览Max.com网站时想找一部电影看。通常,这个过程包括浏览系统呈现给我的各种列表,阅读一些相关描述,然后挑选一些看起来有趣的电影。如果我知道我想看的电影的片名或我喜欢的演员的名字,我通常只会点击搜索功能。否则,搜索就没有多大用处了。
现在,我突然想到了一个新的想法:为什么我不能用自然语言来查找一部电影,更多地基于电影的氛围或实质,而不仅仅是标题或演员呢?例如,为什么我不能启动Max、Netflix或Hulu等流媒体播放平台,并在搜索栏中键入类似于以下查询之一呢:
- 给我找一部长度不到2小时、以宠物为主角的英语戏剧电影。
- 推荐僵尸电影,但要确保它们很有趣。
- 我喜欢《瞬息全宇宙》。给我一部类似的电影,但场景、氛围或者人物性格更加阴暗、沉重一些。
这种方法的美妙之处超出了更自然的电影搜索方式,还保护了用户的隐私。该系统根本不会使用用户数据,不是挖掘用户的行为、喜欢和不喜欢来提供给推荐系统。唯一需要的就是一个查询。
为此,我开发了本文中要展示给大家的一个电影搜索程序。这是一个基于RAG(检索增强生成)的系统,它可以接受用户的查询,嵌入查询,并进行相似性搜索,以找到相似的电影。不过,这个程序超越了普通的RAG系统。这个系统使用了所谓的自查询检索器。该技术允许在进行相似性搜索之前,根据电影的元数据对其进行过滤。因此,如果用户有一个类似“推荐1980年后拍摄的以大量爆炸为特征的恐怖电影”的查询,搜索算法将首先过滤掉所有不是“1980年后制作的恐怖片”的电影,然后再对“以大量爆炸为主”的电影进行相似性搜索。
在本文中,我将提供一个关于我如何创建此系统的总体概述。如果您想深入了解这个程序,完整的源代码将在文后的链接参考处提供。
接下来,让我们继续作深入介绍。
检索数据
首先,该项目的数据来自电影数据库(TMDB:https://developer.themoviedb.org/docs/getting-started),并得到了所有者的许可。他们的API使用简单,维护良好,并且没有严格的费率限制。我从他们的API中提取了以下电影属性:
- 标题
- 运行时间(分钟)
- 语言
- 概述
- 发布年份
- 体裁
- 描述电影的关键词
- 演员
- 董事
- 流式传输的位置
- 购买地点
- 出租场所
- 生产公司名单
以下是如何使用TMDB API和Python的响应库提取数据的片段:
def get_data(API_key, Movie_ID, max_retries=5):
"""
函数以JSON格式提取感兴趣的电影的详细信息。
parameters:
API_key (str): Your API key for TMBD
Movie_ID (str): TMDB id for film of interest
returns:
dict: JSON格式的字典,包含您的电影的所有细节
兴趣
"""
query = 'https://api.themoviedb.org/3/movie/' + Movie_ID + \
'?api_key='+API_key + '&append_to_response=keywords,' + \
'watch/providers,credits'
for i in range(max_retries):
response = requests.get(query)
if response.status_code == 429:
# If the response was a 429, wait and then try again
print(
f"Request limit reached. Waiting and retrying ({i+1}/{
max_retries})")
time.sleep(2 ** i) # Exponential backoff
else:
dict = response.json()
return dict