# Step 9 — Interrogazione del documento Due modalità di interrogazione, entrambe con loop interattivo: | Script | Modalità | Quando usarlo | |---|---|---| | `rag.py` | Retrieval + generazione LLM | Risposta in linguaggio naturale | | `retrieve.py` | Solo retrieval (no LLM) | Debug, verifica chunk, ricerca semantica | --- ## Prerequisiti - Step 8 completato (`chroma_db/` popolata) - Ollama attivo con il modello di embedding scaricato - Per `rag.py`: anche il modello LLM scaricato --- ## rag.py — Risposta in linguaggio naturale ```bash source .venv/bin/activate python step-9/rag.py --stem ``` Per ogni domanda: vettorizza la query, recupera i chunk più rilevanti da ChromaDB e genera la risposta tramite Ollama. ``` ── Loop RAG ─────────────────────────────────────── (exit per uscire) Domanda: ``` | Sintassi | Comportamento | |---|---| | `` | Risposta basata sul documento | | ` -v` | Risposta + chunk recuperati con score di similarità | | `exit` | Esce dal programma | Flusso interno: ``` domanda │ ▼ embed (EMBED_MODEL, Ollama) vettore N-dim │ ▼ query ChromaDB — similarità coseno, top-K chunk rilevanti │ ▼ build_prompt (SYSTEM_PROMPT + contesti + domanda) │ ▼ generate (OLLAMA_MODEL, Ollama) risposta ``` Il LLM risponde esclusivamente dal contesto fornito. Se il contesto è irrilevante rispetto alla domanda, lo dichiara esplicitamente. --- ## retrieve.py — Retrieval puro (senza LLM) ```bash source .venv/bin/activate python step-9/retrieve.py --stem ``` Vettorizza la query e restituisce i chunk più simili con score di similarità — senza chiamare Ollama per la generation. Utile per verificare la qualità del retrieval e diagnosticare risposte sbagliate. ``` ── Loop retrieval ──────────────────────── (exit per uscire, -f per testo completo) Query: ``` | Sintassi | Comportamento | |---|---| | `` | Chunk più simili con score di similarità (testo troncato a 200 car.) | | ` -f` | Chunk più simili con testo completo | | `exit` | Esce dal programma | Accetta `--top-k N` per sovrascrivere il valore di `config.py` per quella sessione. --- ## Configurazione (`config.py`) | Parametro | Default | Descrizione | |---|---|---| | `TOP_K` | `6` | Chunk recuperati per ogni domanda. Valori consigliati: `3`–`10` | | `TEMPERATURE` | `0.0` | Deterministico a `0.0`, creativo verso `1.0`. Per RAG consigliato `0.0` | | `NO_THINK` | `True` | Disabilita il chain-of-thought interno dei modelli Qwen3/Qwen3.5. `True` = risposta diretta, più veloce | | `EMBED_MODEL` | `"nomic-embed-text"` | Deve corrispondere al modello usato in step-8. Se cambiato, rieseguire step-8 con `--force` | | `OLLAMA_URL` | `"http://localhost:11434"` | Modifica solo se Ollama gira su porta o host diversi | | `OLLAMA_MODEL` | `"qwen3.5:0.8b"` | Modello LLM. Vedi `step-7/README.md` per la scelta | | `SYSTEM_PROMPT` | *(vedi file)* | Istruzioni di comportamento inviate al LLM. Modifica per cambiare tono, lingua o condizione di fallback | --- ## Test senza RAG Per verificare che Ollama risponda correttamente prima di interrogare il documento: ```bash python step-9/test_ollama.py ``` Chat diretta con il modello, senza ChromaDB. Usa gli stessi parametri di `config.py`.