クエリポイントをドラッグし、メトリクスを切り替えて、最近傍がどのように変化するかを確認してください。
2点間の直線距離を測定する。同心円は等距離ゾーンを示しており、同じ円上のすべての点はクエリから等しく「遠い」位置にある。
メトリックとは、2つのベクトルを受け取り、それらがどれほど類似しているか(あるいは異なるか)を示す単一の数値を返す関数に過ぎない。ベクトル検索の本質は、「自分のクエリに対してメトリックスコアが最も高いK個のベクトルを見つける」ことにある。 それ以外のすべて――インデックス、クラスター、グラフ――は、データベース内のすべてのベクトルに対してこのスコアを計算する手間を省くための管理手段に過ぎません。
選択するメトリックによって、データにおける「類似」の意味が決まります。2つの埋め込みベクトルは、あるメトリックでは「近い」と評価され、別のメトリックでは「遠い」と評価されることがあります。同じデータでも、答えは異なるのです。そのため、インデックスを構築する前にこの選択を行う必要があります。
試してみてください:クエリポイントを原点付近にドラッグし、「Cosine」と「L2 」を切り替えてみてください。「Cosine」がクエリが指す「方向」のみを重視している様子を確認してください。原点の反対側にある点は、「L2 」では「近い」とみなされる一方、「Cosine」では「遠い」とみなされることがあります。この視覚的な違いこそが、この概念のすべてです。
『Milvus 』では、メトリックはmetric_type を通じてインデックスごとに設定される — L2、 IP、あるいは COSINE (密ベクトルの場合)のいずれかを使用して、インデックス作成時に設定されます。その後、そのコレクションに対するすべての検索では、上記で試したのと同じ関数が使用されます。最も信頼できる唯一のルールは、エンベディングモデルのトレーニングに使用されたメトリックを使用することです。このメトリックは、事実上すべてのモデルカードに記載されています。
2つの便利な近道。最新のテキスト埋め込みAPIのほとんど(OpenAI 、Cohere 、Voyage 、およびほとんどのSentenceTransformer)は、コサイン類似度を想定したベクトルを生成する。また、ベクトルが単位長に正規化されていれば、コサインと内積は同一の順位を返すため、 IP 正規化されたベクトルに対する計算は、 COSINEの代わりに、よく用いられ、計算コストがわずかに低い代替手段となります。
コサイン類似度(Milvus 内の metric_typeCOSINE )を使用してください。OpenAI のtext-embedding-3ファミリーを含む、ほぼすべての最新のテキスト埋め込みモデルは、コサイン類似度を基準に学習されています。OpenAI の埋め込みは単位長に正規化されているため、内積(IP )は同一の順位付け結果を与え、優れた代替手段となります。
コサイン類似度は、2つのベクトルの長さを無視して、それらの間の角度のみを測定する。内積(ドット積)は、方向の一致と大きさの両方を評価するため、同じ方向を指す長いベクトルほど高いスコアとなる。単位正規化されたベクトルにおいて、この2つは数学的に同等である。
いいえ。メトリックは構築時にインデックスに組み込まれています。メトリックを切り替えるには、インデックスを削除し、新しい metric_type を使用して再構築する必要があります。異なるメトリックによるスコアは互いに比較できないため、結果の後処理時にそれらを混在させないでください。
処理速度は本質的に同一である――L2 、IP 、cosineはいずれもベクトルを1回走査するだけで済む。重要なのはリコールである。埋め込みモデルの学習に使用されたものとは異なるメトリックで検索を行うと、結果の品質が顕著に、しばしば劇的に低下する。
さらに詳しく:Milvus がサポートするメトリクスの完全なリストについては、『Similarity Metrics』のドキュメントを参照してください。これには、バイナリベクトル用のハミング(Hamming)やジャカード(Jaccard)、全文検索用のBM25などが含まれます。