Prompt Engineering Recupero Generazione potenziata (RAG)

RAG Prompt Engineering Power Generation Enhancement

Il campo del Natural Language Processing (NLP) ha visto importanti progressi con l’avvento di modelli basati su trasformatori come GPT-3. Questi modelli linguistici hanno la capacità di generare testo simile a quello umano e hanno trovato diverse applicazioni come chatbot, generazione di contenuti e traduzione. Tuttavia, quando si tratta di casi d’uso aziendali in cui sono coinvolti informazioni specializzate e specifiche per il cliente, i modelli linguistici tradizionali potrebbero non essere sufficienti. L’addestramento di questi modelli con nuovi corpora può essere costoso e richiedere molto tempo. Per affrontare questa sfida, possiamo utilizzare una delle tecniche chiamata “Retrieval Augmented Generation” (RAG).

In questo blog, esploreremo come funziona RAG e dimostreremo la sua efficacia attraverso un esempio pratico utilizzando GPT-3.5 Turbo per rispondere a un manuale di prodotto come corpus aggiuntivo.

Immagina di dover sviluppare un chatbot in grado di rispondere a domande su un particolare prodotto. Questo prodotto ha un proprio manuale utente unico specifico per le offerte dell’azienda. I modelli linguistici tradizionali, come GPT-3, sono generalmente addestrati su dati generici e potrebbero non avere conoscenza di questo prodotto specifico. L’addestramento del modello con il nuovo corpus potrebbe sembrare una soluzione, ma comporta costi considerevoli e requisiti di risorse.

Introduzione di RAG

Retrieval Augmented Generation (RAG) offre un modo più efficiente ed efficace per affrontare il problema della generazione di risposte contestualmente adeguate in domini specializzati. Invece di addestrare completamente il modello linguistico con il nuovo corpus, RAG sfrutta il potere del recupero per accedere alle informazioni rilevanti su richiesta. Combinando i meccanismi di recupero con i modelli linguistici, RAG migliora le risposte incorporando contesti esterni. Questo contesto esterno può essere fornito come un embedding vettoriale.

Nella seguente immagine viene mostrato il flusso di passaggi che seguiremo per creare la nostra applicazione.

  1. Leggi dal PDF (manuale utente Clarett PDF) e tokenizza con una dimensione di chunk di 1000 token.
  2. Crea un embedding vettoriale di questi token. Utilizzeremo la libreria OpenAIEmbeddings per creare gli embedding vettoriali.
  3. Memorizza gli embedding vettoriali localmente. Utilizzeremo ChromaDB semplice come VectorDB. Potremmo utilizzare Pinecone o qualsiasi altro VectorDB di grado di produzione più disponibile al posto di ChromaDB.
  4. L’utente emette un suggerimento con la query/domanda.
  5. Questo emette una ricerca e un recupero dal vectorDB per ottenere dati contestuali aggiuntivi dal VectorDB.
  6. Questi dati contestuali saranno ora utilizzati insieme al suggerimento.
  7. Il contesto arricchisce il suggerimento. Questo è tipicamente chiamato arricchimento del contesto.
  8. Il suggerimento, insieme alla query/domanda e a questo contesto migliorato, viene ora passato all’LLM
  9. LLM risponde ora, basandosi su questo contesto.

Utilizzeremo il manuale utente Focusrite Clarett come corpus aggiuntivo. Focusrite Clarett è un semplice interfaccia audio USB per registrare e riprodurre audio. Puoi scaricare il manuale utente da qui.

Mettiamoci all’opera

Configura l’ambiente virtuale

Creiamo un ambiente virtuale per isolare la nostra implementazione e evitare conflitti di versione/libreria/ dipendenza. Esegui i seguenti comandi per creare un nuovo ambiente virtuale Python

Crea una chiave OpenAI

Avere una chiave OpenAI per accedere a GPT. Creiamo una chiave OpenAI. Puoi creare l’OpenAIKey gratuitamente registrandoti con OpenAI qui.

Una volta registrato, accedi e seleziona l’API, Opzione, come mostrato nella schermata (le schermate potrebbero essere cambiate da quando ho fatto lo screenshot)

Vai alle impostazioni del tuo account e seleziona “Visualizza le chiavi API”.

Seleziona “Crea nuova chiave segreta” e vedrai un popup come quello sotto. Fornisci un nome e verrà generata una chiave.

Questo genererà una chiave unica, che dovresti copiare negli appunti e conservare in un luogo sicuro.

Ora scriviamo il codice Python per implementare tutti i passaggi mostrati nel diagramma di flusso sopra.

Installa le dipendenze

Installa le varie dipendenze di cui avremo bisogno. Utilizzeremo le seguenti librerie:

  • Lanchain: Un framework per sviluppare applicazioni LLM.
  • ChromaDB: Questo è il VectorDB per persistere gli embedding vettoriali.
  • unstructured: Utilizzato per il preprocessing di documenti Word/PDF.
  • tiktoken: Framework tokenizer
  • pypdf: Framework per leggere e elaborare documenti PDF.
  • openai: Framework per accedere a OpenAI.

Una volta che queste dipendenze sono state installate con successo, crea una variabile di ambiente per memorizzare le chiavi di OpenAI che sono state create nell’ultimo passaggio.

Iniziamo a codificare…

Crea Embedding Vettoriali dal Manuale Utente in formato PDF e memorizzali in ChromaDB

Nel codice seguente, stiamo importando tutte le librerie e le funzioni dipendenti che utilizzeremo.

Nel codice seguente leggiamo il file PDF, suddividendo il documento in token.

Nel codice seguente, stiamo creando una collezione di chroma, una directory locale per memorizzare il chroma db. Stiamo quindi creando un embedding vettoriale e memorizzandolo in ChromaDB.

Dopo aver eseguito questo codice, dovresti vedere una cartella creata che memorizza gli embedding vettoriali.

Ora abbiamo gli embedding vettoriali memorizzati in ChromaDB. Ora utilizziamo l’API ConversationalRetrievalChain in LangChain per avviare un componente di cronologia delle chat. Passeremo l’oggetto OpenAI inizializzato con GPT 3.5 turbo e il vectorDB che abbiamo creato. Passeremo ConversationBufferMemory, che memorizza i messaggi.

Ora che abbiamo inizializzato la catena di recupero conversazionale, possiamo utilizzarla per chattare/rispondere alle domande. Nel codice seguente, accettiamo gli input dell’utente (domande) fino a quando l’utente digita ‘done’. Passiamo quindi le domande al LLM per ottenere una risposta e la stampiamo.

Ecco lo screenshot dell’output.

Come puoi vedere, la Generazione con Recupero Potenziato è una tecnica eccellente che combina i punti di forza dei modelli di linguaggio come GPT-3 con la potenza del recupero delle informazioni. Arricchendo l’input con informazioni specifiche del contesto, RAG consente ai modelli di linguaggio di generare risposte più accurate e rilevanti dal punto di vista contestuale. Nei casi di utilizzo aziendale in cui il fine-tuning potrebbe non essere pratico, RAG offre una soluzione efficiente ed economica per fornire interazioni personalizzate e informate agli utenti.

Spero che questo sia stato utile. Fornisci i tuoi pareri, feedback e commenti. Nel frattempo, pubblicherò altri blog in questo campo mentre esploro.

Trascorri un bel momento… Torno subito!! Nel frattempo, stai al sicuro…