如何在 Qdrant 0.10.0 中使用批量搜索优化向量搜索
Qdrant 0.10.0 的最新版本引入了许多简化常见任务的功能。这些新功能伴随着客户端库接口的一些微小修改。最近引入的功能之一是能够一次使用 多个向量 查询集合——一种批量搜索机制。
有很多场景你可能需要同时执行多个不相关的任务。以前,你只能自己向 Qdrant API 发送多个请求。但是多个并行请求可能会导致显著的网络开销并降低处理速度,尤其是在连接速度较慢的情况下。
现在,得益于新的批量搜索,你无需担心这一点。Qdrant 将在仅一个 API 调用中处理多个搜索请求,并以最优方式执行这些请求。
使用批量搜索优化向量搜索的示例
我们使用了官方的 Python 客户端来展示如何将批量搜索集成到你的应用中。由于 Qdrant 0.10.0 的接口发生了一些变化,我们将一步步进行。
步骤 1:创建集合
第一步是创建一个具有指定配置的集合——至少包括向量大小和用于衡量向量之间相似度的距离函数。
from qdrant_client import QdrantClient
from qdrant_client.conversions.common_types import VectorParams
client = QdrantClient("localhost", 6333)
if not client.collection_exists('test_collection'):
client.create_collection(
collection_name="test_collection",
vectors_config=VectorParams(size=4, distance=Distance.EUCLID),
)
步骤 2:加载向量
创建集合后,我们可以向其中放入一些向量。我们将只提供几个示例。
vectors = [
[.1, .0, .0, .0],
[.0, .1, .0, .0],
[.0, .0, .1, .0],
[.0, .0, .0, .1],
[.1, .0, .1, .0],
[.0, .1, .0, .1],
[.1, .1, .0, .0],
[.0, .0, .1, .1],
[.1, .1, .1, .1],
]
client.upload_collection(
collection_name="test_collection",
vectors=vectors,
)
步骤 3:在单个请求中进行批量搜索
现在我们已经准备好开始寻找相似向量了,因为我们的集合中已有了一些条目。假设我们想找到选定向量与最相似数据库条目之间的距离,同时为另一个向量查询找到两个最相似的对象。直到 0.9 版本,我们需要调用两次 API。现在,我们可以将两个请求一起发送
results = client.search_batch(
collection_name="test_collection",
requests=[
SearchRequest(
vector=[0., 0., 2., 0.],
limit=1,
),
SearchRequest(
vector=[0., 0., 0., 0.01],
with_vector=True,
limit=2,
)
]
)
# Out: [
# [ScoredPoint(id=2, version=0, score=1.9,
# payload=None, vector=None)],
# [ScoredPoint(id=3, version=0, score=0.09,
# payload=None, vector=[0.0, 0.0, 0.0, 0.1]),
# ScoredPoint(id=1, version=0, score=0.10049876,
# payload=None, vector=[0.0, 0.1, 0.0, 0.0])]
# ]
SearchRequest 类的每个实例都可以提供自己的搜索参数,包括向量查询以及一些附加过滤器。响应将是每个请求的单独结果列表。如果任何请求格式错误,将会抛出异常,因此要么所有请求都成功,要么所有请求都失败。
就是这样!你不再需要自己处理多个请求了。Qdrant 将在底层为你完成。
批量搜索性能基准
批量搜索相当容易集成到你的应用中,但如果你在决定切换之前更愿意看到一些数字,那么比较四种不同的选项是值得的
- 顺序查询数据库。
- 使用多个线程/进程进行独立请求。
- 在单个请求中利用 Qdrant 的批量搜索。
- 结合并行处理和批量搜索。
为了做到这一点,我们将创建一个更丰富的点集合,使用来自 glove-25-angular 数据集的向量,这是 ANN 比较中一个相当常见的选择。如果你有兴趣了解我们如何对 Qdrant 进行基准测试的更多细节,请 查看 Gist。
结果
我们对 10000 个测试向量进行了 5 次基准测试,并取了结果的平均值。呈现的数字是所有尝试的平均值
- 顺序搜索:225.9 秒
- 批量搜索:208.0 秒
- 多进程搜索 (8 个进程):194.2 秒
- 多进程批量搜索 (8 个进程,批量大小 10):148.9 秒
在特定设置上可能获得的结果会因硬件而异,但乍一看,批量搜索似乎可以为你节省相当多的时间。
在分布式部署的情况下可以实现额外的改进,因为 Qdrant 不需要进行大量的跨集群请求。此外,如果你的请求共享相同的过滤条件,查询优化器将能够在批量请求中重复使用它。
总结
批量搜索允许将不同的查询打包到单个 API 调用中,并在一个响应中检索结果。如果你曾为向 Qdrant 发送多个连续查询而苦恼,那么你可以轻松切换到新的批量搜索方法并简化你的应用代码。正如基准测试所示,这几乎可以毫不费力地将你与 Qdrant 的交互速度提高 30% 以上,甚至还没有考虑节省的网络开销和可能对过滤器的重复使用!
准备好释放批量搜索的潜力,并使用 Qdrant 0.10.0 优化你的向量搜索了吗?今天就联系我们,了解我们如何彻底改变你的搜索能力!