Overview
このガイドでは、Mongoid を使用してMongoDB ベクトル検索クエリを実行する方法を学習できます。 MongoDB ベクトル検索、ベクトル埋め込みを使用することで、セマンティック意味に基づいてドキュメントをクエリできます。
Mongoid は、vector_search $vectorSearch集計ステージを構築および実行する メソッドを提供します。$vectorSearch 集計ステージの詳細については、 集計操作ガイドをご覧ください。
注意
配置の互換性
MongoDB ベクトル検索 を使用するには、 MongoDB AtlasクラスターまたはMongoDB 8.2 以降を実行中自己管理型配置に接続する必要があります。
MongoDB ベクトル検索の詳細については、Atlas ドキュメントの「MongoDB ベクトル検索の概要」を参照してください。
前提条件
MongoDB ベクトル検索クエリを実行する前に、モデルに対してベクトルフィールドとベクトル検索インデックスを定義し、コレクションにインデックスを作成する必要があります 。ベクトル検索インデックスを宣言して作成する方法については、 インデックスガイドの「 MongoDB ベクトル検索インデックス 」セクションを参照してください。
このガイドの例では、sample_mflixデータベース内の embedded_moviesコレクションにマッピングする次の Movie モデルを使用します。 plot_embeddingフィールドには、各映画のプロットのベクトル埋め込みが保存されます。
class Movie include Mongoid::Document store_in collection: "embedded_movies", database: "sample_mflix" field :title, type: String field :plot, type: String field :year, type: Integer field :plot_embedding, type: Array # Declare a vector search index on the `plot_embedding` field. The `_id` # and `year` filter fields enable instance-level and filtered queries. vector_search_index :plot_embedding_index, fields: [ { type: "vector", path: "plot_embedding", numDimensions: 1536, similarity: "cosine" }, { type: "filter", path: "_id" }, { type: "filter", path: "year" } ] end
ベクトル検索クエリの実行
MongoDB ベクトル検索クエリを実行するには、モデルで vector_searchクラスメソッドを呼び出し、クエリベクトルを最初の引数として渡します。クエリベクトルは、検索入力を表すベクトル埋め込みです。
次のコード例では、plot_embeddingフィールドでMongoDB ベクトル検索クエリを実行し、一致する各映画のタイトルを出力します。 Movie モデルはベクトル検索インデックス の1 つだけを宣言するため、Mongoid は使用するインデックスとベクトルフィールドを自動的に選択します。
# The query vector must have the same number of dimensions as the # vector search index (1536, in this example). query_vector = [ -0.0016261312, -0.028070757, -0.011342932, ..., -0.009710136 ] movies = Movie.vector_search(query_vector, limit: 5) movies.each do |movie| puts movie.title end
Thrill Seekers About Time The Time Machine Timecop Crusade in Jeans
vector_search メソッドは Movie ドキュメントの配列を返します。デフォルトでは 、10 の最も類似したドキュメントが返されます。結果の数を変更するには、limit オプションを設定します。上記の例では、5 の結果の制限が指定されています。
ベクトル検索スコア
vector_search が返す各ドキュメントには vector_search_score 属性があります。この属性は、ドキュメントがクエリベクトルにどの程度一致するかを記述します。スコアが高いほど、一致が近いことを示します。
次のコードは 前の例と同じクエリを実行しますが、一致する各映画のタイトルとスコアが出力されます。
movies = Movie.vector_search(query_vector, limit: 5) movies.each do |movie| puts "#{movie.title}: #{movie.vector_search_score}" end
Thrill Seekers: 0.9253387451171875 About Time: 0.9246978759765625 The Time Machine: 0.9229583740234375 Timecop: 0.9228057861328125 Crusade in Jeans: 0.9222259521484375
類似ドキュメントの検索
また、ドキュメントインスタンスで vector_search メソッドを呼び出して、そのドキュメントに類似するドキュメントを検索することもできます。ドキュメントで vector_search を呼び出すと、Mongoid はドキュメントに独自の保存済みベクトルをクエリベクトルとして使用し、ドキュメント自体を結果から除外します。
次のコードは、既存の Movieドキュメントに最も類似している 5 つの映画を検索します。
movie = Movie.find_by(title: "About Time") neighbors = movie.vector_search(limit: 5) neighbors.each do |neighbor| puts neighbor.title end
Thrill Seekers The Time Machine Timecop Crusade in Jeans Frequency
ベクトル検索オプション
次のキーワード引数を vector_search メソッドに渡して、クエリをカスタマイズできます。
オプション | タイプ | 説明 | デフォルト値 |
|---|---|---|---|
|
| 使用するベクトル検索インデックスの名前。モデルが複数のベクトル検索インデックスを宣言する場合にのみ必要です。 | モデルから推論 |
|
| ベクトル埋め込みを含むフィールド。ベクトルフィールドがインデックス定義から推論できない場合にのみ必要です。 | インデックスから推論 |
|
| 返されるドキュメントの最大数。 |
|
|
| 検索中に考慮する最近傍の数。 |
|
|
| 検索前にドキュメントを事前にフィルタリングするために使用されるクエリ。 | フィルタリングなし |
|
| ベクトル検索の後に追加する追加の集計ステージ。 | 追加のステージなし |
次のコードは、150 候補を考慮し、2000 年以降にリリースされた映画のみを返すMongoDB ベクトル検索クエリを実行します。
movies = Movie.vector_search( query_vector, limit: 5, num_candidates: 150, filter: { year: { "$gt" => 2000 } } )
これらのオプションの詳細については、Atlas ドキュメントの $vectorSearch 演算子参照の「フィールド」セクションを参照してください。
詳細情報
ベクトル検索インデックスを宣言して作成する方法については、 インデックスガイドの「 MongoDB ベクトル検索インデックス 」セクションを参照してください。
このガイドで言及されている概念の詳細については、 Atlas ドキュメントの次のページを参照してください 。
API ドキュメント
このガイドで言及されているメソッドについて詳しくは、次のAPIドキュメントを参照してください。