コレクション

Qdrantベクトルデータベースにおけるコレクションの概念は、MYSQLにおけるテーブル構造に類似しており、同じタイプのベクトルデータを一貫して格納するために使用されます。コレクションに格納されるデータのそれぞれは、Qdrantにおいてポイントと呼ばれます。ここでのポイントは、数学の幾何学的空間の概念に似ており、幾何学的空間におけるベクトルの表現(単なるデータの一部と考えてください)を表しています。

同じコレクション内では、各ポイントのベクトルは同じ次元を持ち、単一のメトリックを用いて比較される必要があります。名前付きベクトルを使用して、各ベクトルが独自の次元とメトリック要件を持つ単一のポイントに複数のベクトルを含めることができます。

距離メトリックはベクトル間の類似性を測定するために使用されます。メトリックの選択は、特にニューラルネットワークエンコーダーのトレーニングに使用されるベクトルの取得方法に依存します。

Qdrantは以下の人気のあるタイプのメトリックをサポートしています:

  • ドット積: Dot
  • コサイン類似度: Cosine
  • ユークリッド距離: Euclid

検索効率を向上させるために、コサイン類似度は正規化されたベクトルのドット積を取ることで実現されます。アップロード時には、ベクトルは自動的に正規化されます。メトリックとベクトルサイズに加えて、各コレクションはコレクションの最適化、インデックスの構築、およびクリーニングを制御するための固有のパラメータセットも使用します。これらの設定は対応するリクエストを通じていつでも変更することができます。

マルチテナンシーの設定

何個のコレクションを作成すべきですか? ほとんどの場合、ペイロードベースのパーティショニングを使用して単一のコレクションを使用するだけで十分です。このアプローチはマルチテナンシーとして知られています。ほとんどのユーザーにとっては効率的ですが、追加の設定が必要です。マルチテナンシーの設定方法を学ぶ。

いつ複数のコレクションを作成すべきですか? ユーザー数が限られており、隔離が必要な場合に複数のコレクションを作成する必要があります。このアプローチはより柔軟ですが、大量のコレクションを作成するとリソースの過剰使用につながり、追加の費用がかかる場合があります。また、パフォーマンスを含め、相互に干渉しないようにする必要があります。

コレクションの作成

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    }
}

必須のオプションに加えて、以下のコレクションオプションにカスタム値を指定することもできます:

  • hnsw_config - インデックスの詳細については、インデックスセクションを参照してください。
  • wal_config - 先行ログ書き込みに関連する構成。より詳細な情報についてはWALを参照してください。
  • optimizers_config - 最適化プログラムの詳細については、最適化プログラムセクションを参照してください。
  • shard_number - コレクションが持つシャードの数を定義します。詳細については分散展開セクションを参照してください。
  • on_disk_payload - ペイロードデータの保存場所を定義します。trueに設定すると、ペイロードをディスクにのみ保存します。大きなペイロードの取扱い時にRAM使用量を制限するのに非常に役立ちます。
  • quantization_config - 量子化の詳細については、量子化を参照してください。

オプションのコレクションパラメータのデフォルトパラメータは、設定ファイルで定義されています。

コレクションおよびベクトルのパラメータに関する詳細情報については、スキーマ定義および設定ファイルを参照してください。

v1.2.0以降利用可能

非常に高速なアクセスを実現するために、ベクトルはRAMに保存されます。on_diskパラメータはベクトルの構成で設定することができます。trueに設定すると、すべてのベクトルがディスクに保存されます。これによりメモリマッピングの使用が可能になり、大量のデータのインポートに適しています。

他のコレクションからのコレクションの作成

v1.0.0以降利用可能

既存のコレクションから新しいコレクションを初期化することができます。

これは同じデータセットの異なる構成を素早く試すために役立つことがあります。

新しいコレクションでベクトル構成を設定する際には、元のコレクションと同じサイズと距離関数を持つことを確認してください。

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    },
    "init_from": {
       "collection": {from_collection_name}
    }
}

マルチベクトルコレクション

v0.10.0 で利用可能

それぞれのレコードに複数のベクトルを持たせることができます。この機能により、複数のベクトルをコレクションに格納できます。レコード内でベクトルを区別するためには、コレクションを作成する際にそれぞれのユニークな名前を定義します。このスキーマの下で名前付きベクトルは、それぞれ独自の距離とサイズを持っています:

PUT /collections/{collection_name}

{
    "vectors": {
        "image": {
            "size": 4,
            "distance": "Dot"
        },
        "text": {
            "size": 8,
            "distance": "Cosine"
        }
    }
}

特別なケースとして、ベクトルを格納しないコレクションも作成できます。

v1.1.1 で利用可能

各名前付きベクトルに対して、hnsw_configquantization_config を任意で指定することができ、コレクションの構成から逸脱することができます。これはベクトルレベルでの検索パフォーマンスの最適化に使用できます。

v1.2.0 で利用可能

ベクトルはメモリに格納され、素早くアクセスできます。各ベクトルについて、on_disktrue に設定してすべてのベクトルを常にディスク上に保存することができます。これによりメモリマッピングが可能になり、大量のデータの取り込みに適しています。

コレクションの削除

DELETE /collections/{collection_name}

コレクションパラメータの更新

動的なパラメータの更新は便利です。たとえば、ベクトルの効率的な初期読み込みのためにインデックス作成を無効にしてからアップロード後にすぐに有効にすることができます。これにより、インデックスを再構築するための余分な計算リソースを浪費することはありません。

次のコマンドは、10000 kB より大きなベクトルを含むセグメントのためにインデックス作成を有効にします:

PATCH /collections/{collection_name}

{
    "optimizers_config": {
        "indexing_threshold": 10000
    }
}

以下のパラメータを更新できます:

  • optimizers_config - 最適化機能の詳細な説明を参照してください。
  • hnsw_config - インデックスの詳細な説明を参照してください。
  • quantization_config - 量子化の詳細な説明を参照してください。
  • vectors - 各自の hnsw_configquantization_configon_disk 設定を含む特定のベクトルの構成。
  • params - 他のコレクションパラメーター、write_consistency_factor および on_disk_payload を含む。

完全な API 仕様は スキーマの定義 にあります。

v1.4.0 から利用可能

Qdrant 1.4 ではランタイムでのコレクションパラメーターの更新に対応しました。HNSW インデックス、量子化、およびディスク構成を再作成することなく変更することができます。セグメント (インデックスおよび量子化データを含む) は更新されたパラメーターに合わせてバックグラウンドで自動的に再構築されます。

次の例では、my_vector の全コレクションと HNSW インデックスおよび量子化パラメーターが更新されます:

PATCH /collections/{collection_name}

{
    "vectors": {
        "my_vector": {
            "hnsw_config": {
                "m": 32,
                "ef_construct": 123
            },
            "quantization_config": {
                "product": {
                    "compression": "x32",
                    "always_ram": true
                }
            },
            "on_disk": true
        }
    },
    "hnsw_config": {
        "ef_construct": 123
    },
    "quantization_config": {
        "scalar": {
            "type": "int8",
            "quantile": 0.8,
            "always_ram": false
        }
    }
}

注意: 名前付きベクトルのないコレクションでベクトルパラメーターを更新するには、空の ("") 名前を使用することができます。

このエンドポイントへの呼び出しは、既存の最適化機能が完了するのを待つため、ブロックする場合があります。インデックスの再構築により重大なオーバーヘッドが発生する可能性があるため、本番データベースでこの機能を使用することはお勧めしません。

コレクション情報

Qdrantは、既存のコレクションの構成パラメータを決定し、ポイントの分布やインデックス状況をより良く把握することができます。

GET /collections/{collection_name}

{
    "result": {
        "status": "green",
        "optimizer_status": "ok",
        "vectors_count": 1068786,
        "indexed_vectors_count": 1024232,
        "points_count": 1068786,
        "segments_count": 31,
        "config": {
            "params": {
                "vectors": {
                    "size": 384,
                    "distance": "Cosine"
                },
                "shard_number": 1,
                "replication_factor": 1,
                "write_consistency_factor": 1,
                "on_disk_payload": false
            },
            "hnsw_config": {
                "m": 16,
                "ef_construct": 100,
                "full_scan_threshold": 10000,
                "max_indexing_threads": 0
            },
            "optimizer_config": {
                "deleted_threshold": 0.2,
                "vacuum_min_vector_number": 1000,
                "default_segment_number": 0,
                "max_segment_size": null,
                "memmap_threshold": null,
                "indexing_threshold": 20000,
                "flush_interval_sec": 5,
                "max_optimization_threads": 1
            },
            "wal_config": {
                "wal_capacity_mb": 32,
                "wal_segments_ahead": 0
            }
        },
        "payload_schema": {}
    },
    "status": "ok",
    "time": 0.00010143
}

もしコレクションにベクトルが挿入されると、statusフィールドは最適化中に "yellow" に変わり、すべてのポイントが正常に処理されると "green" に変わります。

以下のカラー状態が発生する可能性があります:

  • ? green: コレクションが準備完了
  • ? yellow: コレクションが最適化中
  • ? red: エンジンが回復不能なエラーに遭遇した

興味を持つ他のプロパティには以下が含まれます:

  • points_count - コレクションに格納されているオブジェクト(ベクトルとペイロード)の総数
  • vectors_count - コレクション内のベクトルの総数。各オブジェクトに複数のベクトルがある場合、これは points_count と等しくないかもしれません。
  • indexed_vectors_count - HNSWインデックスに格納されているベクトルの総数。Qdrantはすべてのベクトルをインデックスに格納せず、与えられた構成に基づいてインデックスセグメントを作成する可能性のあるベクトルのみを格納します。

HNSWにベクトルをインデックス化

場合によっては、indexed_vectors_countの値がvectors_countよりも少ないことがあります。これは、最適化プログラムの構成に依存する意図的な動作です。非インデックス化ベクトルのサイズが indexing_threshold(KB単位)を超えると、新しいインデックスセグメントが構築されます。コレクションが非常に小さい場合やベクトルの次元が低い場合、HNSWセグメントが作成されない可能性があり、indexed_vectors_count0と等しくなることがあります。

既存のコレクションに新しいインデックスセグメントを作成するには、 collection パラメーター内の indexing_threshold の値を減らすことができます。

コレクションのエイリアス

本番環境では、新しいバージョンのニューラルネットワークにアップグレードするなど、異なるバージョンのベクトル間をシームレスに切り替える必要がある場合があります。

このような場合、サービスを停止して新しいベクトルを使用してコレクションを再構築することは現実的ではない場合があります。エイリアスは既存コレクションの追加の名前であり、クエリはコレクション名の代わりに完全にエイリアスを使用して実行できます。

したがって、バックグラウンドで2番目のコレクションを構築し、次にエイリアスを古いコレクションから新しいコレクションに切り替えることができます。エイリアスの変更はアトミックであり、切り替えプロセス中に同時リクエストには影響しません。

エイリアスの作成

POST /collections/aliases

{
    "actions": [
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "example_collection"
            }
        }
    ]
}

エイリアスの削除

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        }
    ]
}

コレクションの切り替え

複数のエイリアス操作はアトミックに実行できます。たとえば、次のコマンドを使用して基礎となるコレクションを切り替えることができます:

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        },
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "new_collection"
            }
        }
    ]
}

リストコレクションエイリアス

GET /collections/{collection_name}/aliases

すべてのエイリアスをリストする

GET /aliases

すべてのコレクションをリストする

GET /collections