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

スパースベクトル

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

Overview

スパースベクトルは特殊な高次元ベクトルであり、ほとんどの要素がゼロで、非ゼロの値を持つ次元はごくわずかです。以下の図に示すように、dense vector は通常、各位置に値を持つ連続配列として表現されます(例: [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 を提供しており、テキストを自動的にスパースベクトルへ変換するため、手動の前処理が不要です。このアプローチは、精度や完全一致が重要なキーワードベース検索に最適です。詳細は Full Text Search を参照してください。

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

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

A7FvwnB5bhpBlKbgrzYcQijbnxg

📘Notes

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

Data Formats

以下のセクションでは、SPLADE のような学習済み sparse embedding model から得られるベクトルの保存方法を説明します。dense-vector ベースのセマンティック検索を補完するものを探している場合は、シンプルさの観点から、SPLADE よりも BM25 を使った Full Text Search を推奨します。品質評価を行って SPLADE を使うことに決めた場合は、Embeddings を参照して、SPLADE でスパースベクトルを生成する方法を確認してください。

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)]
    ]

Define Collection Schema

collection を作成する前に、collection schema を指定する必要があります。これは field を定義し、必要に応じて、テキスト field を対応するスパースベクトル表現に変換する function も定義します。

Add fields

Zilliz Cloud cluster でスパースベクトルを使用するには、次の field を含む schema を持つ collection を作成する必要があります。

  • SPARSE_FLOAT_VECTOR field。スパースベクトルの保存用に予約されており、VARCHAR field から自動生成されるか、入力データで直接提供されます。

  • 通常、スパースベクトルが表現する生テキストも collection に保存されます。生テキストの保存には VARCHAR field を使用できます。

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 つの field が追加されています。

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

  • sparse_vector: この field は SPARSE_FLOAT_VECTOR データ型を使用してスパースベクトルを格納します。

  • text: この field は VARCHAR データ型を使用してテキスト文字列を格納し、最大長は 65535 バイトです。

📘Notes

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

Set Index Parameters

スパースベクトル用 index の作成プロセスは dense vectors の場合と似ていますが、指定する index type(index_type)、距離メトリック(metric_type)、および index parameter(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"
)

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

  • Metric Types: さまざまな field type でサポートされるメトリックタイプ

  • Full Text Search: 全文検索に関する詳細なチュートリアル

Create Collection

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

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

データの挿入

コレクションの作成時に定義したすべてのフィールドに対してデータを指定する必要があります。ただし、自動生成されるフィールド(auto_id が有効な主キーなど)は除きます。組み込みの 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'}}]"]

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

Ctrl I