
Come funziona un moderno bot RAG
Una buona pipeline RAG è qualcosa di più di “mettere i documenti in un database vettoriale”. Il flusso di base appare così:| Passo | Cosa succede |
|---|---|
| Load | Legge file locali Markdown, testo o reStructuredText |
| Chunk | Suddivide documenti lunghi in sezioni sovrapposte |
| Embed | Usa gli embedding di Venice per trasformare i chunk in vettori |
| Store | Salva vettori e metadati della sorgente in Qdrant |
| Retrieve | Effettua l’embedding della domanda dell’utente ed esegue la vector search |
| Re-rank | Usa un cross-encoder per ri-classificare i migliori candidati |
| Answer | Invia il contesto migliore a un modello di chat Venice con istruzioni di citazione |
Installazione delle dipendenze
Useremo l’SDK Python di OpenAI perché Venice espone un’API compatibile con OpenAI. Useremo anche il client Python di Qdrant con il supporto FastEmbed:requirements.txt con gli stessi pacchetti:
Scelta dei modelli
Crea un file chiamatorag_bot.py, poi inizia aggiungendo gli import, le strutture dati, l’URL dell’API e i nomi dei modelli:
base_url e l’API key.
Puoi elencare i modelli Venice disponibili con:
Creazione dei client Venice e Qdrant
Crea un singolo client Venice compatibile con OpenAI sia per gli embedding sia per le chat completions:| Modalità | Quando usarla |
|---|---|
QdrantClient(":memory:") | Demo e test locali rapidi |
QdrantClient(path="./qdrant_data") | Storage persistente locale |
QdrantClient(url=..., api_key=...) | Un cluster Qdrant remoto o gestito |
Caricamento e chunking dei documenti
Per questo tutorial, lasceremo che il bot ingerisca file o cartelle locali. Inizia con file.md, .rst e .txt:
1000 caratteri con 150 caratteri di overlap è un buon default per documenti misti Markdown e testo. Chunk più piccoli possono migliorare la precisione. Chunk più grandi possono preservare più contesto. L’impostazione giusta dipenderà spesso dai tipi di documenti che stai archiviando.
Embedding dei documenti con Venice
Una volta che abbiamo i chunk, li embeddiamo in batch:Memorizzazione dei vettori in Qdrant
Prima di inserire i point, crea una collection Qdrant con la dimensione del vettore giusta. Il modo più semplice per conoscere la dimensione del vettore è embeddare il primo batch, poi usarelen(embeddings[0]).
source, chunk_index e contenuto. Questo rende l’ingestion ripetuta idempotente per i chunk non modificati.
Recupero dei chunk candidati
Al momento della domanda, il bot embedda la domanda dell’utente e chiede a Qdrant i top match vettoriali:limit qui è il conteggio dei candidati. Dovrebbe di solito essere più alto del numero di chunk che pianifichi di inviare al modello perché il passo successivo li ri-classificherà. Un buon default è recuperare 8 candidati e inviare i 4 migliori al modello di chat.
Re-ranking con FastEmbed
Ora aggiungiamo la parte che fa sembrare il retrieval molto più intelligente.- Recupera un insieme di candidati più ampio con la vector search.
- Ri-classifica solo quei candidati localmente.
- Invia i primi pochi chunk al language model.
candidate_k=8 e top_k=4. Aumenta candidate_k se la sorgente giusta è spesso vicina ma non riesce ad arrivare nel contesto finale.
Rispondere con Venice Chat Completions
Una volta selezionato il contesto, formattalo con numeri di sorgente:Eseguire il bot
Una volta assemblati i pezzi in uno script, salvalo comerag_bot.py. Una prima esecuzione semplice può usare alcuni documenti di esempio integrati in modo da verificare la pipeline prima di ingerire i tuoi file:
Opzioni CLI utili
Esponi le principali leve di retrieval come opzioni CLI in modo da poter regolare il bot senza modificare il codice:| Opzione | Default | Cosa controlla |
|---|---|---|
--candidate-k | 8 | Numero di risultati della vector search da ri-classificare |
--top-k | 4 | Numero di chunk ri-classificati inviati al modello di chat |
--chunk-size | 1000 | Dimensione massima del chunk prima dell’overlap |
--chunk-overlap | 150 | Caratteri ripetuti tra chunk adiacenti |
--embedding-batch-size | 32 | Numero di chunk per richiesta agli embedding di Venice |
--qdrant-path | non impostato | Percorso di storage Qdrant locale persistente |
--qdrant-url | non impostato | URL Qdrant remoto |
--skip-ingest | false | Interroga una collection esistente senza ricaricare i documenti |
--recreate-collection | false | Elimina e ricostruisce la collection Qdrant |
Note sulla privacy
Per un setup RAG privato, pensa a ciascun layer separatamente:| Layer | Considerazione di privacy |
|---|---|
| Venice embeddings | I chunk dei documenti vengono inviati a Venice per creare i vettori |
| Venice chat | Il contesto recuperato viene inviato a Venice per rispondere alla domanda |
| Qdrant locale | Vettori e payload restano sulla tua macchina |
| Qdrant remoto | Vettori e payload sono archiviati ovunque il tuo server Qdrant venga eseguito |
| FastEmbed re-ranker | Il re-ranking viene eseguito localmente una volta che il modello è disponibile |
Errori comuni da gestire fin da subito
| Sintomo | Cosa significa di solito | Cosa fare |
|---|---|---|
Set VENICE_API_KEY before running this example. | La variabile d’ambiente manca | Esporta VENICE_API_KEY prima di eseguire lo script |
Document path does not exist | Un percorso passato a --docs è sbagliato | Controlla il percorso del file o della cartella |
| Risultati di retrieval vuoti | Nulla è stato ingerito, o viene interrogata la collection sbagliata | Rimuovi --skip-ingest o conferma --collection e --qdrant-path |
| Errore di dimensione del vettore Qdrant | La collection è stata creata con un modello di embedding diverso | Ricrea la collection dopo aver cambiato modello di embedding |
| Primo re-rank lento | FastEmbed potrebbe scaricare o inizializzare il cross-encoder | Lascia terminare la prima esecuzione, poi le successive dovrebbero essere più veloci |
Dove andare dopo
Una volta che hai la baseline funzionante, i miglioramenti di maggior impatto sono solitamente:- Aggiungi loader specifici per i documenti per PDF, HTML, ticket o pagine wiki interne.
- Archivia metadati più ricchi come titoli, intestazioni, date, owner e URL.
- Regola
candidate_k,top_k, dimensione del chunk e overlap su domande reali. - Aggiungi domande di valutazione per misurare la qualità del retrieval prima e dopo le modifiche.
- Effettua lo streaming della chat completion finale di Venice per una migliore esperienza di chat interattiva.