• 文章
  • 掌握批量搜索以优化向量
返回向量搜索手册

掌握批量搜索以优化向量

Kacper Łukawski

·

2022 年 9 月 26 日

Mastering Batch Search for Vector Optimization

如何在 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 将在底层为你完成。

批量搜索性能基准

批量搜索相当容易集成到你的应用中,但如果你在决定切换之前更愿意看到一些数字,那么比较四种不同的选项是值得的

  1. 顺序查询数据库。
  2. 使用多个线程/进程进行独立请求。
  3. 在单个请求中利用 Qdrant 的批量搜索。
  4. 结合并行处理和批量搜索。

为了做到这一点,我们将创建一个更丰富的点集合,使用来自 glove-25-angular 数据集的向量,这是 ANN 比较中一个相当常见的选择。如果你有兴趣了解我们如何对 Qdrant 进行基准测试的更多细节,请 查看 Gist

结果

我们对 10000 个测试向量进行了 5 次基准测试,并取了结果的平均值。呈现的数字是所有尝试的平均值

  1. 顺序搜索:225.9 秒
  2. 批量搜索:208.0 秒
  3. 多进程搜索 (8 个进程):194.2 秒
  4. 多进程批量搜索 (8 个进程,批量大小 10):148.9 秒

在特定设置上可能获得的结果会因硬件而异,但乍一看,批量搜索似乎可以为你节省相当多的时间。

在分布式部署的情况下可以实现额外的改进,因为 Qdrant 不需要进行大量的跨集群请求。此外,如果你的请求共享相同的过滤条件,查询优化器将能够在批量请求中重复使用它。

总结

批量搜索允许将不同的查询打包到单个 API 调用中,并在一个响应中检索结果。如果你曾为向 Qdrant 发送多个连续查询而苦恼,那么你可以轻松切换到新的批量搜索方法并简化你的应用代码。正如基准测试所示,这几乎可以毫不费力地将你与 Qdrant 的交互速度提高 30% 以上,甚至还没有考虑节省的网络开销和可能对过滤器的重复使用!

准备好释放批量搜索的潜力,并使用 Qdrant 0.10.0 优化你的向量搜索了吗?今天就联系我们,了解我们如何彻底改变你的搜索能力!

本页有用吗?

感谢你的反馈!🙏

很抱歉听到这个消息。😔 你可以在 GitHub 上 编辑 此页面,或 创建 一个 GitHub issue。