In questo post proveremo a utilizzare Open WebUI per realizzare un piccolo sistema RAG (Retrieval Augmented Generation) [6].
Un RAG combina le capacità generative di un LLM (Large Language Model) con la conoscenza recuperata da fonti sconosciute all’LLM (tipicamente i dati privati dell’organizzazione) allo scopo di fornire risposte accurate e precise riguardanti un dominio ristretto.
Lo scopo, quindi, è quello di utilizzare una base di dati privata per rispondere alle domande degli utenti su argomenti specifici.
I dati possono provenire da varie fonti: database, gestionali, documenti, file system, siti web, ecc. Quando si caricano i dati in un sistema RAG, vengono vettorializzati e salvati in un database vettoriale (per esempio ChromaDB). Nel momento in cui un utente interroga il RAG, il sistema recupera tutti i vettori che contengono i dati che hanno una relazione con la domanda e li include nel prompt da inviare all’LLM. Il modello quindi cercherà tra questi dati le informazioni necessarie e risponderà utilizzando sia quelle informazioni specifiche sia la conoscenza “generica” di cui è dotato.
Si può realizzare un sistema RAG utilizzando delle librerie come LllamaIndex o LangChain, ma ci sono dei sistemi che includono già al loro interno tutte queste funzionalità.
Per provare tutto questo processo, in questo post realizzeremo un chatbot esperto di cucina: Chef Gino, realizzato con OpenWebUI e Ollama.
Prerequisiti
E’ necessario che sul sistema (nel nostro caso un computer con Windows) siano già installati e configurati Ollama [8] e OpenWebUI [5] e che si scarichi questo archivio che contiene alcune ricette opportunamente formattate [7].
Descrizione del progetto
Supponiamo quindi di voler realizzare un Chabot che simuli le conoscenze di un bravo chef che conosce tante ricette e tutti i segreti per creare dei piatti gustosi. Ci piacerebbe che il nostro amico chef, che si chiama Gino, sia sempre pronto a suggerisci qualche buon piatto da cucinare con gli ingredienti che abbiamo a disposizione.
Non è un progetto difficile da realizzare, ma l’ho scelto perché è divertente e perché in rete ci sono tante ricette gratuite che possono essere usate come base di dati, in questo caso, tuttavia, ho usato delle ricette strutturate in un formato ben preciso e le ho fatte generare da ChatGPT per fare prima.
Inutile dire che si tratta solo di un prototipo e che realizzare un sistema commerciale richiederebbe un lavoro molto più serio e complesso. Nell’ultimo paragrafo c’è un elenco delle principali problematiche riscontrate e delle questioni che andrebbero approfondite per ottenere un sistema migliore.
Configurazione e utilizzo come RAG
La procedura per configurare il RAG è ben descritta nella documentazione ufficiale con un tutorial [6]. I passi da seguire sono:
- Scaricare l’archivio delle ricette o realizzarne uno proprio [7].
- Creare su Ollama un modello personalizzato con un contesto esteso, in modo che si possano inviare al modello le informazioni estratte dalle ricette. In pratica, in questo caso, siamo partiti dal modello Mistral:7b e abbiamo aumentato l’ambiezza del contesto da 2048 token (il valore di default) a 8192 token:
- Crare un file Modelfile.
- Inserire nel file le righe:
FROM mistral:7b PARAMETER num_ctx 8192
- Eseguire i comandi per creare il modello mistral-8k ed eseguirlo:
ollama create mistral-8k -f Modelfile ollama run mistral-8k
- Creare la base di conoscenza:
- Da Spazio di lavoro–>Conoscenza cliccare su Crea una base di conoscenza.
- Inserire Nome (per esempio Conoscenza di Gino) e Descrizione.
- Nel campo Visibilità lasciare il valore Privato.
- Cliccare su Crea conoscenza.
- Cliccare sul simbolo + e importare i file con i dati uno a uno oppure le directory (in questo caso ho importato la directory RicetteFormattate) scegliere il modello personalizzato creato nel passo 2: mistral-8k:latest.
- Creare un modello personalizzato:
- Da Spazio di lavoro–>Modelli cliccare sul simbolo +.
- Inserire Nome (per esempio ChefGino) e Descrizione.
- Nel campo Visibilità lasciare il valore Privato.
- Nel campo Modello base scegliere il modello personalizzato creato nel passo 2: mistral-8k:latest.
- Nel campo Prompt di sistema inserire il testo:
Agisci come uno chef italiano esperto e appassionato di cucina tradizionale. Rispondi in italiano, con uno stile caloroso, diretto e professionale, come se parlassi nella cucina della tua famiglia. Non inventare nessuna ricetta. Quando rispondi a domande sui piatti o le ricette, utilizza SOLO le informazioni contenute nei documenti forniti nella base di conoscenza (ricette in formato PDF o testo). Non inventare o indovinare risposte: se le informazioni non sono presenti nei documenti, spiega gentilmente che non puoi fornire dettagli al riguardo. Le ricette nei documenti sono spesso organizzate con questa struttura: RICETTA, INGREDIENTI, PREPARAZIONE, SUGGERIMENTI. Quando ti viene chiesto come preparare un piatto, rispondi, se la ricetta è presente nella base di conoscenza, seguendo questa struttura ordinata: Titolo, Ingredienti (elenco con dosi), Preparazione (passaggi numerati, chiari e ordinati), Suggerimenti (consigli pratici, note sulla cottura, trucchi di cucina, eventuali varianti regionali se presenti nei documenti), Sii preciso, conciso e concentrato sulle ricette. Mantieni un tono accogliente e autentico, come uno chef che condivide con amore i segreti della cucina di casa. Se utile, spiega passaggi complessi in modo semplice e accessibile anche ai principianti. Se la domanda non riguarda una ricetta specifica, ma un ingrediente, un passaggio o un confronto tra piatti, rispondi comunque solo con le informazioni ricavate dai documenti disponibili, citando solo le ricette pertinenti. Inizia e finisci la risposta salutando l'interlocutore.
- Nel campo Conosenza scegliere la conoscenza creata nel punto 3 (Conoscenza di Gino).
- Nel campo Funzionalità lasciare selezionati solo: File Upload, Usage e Citations.
- Cliccare su Salva e crea.
- Modificare alcune proprietà di recupero dei documenti:
- Raggiungere le sezione Modello RAG della pagina: Pannello amministrazione–>Impostazioni–>Documenti–>Recupero ricordo
- Sostiture queste due direttive:
- If the context is unreadable or of poor quality, inform the user and provide the best possible answer. - If the answer isn't present in the context but you possess the knowledge, explain this to the user and provide the answer using your own understanding.
- Con queste tre direttive:
- If the context is unreadable or of poor quality, inform the user and say something like "I'm sorry but I don't knw this recipe". - If the answer isn't present in the context explain this to the user but not invent a response using your own understanding. - Never use the model's pre-trained knowledge to answer recipe-related queries — respond strictly using the context provided into the <context> section passed below.
- Creare una API Key:
- Creare una API Key (<YOUR_API_KEY>) come indicato in [5], cioè da Impostazioni–>Account->Chiave API cliccare su Crea nuova chiave segreta.
Interrogazione del RAG tramite interfaccia grafica
A questo punto possiamo effettuare delle interrogazioni di prova, assicurandoci di aver selezionato il modello: ModelloGino.
Nella galleria di immagini sono riportate le risposte a queste tre domande:
- Ciao Gino, come si fa il Pan di Spagna?
- Come si prepara il filetto alla Wellington?
- Ho comprato delle mele come le posso cucinare?
- Devo invitare a cena degli amici mi suggeriresti un menù di tre portate: un primo, un secondo e un dolce con le tue migliori ricette?
eseguite sia con il modello base: mistral:7b (M1-M4) sia con il RAG e il ModelloGino (G1-G4).
Come si può vedere dagli screenshot, le risposte del modello base (M1-M4) sono generiche e ricavate dalla conoscenza dell’LLM acquisita durante l’addestramento, mentre le risposte del sistema RAG (G1-G4) sono basate sui documenti che abbiamo messo a disposizione del sistema. In fondo a ogni risposta sono indicati i file dai quali sono state recuperate le informazioni utilizzate.
Uno degli obiettivi era quello di fare in modo che il sistema rispondesse usando esclusivamente le ricette presenti nella base di conocenza, per evitare allucinazioni e fare in modo che desse risposte precise.
Per fare questo è stato necessario agire sul System Prompt e sul RAG template e, nonostante questo, non sempre il sistema rispetta le regole indicate, nel senso che, come si può vedere nel caso delle risposte G2*, spesso ChefGino ricorre alle sue “conoscenze pregresse” per rispondere alle domande che riguardano ricette non presenti nella base di conoscenza.
Da segnalare che lavorando in locale su un semplice Lenovo Ideapad 3 con un Intel Core i7 e senza GPU, i tempi di risposta sono molto lunghi, quasi esasperanti, ma questo era prevedibile.
Interrogazione del RAG tramite API HTTP
Per interrogare il modello ChefGino tramite API HTTP basta eseguire una chiamata di questo tipo:
curl -X POST "http://localhost:3000/api/chat/completions" -H "Content-Type: application/json" -H "Authorization: Bearer <YOUR_API_KEY>" -d '{"model": "ChefGino", "messages": [{"role": "user", "content": "Quali sono gli ingredienti per una carbonara?" }],"stream": false}'
Considerazioni finali
OpenWeb UI permette di creare un sistema RAG in modo molto semplice.
Per poter realizzare però un sistema utilizzabile è necessario però scegliere un modello adatto ed effettuare numerose prove variando i parametri che il sistema mette a disposizione.
I risultati delle prove sono migliorati molto sostituendo i file delle ricette in PDF con file strutturati, ossia formattati in un modo ben preciso.
Altre problematiche su cui è necessario lavorare per migliorare le prestazioni e l’affidabilità del sistema sono:
- Corretto dimenionamento dell’hardware ed eventuale uso di GPU.
- Opportuna gestione delle sessioni.
- Inclusione dei dati del profilo utente nelle interrogazioni.
- Dimensionamento opportuno della dimensione del contesto passata ad Ollama.
- Definizione corretta del System Prompt e del RAG Template.ù
- Tuning opportuno di tutti i parametri del sistema di vettorizzazione (chunk, overlapping, ecc.) e dell’LLM (temperatura, ecc.)
- Formattazione dei documenti che costituiscono la base di conoscenza.
Galleria di immagini
Fonti e riferimenti
-
- Open WebUI sito ufficiale.
- API Endpoints di Open WebUI.
- Retrieval Augmented Generation (RAG) sul sito di Open WebUI.
- Tutorial: Configuring RAG with Open WebUI Documentation sul sito di Open WebUI.
- Open WebUI: una interfaccia grafica per Ollama, su questo blog.
- Retrieval Augmented Generation (RAG): Come utilizzare dati di dominio specializzati con gli LLM, su questo blog.
- Archivio con le ricette formattate usate nel progetto.
- Eseguire un modello LLM in locale con Ollama, su questo blog.