Hoe bouw je een Retrieval Augmented Generation (RAG)
Disclaimer: dit artikel wordt voorgelezen door AI.
Wat als je de kracht van grote taalmodellen zou kunnen combineren met informatie uit je eigen bestanden en databases? Dat is nu mogelijk dankzij Retrieval Augmented Generation (RAG). Je kunt vragen stellen aan RAG, net zoals je dat doet aan ChatGPT. Vervolgens haalt het systeem het antwoord niet alleen uit de input van GPT-4, maar ook uit de documenten en data die je er zelf in hebt gestopt.
Dat opent opeens een wereld aan mogelijkheden, waar ook veel organisaties van kunnen profiteren. Een RAG-systeem kan namelijk zeer specifieke en feitelijke antwoorden geven als het toegang heeft tot een betrouwbare kennisbasis. Een RAG-systeem kan worden gepersonaliseerd voor een specifieke organisatie door het te voeden met interne documenten en data. Dit maakt het mogelijk om geautomatiseerde antwoorden te geven op veelvoorkomende vragen.
Hoe werkt RAG?
Een RAG-systeem bestaat uit een taalmodel en een vector database. Het taalmodel is getraind op een enorme hoeveelheid tekst en kan daardoor natuurlijke taal begrijpen en genereren. De vector database is een gespecialiseerde database waarin de relevante documenten en informatie worden opgeslagen in de vorm van ‘embeddings’ – compacte numerieke representaties van de inhoud. Elk stukje tekst (bijvoorbeeld een alinea of een pagina) wordt omgezet naar een vector van getallen die de betekenis van de tekst vastlegt. Wanneer een gebruiker een vraag stelt, wordt deze vraag ook omgezet naar een vector. Door de overeenkomst tussen de vector van de vraag en de vectoren in de database te berekenen, kunnen de meest relevante passages worden geselecteerd.
Tot slot is er custom code nodig om de verschillende componenten met elkaar te laten samenwerken. Deze code regelt de communicatie tussen de gebruikersinterface (waar de vraag wordt ingevoerd), het taalmodel en de vector database. Ook bevat deze code vaak extra logica om de prestaties te optimaliseren, bijvoorbeeld door de geselecteerde passages samen te vatten voordat ze naar het taalmodel worden gestuurd.
Uitdagingen bij het ontwikkelen van een RAG-systeem
Een belangrijke uitdaging bij het ontwikkelen van een RAG-systeem is het beperkte contextvenster van de huidige taalmodellen. Een model als GPT-3.5 kan maximaal 4096 tokens (ongeveer 3000 woorden) verwerken in één keer. Dit betekent dat er slimme manieren moeten worden bedacht om de meest relevante informatie te selecteren en compact samen te vatten.
Daarnaast kunnen de kosten van het gebruik van een RAG-systeem snel oplopen, afhankelijk van het aantal gebruikers en de complexiteit van de vragen. Het is daarom belangrijk om het systeem zo efficiënt mogelijk in te richten en goed te monitoren.
Drie manieren om RAG in te zetten
Er zijn grofweg drie verschillende manieren om RAG in te zetten. De meest laagdrempelige optie is om gebruik te maken van een ‘custom GPT’ via OpenAI of Microsoft Azure. Hierbij upload je je eigen documenten en trainingsdata naar de servers van OpenAI of Azure, waarna je via een API toegang krijgt tot je eigen taalmodel. Het voordeel hiervan is dat je snel kunt beginnen en niet zelf een infrastructuur hoeft op te zetten. Wel is het belangrijk om goed na te denken over de privacy en beveiliging van je data.
Een tweede optie is om te wachten tot er kant-en-klare SaaS-oplossingen op de markt komen die RAG-functionaliteiten bieden. Naarmate de technologie meer volwassen wordt, zullen er ongetwijfeld aanbieders komen die een volledig gemanaged RAG-platform aanbieden, vergelijkbaar met diensten als Algolia of Elastic voor zoekfunctionaliteit. Het voordeel hiervan is gemak: je hoeft zelf niets te bouwen of te beheren. Nadeel is dat je minder controle hebt over de functionaliteit en minder ruimte voor maatwerk.
De derde en meest bewerkelijke optie is om zelf een custom RAG-systeem te ontwikkelen op basis van open source-componenten. Voorbeelden hiervan zijn Hugging Face-transformers en Pinecone of Weaviate voor de vector database. Het ontwikkelen van een custom RAG geeft je de meeste flexibiliteit en controle, maar vereist wel de nodige technische expertise en ontwikkeltijd. Bovendien moet je zelf een infrastructuur opzetten en beheren, wat kostbaar kan zijn. Daar staat tegenover dat je het systeem helemaal kunt optimaliseren voor jouw use case en dat je gevoelige data binnen je eigen omgeving kunt houden.
Stappen in het ontwikkelen van een custom RAG
Welke stappen moet je doorlopen bij het ontwikkelen van een eigen RAG-systeem?
Het begint met het bepalen van de use case: zet op een rij wat je precies wil bereiken met het systeem en wie het gaat gebruiken. Op basis daarvan kun je de functionele en niet-functionele eisen opstellen, zoals de gewenste responstijd, de benodigde integraties en de verwachte hoeveelheid gebruikers.
Vervolgens moet er een keuze worden gemaakt voor het taalmodel en de infrastructuur: wordt het GPT-3.5, GPT-4 of een open source-alternatief zoals Mistral? En waar wordt het model gehost (lokaal, in de cloud of via een API)? Hierbij spelen factoren mee als kosten, schaalbaarheid en beveiliging.
De volgende stap is het verzamelen en voorbereiden van de content waarmee het RAG-systeem wordt gevoed. Dit kunnen interne documenten zijn, zoals productbeschrijvingen, FAQ’s en handleidingen, maar ook externe bronnen zoals wetenschappelijke artikelen of nieuwsberichten. Het is belangrijk om deze content goed te structureren en op te schonen, bijvoorbeeld door opmaak en metadata te verwijderen en een consistente terminologie te hanteren.
In de volgende fase moet de vector database worden gevuld. De verzamelde documenten moeten worden opgesplitst in kleinere eenheden (passages) en voor elke passage moet een embedding worden berekend met behulp van het taalmodel. Deze embeddings worden vervolgens opgeslagen in de vector database, samen met een verwijzing naar de oorspronkelijke tekst. Dit proces kan worden geoptimalisererd door te experimenteren met verschillende modellen en parameters voor het maken van de embeddings.
Als de vector database gevuld is, is het tijd om het RAG-systeem te testen. Dat begint met het definiëren van een set van realistische testvragen en het evalueren van de kwaliteit van de gegenereerde antwoorden. Op basis van de resultaten kan het systeem iteratief worden verbeterd, bijvoorbeeld door de prompts voor het taalmodel aan te passen, de selectie van passages te finetunen of extra content toe te voegen. Het is belangrijk om ook tijdens het gebruik in productie te blijven monitoren en regelmatig te updaten zodat het systeem actueel en relevant blijft.
Praktijkvoorbeeld: RAG bij Info Support
‘Ricardo’ is een voorbeeld van een RAG-systeem dat wij zelf ontwikkeld hebben en dat door collega’s wordt gebruikt. Het doel van Ricardo is om medewerkers te ondersteunen bij het beantwoorden van technische vragen en het schrijven van code.
Het Ricardo-systeem is gebaseerd op het GPT-3.5 taalmodel van OpenAI dat wordt aangevuld met een vector database gevuld met interne documentatie en codevoorbeelden. De gebruikersinterface is geïntegreerd in het chatplatform Slack, zodat medewerkers op een laagdrempelige manier vragen kunnen stellen.
Bij de ontwikkeling van Ricardo hebben we gekozen voor een iteratieve aanpak. We zijn begonnen met een proof of concept om te valideren dat het idee werkte en om buy-in te creëren binnen de organisatie. Vervolgens hebben we stap voor stap de functionaliteit uitgebreid en verbeterd op basis van feedback van gebruikers.
Een belangrijke les die we geleerd hebben, is het belang van een goede informatiestructuur en content-kwaliteit. In eerste instantie werden complete documenten in de vector database gestopt, maar dit leidde tot lange en soms irrelevante antwoorden. Door de documenten op te splitsen in kortere passages en ze te verrijken met metadata, verbeterde de kwaliteit van de antwoorden aanzienlijk.
Ondanks deze uitdagingen is Ricardo inmiddels wel een succes binnen Info Support. Het systeem wordt dagelijks gebruikt door honderden medewerkers en heeft geleid tot een significante tijdsbesparing en kwaliteitsverbetering. De volgende stappen zijn verdere uitbreiding van de content en integratie met andere interne systemen.
Naar verwachting zullen RAG-systemen in de toekomst steeds vaker worden ingezet door bedrijven en organisaties. Met de razendsnelle ontwikkeling van taalmodellen en de toenemende beschikbaarheid van data liggen er volop kansen om processen te automatiseren, kennis te ontsluiten en de klantervaring te verbeteren. Wellicht dat we over een paar jaar terugkijken op RAG als de logische volgende stap in de evolutie van zoekmachines en chatbots.