Advanced RAG pipeline untuk analisis dokumen kompleks.
graph TB
subgraph Input
A[PDF / TXT / DOCX]
end
subgraph "Document Pipeline"
B[Parser]
C[Structure Detector]
D[Metadata Extractor]
E[Semantic Chunker]
F[Embeddings<br/>nemotron-3-embed-1b]
G[Chroma Vector Store]
end
subgraph "Query Pipeline"
H[User Query]
I[Query Rewriter]
J{Hybrid Retrieval}
K[Semantic Search<br/>Vector / Chroma]
L[Keyword Search<br/>BM25]
M[Reciprocal Rank<br/>Fusion]
N[Cross-Encoder<br/>Reranker]
O[Context Selection]
P[LLM<br/>NVIDIA NIM]
end
A --> B --> C --> D --> E --> F --> G
H --> I --> J
J --> K
J --> L
K --> M
L --> M
M --> N --> O --> P
style A fill:#1a1a2e,color:#fff,stroke:#e94560
style P fill:#76b900,color:#000,stroke:#fff
style J fill:#16213e,color:#fff,stroke:#e94560
style G fill:#0f3460,color:#fff,stroke:#533483
flowchart LR
subgraph "Stage 1: Ingest"
A1[Load] --> A2[Parse]
A2 --> A3[Structure]
A3 --> A4[Metadata]
A4 --> A5[Chunk]
A5 --> A6[Embed]
end
subgraph "Stage 2: Retrieve"
B1[Rewrite] --> B2{Hybrid}
B2 --> B3[Vector]
B2 --> B4[BM25]
B3 --> B5[Fusion]
B4 --> B5
B5 --> B6[Rerank]
end
subgraph "Stage 3: Generate"
C1[Context] --> C2[Prompt]
C2 --> C3[LLM]
C3 --> C4[Answer]
end
A6 -.-> B1
B6 -.-> C1
style A6 fill:#533483,color:#fff
style B6 fill:#e94560,color:#fff
style C3 fill:#76b900,color:#000
graph LR
A[Streamlit] --> B[LangChain Classic]
B --> C[NVIDIA NIM API]
B --> D[ChromaDB]
B --> E[rank_bm25]
B --> F[sentence-transformers]
C --> G[Nemotron 3 Ultra 550B]
C --> H[nemotron-3-embed-1b]
style A fill:#FF4B4B,color:#fff
style C fill:#76b900,color:#000
style G fill:#0f3460,color:#fff
style H fill:#0f3460,color:#fff
| Fitur | Deskripsi |
|---|---|
| Hybrid Retrieval | Semantic (vector) + Keyword (BM25) dengan Reciprocal Rank Fusion |
| Cross-Encoder Reranking | Precisi ranking pakai ms-marco-MiniLM |
| Query Rewriting | Pronoun resolution + query expansion otomatis |
| Document Parsing | Structure-aware: detect headings, tables, sections |
| Semantic Chunking | Respect sentence/paragraph boundaries |
| Multi-Format | PDF, TXT, DOCX |
| 7 Model NIM | Nemotron 3 Ultra, Lightning 3.5, Muse Glimmer, dll |
| Export | Chat, ringkasan, dan insights ke Markdown |
Target: 4–15 PDF × 20 hal → target 2–3 menit, maksimal 5 menit, RPM NIM 40.
| Area | Sebelum | Sesudah |
|---|---|---|
| Chunking | Fixed 1000/200 RecursiveCharacterTextSplitter |
Structure-aware: table → section → para → heading (chunker.py:28), merge <250 chr, is_table/section_title metadata |
| Summary | Serial 9 batch BATCH_SIZE=15, create_stuff_documents_chain bug Prompt must accept context |
Hierarchical map-reduce: chunk (fast, 5/batch, max_tokens 300) → doc → cross-doc synthesis (hierarchical_summarizer.py:30), BATCH_SIZE=40 adaptif, llm.invoke langsung, ETA elapsed/done*remaining |
| Model Routing | 1 model untuk semua | Fast lightning-30b (default, bisa ganti diffusiongemma-26b-a4b-it di Ringkasan) untuk chunk/doc; Reasoning inkling/ultra-550b hanya di sintesis akhir |
| Pipeline | parse → chunk → embed serial |
Parallel: ThreadPool 4 parse, `embed |
| RAG | invoke blocking |
Streaming ChatOpenAI(streaming=True) + pipeline.query_stream + st.write_stream (rag.py:11, chat.py:173) |
| Chat | Single messages=[], + New Chat hapus histori |
Multi-chat conversations={id:[]} + active_conversation_id, PERCAKAPAN jadi tombol klik (sidebar.py:20, chat.py:94) |
| Charts | 2 chart | 7 chart: bar kata/halaman/karakter, area proporsi, bar/line chunk, scatter korelasi, bar chunk/doc, histogram (stats.py, insights.py:9) |
| UI Collapsed | border-right tiang muncul saat hover, + tidak center, menu tidak klik |
HAPUS di source app.py:44 border hanya expanded, + centered absolute inset:0 flex, label pointer-events:auto |
| Cache | vectorstore saja | doc_hash + chunk_hash untuk summary/embed (summary.py: cache, hierarchical_summarizer.py:11) |
| Benchmark | — | benchmark/fast_model_benchmark.py & stress_15docs_bench.py — Lightning vs DiffusionGemma, concurrency 2,4,8 |
Cara pakai model cepat: Buka Ringkasan → Model ringkas (cepat) → pilih Lightning 30B (Default) atau DiffusionGemma 26B (Eksperimen) → Generate Ringkasan → progress ETA 2m 30s.
| Model | Type | ID |
|---|---|---|
| Nemotron 3 Ultra 550B | Terkuat | nvidia/nemotron-3-ultra-550b-a55b |
| Nemotron 3.5 Lightning 30B | Seimbang | nvidia/nemotron-3.5-lightning-30b-a3b |
| Google DiffusionGemma 26B A4B IT | Eksperimen Cepat | google/diffusiongemma-26b-a4b-it |
| Meta Muse Glimmer 30B | Kreatif | meta/muse-glimmer-30b |
| StepFun Step 3.7 Flash | Cepat | stepfun-ai/step-3.7-flash |
| Poolside Laguna XS 2.1 | Ringan | poolside/laguna-xs-2.1 |
| Thinking Machines Inkling | — | thinkingmachines/inkling |
| Embedding: Nemotron 3 Embed 1B | RAG | nvidia/nemotron-3-embed-1b |
| Fast Summary Default | Cepat | nvidia/nemotron-3.5-lightning-30b-a3b (bisa ganti DiffusionGemma) |
mavent-multirag/
├── app.py # Entry point (Streamlit)
├── src/smart_doc/
│ ├── config.py # Konfigurasi + FAST_SUMMARY_MODELS
│ ├── core/
│ │ ├── document.py # Document loading
│ │ ├── document_parser.py # Enhanced parsing + metadata
│ │ ├── chunker.py # Structure-aware chunking (heading/table/section)
│ │ ├── embeddings.py # NVIDIA NIM embeddings + async hash cache
│ │ ├── hierarchical_summarizer.py # Chunk→Doc→Cross-doc (fast vs reasoning)
│ │ ├── rag.py # RAG chain + LLM (streaming)
│ │ ├── retriever.py # Hybrid: vector + BM25
│ │ ├── reranker.py # Cross-encoder reranking
│ │ ├── query_rewriter.py # Query expansion
│ │ ├── pipeline.py # Full pipeline orchestrator (parallel parse)
│ │ └── prompts.py # System prompts
│ ├── ui/
│ │ ├── sidebar.py # Sidebar + multi-chat
│ │ ├── chat.py # Chat tab (streaming)
│ │ ├── summary.py # Summary tab (hierarchical, ETA)
│ │ ├── insights.py # Key insights tab (7 charts)
│ │ └── stats.py # Document stats (5+ charts)
│ └── utils/
│ ├── file.py # File helpers
│ └── export.py # Export to Markdown
├── benchmark/ # Benchmark fast models (Lightning vs DiffusionGemma)
│ ├── fast_model_benchmark.py
│ └── stress_15docs_bench.py
├── tests/ # 20 unit tests + manual
│ ├── test_real_hier_manual.py
│ └── test_real_rag_manual.py
├── plan.md # Rencana hierarki P95 <5m
├── .streamlit/config.toml
├── Dockerfile
├── pyproject.toml
└── requirements.txt
git clone https://github.com/Maventlabs/mavent-multirag.git
cd mavent-multirag
python -m venv venv
source venv/bin/activate
pip install -r requirements.txtstreamlit run app.pyBuka http://localhost:8501 lalu:
- Masukkan NVIDIA NIM API Key (gratis di build.nvidia.com)
- Upload dokumen (PDF/TXT/DOCX)
- Pilih model → mulai tanya
- Buka share.streamlit.io
- Login GitHub → New app → Pilih repo → Deploy
docker build -t smart-doc-insights .
docker run -p 8501:8501 smart-doc-insightspython -m unittest discover tests -v- API key tidak disimpan permanen
- Dokumen diproses di memori (in-memory)
- Semua model NIM gratis tanpa kartu kredit
- Rate limit: 40 requests/menit
Dibangun dengan NVIDIA NIM + LangChain + Streamlit