在高效 Python 应用中使用 Qdrant 的异步 API

异步编程正在 Python 生态系统中被广泛采用。FastAPI 等工具已经接受了这种新范式,它也正成为作为 SaaS 提供的 ML 模型的一种标准。例如,Cohere SDK 提供了一个异步客户端,与其同步对应物并行。

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

何时使用异步 API

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

现代 Web 框架,如FastAPIQuart 开箱即用地支持异步 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 issue。