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

バイナリベクトル

バイナリベクトルは、従来の高次元浮動小数点ベクトルを0と1のみで構成されるバイナリベクトルに変換する、特殊なデータ表現形式です。この変換により、ベクトルのサイズが圧縮されるだけでなく、セマンティック情報を保持しながらストレージと計算コストも削減されます。重要でない特徴量の精度が必須でない場合、バイナリベクトルは元の浮動小数点ベクトルの完全性と有用性の大部分を効果的に維持できます。

バイナリベクトルは幅広い用途に適用でき、特に計算効率とストレージの最適化が重要な場面で役立ちます。検索エンジンやレコメンデーションシステムなど大規模な AI システムでは、膨大な量のデータをリアルタイムで処理することが重要です。ベクトルのサイズを小さくすることで、バイナリベクトルは精度を大幅に犠牲にすることなく、レイテンシーと計算コストの削減に役立ちます。さらに、メモリと処理能力が限られているモバイルデバイスや組み込みシステムなど、リソースが制約された環境でもバイナリベクトルは有用です。バイナリベクトルを活用することで、こうした制約のある環境でも高いパフォーマンスを維持しながら、複雑な AI 機能を実装できます。

概要​

バイナリベクトルは、画像、テキスト、音声などの複雑なオブジェクトを固定長のバイナリ値にエンコードする方法です。Zilliz Cloud クラスターでは、バイナリベクトルは通常、ビット配列またはバイト配列として表現されます。たとえば、8 次元のバイナリベクトルは [1, 0, 1, 1, 0, 0, 1, 0] として表現できます。

次の図は、バイナリベクトルがテキストコンテンツ内のキーワードの有無をどのように表現するかを示しています。この例では、10 次元のバイナリベクトルを使用して 2 つの異なるテキスト(テキスト 1 と テキスト 2)を表現しており、各次元は語彙内の単語に対応します。1 はテキスト内にその単語が存在することを示し、0 は存在しないことを示します。

TuIGwtyEkh9g04bvo0icsWdynBd

バイナリベクトルには次の特性があります:

  • 効率的なストレージ: 各次元の保存に必要なのはわずか 1 ビットであり、ストレージスペースを大幅に削減できます。

  • 高速な計算: ベクトル間の類似度は、XOR などのビット演算を使用して高速に計算できます。

  • 固定長: ベクトルの長さは元のテキストの長さに関係なく一定であるため、インデックスの作成と検索が容易になります。

  • シンプルで直感的: キーワードの有無を直接反映するため、特定の専門的な検索タスクに適しています。

バイナリベクトルはさまざまな方法で生成できます。テキスト処理では、事前定義された語彙を使用して、単語の有無に基づいて対応するビットを設定できます。画像処理では、知覚ハッシュアルゴリズム(pHash など)によって画像のバイナリ特徴を生成できます。機械学習アプリケーションでは、モデルの出力を二値化してバイナリベクトル表現を得ることができます。

バイナリベクトル化後、データは Zilliz Cloud クラスターに保存して管理およびベクトル検索に利用できます。次の図は基本的なプロセスを示しています。

TF1uw4AQVhFdmBbrhyVcJO6WnXe

Notes

Although binary ベクトル excel in specific scenarios, they have limitations in their expressive capability, making it difficult to capture complex semantic relationships. Therefore, in real-world scenarios, binary ベクトル are often used alongside other ベクトル types to balance efficiency and expressiveness. For more information, refer to Dense ベクトル and Sparse Vector.

バイナリベクトルを使用する​

ベクトルフィールドを追加する​

Zilliz Cloud クラスターでバイナリベクトルを使用するには、コレクションの作成時にバイナリベクトルを格納するベクトルフィールドをまず定義します。このプロセスには次の作業が含まれます:

  1. datatype を、サポートされているバイナリベクトルデータタイプである BINARY_VECTOR に設定します。

  2. dim パラメーターを使用してベクトルの次元数を指定します。バイナリベクトルは挿入時にバイト配列に変換する必要があるため、dim は 8 の倍数である必要があります。8 個のブール値(0 または 1)が 1 バイトにパックされます。たとえば、dim=128 の場合、挿入には 16 バイトの配列が必要です。

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="binary_vector", datatype=DataType.BINARY_VECTOR, dim=128)

この例では、バイナリベクトルを格納するために binary_vector という名前のベクトルフィールドが追加されます。このフィールドのデータタイプは BINARY_VECTOR で、次元数は 128 です。

ベクトルフィールドのインデックスパラメーターを設定する​

検索を高速化するには、バイナリベクトルフィールドにインデックスを作成する必要があります。インデックスを作成すると、大規模なベクトルデータの検索効率を大幅に向上できます。

python
index_params = client.prepare_index_params()

index_params.add_index(
field_name="binary_vector",
index_name="binary_vector_index",
index_type="AUTOINDEX",
metric_type="HAMMING"
)

上記の例では、AUTOINDEX インデックスタイプを使用して、binary_vector フィールドに binary_vector_index という名前のインデックスが作成されます。metric_type は HAMMING に設定されており、類似度の測定にハミング距離が使用されることを示しています。

さらに、Zilliz Cloud はバイナリベクトル向けの他の類似度メトリクスもサポートしています。詳細については、Metric Types を参照してください。

コレクションを作成する​

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

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

データを挿入する​

コレクションを作成したら、insert メソッドを使用してバイナリベクトルを含むデータを追加します。バイナリベクトルは、各バイトが 8 個のブール値を表すバイト配列の形式で指定する必要があります。

たとえば、128 次元のバイナリベクトルの場合、16 バイトの配列が必要です(128 ビット ÷ 8 ビット/byte = 16 バイト)。データを挿入するサンプルコードは次のとおりです:

python
def convert_bool_list_to_bytes(bool_list):
if len(bool_list) % 8 != 0:
raise ValueError("The length of a boolean list must be a multiple of 8")

byte_array = bytearray(len(bool_list) // 8)
for i, bit in enumerate(bool_list):
if bit == 1:
index = i // 8
shift = i % 8
byte_array[index] |= (1 << shift)
return bytes(byte_array)

bool_vectors = [
[1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112,
[0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1] + [0] * 112,
]

data = [{"binary_vector": convert_bool_list_to_bytes(bool_vector)} for bool_vector in bool_vectors]

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

類似検索は Zilliz Cloud クラスターの主要な機能の 1 つであり、ベクトル間の距離に基づいて、クエリベクトルに最も類似するデータをすばやく見つけることができます。バイナリベクトルを使用して類似検索を実行するには、クエリベクトルと検索パラメーターを準備し、search メソッドを呼び出します。

検索操作では、バイナリベクトルもバイト配列の形式で指定する必要があります。クエリベクトルの次元数が dim の定義時に指定した次元と一致すること、および 8 個のブール値が 1 バイトに変換されることを確認してください。

python
search_params = {
"params": {"nprobe": 10}
}

query_bool_list = [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112
query_vector = convert_bool_list_to_bytes(query_bool_list)

res = client.search(
collection_name="my_collection",
data=[query_vector],
anns_field="binary_vector",
search_params=search_params,
limit=5,
output_fields=["pk"]
)

print(res)

# Output
# data: ["[{'id': '453718927992172268', 'distance': 10.0, 'entity': {'pk': '453718927992172268'}}]"]

類似検索のパラメーターの詳細については、Basic ANN Search を参照してください。