メインコンテンツまでスキップ

スパースベクトル

スパースベクトルは、情報検索および自然言語処理において、表層的な用語一致を捉えるための重要な手法です。密ベクトルは意味理解に優れていますが、スパースベクトルは、特に特殊な用語やテキスト識別子を検索する際に、より予測しやすい一致結果を提供することがよくあります。

概要

スパースベクトルは特殊な高次元ベクトルであり、ほとんどの要素がゼロで、非ゼロ値を持つ次元はごくわずかです。以下の図に示すように、密ベクトルは通常、各位置に値を持つ連続配列として表されます(例: [0.3, 0.8, 0.2, 0.3, 0.1])。一方、スパースベクトルは非ゼロ要素とその次元インデックスのみを格納し、しばしば { index: value} のようなキーと値のペアで表現されます(例: [{2: 0.2}, ..., {9997: 0.5}, {9999: 0.7}])。

VPhswBhHmhJrh3byaVnc3onYnPc

トークン化とスコアリングにより、文書は bag-of-words ベクトルとして表現できます。ここでは、各次元が語彙内の特定の単語に対応します。文書内に存在する単語のみが非ゼロ値を持つため、スパースベクトル表現が作られます。スパースベクトルは、次の 2 つのアプローチで生成できます。

  • 従来の統計的手法。たとえば TF-IDF(Term Frequency-Inverse Document Frequency)や BM25(Best Matching 25)は、コーパス全体における単語の頻度と重要度に基づいて重みを割り当てます。これらの手法では、トークンを表す各次元に対するスコアとして単純な統計量を計算します。Zilliz Cloud は、BM25 手法による組み込みの 全文検索 を提供しており、テキストを自動的にスパースベクトルへ変換するため、手動での前処理が不要です。このアプローチは、精度と完全一致が重要なキーワードベース検索に最適です。詳細は Full Text Search を参照してください。

  • ニューラルスパース埋め込みモデル は、大規模データセットで学習することによりスパース表現を生成する学習ベースの手法です。通常は Transformer アーキテクチャを持つ深層学習モデルであり、意味的文脈に基づいて用語を拡張し、重み付けできます。Zilliz Cloud は、SPLADE のようなモデルから外部生成されたスパース埋め込みもサポートしています。詳細は Embeddings を参照してください。

スパースベクトルと元のテキストは、効率的な検索のために Zilliz Cloud に保存できます。以下の図は全体的なプロセスを示しています。

A7FvwnB5bhpBlKbgrzYcQijbnxg

📘Notes

スパースベクトルに加えて、Zilliz Cloud は密ベクトルとバイナリベクトルもサポートしています。密ベクトルは深い意味的関係を捉えるのに最適であり、バイナリベクトルは高速な類似性比較やコンテンツ重複排除のようなシナリオで優れています。詳細は Dense Vector および Binary Vector を参照してください。

データ形式

以下のセクションでは、SPLADE のような学習済みスパース埋め込みモデルからのベクトルを保存する方法を示します。密ベクトルベースのセマンティック検索を補完するものを探している場合は、簡潔さの観点から、SPLADE よりも BM25 を使用した Full Text Search を推奨します。品質評価を実施し、SPLADE を使用することを決定した場合は、SPLADE でスパースベクトルを生成する方法について Embeddings を参照できます。

Zilliz Cloud は、以下の形式でのスパースベクトル入力をサポートします。

  • 辞書のリスト( {dimension_index: value, ...} 形式)

    python
    # Represent each sparse vector using a dictionary
    sparse_vectors = [{27: 0.5, 100: 0.3, 5369: 0.6} , {100: 0.1, 3: 0.8}]
  • スパース行列( scipy.sparse クラスを使用)

    python
    from scipy.sparse import csr_matrix

    # First vector: indices [27, 100, 5369] with values [0.5, 0.3, 0.6]
    # Second vector: indices [3, 100] with values [0.8, 0.1]
    indices = [[27, 100, 5369], [3, 100]]
    values = [[0.5, 0.3, 0.6], [0.8, 0.1]]
    sparse_vectors = [csr_matrix((vals, ([0]*len(idx), idx)), shape=(1, 5369+1)) for idx, vals in zip(indices, values)]
  • **タプルの反復可能オブジェクトのリスト(例: ** [(dimension_index, value)]

    python
    # Represent each sparse vector using a list of iterables (e.g. tuples)
    sparse_vector = [
    [(27, 0.5), (100, 0.3), (5369, 0.6)],
    [(100, 0.1), (3, 0.8)]
    ]

コレクションスキーマの定義

コレクションを作成する前に、コレクションスキーマを指定する必要があります。これはフィールドを定義し、必要に応じてテキストフィールドを対応するスパースベクトル表現に変換する関数も定義します。

フィールドの追加

Zilliz Cloud クラスターでスパースベクトルを使用するには、以下のフィールドを含むスキーマを持つコレクションを作成する必要があります。

  • スパースベクトルを保存するために予約された SPARSE_FLOAT_VECTOR フィールド。VARCHAR フィールドから自動生成することも、入力データで直接指定することもできます。

  • 通常、スパースベクトルが表す元のテキストもコレクションに保存します。元のテキストの保存には VARCHAR フィールドを使用できます。

python
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

schema = client.create_schema(
auto_id=True,
enable_dynamic_fields=True,
)

schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)
schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=65535, enable_analyzer=True)

この例では、3 つのフィールドが追加されています。

  • pk: このフィールドは、VARCHAR データ型を使用して主キーを保存し、最大長 100 バイトで自動生成されます。

  • sparse_vector: このフィールドは、SPARSE_FLOAT_VECTOR データ型を使用してスパースベクトルを保存します。

  • text: このフィールドは、VARCHAR データ型を使用してテキスト文字列を保存し、最大長は 65535 バイトです。

📘Notes

指定したテキストフィールドからデータ挿入時にスパースベクトル埋め込みを生成できるようにするには、関数を使用する追加の手順が必要です。詳細は Full Text Search を参照してください。

インデックスパラメーターの設定

スパースベクトルのインデックスを作成するプロセスは 密ベクトル の場合と似ていますが、指定するインデックスタイプ(index_type)、距離メトリック(metric_type)、およびインデックスパラメーター(params)に違いがあります。

python
index_params = client.prepare_index_params()
index_params.add_index(
field_name="sparse_vector",
index_name="sparse_auto_index",
index_type="AUTOINDEX",
metric_type="IP"
)

この例では、SPARSE_INVERTED_INDEX インデックスタイプと IP メトリックを使用しています。詳細は以下のリソースを参照してください。

  • Metric Types: さまざまなフィールドタイプでサポートされるメトリックタイプ

  • Full Text Search: 全文検索の詳細なチュートリアル

コレクションの作成

スパースベクトルとインデックスの設定が完了したら、スパースベクトルを含むコレクションを作成できます。以下の例では、create_collection メソッドを使用して my_collection という名前のコレクションを作成します。

python
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params
)

データの挿入

auto-generated されるフィールド(auto_id が有効な主キーなど)を除き、collection 作成時に定義したすべてのフィールドに対してデータを指定する必要があります。組み込みの BM25 関数を使用してスパースベクトルを自動生成する場合は、データ挿入時にスパースベクトルフィールドも省略する必要があります。

python
data = [
{
"text": "information retrieval is a field of study.",
"sparse_vector": {1: 0.5, 100: 0.3, 500: 0.8}
},
{
"text": "information retrieval focuses on finding relevant information in large datasets.",
"sparse_vector": {10: 0.1, 200: 0.7, 1000: 0.9}
}
]

client.insert(
collection_name="my_collection",
data=data
)

スパースベクトルを使用して類似検索を実行するには、クエリデータと検索パラメータの両方を準備します。

python
# Prepare search parameters
search_params = {
"params": {"drop_ratio_search": 0.2}, # A tunable drop ratio parameter with a valid range between 0 and 1
}

# Query with sparse vector
query_data = [{1: 0.2, 50: 0.4, 1000: 0.7}]

次に、search メソッドを使用して類似検索を実行します。

python
res = client.search(
collection_name="my_collection",
data=query_data,
limit=3,
output_fields=["pk"],
search_params=search_params,
consistency_level="Strong"
)

print(res)

# Output
# data: ["[{'id': '453718927992172266', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172266'}}, {'id': '453718927992172265', 'distance': 0.10000000149011612, 'entity': {'pk': '453718927992172265'}}]"]

類似検索パラメータの詳細については、基本的なベクトル検索 を参照してください。