Use ScyllaDB to perform semantic search across movie plot descriptions. We built a sample movie recommendation app to showcase. サンプル映画推薦アプリを作成しました。 サンプルアプリは、ScyllaDBで低遅延のセマンティック検索とベクターベースのアプリケーションを構築するための簡単な方法を提供します。 ScyllaDBの新しいベクター検索機能 Vector Search Early Access プログラム Vector Search Early Access プログラム この記事では、映画のスロットの記述を通じてセマンティックな検索を実行して、キーワードではなく意味で映画を見つける方法を説明します。 アプリケーションに潜入する前に、セマンティック検索の意味を明確にし、類似性関数についていくつかの文脈を提供しましょう。 ベクター類似性関数について 2 つのベクター間の類似性は、いくつかの方法で計算できます。 で、 (国内製品)および ScyllaDB Vector Search は、これらのすべての機能をサポートします。 コチラ類似 DOT 製品 L2 テキストの埋め込みでは、コジン類似性は最も頻繁に使用される類似性関数です. それは、テキストで作業するとき、我々は主にその大きさではなく、ベクターの方向に焦点を当てているためです. Cosine類似性は、ベクター間の角度(すなわち方向の違い)のみを考慮し、大きさ(ベクターの長さ)を無視している。 たとえば、同じテーマに関する短い文書(1ページ)と長い文書(10ページ)は、異なる長さであるにもかかわらず、ベクトル空間で同じ方向を指します。 実際には、多くのモデル(例えば、 ) normalized vectors. normalized vectors all have the same length (magnitude of 1). for normalized vectors, cosine similarity and the dot product return the same result. This is because cosine similarity divides the dot product by the magnitudes of the vectors, which are all 1 when vectors are normalized. The L2 function produces different distance values compared to the dot product or cosine similarity, but the ordering of the embeddings remains the same (assuming normalized vectors). normalized vectors all have the same length. normalized vectors all have the same length (magnitude of 1). for normalized vectors, cosine similarity and the dot product return the same result. This is because cosine similarity divides the dot product by the magnitudes of the vectors, which are オープンモデル セマンティックな類似性の機能をよりよく理解しているので、勧告アプリがどのように機能するか説明しましょう。 App 概要 アプリケーションでは、ユーザーが何の映画を観たいかを入力することができます. たとえば、「アメリカンフットボール」を入力すると、アプリケーションはあなたの入力と比較します。 データベースに格納されます. 最初の結果は最適な合点であり、その後他の類似の推奨事項があります. この比較では、 . plots of movies ScyllaDB Vector Search You can find the , along with setup instructions and a データセットの場合、TMDBデータセットを再利用しています。 . ソースコード GitHub Step-by-step トリートル KAGGLE で利用可能 プロジェクト要件 アプリケーションを実行するには、ScyllaDB Cloud アカウントとベクトル検索可能なクラスターが必要です。 ! ここで指示に従って始める。 アプリケーションは、いくつかのPythonパッケージに依存します: ScyllaDB Python ドライバー - ScyllaDB を接続し、クエリするために。 Sentence Transformers - OpenAI またはその他の有料 API を必要とせずに、ローカルに埋め込みを生成します。 Streamlit - for the UI. Pydantic - クエリの結果で作業を容易にする。 デフォルトでは、App は 誰でも本地で実行できるように、重いコンピューティング要件なしでモデル。 例を実行するために、商業的または有料のサービスは必要ありません。 オールミニLM-L6-v2 ScyllaDB クラウド 構成とデータベース接続 A file stores ScyllaDB Cloud credentials, including the host address and connection details. ファイルは、ホストアドレスと接続詳細を含む ScyllaDB Cloud credentialsを格納します。 config.py Separate ScyllaDB について 以下を扱う。 ヘルパーモジュール 接続とセッションの作成 データの入力とクエリ クリーンデータベース相互作用のためのヘルパー機能の提供 データベーススケジュール 制度はAで定義されている。 プロジェクトの移行スクリプトを実行するときに実行されたファイル. It includes: schema.cql Keyspace creation (with a replication factor of 3 ) 映画のテーブル定義、release_date、title、genre、plotなどのフィールドを格納 ベクター検索インデックス 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' }; HOSTED WITH ❤ By トップページ > cql GitHub スケジュールが強調: 'plot' - テキストは、類似性比較のために使用された映画の記述を格納します。 `plot_embedding` - vector, embedding representation of the plot, defined using the vector data type with 384 dimensions (matching the Sentence Transformers model). plot_embedding - vector, embedding representation of the plot, defined using the vector data type with 384 dimensions (matching the Sentence Transformers model). 「Primary key」 - id が id でクエリする効率的な検索のためのパーティションキー CDC enabled - required for ScyllaDB vector search. CDC enabled - required for ScyllaDB vector search. 'Vector index' - 効率的なベクトルクエリを可能にするために、plot_embedding 列に作成された近隣者(ANN)のインデックス。 このスケジュールの目的は、プロットの埋め込みの効率的な検索を可能にし、ベクターと一緒に追加情報を保存することです。 Embeddings Embedding Creator クラスは、Sentence Transformers を使用してテキストの埋め込み生成を処理します。この関数は、テキスト入力を受け入れ、ScyllaDB の「ベクトル」列に挿入できる浮動値のリストを返します。 ベクター検索で実装された推奨事項 アプリの主な機能は映画の推奨を提供することです これらの推奨はベクトル検索を使用して実装されます。 このハンドル recommender 入力テキストの作成 テキストを embeddings に変える ベクター検索 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] HOSTED WITH ❤ By おすすめパイ GitHub 次に、ベクター検索クエリを解説します。 SELECT * FROM recommend.movies ORDER BY plot_embedding ANN OF [0.1, 0.2, 0.3, …] LIMIT 5; ユーザ入力は最初に埋め込みに変換され、埋め込みと埋め込みを比較していることを確認します。 テーブルの行は、ANN オペレーター (ANN OF) を使用して類似性で順番にします。 同様の映画は5本限定です。 SELECT 文は、テーブルからすべての列を取得します。 類似性の検索では、2 つのベクトル間の距離を計算します. ベクトル空間のベクトルが近ければ近ければ近ければ近ければ近いほど、それらのベクトルの内容が類似します. または、言い換えれば、より小さい距離はより高い類似性を示します。 ストリーミング UI The UI, defined in 定義 すべてを結びつける。 app.py ユーザーのクエリを取り、それを埋め込みに変換し、ベクトル検索を実行します。 UIは、最高のマッチと他の同様の映画の推奨リストを表示します。 自分で試してみてください! ScyllaDB Vector Search を使用してビルドを開始したい場合は、いくつかのオプションがあります。 GitHubのソースコードを探索 README を使用して、あなたのコンピュータにアプリを設定します。 チュートリアルに従って、アプリをゼロから構築する 質問があれば、使用してください。 そして、私たちは喜んで助けてくれるでしょう。 フォーラム Attila Tóthについて ScyllaDBの開発者弁護士で、チュートリアルやブログ記事を書き、イベントでスピーチし、デモやサンプルアプリを作成し、開発者が高性能なアプリケーションを構築するのを助ける。 アッティラ・トース