メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

スパースベクトル

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

概要

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

VPhswBhHmhJrh3byaVnc3onYnPc

トークン化とスコアリングにより、文書は語彙中の特定の単語に対応する各次元を持つバッグ・オブ・ワーズベクトルとして表現できます。文書中に存在する単語のみが非ゼロ値を持ち、スパースベクトル表現が作成されます。スパースベクトルは以下の2つのアプローチで生成できます:

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

  • ニューラルスパース埋め込みモデルは、大規模データセットで学習することによってスパース表現を生成する学習済み手法です。一般的に変換器(Transformer)アーキテクチャを使用したディープラーニングモデルであり、セマンティックコンテキストに基づいて用語を拡張および重み付けできます。Zilliz CloudはSPLADEなどのモデルから外部生成されたスパース埋め込みもサポートしています。詳細については、埋め込みを参照してください。

スパースベクトルおよび元のテキストはZilliz Cloudに保存され、効率的な検索が可能になります。以下の図は全体的なプロセスを示しています。

A7FvwnB5bhpBlKbgrzYcQijbnxg

📘注釈

スパースベクトルに加えて、Zilliz Cloudは密ベクトルとバイナリベクトルもサポートしています。密ベクトルは深層的なセマンティック関係を捉えるのに最適ですが、バイナリベクトルはクイック類似性比較やコンテンツ重複排除などのシナリオで優れています。詳細については、密ベクトルおよびバイナリベクトルを参照してください。

データフォーマット

以下のセクションでは、SPLADEなどの学習済みスパース埋め込みモデルからベクトルを格納する方法を説明します。密ベクトルベースのセマンティック検索を補完するものを検索している場合は、単純性のためにSPLADEではなくBM25による全文検索を推奨します。品質評価を実施し、SPLADEの使用を決定した場合は、SPLADEを使用したスパースベクトルの生成方法については埋め込みを参照してください。

Zilliz Cloudは以下のフォーマットでのスパースベクトル入力をサポートしています:

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

    # 辞書を使用して各スパースベクトルを表現
    sparse_vectors = [{27: 0.5, 100: 0.3, 5369: 0.6} , {100: 0.1, 3: 0.8}]
  • スパース行列scipy.sparseクラスを使用)

    from scipy.sparse import csr_matrix

    # 最初のベクトル:インデックス[27, 100, 5369]、値[0.5, 0.3, 0.6]
    # 2番目のベクトル:インデックス[3, 100]、値[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)]

    # 各スパースベクトルをイテラブルのリスト(例:タプル)として表現
    sparse_vector = [
    [(27, 0.5), (100, 0.3), (5369, 0.6)],
    [(100, 0.1), (3, 0.8)]
    ]

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

コレクションを作成する前に、フィールドを定義し、オプションでテキストフィールドから対応するスパースベクトル表現に変換する関数を指定する必要があります。

フィールドの追加

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

  • SPARSE_FLOAT_VECTORフィールドは、VARCHARフィールドから自動生成されるか、入力データで直接提供されるスパースベクトルを格納するために予約されます。

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

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つのフィールドが追加されています:

  • pkVARCHARデータ型を使用して主キーを格納するフィールドで、最大長100バイトの自動生成です。

  • sparse_vectorSPARSE_FLOAT_VECTORデータ型を使用してスパースベクトルを格納するフィールドです。

  • textVARCHARデータ型を使用してテキスト文字列を格納するフィールドで、最大長65535バイトです。

📘注釈

データ挿入中に指定されたテキストフィールドからスパースベクトル埋め込みをZilliz Cloudが生成するように有効にするには、関数を含む追加のステップが必要です。詳細については、全文検索を参照してください。

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

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

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インデックスタイプを使用しています。詳細については、以下のリソースを参照してください:

  • メトリックタイプ:異なるフィールドタイプでサポートされているメトリックタイプ

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

コレクションの作成

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

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

データの挿入

コレクション作成時に定義されたすべてのフィールドのデータを提供する必要がありますが、自動生成されたフィールド(auto_idが有効な主キーなど)は除きます。組み込みのBM25機能を使用してスパースベクトルを自動生成する場合は、データ挿入時にスパースベクトルフィールドも省略する必要があります。

data = [
{
"text": "情報検索は学問分野です。",
"sparse_vector": {1: 0.5, 100: 0.3, 500: 0.8}
},
{
"text": "情報検索は大規模データセットから関連情報を検索することに焦点を当てています。",
"sparse_vector": {10: 0.1, 200: 0.7, 1000: 0.9}
}
]

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

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

# 検索パラメータを準備
search_params = {
"params": {"drop_ratio_search": 0.2}, # 0から1の間の有効な範囲を持つ調整可能なドロップ比パラメータ
}

# スパースベクトルでクエリ
query_data = [{1: 0.2, 50: 0.4, 1000: 0.7}]

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

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

print(res)

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

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