集合(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_config
或quantization_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_config
,quantization_config
和on_disk
设置。params
- 其它集合参数,包括write_consistency_factor
和on_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