Come Agentic RAG riduce le allucinazioni e migliora il recupero

Scopri come Agentic RAG può ridurre le allucinazioni e migliorare il recupero riformulando le query, affinando i risultati e sfruttando modelli di linguaggio più ampi. Sblocca risposte più complete e pertinenti per le tue applicazioni RAG.

16 febbraio 2025

party-gif

Sblocca il potere della Retrieval Augmented Generation (RAG) con gli Agenti. Scopri come migliorare il tuo pipeline RAG e ridurre le allucinazioni introducendo agenti intelligenti in grado di analizzare le query, raffinare le ricerche e generare risposte più accurate e complete. Questo post del blog fornisce una guida pratica all'implementazione della RAG agentica, dotandoti degli strumenti per elevare le tue applicazioni di elaborazione del linguaggio naturale.

Come gli agenti possono correggere le allucinazioni in RAG

Il passaggio di recupero delle informazioni nella generazione aumentata dal recupero (RAG) dipende fortemente da come l'utente formula le domande. Se la query non è ben formulata, il recupero delle informazioni può essere difficile, anche se le informazioni che l'utente sta cercando sono presenti nella base di conoscenza. Nel RAG tradizionale, otteniamo un singolo, breve recupero, ma possiamo risolvere questo problema con il RAG agenziale.

Per capire come il RAG agenziale può aiutare, diamo un'occhiata alla configurazione tradizionale del RAG per il recupero. La query dell'utente viene eseguita attraverso una ricerca di similarità basata sulla semantica che cerca i frammenti più rilevanti nella base di informazioni. Ma cosa succede se la domanda stessa non viene posta nel modo corretto? In questo caso, il tuo pipeline RAG probabilmente allucinera, il che significa che inizierà a inventare risposte, o il modello di linguaggio dirà all'utente che non è riuscito a trovare le informazioni, anche se le informazioni sono effettivamente presenti nella base di conoscenza.

Possiamo risolvere questo problema introducendo agenti nel pipeline RAG e dando loro la capacità di analizzare non solo la query iniziale, ma anche le risposte generate dal pipeline RAG. Ecco come funziona di solito:

  1. La query iniziale viene passata attraverso un agente.
  2. L'agente riformulerà la query iniziale.
  3. La query raffinata viene passata attraverso la base di conoscenza e viene eseguita una ricerca di similarità basata sulla semantica per recuperare i documenti più rilevanti.
  4. Prima di passare i documenti rilevanti al modello di linguaggio, l'agente analizza nuovamente quei documenti o frammenti e raffinata la query se ritiene che i documenti recuperati non possano rispondere alla domanda.
  5. Sulla base della query raffinata, il processo viene ripetuto fino a quando l'agente non è soddisfatto sia dei documenti recuperati che della query riformulata.
  6. Il contesto finale viene quindi passato al modello di linguaggio per generare la risposta.

Costruire una pipeline RAG agentica

Il passaggio di recupero delle informazioni nella generazione aumentata dal recupero, o RAG, dipende fortemente da come l'utente formula le domande. Se la query non è ben formulata, il recupero delle informazioni può essere difficile, anche se le informazioni che l'utente sta cercando sono presenti nella base di conoscenza. Nel RAG tradizionale, otteniamo un singolo, breve recupero, ma possiamo risolvere questo problema con il RAG agenziale.

Per capire come il RAG agenziale può aiutare, diamo un'occhiata alla configurazione tradizionale del RAG per il recupero. La query dell'utente viene eseguita attraverso una ricerca di similarità basata sulla semantica che cerca i frammenti più rilevanti nella base di informazioni. Ma cosa succede se la domanda stessa non viene posta nel modo corretto? In questo caso, il tuo pipeline RAG probabilmente allucinera, ovvero inizierà a inventare risposte, o il modello di linguaggio dirà all'utente che non è riuscito a trovare le informazioni, anche se le informazioni sono effettivamente presenti nella base di conoscenza.

Possiamo risolvere questo problema introducendo agenti nel pipeline RAG e dando loro la capacità di analizzare non solo la query iniziale, ma anche le risposte generate dal pipeline RAG. Ecco come funziona di solito:

  1. La query iniziale viene passata attraverso un agente.
  2. L'agente riformulerà la query iniziale.
  3. La query raffinata viene passata attraverso la base di conoscenza e viene eseguita una ricerca di similarità basata sulla semantica per recuperare i documenti più rilevanti.
  4. Prima di passare i documenti rilevanti al modello di linguaggio, l'agente analizza nuovamente quei documenti o frammenti e raffinata la query se ritiene che i documenti recuperati non possano rispondere alla domanda.
  5. Sulla base della query raffinata, il processo viene ripetuto fino a quando l'agente non è soddisfatto sia dei documenti recuperati che della query riformulata.
  6. Il contesto finale viene quindi passato al modello di linguaggio per generare la risposta.

Per implementare il ciclo agenziale nel tuo pipeline RAG, hai diverse opzioni, come i framework Crew AI, Auto o LangGraph di LangChain. In questo caso, utilizzeremo gli Agenti Transformers, una funzionalità meno conosciuta all'interno del pacchetto Transformers che ti consente di creare i tuoi agenti.

Creazione di uno strumento di recupero

Per creare uno strumento di recupero per il pipeline RAG agenziale, definiamo una classe RetrievalTool con la seguente struttura:

class RetrievalTool:
    """Utilizzando la similarità semantica, recupera alcuni documenti dalla base di conoscenza che hanno gli embedding più vicini all'input."""

    def __init__(self, vector_db):
        self.vector_db = vector_db

    def __call__(self, query: str) -> List[str]:
        """
        Recupera fino a 7 frammenti più simili dal vector DB per la query data.
        
        Args:
            query (str): Una query su cui eseguire il recupero. Dovrebbe essere semanticamente vicina ai documenti di destinazione.
        
        Returns:
            List[str]: Una lista di fino a 7 frammenti più simili dal vector DB.
        """
        results = self.vector_db.similarity_search(query, k=7)
        return [chunk.page_content for chunk in results]

La classe RetrievalTool prende un oggetto vector_db come input, che è il magazzino vettoriale (ad es. Faiss, Chroma, Pinecone) utilizzato per memorizzare gli embedding dei documenti.

Il metodo __call__ della classe prende una stringa query come input e restituisce una lista di fino a 7 frammenti più simili dal vector DB. Utilizza il metodo similarity_search dell'oggetto vector_db per trovare i frammenti più simili in base alla similarità del coseno.

Questo strumento di recupero può quindi essere utilizzato come parte del pipeline RAG agenziale, dove l'agente può analizzare la query iniziale, raffinarla e passarla attraverso lo strumento di recupero per ottenere i frammenti più rilevanti dalla base di conoscenza.

Integrazione del modello linguistico

Per integrare il modello di linguaggio nel pipeline RAG agenziale, dobbiamo impostare il LLM che verrà utilizzato sia dall'agente che per generare la risposta finale. Abbiamo due opzioni:

  1. Utilizzo del motore Hugging Face: Questo ci consente di chiamare direttamente gli endpoint API dei diversi LLM disponibili attraverso l'architettura serverless di Hugging Face. Possiamo utilizzare modelli come Llama 38B o 70B, ma di solito richiedono un abbonamento Hugging Face Pro.

  2. Utilizzo di OpenAI: Per questo esempio, utilizzeremo il motore OpenAI. Il processo può essere adattato per impostare qualsiasi altro LLM.

Per impostare il motore OpenAI, creiamo una classe chiamata OpenAIEngine che utilizza le funzioni message_rle e gpt_generate_message_list dal motore LLM degli Agenti Transformer. Questa classe gestisce la pulizia dei messaggi di input e utilizza l'endpoint di completamento della chat di OpenAI per generare le risposte.

Successivamente, creiamo l'agente vero e proprio. L'agente ha accesso allo strumento di recupero che abbiamo creato in precedenza, al LLM che vogliamo utilizzare (in questo caso l'OpenAIEngine) e al numero massimo di iterazioni che vogliamo che l'agente esegua prima di interrompere il ciclo agenziale.

Forniamo anche un prompt di sistema all'agente, che gli dà istruzioni su come utilizzare le informazioni nella base di conoscenza per fornire una risposta esauriente alla domanda dell'utente. Il prompt incoraggia l'agente a ripetere il processo di recupero con query diverse se non riesce a trovare le informazioni necessarie.

Con l'agente e il LLM impostati, possiamo ora eseguire il ciclo agenziale per rispondere alle domande degli utenti. L'agente raffinera iterativamente la query, recupererà le informazioni rilevanti dalla base di conoscenza e genererà una risposta finale utilizzando il LLM. Questo approccio porta a risposte più dettagliate e pertinenti rispetto a un pipeline RAG standard.

Implementazione dell'agente agentico

Per implementare l'agente agenziale, utilizzeremo la funzionalità Agenti Transformer all'interno del pacchetto Transformer. Questo fornisce un approccio modulare e chiaro per creare agenti personalizzati.

Innanzi tutto, dobbiamo installare i pacchetti richiesti, tra cui pandas, Langchain, il pacchetto Langchain Community, Sentence Transformers e gli Agenti Transformer.

Successivamente, importiamo i moduli e i pacchetti necessari. Utilizzeremo l'agente ReactJsonAgent, costruiremo strumenti personalizzati per l'agente e ci affideremo al motore Hugging Face per il modello di linguaggio.

Per costruire il pipeline RAG, partiamo da un dataset contenente la documentazione di Hugging Face. Dividiamo i documenti in frammenti e creiamo gli embedding utilizzando il modello GTE-small. Quindi rimuoviamo eventuali frammenti duplicati e memorizziamo i frammenti univoci in un magazzino vettoriale basato su F.

Ora, introduciamo l'agente nel mix. Creiamo uno RetrievalTool che utilizza la similarità semantica per recuperare i frammenti più rilevanti dalla base di conoscenza in base alla query dell'utente.

Imposteremo anche il modello di linguaggio, in questo caso utilizzando il motore OpenAI con il modello GPT-4.

L'agente viene quindi creato, con accesso allo strumento di recupero e al modello di linguaggio. Specifichiamo anche il numero massimo di iterazioni che l'agente può eseguire per raffinare la query e il contesto recuperato.

All'agente viene fornito un prompt di sistema che lo guida nell'utilizzare la base di conoscenza per fornire una risposta esauriente alla domanda dell'utente. L'agente quindi attraversa un processo iterativo, riformulando la query e recuperando informazioni più rilevanti finché non è soddisfatto della risposta.

Il pipeline RAG agenziale viene quindi confrontato con un pipeline RAG standard, dimostrando come l'approccio basato sull'agente possa fornire risposte più dettagliate e pertinenti, soprattutto quando la query iniziale dell'utente non è ben formulata.

Confronto tra RAG standard e RAG agentico

Le principali differenze tra il RAG standard e il RAG agenziale sono:

  1. Riformulazione della query: Nel RAG standard, la query dell'utente viene passata direttamente attraverso la ricerca di similarità basata sulla semantica per recuperare i frammenti rilevanti dalla base di conoscenza. Nel RAG agenziale, un agente analizza la query iniziale e può riformularla per migliorare il processo di recupero.

  2. Raffinamento iterativo: Il RAG agenziale consente all'agente di raffinare iterativamente la query e il contesto recuperato. Se l'agente non è soddisfatto del recupero iniziale, può ripetere il processo con una query raffinata per ottenere risultati migliori.

  3. Risposte concise e pertinenti: L'approccio agenziale tende a generare risposte più concise e pertinenti rispetto al RAG standard. La capacità dell'agente di analizzare la query e il contesto recuperato lo aiuta a fornire una risposta più esauriente.

  4. Gestione di query mal formulate: Il RAG agenziale è meglio attrezzato per gestire i casi in cui la query dell'utente non è ben formulata. L'agente può riconoscere i limiti della query iniziale e lavorare per riformularla, portando a un miglior recupero e a risposte più informative.

  5. Flessibilità e personalizzazione: Il RAG agenziale consente una maggiore flessibilità e personalizzazione, poiché l'agente può essere dotato di vari strumenti e capacità per soddisfare le esigenze specifiche dell'applicazione.

In sintesi, il RAG agenziale introduce un livello aggiuntivo di intelligenza e controllo, consentendo al sistema di comprendere meglio l'intento dell'utente, raffinare il processo di recupero e generare risposte più mirate e informative, anche quando la query iniziale non è ottimale.

FAQ