Fabrice AI: de technische reis

Zoals ik in het vorige bericht al zei, bleek het ontwikkelen van Fabrice AI veel complexer dan verwacht, waardoor ik veel verschillende benaderingen moest verkennen.

De eerste benadering: Lama-index – Vectorzoeken

Mijn eerste stap in het verbeteren van de opzoekmogelijkheden van Fabrice AI betrof het gebruik van de Llama Index voor vectorzoeken. Het concept was simpel: neem de inhoud van mijn blog, zet het om in Langchain documenten en zet deze vervolgens om in Llama documenten. Deze Llama-documenten zouden dan worden opgeslagen in een vectorindex, zodat ik deze index kon doorzoeken naar relevante informatie.

Toen ik het systeem begon te testen, werd het echter duidelijk dat deze aanpak niet de resultaten opleverde waarop ik had gehoopt. Met name toen ik het systeem om contextvragen vroeg zoals “Wat zijn de grootste fouten die oprichters van een marktplaats maken?”, gaf de AI geen zinvolle antwoorden. In plaats van de genuanceerde inhoud op te halen waarvan ik wist dat die in de gegevens zat, gaf het irrelevante of onvolledige antwoorden.

Deze eerste mislukking leidde ertoe dat ik mijn aanpak heroverwoog. Ik realiseerde me dat het simpelweg opslaan van inhoud in een vector-index niet genoeg was; het opvraagmechanisme moest de context en nuances van de gestelde vragen begrijpen. Dit besef was de eerste van vele lessen die de evolutie van Fabrice AI zouden vormen.

Kennis opslaan: MongoDB documentopslag en -herwinning

Met de beperkingen van de Llama Index benadering in gedachten, onderzocht ik vervolgens de opslag van de Llama documenten in MongoDB. Het flexibele schema en de documentgeoriënteerde structuur van MongoDB leken een veelbelovende oplossing voor het beheren van de verschillende soorten inhoud die ik in de loop der jaren had verzameld.

Het plan was om een meer dynamische en responsieve zoekervaring te creëren. Deze aanpak stuitte echter al snel op problemen. De zoekfunctionaliteit, waarvan ik had verwacht dat deze robuuster zou zijn, presteerde niet zoals verwacht. Query’s die relevante documenten hadden moeten opleveren, leverden in plaats daarvan geen resultaten of irrelevante inhoud op.

Deze tegenslag was frustrerend, maar onderstreepte ook een belangrijke les: de opslagmethode is net zo belangrijk als de zoekstrategie. Ik begon andere opties te overwegen, zoals het gebruik van MongoDB Atlas voor vectorzoekopdrachten, die mogelijk de precisie en schaalbaarheid konden bieden die ik nodig had. Maar voordat ik me vastlegde op dit alternatief, wilde ik andere benaderingen onderzoeken om te bepalen of er een effectievere oplossing was.

Metadata Retriever en Vectoropslag: Op zoek naar specificiteit

Een van de volgende mogelijkheden die ik onderzocht was het gebruik van een metadata retriever gecombineerd met een vector store. Het idee achter deze aanpak was om de enorme hoeveelheid informatie binnen Fabrice AI te categoriseren en vervolgens antwoorden op te halen op basis van deze categorieën. Door de data te structureren met metadata hoopte ik de AI beter in staat te stellen om specifieke, gerichte antwoorden te geven.

Toch had deze methode ook zijn beperkingen. Hoewel het aan de oppervlakte veelbelovend leek, had de AI moeite om accurate antwoorden te geven op alle soorten vragen. Toen ik bijvoorbeeld vroeg: “Is de auteur optimistisch?”, kon het systeem de vraag niet interpreteren in de context van de relevante inhoud. Het systeem slaagde er niet in om de vraag te interpreteren in de context van de relevante inhoud. In plaats van een inzichtelijke analyse te geven op basis van de metadata, gaf het vage of geen antwoorden.

Deze aanpak leerde me een waardevolle les over het belang van context in AI. Het is niet genoeg om informatie simpelweg te categoriseren; de AI moet ook begrijpen hoe deze categorieën op elkaar inwerken en elkaar overlappen om een samenhangend begrip van de inhoud te vormen. Zonder dit diepgaande begrip kunnen zelfs de meest geavanceerde zoekmethoden tekortschieten.

Kennis structureren: De SummaryTreeIndex

Terwijl ik Fabrice AI verder verfijnde, experimenteerde ik met het maken van een SummaryTreeIndex. Deze aanpak was erop gericht om alle documenten samen te vatten in een boomvorm, zodat de AI door deze samenvattingen kon navigeren en relevante informatie kon ophalen op basis van de structuur van de inhoud.

Het idee was dat door de documenten samen te vatten, de AI snel belangrijke punten kon identificeren en vragen kon beantwoorden met beknopte, accurate informatie. Deze methode had echter ook te maken met grote uitdagingen. De AI had moeite om zinvolle antwoorden te geven op complexe vragen, zoals “Hoe neem ik belangrijke beslissingen in het leven?”. In plaats van te putten uit de rijke, genuanceerde inhoud die was opgeslagen in de samenvattingen, waren de antwoorden van de AI vaak oppervlakkig of onvolledig.

Deze ervaring onderstreepte hoe moeilijk het is om een evenwicht te vinden tussen breedte en diepte in AI. Samenvattingen kunnen een overzicht op hoog niveau bieden, maar missen vaak de gedetailleerde context die nodig is om complexere vragen te beantwoorden. Ik realiseerde me dat elke effectieve oplossing zowel gedetailleerde inhoud als samenvattingen op hoog niveau zou moeten integreren, zodat de AI uit beide kan putten als dat nodig is.

Daarom laat ik in de versie van Fabrice AI die nu live is, de AI eerst een samenvatting van het antwoord geven, voordat hij meer in detail treedt.

De horizon verbreden: Index kennisgrafiek

Omdat ik de beperkingen van de vorige methoden inzag, ben ik overgestapt op een meer geavanceerde benadering: de Knowledge Graph Index. Deze aanpak bestond uit het construeren van een kennisgrafiek uit ongestructureerde tekst, waardoor de AI entiteitsgebaseerde zoekopdrachten kon uitvoeren. Het doel was om een dynamischer en meer samenhangend begrip van de inhoud te creëren, waardoor Fabrice AI in staat zou zijn om complexe, contextgevoelige vragen effectiever te beantwoorden.

Ondanks de belofte had de Knowledge Graph Index ook te kampen met aanzienlijke obstakels. De AI had moeite met het produceren van nauwkeurige resultaten, vooral voor zoekopdrachten die een diep begrip van de context vereisten. Op de vraag “Wat zijn eerlijke Seed & Series A waarderingen?” kon de AI bijvoorbeeld opnieuw geen relevant antwoord geven, wat duidelijk maakt hoe moeilijk het is om ongestructureerde tekst te integreren in een coherente kennisgrafiek.

Hoewel deze aanpak uiteindelijk niet succesvol was, leverde het belangrijke inzichten op in de uitdagingen van het gebruik van kennisgrafieken in AI. De complexiteit van de gegevens en de behoefte aan precieze context betekende dat zelfs een goed opgebouwde kennisgrafiek moeite had om de gewenste resultaten te leveren. Een ander nadeel van de Knowledge Graph Index was de trage snelheid. De responstijd om gerelateerde documenten op te halen was erg hoog in vergelijking met een vector store index.

De gegevens opnieuw evalueren: Tweelingen

Na een aantal tegenslagen besloot ik het anders aan te pakken door gebruik te maken van Google’s AI, Gemini. Het idee was om datasets te maken van JSON-CSV bestanden en vervolgens een aangepast model LLM te trainen met deze gegevens. Ik hoopte dat ik door het gebruik van gestructureerde gegevens en een robuust trainingsmodel een aantal van de uitdagingen die eerdere pogingen hadden geplaagd, kon overwinnen.

Deze aanpak stuitte echter ook op problemen. Het trainingsproces werd stopgezet vanwege onjuiste gegevensopmaak, waardoor het model niet effectief kon worden getraind. Deze tegenslag onderstreepte het belang van gegevensintegriteit bij AI-training. Zonder goed geformatteerde en gestructureerde gegevens kunnen zelfs de meest geavanceerde modellen niet naar verwachting presteren.

Door deze ervaring ben ik gaan nadenken over de mogelijkheden om BigQuery te gebruiken om JSON-gegevens op te slaan, wat een schaalbaarder en betrouwbaarder platform biedt voor het beheren van de grote datasets die nodig zijn om Fabrice AI effectief te trainen.

Sterke punten combineren: Langchain-documenten met Pinecone

Ondanks de uitdagingen tot nu toe, was ik vastbesloten om een oplossing te vinden waarmee Fabrice AI effectief kennis zou kunnen opslaan en ophalen. Deze vastberadenheid leidde ertoe dat ik ging experimenteren met Langchain-documenten en Pinecone. De aanpak bestond uit het creëren van een Pinecone vectoropslag met behulp van Langchain-documenten en OpenAI embeddings, en vervolgens het ophalen van de meest vergelijkbare documenten op basis van de zoekopdracht.

Deze methode bleek veelbelovend, vooral wanneer de zoekopdracht de titel van het document bevatte. Als er bijvoorbeeld werd gevraagd: “Wat is de sleutel tot geluk?”, kon de AI de relevante inhoud nauwkeurig ophalen en samenvatten. Er waren echter nog steeds beperkingen, vooral wanneer de zoekopdracht geen specifieke trefwoorden of titels bevatte.

Deze aanpak toonde het potentieel aan van het combineren van verschillende technologieën om de prestaties van AI’s te verbeteren. Door Langchain-documenten te integreren met de vectoropslag van Pinecone kon ik de relevantie en nauwkeurigheid van de antwoorden van de AI verbeteren, zij het met enkele beperkingen.

Consistentie bereiken: GPT bouwer OpenAI

Na het verkennen van verschillende methoden en technologieën, wendde ik me tot Open AI’s GPT Builder om de kennis die was opgeslagen binnen Fabrice AI te consolideren en te verfijnen. Door alle inhoud te uploaden naar een GPT-kennisbank, wilde ik een consistenter en betrouwbaarder platform creëren voor het ophalen en gebruiken van mijn kennis.

Deze aanpak bleek een van de meest succesvolle, waarbij de AI in staat was om betere resultaten te leveren bij een reeks van zoekopdrachten. De sleutel tot dit succes was de integratie van alle kennis in één samenhangend systeem, zodat de AI bij het beantwoorden van vragen uit de volledige inhoud kon putten.

Zoals vermeld in mijn vorige post, kon ik het niet draaiende krijgen op mijn website, en het was alleen beschikbaar voor betaalde abonnees van Chat GPT, wat ik te beperkend vond. En hoewel het beter was, hield ik nog steeds niet van de kwaliteit van de antwoorden en voelde ik me er niet prettig bij om het vrij te geven aan het publiek.

Laatste verfijning: GPT-assistenten met model 4o

Het laatste stukje van de puzzel bij de ontwikkeling van Fabrice AI kwam met de introductie van GPT-assistenten met behulp van Model 4o. Deze aanpak vertegenwoordigde het hoogtepunt van alles wat ik tijdens het project had geleerd. Door gebruik te maken van een vector database en het verfijnen van de prompts, streefde ik naar het hoogst mogelijke niveau van nauwkeurigheid en contextueel begrip in de antwoorden van de AI.

Deze methode bestond uit het uploaden van alle kennis die ik had verzameld in een vector database, die vervolgens werd gebruikt als basis voor de interacties van de AI. Met de vector database kon de AI geavanceerdere zoekopdrachten uitvoeren, waarbij informatie werd opgehaald op basis van de semantische betekenis van zoekopdrachten in plaats van alleen te vertrouwen op het matchen van trefwoorden. Dit betekende een aanzienlijke vooruitgang ten opzichte van eerdere benaderingen, waardoor de AI complexe, genuanceerde vragen beter kon begrijpen en beantwoorden.

Een van de belangrijkste innovaties van deze aanpak was het zorgvuldig verfijnen van de prompts. Door zorgvuldig verschillende prompts te maken en te testen, kon ik de AI sturen in de richting van nauwkeurigere en relevantere antwoorden. Dit hield niet alleen in dat ik de formulering van de prompts moest aanpassen, maar ook dat ik moest experimenteren met verschillende manieren om de vragen te structureren om de best mogelijke antwoorden te krijgen.

De resultaten waren indrukwekkend. De AI was nu in staat om een breed scala aan zoekopdrachten met hoge nauwkeurigheid te verwerken, zelfs als de vragen open waren of een diep begrip van de context vereisten. Bijvoorbeeld, op de vraag “Hoe maak je de belangrijkste beslissingen in je leven?” gaf de AI een uitgebreid en inzichtelijk antwoord. gaf de AI een uitgebreid en inzichtelijk antwoord, waarbij hij putte uit verschillende bronnen en perspectieven om een goed afgerond antwoord te geven.

Dit succes was het hoogtepunt van honderden uren werk en talloze experimenten. Het toonde aan dat het met de juiste combinatie van technologie en verfijning mogelijk was om een AI te maken die niet alleen effectief informatie kon opslaan en ophalen, maar er ook op een zinvolle manier mee om kon gaan. De ontwikkeling van GPT Assistants met behulp van Model 4o markeerde het punt waarop Fabrice AI echt tot zijn recht kwam en het niveau van verfijning en nauwkeurigheid bereikte dat ik vanaf het begin voor ogen had. De GPT Assistants API werd vervolgens geïntegreerd in mijn blog om eindgebruikers in staat te stellen te communiceren met Fabrice AI op de manier zoals je het nu ziet op de blog.

Reflecteren op de reis

Het ontwikkelingsproces van Fabrice AI heeft de complexiteit van het werken met AI duidelijk gemaakt, vooral als het gaat om het begrijpen en contextualiseren van informatie. Het heeft me geleerd dat er geen sluiproutes zijn in de ontwikkeling van AI – elke stap, elke iteratie en elk experiment is een noodzakelijk onderdeel van de reis naar het creëren van iets dat echt effectief is.

Vooruitkijkend ben ik enthousiast om Fabrice AI verder te verfijnen en uit te breiden. Zoals vermeld in de vorige post, zal ik de gestelde vragen herzien om de kennisbank aan te vullen waar er hiaten zijn. Ik hoop uiteindelijk ook een interactieve versie uit te brengen die eruitziet en klinkt als ik en waarmee je kunt praten.