跳到主要内容

稀疏向量

稀疏向量(Sparse Vector)是信息检索和自然语言处理中的一种重要数据表示方法。虽然稠密向量(Dense Vector)因其出色的语义理解能力而广受欢迎,但在需要精确匹配关键词或短语的应用中,稀疏向量往往能够提供更为准确的结果。

概述

稀疏向量是一种高维向量的特殊表示方法,其大多数元素为零,只有少数维度上有非零值。这种特性使得稀疏向量在处理大规模、高维度但数据稀疏的场景中特别有效。常见的应用有:

  • 文本分析:将文档表示为词袋向量,每个维度对应一个词,只有文档中出现的词维度取非零值;

  • 推荐系统:User-Item 交互矩阵,每个维度表示用户对某个物品的评分,大多数用户只与少数物品交互;

  • 图像处理:局部特征表示,只描述图像中的关键点,生成高维稀疏向量。

如下图所示,稠密向量通常以连续数组的形式表示,每个位置都有一个值(如 [0.3, 0.8, 0.2, 0.3, 0.1])。相比之下,稀疏向量仅存储非零元素及其索引位置,通常表示为键值对列表(如 [{2: 0.2}, ..., {9997: 0.5}, {9999: 0.7}])。这种表示方法大大减少了存储空间,并提高了计算效率,特别是在处理超高维度(如 10000 维)的数据时。

XSFJwXDGGhJGoob8UaMcvpCrnOb

稀疏向量可以通过多种方法生成,常见的包括文本处理中的 TF-IDF(词频-逆文档频率)和 BM25 算法。此外,Zilliz Cloud 提供了一些便捷的方法来帮助您生成和处理稀疏向量,具体可以参考 Embeddings。

数据在向量化后,可以存储在 Zilliz Cloud 中进行管理和向量检索。下图展示了基本流程。

AAIowWHINh4lYhbAmPlcJ5yQnUn

📘说明

除了稀疏向量,Zilliz Cloud 还支持稠密向量和 Binary 向量。稠密向量适用于捕捉深层次的语义关联,而 Binary 向量则在快速相似性比较和内容去重等场景中表现出色。有关更多信息,请参考稠密向量Binary 向量

在 Zilliz Cloud 中使用稀疏向量

Zilliz Cloud 支持用以下任意格式表示稀疏向量:

  • 稀疏矩阵(使用 scipy.sparse 类)

    from scipy.sparse import csr_matrix

    row = [0, 0, 1, 2, 2, 2]
    col = [0, 2, 2, 0, 1, 2]
    data = [1, 2, 3, 4, 5, 6]
    sparse_matrix = csr_matrix((data, (row, col)), shape=(3, 3))

    sparse_vector = sparse_matrix.getrow(0)
  • 字典列表(格式为 {dimension_index: value, ...}

    sparse_vector = [{1: 0.5, 100: 0.3, 500: 0.8, 1024: 0.2, 5000: 0.6}]
  • 元组迭代器列表(格式为 [(dimension_index, value)]

    sparse_vector = [[(1, 0.5), (100, 0.3), (500, 0.8), (1024, 0.2), (5000, 0.6)]]

添加稀疏向量字段

要在 Zilliz Cloud 中使用稀疏向量,首先需要在创建 Collection 时定义用于存储稀疏向量的字段。这个过程包括:

  1. 设置 datatype 为支持的稀疏向量数据类型,即 SPARSE_FLOAT_VECTOR

  2. 不需要指定维度。

from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

client.drop_collection(collection_name="my_sparse_collection")

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)

以上示例中,我们添加了一个名为 sparse_vector 的向量字段,用于存储稀疏向量。该字段的数据类型为 SPARSE_FLOAT_VECTOR

为稀疏向量创建索引

为稀疏向量创建索引的过程和稠密向量类似,但指定的索引类型(index_type),距离度量类型(metric_type),和索引参数(params)有所差别。

index_params = client.prepare_index_params()

index_params.add_index(
field_name="sparse_vector",
index_name="sparse_inverted_index",
index_type="AUTOINDEX",
metric_type="IP"
)

以上示例中:

  • 为稀疏向量创建了 AUTOINDEX 类型的索引。

  • 对于稀疏向量,metric_type 只支持 IPIP 表示内积(Inner Product),用于衡量两个稀疏向量之间的相似度。有关更多相似度信息,请参考相似度类型

创建 Collection

稀疏向量和索引定义完成后,我们便可以创建包含稀疏向量的 Collection。以下示例通过 create_collection 方法创建了一个名为 my_sparse_collection 的 Collection。

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

插入稀疏向量

创建 Collection 后,您可以插入包含稀疏向量的数据。

sparse_vectors = [
{"sparse_vector": {1: 0.5, 100: 0.3, 500: 0.8}},
{"sparse_vector": {10: 0.1, 200: 0.7, 1000: 0.9}},
]

client.insert(
collection_name="my_sparse_collection",
data=sparse_vectors
)

基于稀疏向量执行相似性搜索

要基于稀疏向量进行相似性搜索,您需要先准备查询向量和搜索参数。

search_params = {
"params": {"drop_ratio_search": 0.2},
}

query_vector = [{1: 0.2, 50: 0.4, 1000: 0.7}]

以上示例中,drop_ratio_search是专用于稀疏向量的可选搜索参数,它允许在搜索过程中对查询向量中的小值进行微调。例如,如果 {"drop_ratio_search": 0.2},在搜索过程中,查询向量中最小的 20% 的值将被忽略。

然后,通过 search 方法执行相似性搜索:

res = client.search(
collection_name="my_sparse_collection",
data=query_vector,
limit=3,
output_fields=["pk"],
search_params=search_params,
)

print(res)

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

有关更多搜索相关信息,请参考基本 ANN Search