我是 Qdrant 的新手。目前,我计划将嵌入以及基本上包含语言信息的有效负载存储在 Qdrant(矢量数据库)中。我们的主要目标是使用 Qdrant 提供的 ANN 功能。
在这里,我想存储我们的训练管道生成的最后 3 天的嵌入。
实施1:
-摄取 3 天的数据,无需构建任何全局索引。 -根据日期和语言对整个数据进行分区。
实施2: -根据日期建立单独的集合。即每个日期一个集合。 -为每个集合建立全局索引。 -根据语言对每个集合进行分区。 -使用基于语言的过滤器执行人工神经网络。
在实现 2 中,成本和可扩展性将是主要问题,但我相信全局索引会更好,因为与 KNN ~ 98% 匹配相比,它提供了更好的推荐结果。
在实现 1 中,与 KNN ~ 50% 匹配相比,结果急剧下降。
我在这里发布配置:
{'result': {'status': 'green',
'optimizer_status': 'ok',
'vectors_count': 3517432,
'indexed_vectors_count': 3517432,
'points_count': 3517432,
'segments_count': 15,
'config': {'params': {'vectors': {'size': 128,
'distance': 'Cosine',
'hnsw_config': {'m': 0,
'ef_construct': 200,
'full_scan_threshold': 10000,
'on_disk': True,
'payload_m': 50},
'on_disk': True},
'shard_number': 3,
'replication_factor': 1,
'write_consistency_factor': 1,
'on_disk_payload': True},
'hnsw_config': {'m': 0,
'ef_construct': 100,
'full_scan_threshold': 10000,
'max_indexing_threads': 0,
'on_disk': False,
'payload_m': 16},
'optimizer_config': {'deleted_threshold': 0.2,
'vacuum_min_vector_number': 1000,
'default_segment_number': 0,
'max_segment_size': None,
'memmap_threshold': None,
'indexing_threshold': 100,
'flush_interval_sec': 5,
'max_optimization_threads': 1},
'wal_config': {'wal_capacity_mb': 32, 'wal_segments_ahead': 0},
'quantization_config': None},
'payload_schema': {'dt': {'data_type': 'keyword', 'points': 3517432},
'language': {'data_type': 'keyword', 'points': 3517432}}},
'status': 'ok',
'time': 0.001034984}
我会提倡第一个实施,尽管我对这些数字有点惊讶。然而,这是应该改进的地方。
您可以分享您要执行的查询的示例吗?我希望有一个调用 Qdrant API 并应用过滤器的示例。我看到两个有效负载索引都是
keyword
类型,但 Qdrant 1.8+ 本身支持日期时间:
https://qdrant.tech/documentation/concepts/payload/?q=date#datetime