Use ScyllaDB to perform semantic search across movie plot descriptions. 我们建立了一个样本电影推荐应用程序来展示 示例应用程序为您提供了一种简单的方式来体验使用 ScyllaDB 构建低延迟语义搜索和矢量应用程序。 ScyllaDB的新矢量搜索功能 加入Vector搜索早期访问计划 加入Vector搜索早期访问计划 在本文中,我们将展示如何在电影场景描述中进行语义搜索,以寻找电影的含义,而不是关键字。 在深入应用程序之前,让我们澄清我们用语义搜索的意思,并提供一些相似函数的背景。 关于矢量相似性函数 两个矢量之间的相似性可以以多种方式计算,最常见的方法是: , (内部产品)和 ScyllaDB Vector Search 支持所有这些功能。 科比相似之处 DOT 产品 l2 对于文本嵌入,cosine 相似性是最常用的相似性函数. 这是因为,当我们使用文本时,我们主要关注矢量的方向,而不是它的大小。 例如,一个关于同一个主题的短文档(一页)和一个较长的文档(十页),即使它们有不同的长度,也会在矢量空间中指向相似的方向。 在实践中,许多嵌入式模型(例如, )生成正常化 vector. 正常化 vector 都有相同的长度(大小为 1)。 对于正常化 vector,cosine 相似性和点产品返回相同的结果. 这是因为cosine 相似性将点产品划分为 vector 的大小,当 vector 正常化时,它们都是 1。 L2 函数产生与点产品或 cosine 相似性相比的不同距离值,但嵌入物的排序仍然相同(假设正常化 vector)。 开放模型 现在你对语义相似性函数有了更好的理解,让我们解释推荐应用程序是如何工作的。 App 概览 该应用程序允许用户输入他们想要观看的电影类型,例如,如果您键入“美国足球”,该应用程序将您的输入与 存储在数据库中。第一个结果是最佳匹配,然后是其他类似的建议。 . plots of movies ScyllaDB Vector Search 你可以找到的 ,以及设置指令和 a 在文档中. 对于数据集,我们正在重新使用 TMDB 数据集 . 源代码在GitHub上 步骤式教程 可用於 Kaggle 项目要求 要运行该应用程序,您需要一个 ScyllaDB 云帐户和一个可引擎搜索的集群. 现在,您需要使用 API 创建一个可引擎搜索的集群。 ! 按照这里的指示开始 应用程序依赖于几个Python包: ScyllaDB Python 驱动程序 – 用于连接和查询 ScyllaDB。 语句转换器 – 可在本地生成嵌入式,而不需要OpenAI或其他付费API。 Streamlit - 对于UI。 Pydantic - 使处理查询结果更容易。 默认情况下,应用程序使用 模型,这样任何人都可以在本地运行它,而不需要沉重的计算。 ,不需要任何商业或付费服务来运行该示例。 全方位MiniLM-L6-v2 ScyllaDB 云 配置和数据库连接 A 的 存储 ScyllaDB Cloud 凭据,包括主机地址和连接细节。 config.py 单独的 ScyllaDB 处理下列事项: 辅助模块 创建连接和会话 输入和查询数据 提供清洁数据库交互的辅助功能 数据库计划 该方案在A中定义 文件,在运行项目的迁移脚本时执行。 schema.cql 关键空间创建(具有3的复制因子) 用于电影的表定义,存储 release_date、标题、类型和插图等字段 矢量搜索指数 CREATE KEYSPACE recommend WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': '3'}; CREATE TABLE recommend.movies ( id INT, release_date TIMESTAMP, title TEXT, tagline TEXT, genre TEXT, imdb_id TEXT, poster_url TEXT, plot TEXT, plot_embedding VECTOR<FLOAT, 384>, PRIMARY KEY (id) ) WITH cdc = {'enabled': 'true'}; CREATE INDEX IF NOT EXISTS ann_index ON recommend.movies(plot_embedding) USING 'vector_index' WITH OPTIONS = { 'similarity_function': 'DOT_PRODUCT' }; 主持人 ❤ by 标签: cql 吉普赛 方案强调: 'plot' - 文本,存储用于相似性比较的电影描述。 ’plot_embedding’ – 矢量,嵌入式图像,用384个维度的矢量数据类型定义(匹配Sentence Transformers模型)。 'Primary key' - id 作为分区密钥,用于通过 id 查询高效的搜索。 CDC 启用 - 用于 ScyllaDB 矢量搜索所需。 `Vector index` – 一个在 plot_embedding 列上创建的近邻(ANN)索引,以允许高效的 vector 查询。 该方案的目标是允许对场景嵌入物进行有效的搜索,并在矢量旁存储额外的信息。 嵌入式 嵌入式创建器类处理文本嵌入生成与语句转换器. 该函数接受任何文本输入,并返回一个列表的浮动值,你可以插入 ScyllaDB 的“矢量”列。 使用矢量搜索实现的建议 该应用程序的主要功能是提供电影推荐,这些建议是使用矢量搜索来实现的,所以我们创建了一个名为 这些手 recommender 获取输入文本 将文本转化为嵌入式 引擎搜索 from db.scylladb import ScyllaClient from embedding_creator import EmbeddingCreator from models import Movie class MovieRecommender: def __init__(self): self.scylla_client = ScyllaClient() self.embedding_creator = EmbeddingCreator("all-MiniLM-L6-v2") def similar_movies(self, user_query: str, top_k=5) -> list[Movie]: db_client = ScyllaClient() user_query_embedding = self.embedding_creator.create_embedding(user_query) db_query = f""" SELECT * FROM recommend.movies ORDER BY plot_embedding ANN OF %s LIMIT %s; """ values = [user_query_embedding, top_k] results = db_client.query_data(db_query, values) return [Movie(**row) for row in results] 主持人 ❤ by 主持人.py 吉普赛 让我们分解矢量搜索查询: SELECT * FROM recommend.movies ORDER BY plot_embedding ANN OF [0.1, 0.2, 0.3, …] LIMIT 5; 用户输入首先转换为嵌入式,确保我们将嵌入式与嵌入式进行比较。 表中的行按相似度排序使用 ANN 运算符(ANN OF)。 结果仅限于五部类似的电影。 SELECT 语句从表中检索所有列。 在相似性搜索中,我们计算两个矢量之间的距离. 越接近矢量空间中的矢量,其底层内容就越相似. 或者,换句话说,较小的距离暗示更高的相似性。 流量 UI UI,定义在 把一切都连在一起。 app.py 它将用户的查询转换为嵌入式,并执行矢量搜索。 用户界面显示了最好的匹配和其他类似电影推荐的列表。 自己试试吧! 如果您想使用 ScyllaDB 矢量搜索开始构建,您有几个选项: 在GitHub上探索源代码 使用 README 在您的计算机上设置应用程序 遵循教程,从头开始构建应用程序 如果您有疑问,请使用 我们会很乐意帮助。 论坛 阿提拉·托斯 他是ScyllaDB的开发者倡导者,撰写教程和博客文章,在活动中发表讲话,创建演示和样本应用程序,以帮助开发人员构建高性能应用程序。 阿提拉·托斯