Hoe Agentic RAG hallucinaties vermindert en het ophalen verbetert

Ontdek hoe Agentic RAG hallucinaties kan verminderen en het ophalen kan verbeteren door queries te herformuleren, resultaten te verfijnen en grotere taalmodellen te benutten. Ontgrendel meer uitgebreide en relevante antwoorden voor uw RAG-toepassingen.

21 februari 2025

party-gif

Ontgrendel de kracht van Retrieval Augmented Generation (RAG) met Agents. Ontdek hoe je je RAG-pijplijn kunt verbeteren en hallucinaties kunt verminderen door intelligente agents te introduceren die queries kunnen analyseren, zoekopdrachten kunnen verfijnen en nauwkeurigere en uitgebreidere antwoorden kunnen genereren. Deze blogpost biedt een praktische gids voor het implementeren van agentic RAG, waarmee je de tools krijgt om je natuurlijke taalverwerkingstoepassingen te verbeteren.

Hoe Agenten Hallucinaties in RAG kunnen Oplossen

De stap voor informatieopvraging in retrieval augmented generation (RAG) is sterk afhankelijk van hoe de gebruiker vragen stelt. Als de query niet goed geformuleerd is, kan het ophalen van informatie moeilijk zijn, zelfs als de informatie die de gebruiker zoekt aanwezig is in de kennisbank. In traditionele RAG krijgen we één enkele, korte ophaling, maar we kunnen dit oplossen met agentische RAG.

Om te begrijpen hoe agentische RAG kan helpen, laten we eens kijken naar de traditionele RAG-opstelling voor ophaling. De gebruikersquery wordt uitgevoerd door een op semantiek gebaseerde similariteitszoekactie die op zoek gaat naar de meest relevante stukken in de informatiebasis. Maar wat gebeurt er als de vraag zelf niet op de juiste manier wordt gesteld? In dat geval zal uw RAG-pijplijn waarschijnlijk hallucineren, wat betekent dat het antwoorden gaat verzinnen, of het taalmodel zal de gebruiker vertellen dat het de informatie niet kon vinden, ook al is de informatie eigenlijk aanwezig in de kennisbank.

We kunnen dit oplossen door agenten in de RAG-pijplijn te introduceren en hen de mogelijkheid te geven om niet alleen de initiële query te analyseren, maar ook de antwoorden die door de RAG-pijplijn worden gegenereerd. Hier is hoe het er meestal uitziet:

  1. De initiële query wordt doorgegeven aan een agent.
  2. De agent zal de initiële query herformuleren.
  3. De verfijnde query wordt doorgegeven aan de kennisbank en er wordt een op semantiek gebaseerde similariteitszoekactie uitgevoerd om de meest relevante documenten op te halen.
  4. Voordat de relevante documenten worden doorgegeven aan het taalmodel, analyseert de agent deze documenten of stukken opnieuw en verfijnt de query als hij denkt dat de opgehaalde documenten de vraag niet kunnen beantwoorden.
  5. Op basis van de verfijnde query wordt het proces herhaald totdat de agent tevreden is met zowel de opgehaalde documenten als de herformuleerde query.
  6. De uiteindelijke context wordt vervolgens doorgegeven aan het taalmodel om het antwoord te genereren.

In dit geval kan de agent plannen, analyseren en uitvoeren om de agentische lus in uw RAG-pijplijn te implementeren. U heeft verschillende opties, zoals frameworks als Crew AI, AutoGPT of LangGraph van LangChain, die u kunt gebruiken om agenten te bouwen. In deze video gebruiken we Transformers Agents, een minder bekende functie binnen het Transformers-pakket waarmee u uw eigen agenten kunt maken.

Een Agentische RAG-Pipeline Bouwen

De stap voor informatieopvraging in retrieval augmented generation of RAG is sterk afhankelijk van hoe de gebruiker vragen stelt. Als de query niet goed geformuleerd is, kan het ophalen van informatie moeilijk zijn, zelfs als de informatie die de gebruiker zoekt aanwezig is in de kennisbank. In traditionele RAG krijgen we één enkele, korte ophaling, maar we kunnen dit oplossen met agentische RAG.

Om te begrijpen hoe agentische RAG kan helpen, laten we eens kijken naar de traditionele RAG-opstelling voor ophaling. De gebruikersquery wordt uitgevoerd door een op semantiek gebaseerde similariteitszoekactie die op zoek gaat naar de meest relevante stukken in de informatiebasis. Maar wat gebeurt er als de vraag zelf niet op de juiste manier wordt gesteld? In dat geval zal uw RAG-pijplijn waarschijnlijk hallucineren, dat wil zeggen dat het antwoorden gaat verzinnen, of het LLM zal de gebruiker vertellen dat het de informatie niet kon vinden, ook al is de informatie eigenlijk aanwezig in de kennisbank.

We kunnen dit oplossen door agenten in de RAG-pijplijn te introduceren en hen de mogelijkheid te geven om niet alleen de initiële query te analyseren, maar ook de antwoorden die door de RAG-pijplijn worden gegenereerd. Hier is hoe het er meestal uitziet:

  1. De initiële query wordt doorgegeven aan een agent.
  2. De agent zal de initiële query herformuleren.
  3. De verfijnde query wordt doorgegeven aan de kennisbank en er wordt een op semantiek gebaseerde similariteitszoekactie uitgevoerd om de meest relevante documenten op te halen.
  4. Voordat de relevante documenten worden doorgegeven aan het LLM, analyseert de agent deze documenten of stukken opnieuw en verfijnt de query als hij denkt dat de opgehaalde documenten de vraag niet kunnen beantwoorden.
  5. Op basis van de verfijnde query wordt het proces herhaald totdat de agent tevreden is met zowel de opgehaalde documenten als de herformuleerde query.
  6. De uiteindelijke context wordt vervolgens doorgegeven aan het LLM om het antwoord te genereren.

Om de agentische lus in uw RAG-pijplijn te implementeren, heeft u verschillende opties, zoals frameworks als Crew AI, Auto of LangGraph van LangChain. In dit geval gebruiken we Transformers Agents, een minder bekende functie binnen het Transformers-pakket waarmee u uw eigen agenten kunt maken.

Eerst moeten we de vereiste pakketten installeren, waaronder pandas, LangChain, het LangChain Community-pakket, het Sentence Transformer-pakket en het Transformers-pakket. Vervolgens importeren we de benodigde modules en stellen we de gegevens in, inclusief het opdelen van de documenten in stukken en het maken van embeddings.

Vervolgens maken we een ophaalgereedschap dat de agent kan gebruiken om relevante documenten uit de kennisbank op te halen. We stellen ook het LLM in, in dit geval met behulp van de OpenAI-engine.

Tenslotte maken we de agent zelf, die toegang heeft tot het ophaalgereedschap en het LLM, evenals een systeemprompt die het gedrag van de agent stuurt. We laten de agent vervolgens door de agentische lus lopen om antwoorden op voorbeeldvragen te genereren en vergelijken de resultaten met een standaard RAG-pijplijn.

De agentische RAG-aanpak maakt robuustere en uitgebreidere antwoorden mogelijk door de agent in staat te stellen de query te verfijnen en de meest relevante informatie op te halen, wat leidt tot antwoorden van betere kwaliteit van het LLM.

Een Retrievaltool Creëren

Om een ophaalgereedschap voor de agentische RAG-pijplijn te maken, definiëren we een RetrievalTool-klasse met de volgende structuur:

class RetrievalTool:
    """Using semantic similarity, retrieves some documents from the knowledge base that have the closest embeddings to the input."""

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

    def __call__(self, query: str) -> List[str]:
        """
        Retrieve up to 7 most similar chunks from the vector DB for the given query.
        
        Args:
            query (str): A query to perform retrieval on. This should be semantically close to the target documents.
        
        Returns:
            List[str]: A list of up to 7 most similar chunks from the vector DB.
        """
        results = self.vector_db.similarity_search(query, k=7)
        return [chunk.page_content for chunk in results]

De RetrievalTool-klasse neemt een vector_db-object als invoer, wat de vectoropslag (bijv. Faiss, Chroma, Pinecone) is die wordt gebruikt om de documentembeddings op te slaan.

De __call__-methode van de klasse neemt een query-tekenreeks als invoer en retourneert een lijst van maximaal 7 meest vergelijkbare stukken uit de vectorDB. Het gebruikt de similarity_search-methode van het vector_db-object om de meest vergelijkbare stukken te vinden op basis van cosinus-similariteit.

Dit ophaalgereedschap kan vervolgens worden gebruikt als onderdeel van de agentische RAG-pijplijn, waarbij de agent de initiële query kan analyseren, deze kan verfijnen en deze door het ophaalgereedschap kan laten lopen om de meest relevante stukken uit de kennisbank op te halen.

Het Taalmodel Integreren

Om het taalmodel in de agentische RAG-pijplijn te integreren, moeten we het LLM instellen dat zowel door de agent als voor het genereren van het uiteindelijke antwoord zal worden gebruikt. We hebben twee opties:

  1. Met behulp van de Hugging Face-engine: Hiermee kunnen we rechtstreeks de API-eindpunten van verschillende LLM's aanroepen die beschikbaar zijn via de serverloze architectuur van Hugging Face. We kunnen modellen als Llama 38B of 70B gebruiken, maar deze vereisen meestal een Hugging Face Pro-abonnement.

  2. Met behulp van OpenAI: Voor dit voorbeeld gebruiken we de OpenAI-engine. Het proces kan worden aangepast om elk ander LLM in te stellen.

Om de OpenAI-engine in te stellen, maken we een klasse genaamd OpenAIEngine die de functies message_rle en gpt_generate_message_list uit de Transformer Agents LLM-engine gebruikt. Deze klasse verwerkt het opschonen van de invoerberichten en gebruikt het OpenAI chat completion-eindpunt om antwoorden te genereren.

Vervolgens maken we de eigenlijke agent. De agent heeft toegang tot het eerder gemaakte ophaalgereedschap, het LLM dat we willen gebruiken (in dit geval de OpenAIEngine) en het maximale aantal iteraties dat we willen dat de agent uitvoert voordat de agentische lus stopt.

We geven de agent ook een systeemprompt, die hem instructies geeft over hoe hij de informatie in de kennisbank moet gebruiken om een uitgebreid antwoord op de vraag van de gebruiker te geven. De prompt moedigt de agent aan om het ophaalproces met verschillende queries opnieuw uit te voeren als hij de benodigde informatie niet kan vinden.

Met de agent en het LLM ingesteld, kunnen we nu de agentische lus uitvoeren om vragen van gebruikers te beantwoorden. De agent zal de query iteratief verfijnen, relevante informatie uit de kennisbank ophalen en een uiteindelijk antwoord genereren met behulp van het LLM. Deze aanpak leidt tot meer gedetailleerde en relevante antwoorden in vergelijking met een standaard RAG-pijplijn.

De Agentische Agent Implementeren

Om de agentische agent te implementeren, gebruiken we de Transformers Agents-functie binnen het Transformers-pakket. Dit biedt een modulaire en duidelijke aanpak voor het maken van aangepaste agenten.

Eerst moeten we de vereiste pakketten installeren, waaronder pandas, Langchain, het Langchain Community-pakket, Sentence Transformers en de Transformers Agents.

Vervolgens importeren we de benodigde modules en pakketten. We gebruiken de ReactJsonAgent, bouwen aangepaste tools voor de agent en maken gebruik van de Hugging Face-engine voor het taalmodel.

Om de RAG-pijplijn op te bouwen, beginnen we met een dataset met de Hugging Face-documentatie. We splitsen de documenten in stukken en maken embeddings met behulp van het GTE-small-model. Vervolgens verwijderen we eventuele dubbele stukken en slaan we de unieke stukken op in een op F gebaseerde vectoropslag.

Nu introduceren we de agent in het geheel. We maken een RetrievalTool die gebruik maakt van semantische similariteit om de meest relevante stukken uit de kennisbank op te halen op basis van de gebruikersquery.

We stellen ook het taalmodel in, in dit geval met behulp van de OpenAI-engine met het GPT-4-model.

De agent wordt vervolgens gemaakt, met toegang tot het ophaalgereedschap en het taalmodel. We geven ook het maximale aantal iteraties op dat de agent mag uitvoeren om de query en de opgehaalde context te verfijnen.

De agent krijgt een systeemprompt die hem ertoe aanzet de kennisbank te gebruiken om een uitgebreid antwoord op de vraag van de gebruiker te geven. De agent doorloopt vervolgens een iteratief proces, waarbij hij de query herformuleert en meer relevante informatie ophaalt totdat hij tevreden is met het antwoord.

De agentische RAG-pijplijn wordt vervolgens vergeleken met een standaard RAG-pijplijn, waarbij wordt aangetoond hoe de op agent gebaseerde aanpak meer gedetailleerde en relevante antwoorden kan opleveren, vooral wanneer de initiële query van de gebruiker niet goed is geformuleerd.

Standaard RAG en Agentische RAG Vergelijken

De belangrijkste verschillen tussen standaard RAG en agentische RAG zijn:

  1. Query-herformulering: In standaard RAG wordt de gebruikersquery rechtstreeks doorgegeven aan de op semantiek gebaseerde similariteitszoekactie om relevante stukken uit de kennisbank op te halen. In agentische RAG analyseert een agent de initiële query en kan deze herformuleren om het ophaalproces te verbeteren.

  2. Iteratieve verfijning: Agentische RAG stelt de agent in staat de query en de opgehaalde context iteratief te verfijnen. Als de agent niet tevreden is met de initiële ophaling, kan hij het proces herhalen met een verfijnde query om betere resultaten te krijgen.

  3. Bondige en relevante antwoorden: De agentische aanpak genereert over het algemeen bondiger en relevantere antwoorden in vergelijking met standaard RAG. Het vermogen van de agent om de query en de opgehaalde context te analyseren, helpt hem een uitgebreider antwoord te geven.

  4. Omgaan met slecht geformuleerde queries: Agentische RAG is beter uitgerust om gevallen aan te pakken waarin de gebruikersquery niet goed is geformuleerd. De agent kan de beperkingen van de initiële query herkennen en werken aan het herformuleren ervan, wat leidt tot betere ophaling en informatievere antwoorden.

  5. Flexibiliteit en aanpasbaarheid: Agentische RAG biedt meer flexibiliteit en aanpasbaarheid, aangezien de agent kan worden uitgerust met verschillende tools en mogelijkheden om te voldoen aan de specifieke behoeften van de toepassing.

Samenvattend introduceert agentische RAG een extra laag van intelligentie en controle, waardoor het systeem beter in staat is de bedoeling van de gebruiker te begrijpen, het ophaalproces te verfijnen en meer gerichte en informatieve antwoorden te genereren, zelfs wanneer de initiële query niet optimaal is.

Conclusie

De introductie van agenten in de Retrieval Augmented Generation (RAG)-pijplijn kan de kwal

FAQ