When building a RAG system, many face a dilemma: dense search finds semantic matches well but fails on exact matches—SKUs, order numbers, dates. Sparse search (BM25) does the opposite. Clients want a production-ready solution without compromises. Over 5 years, we've delivered 30+ RAG projects and know how to combine both approaches. We offer RAG development with Qdrant—a vector database written in Rust with native hybrid search support and rich filtering. Qdrant is 1.5 times faster than competitors at equal accuracy, as confirmed by independent benchmarks (official Qdrant documentation).
What business tasks does RAG on Qdrant solve?
RAG on Qdrant suits scenarios requiring fast, accurate answers from your own knowledge base—corporate document search, support assistant, or analytical data extraction from reports. Qdrant enables semantic search with metadata filtering (date, category, author), critical for enterprise development.
What problems do we solve?
Low accuracy on rare terms. Dense embeddings (1536-dimensional vectors) don't always capture exact matches: ORDER-12345 and ORDER-12346 may be semantically close but are different entities. Sparse representation (SPLADE) captures specific tokens. Hybrid with RRF delivered +13% MRR@5 in our cases.
Slow filtering across hundreds of thousands of documents. Without payload field indexing, searches with conditions on doc_type, date, or department can slow down to 500 ms per query. Qdrant allows creating payload indexes (KEYWORD, DATETIME, INTEGER), reducing latency to 20 ms.
Scaling to millions of vectors. A single-node Qdrant configuration handles up to 10M vectors on 64 GB RAM. As data grows, sharding and replication are added without downtime.
How we do it
Stack: Qdrant (self-hosted or Cloud), sentence-transformers/paraphrase-multilingual-mpnet-base-v2 for dense, prithivida/Splade_PP_en_v1 for sparse, GPT-4o-mini for answer generation. Deployment via Docker Compose or Kubernetes.
Here's a typical collection configuration:
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, SparseVectorParams, SparseIndexParams, HnswConfigDiff
client = QdrantClient(url="http://localhost:6333")
client.create_collection(
collection_name="documents",
vectors_config={
"dense": VectorParams(size=1536, distance=Distance.COSINE, hnsw_config=HnswConfigDiff(m=16, ef_construct=200))
},
sparse_vectors_config={
"sparse": SparseVectorParams(index=SparseIndexParams(on_disk=False))
}
)
From our practice. A client had a multilingual e-commerce assistant (Russian/English) with 85,000 chunks: FAQs, return policies, product descriptions. We deployed Qdrant on a single server (16 vCPU, 64 GB RAM). Dense-only gave MRR@5 = 0.71, hybrid with RRF gave 0.84, improving SKU accuracy by 30%. Faithfulness of answers rose from 0.82 to 0.91. The full pipeline was built in 2.5 weeks.
How hybrid search increases accuracy
Hybrid search combines two strategies: semantic search (dense) and keyword matching (sparse). Qdrant performs prefetch for each type, then applies RRF (Reciprocal Rank Fusion)—the final rank is the sum of inverse ranks. This yields stable gains in scenarios where both meaning and exact entities matter.
Comparison with dense-only:
| Metric |
Dense only |
Hybrid (RRF) |
Improvement |
| MRR@5 |
0.71 |
0.84 |
+18% |
| NDCG@5 |
0.68 |
0.81 |
+19% |
| Faithfulness |
0.82 |
0.91 |
+11% |
Our tests show hybrid search gives 10% to 18% metric improvement. For Qdrant, this comes for free—no need for a separate Elasticsearch.
Configuration comparison for different data volumes
| Data volume |
Recommended Qdrant config |
Expected latency p99 |
| Up to 10M vectors |
1 node, 64 GB RAM, 8 vCPU |
< 30 ms |
| 10–100M vectors |
3 nodes, 128 GB RAM, 16 vCPU |
< 50 ms |
| > 100M vectors |
6+ nodes, 256 GB RAM, 32 vCPU |
< 100 ms |
Process of work
-
Analytics. We evaluate your data: volume, types, update frequency. Determine whether sparse vectors and payload indexes are needed.
-
Design. Collection schema, choice of embedders, indexing pipeline.
-
Implementation. Build ingestion pipeline (Python or Rust), hybrid search endpoint, integrate with LLM.
-
Testing. Evaluate MRR, NDCG, faithfulness, latency p99. A/B test on real queries.
-
Deployment. Docker/K8s, monitoring (Prometheus + Grafana), alerting on metric drift.
What's included
- Documentation: architecture description, guide for updating embedders, operations manual.
- Access: Git repository with code, infrastructure credentials.
- Training: 2 workshops for your team (Qdrant administration, pipeline fine-tuning).
- Support: 2 weeks post-launch—bug fixes, Q&A.
Estimated timelines
- Qdrant setup + collection schema: 1–2 days.
- Ingestion pipeline (dense + sparse): 3–7 days.
- Hybrid search + filtering: 3–5 days.
- Evaluation and optimization: 1–2 weeks.
- Total: 2 to 4 weeks.
Cost is calculated individually—depends on data volume, filtering complexity, and required LLM customization. We evaluate your project in one day. Request a consultation on a RAG solution—discuss details and choose the optimal approach for your tasks.
Contact us to discuss details and get a preliminary estimate.
LLM Development: Fine-Tuning, RAG, Agents, and Production Deployment
Using GPT‑4 or Claude 3.5 Sonnet through a public API is not a solution — it's just a tool. When the requirement is to "make it like ChatGPT, but on our data," there is a real engineering challenge behind it: from prompt engineering to training a 70B model on your own infrastructure. End-to-end LLM solution development is a complex stack, and we have been doing it for over 5 years. During this time, we have completed over 20 projects in generative AI: from RAG systems for legal departments to custom support agents. Where exactly your task falls depends on data, latency requirements, budget, and how critical confidentiality is.
A typical situation: the client has already tried ChatGPT, but results are unstable — sometimes accurate, sometimes hallucinating. Or they need integration into a corporate portal while complying with security policies. Let's break down each layer of the stack in detail — from RAG to production deployment.
Why Do RAG Systems Break and How to Fix It?
RAG (Retrieval-Augmented Generation) looks simple: find relevant documents, put them in context, get an answer. In practice, it fails in several places.
Chunking without overlap. Classic mistake: chunk_size=512, overlap=0. If the answer lies across two chunks, retrieval won't find either with sufficient confidence. Solution: overlap 15–25% of chunk_size, or better yet, sentence-aware splitting with spaCy or NLTK instead of naive character splitting.
Poor embedder. text-embedding-ada-002 is good for general use, but on legal or medical texts, specialized models like E5-large-v2, BGE-M3, or fine-tuned sentence-transformers on domain data outperform it. Recall@5 differences can be 15–25%.
No re-ranking. Vector search optimizes for speed, not relevance. A cross-encoder re-ranker (ms-marco-MiniLM-L-6-v2, bge-reranker-large) after initial retrieval improves top-3 accuracy with acceptable latency (+50–150ms). This is often more impactful than improving the embedding model.
Hybrid search. Dense vectors alone work poorly on exact queries: names, SKUs, codes. BM25 (sparse) finds exact matches but misses semantics. Hybrid via RRF (Reciprocal Rank Fusion) is the optimal compromise. Qdrant, Weaviate, and pgvector 0.7+ support hybrid search natively.
Typical production architecture for a corporate knowledge base
- Documents → preprocessing (PyMuPDF, Unstructured)
- Chunking → embedding (BGE-M3)
- Qdrant (hybrid dense+sparse)
- Cross-encoder re-ranking
- Context → LLM (vLLM or OpenAI API)
- Answer with sources (RAGAS for quality evaluation)
When to Fine-Tune Instead of Prompt Engineering?
Prompt engineering solves ~70% of LLM adaptation tasks for a domain. The remaining 30% require fine-tuning. Three indicators: the model ignores a specific output format even with detailed prompting; the task requires deep knowledge of specialized vocabulary (medicine, law); you need to significantly reduce token costs by replacing a large model with a smaller specialized one.
LoRA and QLoRA are the standard for SFT. LoRA adds trainable low-rank matrices to attention layers. A typical configuration for Llama-3 8B: r=64, lora_alpha=128, target_modules=["q_proj","v_proj","k_proj","o_proj"] yields ~0.8% trainable parameters, training on one A100 40GB. QLoRA adds 4-bit quantization (NF4) and allows fine-tuning 70B models on two A100 40GB, though speed drops by half compared to bf16.
DPO instead of RLHF. Direct Preference Optimization requires only (chosen, rejected) pairs, not scalar reward signals. DPOTrainer from the trl library (Hugging Face) implements it in a few dozen lines.
Common mistake. A dataset of 500 examples, 5 epochs, validation loss 0.8 — seems fine. But on test, the model degrades on general instructions. Cause: catastrophic forgetting. Solution: add 10–20% general instruction-following examples (Alpaca, FLAN) to the training set to preserve original capabilities.
How to Choose a Base Model: 8B or 70B?
| Model |
Parameters |
Strengths |
Context |
| Llama-3.1 8B |
8B |
Quality/speed balance |
128k |
| Llama-3.1 70B |
70B |
Complex reasoning |
128k |
| Mistral 7B / Mixtral 8x7B |
7B / 47B |
Efficiency for size |
32k |
| Qwen2.5 72B |
72B |
Code, multilingual |
128k |
| Gemma 2 27B |
27B |
Open license |
8k |
For most tasks, fine-tuning an 8B model is sufficient. 70B is needed when deep reasoning is required or the 8B baseline does not reach the required quality even after fine-tuning. Inference cost for Llama-3 8B via vLLM on A100 is efficient; the exact cost depends on volume.
What Does PagedAttention Bring to Production?
vLLM is the first choice for serving open-source models. PagedAttention is the key technical innovation: KV-cache is managed like virtual memory in an OS, without fragmentation. This yields 2–4x higher throughput compared to naive HuggingFace Transformers inference. The vLLM documentation confirms that continuous batching and PagedAttention are the standard for high-load LLM services.
Typical numbers on A100 80GB for Llama-3 8B (bf16): 400–600 req/s, P50 latency 200–400ms, P99 latency 600–900ms at concurrency 64. For 70B on two A100 with tensor parallelism: 80–120 req/s, P99 latency 1.5–2.5s. AWQ or GPTQ quantization reduces memory consumption by 2x with quality loss within 1–3%.
Multi-Agent Systems
Agents are LLMs with access to tools: search, code execution, API calls, database interaction. Common patterns:
- ReAct (Reason + Act): the model reasons → chooses a tool → observes the result → reasons again. LangChain and LlamaIndex implement it out of the box.
- Multi-agent orchestration: multiple specialized agents with a coordinator on top. Example: coordinator → researcher (search + summarization) → coder (code generation and execution) → critic (verification). Tools: AutoGen (Microsoft), CrewAI, custom implementation on LangGraph.
In production, agent systems are non-deterministic. Essential: guardrails, step limits, logging of each step, human-in-the-loop for critical actions.
How We Work: Stages, Timeline, Deliverables
| Stage |
Duration |
What You Get |
| Audit and data collection |
1–2 weeks |
Eval dataset of 100+ examples, task formalization |
| Baseline (prompt + RAG) |
1–2 weeks |
Working prototype, quality metrics |
| Fine-tuning (if needed) |
2–4 weeks |
Trained model, LoRA weights, model card |
| Deployment and monitoring |
1–2 weeks |
vLLM server, Grafana + Prometheus |
| Documentation and training |
1 week |
API documentation, team training |
What Is Included
We deliver:
- Technical documentation (model card, configs, deployment instructions)
- Access to infrastructure (code repository, trained weights)
- 1 month of post-deployment support (consultations, bug fixes)
- Customer team training (2–3 sessions on system operation)
Timeline: basic RAG prototype — 1–2 weeks. Fine-tuning with customer data — 3–6 weeks (including data preparation). Production system with monitoring and retraining — 2–4 months. Cost is calculated individually based on data volume, model complexity, and infrastructure requirements.
We guarantee the quality of the final model with performance benchmarks and ongoing monitoring. Our engineers have hands‑on experience with dozens of production LLM systems.
Want to evaluate your project? Leave a request — we will prepare a preliminary summary within 1–2 business days. Or get a consultation on choosing the approach: RAG, fine-tuning, or hybrid — we will tell you what works best for you. Contact us to discuss your LLM development needs. Schedule a free consultation today.