Multi-tenant RAG-powered enterprise AI platform: hybrid vector search, knowledge base management, LLM gateway routing, and tool-augmented agents in 12 integrated modules.
“Platform ini dirancang dengan isolasi tenant penuh - setiap query Qdrant wajib difilter tenant_id, enkripsi field-level untuk API keys, circuit breaker pada provider eksternal, dan multi-level rate limiting. Repositori bersifat private.”
Architected and built a production-grade multi-tenant RAG chatbot platform from scratch - enabling organizations to deploy AI-powered knowledge assistants with full data isolation, hybrid vector search, tool-augmented agents, and multi-provider LLM gateway routing.
Operating under strict government air-gapped guidelines meant zero access to public cloud services (AWS/GCP/Azure), no third-party SaaS APIs, and strict validation against local SPBE cybersecurity standards.
Organisasi membutuhkan chatbot AI yang bisa mengakses knowledge base internal mereka, tetapi solusi SaaS publik (OpenAI, LangChain cloud) tidak menjamin isolasi data, kedaulatan dokumen, dan kontrol akses granular per departemen.
Dense embedding (semantic similarity) dikombinasikan dengan sparse BM25 (keyword matching) untuk meningkatkan akurasi retrieval - terutama pada query teknis dengan istilah spesifik yang luput dari semantic search murni.
Abstraksi provider (Azure, Ollama, OpenAI-compatible) dengan model per tenant + circuit breaker via pybreaker. Tenant bisa memilih provider & model sendiri. Fail fast saat provider bermasalah, bukan timeout berantai.
Query yang semantically similar (cosine similarity > threshold) dijawab dari cache tanpa panggil LLM ulang. Kombinasi semantic cache + exact-match cache dengan TTL dan versioning. Signifikan mengurangi biaya token LLM.
LLM bisa memanggil tools via function calling: Text2SQL (natural language → SQL query ke live database PostgreSQL/MySQL/MSSQL) dan WebSearch (enrichment via SearXNG). Framework BaseTool + ToolRegistry yang extensible per tenant.
+-----------------------------------------------------------------------------+
| SATUCHAT ENTERPRISE RAG PLATFORM |
| |
| +-------------------+ +--------------------------------------+ |
| | Browser / API | -------> | Nginx (rate limit + API key auth) | |
| | (X-API-Key/JWT) | +--------------------------------------+ |
| +-------------------+ | |
| v |
| +-----------------------------+ |
| | Django 5.2 + Ninja API | |
| | (chat, knowledge, tenants, | |
| | gateways, analytics, users)| |
| +-----------------------------+ |
| | | | |
| +--------v----+ +------v------+ +----v---------+|
| | Celery Queue| | LLM Gateway | | Qdrant ||
| | (Redis) | | Azure/ | | (Hybrid: ||
| | - doc proc | | Ollama/ | | dense+sparse)||
| | - async chat| | OpenAI-comp | | per-tenant ||
| | - web crawl | +-------------+ +--------------+|
| +--------v----+ |
| | |
| +--------v---------+ |
| | PostgreSQL | |
| | (tenants, docs, | |
| | chat, users) | |
| +------------------+ |
+-----------------------------------------------------------------------------+
Platform berhasil mencakup 110+ fitur dalam 12 modul terintegrasi: Chat (RAG + streaming + tools), Knowledge Base (collections, documents, sources), Multi-Tenancy (isolasi penuh), LLM Gateway (multi-provider), Personal Documents, Analytics, dan Admin Dashboard.
Hybrid RAG retrieval (dense+sparse) memberikan akurasi lebih tinggi dibanding pure semantic search, terutama pada dokumen teknis dan istilah domain-spesifik.
Semantic cache memotong pemakaian token LLM secara signifikan dengan menjawab query semantically similar dari cache.
Multi-tenant isolation penuh: setiap query vector DB wajib difilter tenant_id, API key per tenant, model embedding per koleksi.
Tool-augmented agents: Text2SQL memungkinkan user bertanya dalam bahasa natural dan langsung mendapatkan hasil query database.
Diagram alur: user query → embedding → hybrid search Qdrant (dense + sparse) → LLM generate dengan konteks dokumen terisolasi per tenant.
Dashboard admin untuk mengelola tenant, koleksi dokumen, LLM profiles, API keys, quota token, dan monitoring penggunaan sistem.
Potongan service Python untuk hybrid search Qdrant - menggabungkan dense embedding (semantic) dan sparse BM25 (keyword) dengan parameter fusion.
# Sanitized: Hybrid Search Service (Dense + Sparse)
from qdrant_client import QdrantClient
from qdrant_client.models import Filter, FieldCondition, MatchValue
class HybridSearchService:
def __init__(self, client: QdrantClient, embedder):
self.client = client
self.embedder = embedder
def search(
self,
query: str,
collection_name: str,
tenant_id: str,
group_ids: list[str] | None = None,
top_k: int = 10,
similarity_threshold: float | None = 0.7,
) -> list[dict]:
query_vector = self.embedder.encode(query).tolist()
# Mandatory tenant filter
must_filters = [
FieldCondition(key="tenant_id", match=MatchValue(value=tenant_id)),
]
# Group-based access for private documents
if group_ids:
must_filters.append(
Filter(
should=[
FieldCondition(key="access", match=MatchValue(value="public")),
FieldCondition(key="group_id", match=MatchValue(value=g))
for g in group_ids
]
)
)
results = self.client.search(
collection_name=collection_name,
query_vector=query_vector,
query_filter=Filter(must=must_filters),
limit=top_k,
score_threshold=similarity_threshold,
with_payload=True,
)
return [
{
"content": hit.payload["content"],
"score": hit.score,
"metadata": hit.payload.get("metadata", {}),
}
for hit in results
]