一架梯子,一头程序猿,仰望星空!
Qdrant向量数据库教程 > 内容正文

Qdrant集合(Collections)


集合(collections)

Qdrant向量数据库的集合概念可以类比MYSQL的表结构,用于统一存储同一类向量数据,集合中存储的每一条数据,在Qdrant中称为点(points),这里的点有数学几何空间的点类似的意思,代表向量在几何空间中的表示(你就当成一条数据看待就行)。

同一集合内每个点的向量都必须具有相同的维度,并通过单一度量进行比较。命名向量可用于在单个点中包含多个向量,每个向量都可以有自己的维度和度量要求。

距离度量用于衡量向量之间的相似性。度量的选择取决于向量获取的方式,特别是神经网络编码器训练的方法。

Qdrant支持这些最流行的度量类型:

  • 点积:Dot
  • 余弦相似度:Cosine
  • 欧氏距离:Euclid

为了提高搜索效率,余弦相似度通过对归一化向量进行点积实现。在上传时,向量会自动进行归一化。除了度量和向量大小之外,每个集合还使用自己的一组参数来控制集合优化、索引构建和清理。可以通过相应的请求随时更改这些设置。

设置多租户

应该创建多少个集合? 在大多数情况下,您只需要使用一个带有基于有效负载的分区的集合。这种方法称为多租户。对于大多数用户来说,这是高效的,但需要额外的配置。了解如何设置多租户。

何时应该创建多个集合? 当您有有限的用户数并且需要隔离时。这种方法更灵活,但可能更加昂贵,因为创建大量集合可能会导致资源开销。此外,您需要确保它们不以任何方式相互影响,包括性能方面。

创建集合

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    }
}

除了必填选项外,还可以为以下集合选项指定自定义值:

  • hnsw_config - 有关索引详情,请参阅索引。
  • wal_config - 与写前日志相关的配置。有关WAL的更多详细信息请参阅。
  • optimizers_config - 有关优化器的详情,请参阅优化器。
  • shard_number - 定义集合应该具有多少分片。有关详细信息,请参阅分布式部署部分。
  • on_disk_payload - 定义存储有效负载数据的位置。如果是true - 将只将有效负载存储在磁盘上。在处理大型有效负载的情况下,这可能对限制RAM使用非常有用。
  • quantization_config - 有关量化的详细信息,请参阅量化。

可选集合参数的默认参数在配置文件中定义。

有关集合和向量参数的更多信息,请参见模式定义配置文件

从v1.2.0开始可用

向量都保存在RAM中,以便实现非常快速的访问。可以在向量配置中设置on_disk参数。如果为true,则所有向量将保存在磁盘上。这将启用使用内存映射,适用于导入大量数据。

从另一个集合创建集合

从v1.0.0开始可用

可以从另一个现有集合初始化一个集合。

这对于快速尝试相同数据集的不同配置可能会有用。

在设置新集合中的向量配置的向量函数时,确保向量具有相同的大小和距离函数。

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    },
    "init_from": {
       "collection": {from_collection_name}
    }
}

多向量集合

从v0.10.0开始提供

每个记录可以有多个向量。这个特性允许一个集合中有多个向量存储。为了区分一个记录中的向量,当创建集合时定义它们的唯一名称。该模式下每个命名向量都有自己的距离和大小:

PUT /collections/{collection_name}

{
    "vectors": {
        "image": {
            "size": 4,
            "distance": "Dot"
        },
        "text": {
            "size": 8,
            "distance": "Cosine"
        }
    }
}

对于少数特殊情况,也可以创建一个没有任何向量存储的集合。

从v1.1.1开始提供

对于每个命名向量,您可以选择性地指定hnsw_configquantization_config以偏离集合配置。这可以用于在向量级别上优化搜索性能。

从v1.2.0开始提供

向量都存储在内存中以便快速访问。针对每个向量,可以将on_disk设置为true,以便始终将所有向量存储在磁盘上。这将启用内存映射,适用于摄取大量数据。

删除集合

DELETE /collections/{collection_name}

更新集合参数

动态参数更新可能会有帮助,比如对向量的更高效的初始加载。例如,您可以在上传过程中禁用索引,并在上传完成后立即启用它。这样,您将不会浪费额外的计算资源来重建索引。

以下命令为存储了超过10000 kB向量的段启用索引:

PATCH /collections/{collection_name}

{
    "optimizers_config": {
        "indexing_threshold": 10000
    }
}

可以更新以下参数:

  • optimizers_config - 详见优化器的详细说明。
  • hnsw_config - 详见索引的详细说明。
  • quantization_config - 详见量化的详细说明。
  • vectors - 特定向量的配置,包括各自的hnsw_configquantization_configon_disk设置。
  • params - 其它集合参数,包括write_consistency_factoron_disk_payload

完整的API规范位于schema definitions中。

从v1.4.0开始提供

Qdrant 1.4增加了在运行时更新更多集合参数的支持。HNSW索引、量化和磁盘配置现在可以在不重新创建集合的情况下进行更改。段(带有索引和量化数据)将自动在后台重建以匹配更新后的参数。

在以下示例中,更新了整个集合和my_vector的HNSW索引和量化参数:

PATCH /collections/{collection_name}

{
    "vectors": {
        "my_vector": {
            "hnsw_config": {
                "m": 32,
                "ef_construct": 123
            },
            "quantization_config": {
                "product": {
                    "compression": "x32",
                    "always_ram": true
                }
            },
            "on_disk": true
        }
    },
    "hnsw_config": {
        "ef_construct": 123
    },
    "quantization_config": {
        "scalar": {
            "type": "int8",
            "quantile": 0.8,
            "always_ram": false
        }
    }
}

注意: 为了更新没有命名向量的集合中的向量参数,可以使用一个空的("")名称。

对此端点的调用可能会阻塞,因为它等待现有优化器完成。我们不推荐在生产数据库中使用此功能,因为重新构建索引可能会引入巨大的开销。

集合信息

Qdrant允许确定现有集合的配置参数,以更好地了解点的分布和索引情况。

GET /collections/{collection_name}

{
    "result": {
        "status": "green",
        "optimizer_status": "ok",
        "vectors_count": 1068786,
        "indexed_vectors_count": 1024232,
        "points_count": 1068786,
        "segments_count": 31,
        "config": {
            "params": {
                "vectors": {
                    "size": 384,
                    "distance": "Cosine"
                },
                "shard_number": 1,
                "replication_factor": 1,
                "write_consistency_factor": 1,
                "on_disk_payload": false
            },
            "hnsw_config": {
                "m": 16,
                "ef_construct": 100,
                "full_scan_threshold": 10000,
                "max_indexing_threads": 0
            },
            "optimizer_config": {
                "deleted_threshold": 0.2,
                "vacuum_min_vector_number": 1000,
                "default_segment_number": 0,
                "max_segment_size": null,
                "memmap_threshold": null,
                "indexing_threshold": 20000,
                "flush_interval_sec": 5,
                "max_optimization_threads": 1
            },
            "wal_config": {
                "wal_capacity_mb": 32,
                "wal_segments_ahead": 0
            }
        },
        "payload_schema": {}
    },
    "status": "ok",
    "time": 0.00010143
}

如果将向集合中插入向量,status字段可能在优化时变为“yellow”,一旦所有点都成功处理后,它将变为“green”。

可能有以下颜色状态:

  • 🟢 green:集合准备就绪
  • 🟡 yellow:集合正在进行优化
  • 🔴 red:发生了引擎无法恢复的错误

还有一些其他可能感兴趣的属性:

  • points_count - 集合中存储的对象(向量及其有效载荷)总数
  • vectors_count - 集合中向量的总数。如果每个对象有多个向量,则不等于points_count
  • indexed_vectors_count - 存储在HNSW索引中的向量总数。Qdrant不会将所有向量存储在索引中,只有当给定配置可能创建索引段时才会存储。

在HNSW中索引向量

在某些情况下,您可能会发现indexed_vectors_count的值小于vectors_count。这是一种有意的行为,取决于优化器的配置。如果未索引的向量大小大于indexing_threshold(以kB为单位),则会构建一个新的索引段。如果您的集合非常小或向量的维度较低,则可能不会创建HNSW段,并且indexed_vectors_count可能等于0

可以通过更新集合参数来减小现有集合中的indexing_threshold的值。

集合别名

在生产环境中,有时需要轻松切换不同版本的向量,例如升级到新版本的神经网络。

在这些情况下,无法停止服务并使用新的向量重新构建集合。别名是现有集合的附加名称。使用别名而不是集合名称也可以完全执行所有对集合的查询。

因此,可以在后台构建第二个集合,然后将别名从旧集合切换到新集合。由于别名更改是原子的,因此在切换过程中不会影响并发请求。

创建别名

POST /collections/aliases

{
    "actions": [
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "example_collection"
            }
        }
    ]
}

删除别名

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        }
    ]
}

切换集合

多个别名操作可以以原子方式执行。例如,您可以使用以下命令切换底层集合:

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        },
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "new_collection"
            }
        }
    ]
}

列出集合别名

GET /collections/{collection_name}/aliases

列出所有别名

GET /aliases

列出所有集合

GET /collections


关联主题