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 } } )
$vectorSearchこれらのオプションの詳細については、Atlas ドキュメントの 演算子参照の「 フィールド 」セクションを参照してください。
詳細情報
ベクトル検索インデックスを宣言および作成する方法を学ぶには、インデックスガイドの「MongoDB ベクトル検索インデックス」セクションを参照してください。
このガイドで言及されている概念についてさらに学ぶには、Atlas ドキュメントの次のページを参照してください。
API ドキュメント
このガイドで言及されているメソッドについて詳しくは、次のAPIドキュメントを参照してください。