┌────────────────────────────────────┐
│ FastAPI Server │
│ (Async, CORS, Auth) │
└──────────────┬─────────────────────┘
│
┌────────────────────────────────────┼────────────────────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐
│ Embeddings │ │ Retrieval │ │ Generation │
├───────────────────┤ ├───────────────────┤ ├───────────────────┤
│ • SentenceTransf. │ │ • FAISS (IVF/HNSW)│ │ • vLLM Backend │
│ • AraBERT v2 │ │ • CrossEncoder │ │ • Streaming API │
│ • Multi-level: │ │ • HybridReranker │ │ • Chat/Completion │
│ - Document │ │ - Semantic │ │ • Context Window │
│ - Paragraph │ │ - BM25 Lexical │ │ Management │
│ - Sentence │ │ - Cross-Encoder │ │ │
│ - Chunk │ │ • Persistence │ │ │
└───────────────────┘ └───────────────────┘ └───────────────────┘
Score = α₁·sim(q,doc) + α₂·sim(q,para) + α₃·sim(q,sent) + α₄·sim(q,chunk)
| Operation | Latency (p95) | Throughput |
|---|---|---|
| Embedding (batch=32) | 45ms | 710 docs/s |
| FAISS Search (top-100) | 2.3ms | 435 QPS |
| Reranking (top-20) | 28ms | 35 QPS |
| E2E Query | 180ms | 5.5 QPS |
Measured on RTX 3090, 500K documents indexed
src/
├── embeddings/
│ ├── models.py # EmbeddingModel, SentenceTransformer, AraBERT
│ └── multi_level.py # MultiLevelEmbedder, chunking strategies
├── retrieval/
│ ├── vector_store.py # FAISSVectorStore (flat, ivf, hnsw)
│ └── reranker.py # CrossEncoder, HybridReranker
├── generation/
│ └── llm_client.py # VLLMClient, streaming support
└── api/
└── main.py # FastAPI app factory, endpoints