Hybrid BM25 + vector search with reciprocal-rank fusion, built for product catalogues. GDPR Art. 17/20/22 endpoints, a SHA-256-chained audit log with immutable S3 archive, and a consent-driven neutral mode. Local-first by design — deploys on your cloud, your cluster, or ours. The current prototype runs on AWS EKS (us-east-1).






BM25 sparse retrieval fused with Qdrant HNSW dense retrieval via reciprocal-rank fusion (k=60), with SymSpell typo tolerance before the sparse scan.
Per-result score breakdown — dense rank, sparse rank, fused RRF score — returned by /v1/explain for every search trace.
Without consent, search runs dense-only: no query rewrite, no BM25 signals, no personalisation state stored.
Every search event is SHA-256-chained to the previous entry and mirrored to S3 with 365-day object-lock retention.
Local ONNX embedding model, SHA-256 integrity-checked at startup.
Qdrant HNSW dense retrieval alongside per-tenant BM25 sparse indexes.
Reciprocal-rank fusion of both result lists, then boost/bury/pin merchandising rules applied per tenant.
Via an internal LiteLLM gateway to hosted models; PII is scrubbed before any LLM call.
PII patterns (email, phone, IBAN, IP, names) removed from the query; SymSpell typo correction applied.
LLM rewrite through the internal LiteLLM gateway, capped at 400 ms with passthrough fallback.
BM25 sparse scan and Qdrant HNSW dense lookup run against the tenant's catalogue.
RRF fusion, merchandising rules, and a stored explain trace for GDPR Art. 22.