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