Synthesis e una piattaforma RAG (Retrieval Augmented Generation) scritta interamente in Python. Permette di:
- caricare documenti (
pdf,doc,docx,txt,csv) - estrarre e chunkare il contenuto
- storicizzare i chunk in ChromaDB
- interrogare i dati tramite assistant virtuale web
- scegliere runtime LLM tra provider locali (Ollama) e commerciali (OpenAI, Gemini, Anthropic, Kimi)
L'interfaccia e web-based, responsive, usabile da desktop e mobile.
Cosa fa il sistema
Il flusso end-to-end e:
- Upload file dalla UI.
- Parsing del documento (con fallback per PDF scannerizzati).
- Chunking del testo.
- Indicizzazione su ChromaDB.
- Retrieval dei chunk pertinenti alla domanda.
- Generazione risposta con integrazione:
- evidenze documentali
[DOC] - conoscenza modello
[Syntesis]
- evidenze documentali
- Visualizzazione risposta con fonti e formule LaTeX renderizzate in UI.
Come funziona (architettura)
backend/main.py- API REST FastAPI
- gestione upload/list/delete file
- endpoint chat/query
- serving frontend (
/e/static)
backend/services/file_parser.py- estrazione testo multi-formato
- fallback PDF image-only (quando non esiste testo estraibile)
backend/services/chunking.py- split in chunk sovrapposti
backend/services/rag_store.py- persistenza/query su ChromaDB
backend/services/rag_service.py- retrieval + orchestrazione contesto RAG
backend/services/llm_providers.py- gateway provider LLM (
ollama,openai,gemini,anthropic,kimi)
- gateway provider LLM (
frontend/index.html- struttura UI
frontend/static/app.js- logica client (upload, chat, stop risposta, cronologia locale)
frontend/static/styles.css- tema e stile UI responsive
Funzionalita principali
- Upload e indicizzazione singolo file.
- Lista file con icona formato, dimensione, data, chunk count.
- Cancellazione file da UI (metadata + file + chunk ChromaDB).
- Chat con selezione provider/modello/top-k.
- Chat con allegato diretto nel prompt (documenti e immagini, analisi one-shot senza storicizzazione su ChromaDB).
- Cronologia chat persistente lato browser (
localStorage). - Cancellazione singolo messaggio e cancellazione totale chat.
- Pulsante invio stile freccia su, con stop (
square) durante la generazione. - Rendering formule LaTeX in risposta.
Prerequisiti
1) Sistema
- macOS, Linux o Windows
- Python consigliato: 3.13
Nota: con Python 3.14 alcune versioni di ChromaDB possono causare errori runtime.
2) Runtime LLM
- Per uso locale: Ollama in esecuzione (
OLLAMA_BASE_URL, defaulthttp://localhost:11434) - Per provider commerciali: API key opzionali in
.envOPENAI_API_KEYANTHROPIC_API_KEYGEMINI_API_KEYKIMI_API_KEY(opzionale, con endpoint OpenAI-compatible)
Nota OpenAI: per "GPT 5.3" in API usa gpt-5.3-codex (Responses API).
3) Dipendenze opzionali
- Supporto
.doclegacy:antiwordinstallato a sistema- oppure
textract(requirements-doc.txt)
Installazione
Opzione A (consigliata): uv + Python 3.13
uv python install 3.13 uv venv --python 3.13 .venv313 uv pip install --python .venv313/bin/python -r requirements.txt
Per supporto .doc via textract:
uv pip install --python .venv313/bin/python -r requirements-doc.txt
Opzione B: venv classico
python3.13 -m venv .venv .venv/bin/python -m pip install -r requirements.txt
Configurazione
- Copia il file env:
- (Opzionale) modifica variabili principali:
DATA_DIR,UPLOAD_DIR,CHROMA_DIR,METADATA_DB_PATHCHUNK_SIZE,CHUNK_OVERLAP,TOP_K_DEFAULTOLLAMA_BASE_URLSYNTHESIS_HOST,SYNTHESIS_PORT(host/porta server web)- API key provider commerciali
Avvio
Avvio backend + web app
Con ambiente uv:
.venv313/bin/python run_backend.py
Con venv classico:
.venv/bin/python run_backend.py
Apri:
Helper opzionale per aprire il browser:
.venv313/bin/python run_ui.py
Uso rapido
- Vai su
Documenti. - Seleziona file e clicca
Carica e indicizza. - Vai su
Assistant. - Scegli provider/modello/top-k.
- Scrivi domanda e premi
Enter(invio diretto). - (Opzionale) Allega un file direttamente dal box chat per una richiesta one-shot.
- Per allegati immagine usa provider
kimi(multimodale).
- Per allegati immagine usa provider
- Durante la generazione puoi cliccare il bottone stop per interrompere.
API principali
GET /api/healthGET /api/providersGET /api/models/{provider}POST /api/files/uploadGET /api/filesDELETE /api/files/{file_id}POST /api/files/{file_id}/delete(fallback compatibilita)POST /api/chat/queryPOST /api/chat/query-with-file(multipart: domanda + allegato prompt)GET /api/debug/retrieval
Note importanti
PDF scannerizzati (image-only)
Se un PDF non contiene testo nativo, il sistema:
- non fallisce ingestione
- indicizza un fallback descrittivo (metadati + avviso OCR richiesto)
Per indicizzare il testo reale di questi PDF serve OCR esterno (es. Tesseract/OCRmyPDF).
Troubleshooting rapido
- Errore ChromaDB con Python 3.14:
- usa Python 3.13 (vedi installazione Opzione A)
HTTP 404su delete file:- aggiorna backend all'ultima versione e riavvia
- UI non aggiornata:
- hard refresh browser (
Cmd+Shift+Rsu macOS)
- hard refresh browser (