← Back to Blog

Scaling RAG Architecture with Milvus Vector Databases in Production

How I built a reliable WhatsApp AI shopping assistant for Clickmothercare that survives hallucinated products, silent save failures, and multi-agent handoff bugs.

Anas Rhimi
Anas Rhimi August 2026 • 8 min read

Beyond the Prototype: Vector Database Bottlenecks

Building a Retrieval-Augmented Generation (RAG) system with a few thousand documents using in-memory stores like FAISS is trivial. However, when transitioning to production—handling tens of millions of dense embeddings, concurrent read/write queries, and requiring high availability—these naive solutions collapse. Scaling RAG requires a distributed vector database like Milvus. The primary technical challenge lies in optimizing the index type and search parameters to balance recall accuracy against sub-millisecond query latency.

Configuring High-Performance HNSW Indexes in Milvus

To achieve scalable vector similarity search, we must define a robust schema and utilize the Hierarchical Navigable Small World (HNSW) graph algorithm. Below is the Python implementation using the pymilvus SDK to define the collection, optimize the HNSW index for high throughput, and execute a partitioned search.

from pymilvus import Collection, FieldSchema, CollectionSchema, DataType, connections

# Line 1: Establish gRPC connection to the Milvus cluster
connections.connect("default", host="milvus-cluster.default.svc.cluster.local", port="19530")

# Line 2: Define strict schemas for hybrid scalar/vector filtering
fields = [
    FieldSchema(name="doc_id", dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name="department", dtype=DataType.VARCHAR, max_length=100),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536) # e.g., OpenAI embeddings
]
schema = CollectionSchema(fields, description="Enterprise Knowledge Base", enable_dynamic_field=True)
collection = Collection("enterprise_rag", schema)

# Line 3: Build the HNSW Index optimized for recall and memory efficiency
index_params = {
    "metric_type": "COSINE",
    "index_type": "HNSW",
    "params": {"M": 16, "efConstruction": 200}
}
collection.create_index(field_name="embedding", index_params=index_params)
collection.load() # Load collection to memory for querying

# Line 4: Execute a hybrid search query with EF parameter tuning at runtime
search_params = {"metric_type": "COSINE", "params": {"ef": 64}}
results = collection.search(
    data=[query_vector],
    anns_field="embedding",
    param=search_params,
    limit=5,
    expr="department == 'engineering'", # Scalar pre-filtering
    output_fields=["doc_id", "department"]
)

Architectural Tuning Breakdown

  • Line 1 & 2: We connect to a distributed cluster and define a strict schema. We include a scalar field (department). In production RAG, pure vector search often returns irrelevant semantic matches; defining scalar metadata allows for hybrid search (filtering vectors based on hard categorical constraints).
  • Line 3: We utilize the HNSW index over standard IVF (Inverted File). M=16 defines the maximum number of bi-directional links per node. A higher M improves recall but exponentially increases memory overhead. efConstruction=200 dictates the depth of the search during index building—this slows down ingestion but guarantees a highly optimized graph structure for blazing-fast reads.
  • Line 4: During query execution, we pass expr="department == 'engineering'". Milvus performs pre-filtering via Bitsets before graph traversal, ensuring the vector search only evaluates engineering documents. The ef=64 parameter dynamically controls the search depth; tuning this balances the trade-off between absolute recall (finding the best context for the LLM) and query latency.

By masterfully tuning HNSW parameters and leveraging scalar pre-filtering, enterprise RAG architectures can maintain strict Service Level Agreements (SLAs) even as knowledge bases scale to billions of tokens.

Is your AI agent's infrastructure secure and reliable?

Book a Free 15-Min Technical Audit
Hire Me