如何在 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 优化您的向量搜索了吗?立即联系我们,了解我们如何彻底改变您的搜索能力!
