Qdrant Vector Database
Use Qdrant as a vector database for your Knowledge Base.
Setup
uv pip install -U qdrant-client typer rich pypdf openai agnoFollow the instructions in the Qdrant Setup Guide to install Qdrant locally. Get API keys from the Qdrant API Keys guide.
The example uses OpenAI for embeddings and the agent model, so set your API key along with your Qdrant connection details:
export QDRANT_URL=http://localhost:6333
export QDRANT_API_KEY=xxx # only required for Qdrant Cloud
export OPENAI_API_KEY=xxxExample
import os
import typer
from rich.prompt import Prompt
from agno.agent import Agent
from agno.knowledge.knowledge import Knowledge
from agno.vectordb.qdrant import Qdrant
api_key = os.getenv("QDRANT_API_KEY")
qdrant_url = os.getenv("QDRANT_URL")
collection_name = "thai-recipe-index"
vector_db = Qdrant(
collection=collection_name,
url=qdrant_url,
api_key=api_key,
)
knowledge_base = Knowledge(
vector_db=vector_db,
)
def qdrant_agent(user: str = "user"):
agent = Agent(
knowledge=knowledge_base,
debug_mode=True,
)
while True:
message = Prompt.ask(f"[bold] :sunglasses: {user} [/bold]")
if message in ("exit", "bye"):
break
agent.print_response(message)
if __name__ == "__main__":
knowledge_base.insert(
url="https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf"
)
typer.run(qdrant_agent)Async Support ⚡
Qdrant also supports asynchronous operations with ainsert() and aprint_response().
import asyncio
from agno.agent import Agent
from agno.knowledge.knowledge import Knowledge
from agno.vectordb.qdrant import Qdrant
COLLECTION_NAME = "thai-recipes"
# Initialize Qdrant with local instance
vector_db = Qdrant(
collection=COLLECTION_NAME,
url="http://localhost:6333"
)
# Create knowledge base
knowledge_base = Knowledge(
vector_db=vector_db,
)
agent = Agent(knowledge=knowledge_base)
if __name__ == "__main__":
# Load knowledge base asynchronously
asyncio.run(knowledge_base.ainsert(
url="https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf"
)
)
# Create and use the agent asynchronously
asyncio.run(agent.aprint_response("How to make Tom Kha Gai", markdown=True))Using ainsert() and aprint_response() with asyncio provides non-blocking operations, making your application more responsive under load.
Qdrant Params
| Name | Type | Default | Description |
|---|---|---|---|
collection | str | - | Name of the Qdrant collection |
embedder | Embedder | OpenAIEmbedder() | Embedder for embedding the document contents |
distance | Distance | Distance.cosine | Distance metric for similarity search |
location | Optional[str] | None | Location of the Qdrant database |
url | Optional[str] | None | URL of the Qdrant server |
port | Optional[int] | 6333 | Port number for the Qdrant server |
grpc_port | int | 6334 | gRPC port number for the Qdrant server |
prefer_grpc | bool | False | Whether to prefer gRPC over HTTP |
https | Optional[bool] | None | Whether to use HTTPS |
api_key | Optional[str] | None | API key for authentication |
prefix | Optional[str] | None | Prefix for the Qdrant API |
timeout | Optional[float] | None | Timeout for Qdrant operations |
host | Optional[str] | None | Host address for the Qdrant server |
path | Optional[str] | None | Path to the Qdrant database |
fastembed_kwargs | Optional[dict] | None | Additional kwargs passed to SparseTextEmbedding. |
search_type | SearchType | SearchType.vector | Select vector or hybrid search. |
dense_vector_name | str | "dense" | Name of the dense vector in the collection. |
sparse_vector_name | str | "sparse" | Name of the sparse vector in the collection. |
hybrid_fusion_strategy | models.Fusion | models.Fusion.RRF | Fusion strategy for hybrid results. |
reranker | Optional[Reranker] | None | Rerank retrieved documents. |
name | Optional[str] | None | Name of the vector database. |
description | Optional[str] | None | Description of the vector database. |
id | Optional[str] | None | Optional vector database ID. |
**kwargs | Any | — | Additional Qdrant client arguments. |