“La generazione aumentata di recupero è il processo di integrazione dell’input di un utente in un modello linguistico di grandi dimensioni (LLM) come ChatGPT con informazioni aggiuntive di cui tu (il sistema) hai recuperato da qualche altra parte. Il LLM può quindi utilizzare tali informazioni per aumentare la risposta che esso genera.” — Cory Zue
Gli LLM sono un’invenzione straordinaria, soggetta a un problema chiave. Inventano cose. RAG rende i LLM molto più utili fornendo loro un contesto fattuale da utilizzare durante la risposta alle domande.
Utilizzando la guida rapida a un framework come LangChain o LlamaIndex, chiunque può creare un semplice sistema RAG, come un chatbot per i tuoi documenti, con circa cinque righe di codice.
Ma il bot creato con quelle cinque righe di codice non funzionerà molto bene. RAG è facile da prototipare, ma molto difficile da produrre, ovvero arrivare a un punto in cui gli utenti ne sarebbero soddisfatti. Un tutorial di base potrebbe far funzionare RAG all’80%. Ma coprire il prossimo 20% spesso richiede una seria sperimentazione. Le migliori pratiche devono ancora essere risolte e possono variare a seconda del caso d’uso. Ma vale la pena dedicare il nostro tempo a capire le migliori pratiche, perché RAG è probabilmente il modo più efficace per utilizzare i LLM.
Questo post esaminerà le strategie per migliorare la qualità dei sistemi RAG. È fatto su misura per coloro che costruiscono con RAG e desiderano colmare il divario tra le configurazioni di base e le prestazioni a livello di produzione. Ai fini di questo post, migliorare significa aumentare la percentuale di query per le quali il sistema: 1. Trova il contesto appropriato e 2. Genera una risposta appropriata. Presumo che il lettore abbia già una comprensione di come funziona RAG. In caso contrario, suggerirei di leggerlo Questo articolo di Cory Zue per una buona introduzione. Si presuppone inoltre una certa familiarità di base con i framework comuni utilizzati per costruire questi strumenti: LangChain E LlamaIndex. Tuttavia le idee discusse qui sono indipendenti dal contesto.
Non entrerò nei dettagli su come implementare esattamente ciascuna strategia che tratterò, ma cercherò piuttosto di dare un’idea di quando e perché potrebbe essere utile. Data la velocità con cui lo spazio si sta muovendo, è impossibile fornire un elenco esaustivo o perfettamente aggiornato delle migliori pratiche. Il mio obiettivo è invece delineare alcune cose che potresti prendere in considerazione e provare quando tenti di migliorare la tua applicazione di generazione aumentata di recupero.
1. Pulisci i tuoi dati.
RAG collega le funzionalità di un LLM ai tuoi dati. Se i tuoi dati sono confusi, nella sostanza o nel layout, il tuo sistema ne risentirà. Se stai utilizzando dati con informazioni contrastanti o ridondanti, il tuo recupero avrà difficoltà a trovare il contesto giusto. E quando ciò accade, la fase di generazione eseguita dal LLM potrebbe non essere ottimale. Supponiamo che tu stia costruendo un chatbot per i documenti di aiuto della tua startup e scopri che non funziona bene. La prima cosa a cui dovresti dare un’occhiata sono i dati che stai inserendo nel sistema. Gli argomenti sono suddivisi in modo logico? Gli argomenti vengono trattati in un unico posto o in molti posti separati? Se tu, come essere umano, non puoi facilmente dire quale documento dovresti guardare per rispondere a domande comuni, neanche il tuo sistema di recupero sarà in grado di farlo.
Questo processo può essere semplice come combinare manualmente documenti sullo stesso argomento, ma puoi andare oltre. Uno degli approcci più creativi che ho visto è quello di utilizzare LLM per creare riepiloghi di tutti i documenti forniti come contesto. Nella fase di recupero è quindi possibile eseguire innanzitutto una ricerca su questi riepiloghi e approfondire i dettagli solo quando necessario. Alcuni framework lo hanno anche come astrazione incorporata.
2. Esplora diversi tipi di indice.
L’indice è il pilastro centrale di LlamaIndex e LangChain. È l’oggetto che sostiene il tuo sistema di recupero. L’approccio standard al RAG prevede l’incorporamento e la ricerca di similarità. Suddivide i dati di contesto, incorpora tutto, quando arriva una query, trova pezzi simili dal contesto. Funziona molto bene, ma non è l’approccio migliore per ogni caso d’uso. Le query riguarderanno articoli specifici, come i prodotti in un negozio di e-commerce? Potresti voler esplorare la ricerca basata su parole chiave. Non deve essere necessariamente l’uno o l’altro, molte applicazioni utilizzano un ibrido. Ad esempio, puoi utilizzare un indice basato su parole chiave per query relative a un prodotto specifico, ma fare affidamento sugli incorporamenti per l’assistenza clienti generale.
3. Sperimenta il tuo approccio alla suddivisione in blocchi.
Suddividere i dati di contesto è una parte fondamentale della costruzione di un sistema RAG. I framework astraggono il processo di suddivisione in blocchi e ti consentono di scappare senza pensarci. Ma dovresti pensarci. Le dimensioni del pezzo contano. Dovresti esplorare ciò che funziona meglio per la tua applicazione. In generale, i blocchi più piccoli spesso migliorano il recupero ma possono far sì che la generazione soffra di una mancanza di contesto circostante. Esistono molti modi in cui puoi avvicinarti al Chunking. L’unica cosa che non funziona è avvicinarsi alla cieca. Questo post da PineCone delinea alcune strategie da considerare. Ho una serie di domande di prova. Mi sono avvicinato a questo tramite eseguendo un esperimento. Ho eseguito il loop di ogni set una volta con dimensioni di pezzi piccoli, medi e grandi e ho scoperto che piccolo era il migliore.
4. Gioca con il prompt di base.
Un esempio di prompt di base utilizzato in LlamaIndex è:
‘Le informazioni sul contesto sono riportate di seguito. Date le informazioni di contesto e non le conoscenze pregresse, rispondi alla domanda.’
Puoi sovrascriverlo e sperimentare altre opzioni. Puoi persino hackerare il RAG in modo da consentire al LLM di fare affidamento sulla propria conoscenza se non riesce a trovare una buona risposta nel contesto. Puoi anche modificare il prompt per aiutare a orientare i tipi di domande che accetta, ad esempio, istruendolo a rispondere in un certo modo a domande soggettive. Come minimo è utile sovrascrivere il prompt in modo tale che LLM abbia il contesto sui lavori che sta svolgendo. Per esempio:
‘Sei un agente dell’assistenza clienti. Sei progettato per essere il più utile possibile fornendo solo informazioni basate sui fatti. Dovresti essere amichevole, ma non eccessivamente loquace. Le informazioni contestuali sono riportate di seguito. Date le informazioni di contesto e non le conoscenze pregresse, rispondi alla domanda.’
5. Prova il filtraggio dei metadati.
Una strategia molto efficace per migliorare il recupero consiste nell’aggiungere metadati ai blocchi e quindi utilizzarli per facilitare l’elaborazione dei risultati. La data è un tag di metadati comune da aggiungere perché te lo consente filtrare per recency. Immagina di creare un’app che consenta agli utenti di interrogare la cronologia della posta elettronica. È probabile che le email più recenti siano più pertinenti. Ma non sappiamo se saranno i più simili, dal punto di vista dell’incorporamento, alla query dell’utente. Ciò fa emergere un concetto generale da tenere a mente quando si costruisce RAG: simile ≠ rilevante. Puoi aggiungere la data di ogni email ai relativi metadati e quindi dare priorità al contesto più recente durante il recupero. LlamaIndex ha una classe integrata di post-processori di nodo che aiutano esattamente in questo.
6. Utilizzare l’instradamento delle query.
Spesso è utile avere più di un indice. Quindi instradi le query all’indice appropriato quando arrivano. Ad esempio, potresti avere un indice che gestisce le domande di riepilogo, un altro che gestisce le domande mirate e un altro che funziona bene per le domande sensibili alla data. Se provi a ottimizzare un indice per tutti questi comportamenti, finirai per compromettere il loro rendimento. Puoi invece instradare la query all’indice corretto. Un altro caso d’uso potrebbe essere quello di indirizzare alcune query a un indice basato su parole chiave come discusso nella sezione 2.
Una volta costruiti gli indici, devi solo definire nel testo per cosa dovrebbe essere utilizzato ciascuno. Quindi, al momento della query, LLM sceglierà l’opzione appropriata. Sia LlamaIndex che LangChain dispongono di strumenti per questo.
7. Valuta la riclassificazione.
La riclassificazione è una soluzione al problema della discrepanza tra somiglianza e pertinenza. Con la riclassificazione, il tuo sistema di recupero ottiene come al solito i nodi principali per il contesto. Quindi li riclassifica in base alla pertinenza. Cohere Rereanker è comunemente usato per questo. Questa strategia è quella che vedo consigliare spesso dagli esperti. Indipendentemente dal caso d’uso, se stai creando con RAG, dovresti sperimentare la riclassificazione e vedere se migliora il tuo sistema. Sia LangChain che LlamaIndex hanno astrazioni che ne facilitano la configurazione.
8. Considerare le trasformazioni delle query.
Hai già modificato la query del tuo utente inserendola nel prompt di base. Può avere senso modificarlo ulteriormente. Ecco alcuni esempi:
Riformulazione: se il tuo sistema non trova il contesto rilevante per la query, puoi chiedere a LLM di riformulare la query e riprovare. Due domande che sembrano uguali agli esseri umani non sempre sembrano così simili quando si tratta di includere lo spazio.
Iddio: Hyde è una strategia che accetta una query, genera una risposta ipotetica e quindi utilizza entrambe per incorporare la ricerca. Le ricerche hanno scoperto che questo può migliorare notevolmente le prestazioni.
Sottoquery: i LLM tendono a funzionare meglio quando scompongono query complesse. Puoi integrarlo nel tuo sistema RAG in modo tale che una query venga scomposta in più domande.
LLamaIndex dispone di documenti che trattano questi tipi di trasformazioni di interrogazione.
9. Perfeziona il tuo modello di incorporamento.
La somiglianza basata sull’incorporamento è il meccanismo di recupero standard per RAG. I tuoi dati vengono suddivisi e incorporati nell’indice. Quando arriva una query, viene anche incorporata per il confronto con l’incorporamento nell’indice. Ma cosa sta facendo l’incorporamento? Di solito, un modello pre-addestrato come il testo di OpenAIincorporamento–ada–002.
Il problema è che il concetto del modello pre-addestrato di ciò che è simile nello spazio di incorporamento potrebbe non allinearsi molto bene con ciò che è simile nel tuo contesto. Immagina di lavorare con documenti legali. Vorresti che il tuo incorporamento basasse il suo giudizio di somiglianza più su termini specifici del tuo dominio come “proprietà intellettuale” o “violazione del contratto” e meno su termini generali come “con la presente” e “accordo”.
Puoi ottimizzare il modello di incorporamento per risolvere questo problema. Ciò può aumentare le metriche di recupero del 5-10%. Ciò richiede uno sforzo leggermente maggiore, ma può fare una differenza significativa nelle prestazioni di recupero. Il processo è più semplice di quanto potresti pensare, poiché LlamaIndex può aiutarti a generare un set di formazione. Per ulteriori informazioni, puoi controllare questo post di Jerry Liu su come LlamaIndex si avvicina alla messa a punto degli incorporamenti, o questo post che attraversa il processo di messa a punto.
10. Inizia a utilizzare gli strumenti di sviluppo LLM.
Probabilmente stai già utilizzando LlamaIndex o LangChain per costruire il tuo sistema. Entrambi i framework dispongono di utili strumenti di debug che ti consentono di definire callback, vedere quale contesto viene utilizzato, da quale documento proviene il tuo recupero e altro ancora.
Se ti accorgi che mancano gli strumenti integrati in questi framework, esiste un crescente ecosistema di strumenti che possono aiutarti ad immergerti nel funzionamento interno del tuo sistema RAG. Arize AI ha un strumento nel notebook che ti consente di esplorare come viene recuperato il contesto e perché. Rivetto è uno strumento che fornisce un’interfaccia visiva per aiutare la creazione di agenti complessi. È stato semplicemente reso open source dalla società di tecnologia legale Ironclad. Vengono costantemente rilasciati nuovi strumenti e vale la pena sperimentare per vedere quali sono utili nel tuo flusso di lavoro.
Costruire con RAG può essere frustrante perché è così facile iniziare a lavorare e così difficile farlo funzionare bene. Spero che le strategie di cui sopra possano fornire qualche ispirazione su come colmare il divario. Nessuna di queste idee funziona sempre e il processo è fatto di sperimentazione, tentativi ed errori. In questo post non ho approfondito la valutazione e come misurare le prestazioni del tuo sistema. La valutazione è più un’arte che una scienza al momento, ma è importante impostare un tipo di sistema su cui poter controllare costantemente. Questo è l’unico modo per sapere se le modifiche che stai implementando fanno la differenza. ne ho scritto come valutare il RAG sistema in precedenza. Per ulteriori informazioni, puoi esplorare Valutazioni LlamaIndex, Valutazioni LangChaine un nuovo framework davvero promettente chiamato RAGAS.
Fonte: towardsdatascience.com