- 1. The Production RAG Pipeline Architecture
- 2. Chunking Strategies: Fixed-Size vs. Semantic Boundary Chunking
- 3. Hybrid Search Implementation: Combining Dense Vectors with BM25
- Python Implementation: Hybrid Search with Reciprocal Rank Fusion
- 4. Multi-Tenant Access Control & Metadata Filtering
- 5. Engaging Cyberfact Security for Enterprise AI Engineering
Retrieval-Augmented Generation (RAG) has emerged as the dominant architecture for grounding LLMs on proprietary enterprise data without the immense expense and latency of fine-tuning foundational models. However, building a toy RAG prototype in a Jupyter notebook is fundamentally different from operating a production RAG pipeline serving thousands of concurrent enterprise employees.
Naive RAG pipelines suffer from retrieval hallucination, vector embedding blind spots, high latency, and catastrophic cross-department data leakage (e.g., an intern asking the corporate chatbot about confidential executive compensation data).
In this architectural guide, Cyberfact Security breaks down the exact production design required to build scalable, sub-second, and access-controlled enterprise RAG systems.
1. The Production RAG Pipeline Architecture
[ Document Ingestion Pipeline ]
Raw PDFs, Confluence, Slack, SQL DBs
β
βΌ
[ Semantic Chunking & Metadata Tagging (TenantId, ACL, Dept) ]
β
βΌ
[ Dual Vector Embeddings (Dense: text-embedding-3 + Sparse: BM25) ]
β
βΌ
[ Production Vector DB (Qdrant / Milvus / Pinecone) ]
=======================================================
[ Query Execution Pipeline ]
User Query: "What was Q3 revenue in Maharashtra?"
β
βΌ
[ Hybrid Search: Vector Distance + Keyword Match (Dense + Sparse) ]
β
βΌ (Metadata ACL Filter: Enforce department_id == user.dept)
[ Cross-Encoder Re-Ranker (Cohere / BGE-Reranker) ]
β
βΌ (Select Top-5 Most Relevant Chunks)
[ Grounded LLM Context Construction ] ββ> [ Sub-Second Accurate Response ]
2. Chunking Strategies: Fixed-Size vs. Semantic Boundary Chunking
Naive chunking (e.g., cutting text every 500 tokens) breaks sentences in half, destroys tabular financial statements, and loses semantic context. Production pipelines require Recursive Structure-Aware Semantic Chunking:
| Chunking Strategy | Pros | Cons | Best Use Case |
|---|---|---|---|
| Fixed-Size (512 tokens) | Simple, fast, deterministic | Breaks context, splits tables | Quick prototypes |
| Semantic / Sentence-Window | Preserves sentence semantics | Slower ingestion | General text documents |
| Markdown / Header-Aware | Maintains table and section hierarchy | Requires pre-processed Markdown | Technical documentation, API specs |
| Parent-Child Chunking | Retrieves small chunks for search, sends full section to LLM | Higher storage overhead | Complex legal & regulatory compliance |
3. Hybrid Search Implementation: Combining Dense Vectors with BM25
Dense vector embeddings (such as OpenAI text-embedding-3-small or BGE-M3) excel at understanding broad conceptual similarities (e.g., matching βautomobileβ to βcarβ). However, they frequently fail on exact keyword queries, such as specific invoice numbers (INV-2026-90412), error codes (ERR_CONN_REFUSED), or employee IDs.
Production RAG systems combine Dense Semantic Search with Sparse BM25 Keyword Search using Reciprocal Rank Fusion (RRF):
Python Implementation: Hybrid Search with Reciprocal Rank Fusion
import numpy as np
def reciprocal_rank_fusion(dense_results, sparse_results, k=60):
rrf_scores = {}
# Score dense vector results
for rank, doc_id in enumerate(dense_results):
if doc_id not in rrf_scores:
rrf_scores[doc_id] = 0.0
rrf_scores[doc_id] += 1.0 / (k + (rank + 1))
# Score sparse BM25 results
for rank, doc_id in enumerate(sparse_results):
if doc_id not in rrf_scores:
rrf_scores[doc_id] = 0.0
rrf_scores[doc_id] += 1.0 / (k + (rank + 1))
# Sort documents by accumulated RRF score
sorted_docs = sorted(rrf_scores.items(), key=lambda item: item[1], reverse=True)
return sorted_docs
4. Multi-Tenant Access Control & Metadata Filtering
The most critical security vulnerability in enterprise RAG is the Cross-Tenant Context Leak. If an employee queries the AI assistant, the vector search must never return chunks from documents the employee lacks permission to view.
Never filter permissions in application code after retrieving the top 10 vectors. If the top 10 vectors all belong to restricted executive documents, filtering them out leaves zero context for the user query!
Enforce Metadata Filtering Directly at the Vector Index Layer:
search_results = vector_client.search(
collection_name="enterprise_knowledge",
query_vector=query_embedding,
query_filter={
"must": [
{"key": "tenant_id", "match": {"value": user.tenant_id}},
{"key": "authorized_roles", "match": {"any": user.roles}}
]
},
limit=5
)
5. Engaging Cyberfact Security for Enterprise AI Engineering
Cyberfact Security designs, benchmarks, and audits enterprise RAG pipelines for legal firms, financial institutions, and SaaS companies across India.
Connect with Founder Saket Choudhary on WhatsApp (+91 82520 02914) to build a hardened RAG pipeline for your proprietary enterprise data.
Founder and Lead Security Architect at Cyberfact Security. Specializing in offensive penetration testing (VAPT), distributed cloud architectures, and hardened full-stack engineering for high-growth enterprises.
Initiate a Technical Audit or Custom Engineering Scope
Cyberfact Security delivers certified VAPT audits, source code reviews, and enterprise software engineering for institutions across India. Direct technical engagements with Founder Saket Choudhary.




