使用Qdrant的异步API构建高效的Python应用程序

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

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

何时使用异步API

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

现代网络框架如FastAPIQuart支持开箱即用的异步API。将异步代码与现有的同步代码库混合可能是一个挑战。async/await语法不能在同步函数中使用。另一方面,在异步代码中同步调用IO绑定操作被认为是一种反模式。因此,如果你构建一个通过ASGI服务器暴露的异步网络服务,你应该使用异步API与Qdrant进行所有交互。

异步使用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 一样简单。

支持的Python库

Qdrant 集成了众多 Python 库。直到最近,只有 Langchain 提供了异步 Python API 支持。 Qdrant 是唯一一个在 Langchain 中全面覆盖异步 API 的向量数据库。他们的文档 描述了如何使用它

这个页面有用吗?

感谢您的反馈!🙏

我们很抱歉听到这个消息。😔 你可以在GitHub上编辑这个页面,或者创建一个GitHub问题。