使用Qdrant的异步API构建高效的Python应用程序
异步编程正在Python生态系统中被广泛采用。像FastAPI这样的工具已经接受了这种新范式,但它也正在成为作为SaaS提供的ML模型的标准。例如,Cohere SDK除了其同步客户端外,还提供了一个异步客户端。
数据库通常作为独立服务启动,并通过网络访问。与数据库的所有交互都是IO绑定的,可以异步执行,以避免浪费时间主动等待服务器响应。在Python中,这是通过使用async/await语法实现的。这使得解释器在等待服务器响应时可以切换到另一个任务。
何时使用异步API
如果您编写的应用程序永远不会同时支持多个用户(例如,它是一个每天运行一次的脚本),则无需使用异步API。但是,如果您正在编写一个多个用户将同时使用的Web服务,您不应该阻塞Web服务器的线程,因为它限制了可以处理的并发请求数量。在这种情况下,您应该使用异步API。
现代网络框架如FastAPI和Quart支持开箱即用的异步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 的向量数据库。他们的文档 描述了如何使用它。
