利用 Qdrant 的异步 API 构建高吞吐量应用程序

预计耗时:25 分钟难度:中等

异步编程正在 Python 生态系统中被广泛采用。FastAPI 等工具已经拥抱了这种新范式,它也正在成为以 SaaS 形式提供的机器学习模型的标准。例如,Cohere SDK 除了提供同步客户端外,还提供了异步客户端

数据库通常作为独立服务启动,并通过网络进行访问。与它们的所有交互都是 IO 密集型的,可以异步执行,从而避免在主动等待服务器响应时浪费时间。在 Python 中,这是通过使用 async/await 语法实现的。这使得解释器可以在等待服务器响应时切换到另一个任务。

何时使用异步 API

如果你编写的应用程序永远不需要同时支持多个用户(例如每天运行一次的脚本),则无需使用异步 API。但是,如果你编写的是多个用户将同时使用的 Web 服务,则不应阻塞 Web 服务器的线程,因为这会限制其可处理的并发请求数量。在这种情况下,你应该使用异步 API。

FastAPIQuart 这样的现代 Web 框架开箱即用地支持异步 API。将异步代码与现有的同步代码库混合使用可能是一个挑战。async/await 语法不能在同步函数中使用。另一方面,在异步代码中同步调用 IO 密集型操作被视为一种反模式。因此,如果你构建了一个通过 ASGI 服务器公开的异步 Web 服务,你应该在与 Qdrant 的所有交互中使用异步 API。

异步使用 Qdrant

运行异步代码最简单的方法是定义一个 async 函数,并按以下方式使用 asyncio.run 来运行它:

from qdrant_client import models

import qdrant_client
import asyncio


async def main():
    client = qdrant_client.AsyncQdrantClient("localhost")

    # Create a collection
    await client.create_collection(
        collection_name="my_collection",
        vectors_config=models.VectorParams(size=4, distance=models.Distance.COSINE),
    )

    # Insert a vector
    await client.upsert(
        collection_name="my_collection",
        points=[
            models.PointStruct(
                id="5c56c793-69f3-4fbf-87e6-c4bf54c28c26",
                payload={
                    "color": "red",
                },
                vector=[0.9, 0.1, 0.1, 0.5],
            ),
        ],
    )

    # Search for nearest neighbors
    points = await client.query_points(
        collection_name="my_collection",
        query=[0.9, 0.1, 0.1, 0.5],
        limit=2,
    ).points

    # Your async code using AsyncQdrantClient might be put here
    # ...


asyncio.run(main())

AsyncQdrantClient 提供了与其同步对应项 QdrantClient 相同的方法。如果你已经有了一个同步代码库,切换到异步 API 非常简单,只需将 QdrantClient 替换为 AsyncQdrantClient,并在每个方法调用前添加 await 即可。

此页面有用吗?

感谢您的反馈!🙏

很遗憾听到这个消息。😔 你可以在 GitHub 上编辑此页面,或创建一个 GitHub 问题。