Grote taalmodellen (LLM’s) zoals OpenAI GPT, Google BERT en Meta LLaMA veranderen elke sector dankzij hun vermogen om bijna elke gewenste tekst te genereren, van marketingcopy tot datasciencecode tot poëzie. Hoewel ChatGPT de meeste aandacht heeft gekregen dankzij de intuïtieve chatinterface, zijn er nog veel meer mogelijkheden om LLM’s te benutten door ze in andere software te integreren.
Zo bevat DataLab een AI-assistent waarmee je de code en tekst in je analyse kunt schrijven of verbeteren, en bevatten de interactieve cursussen van DataCamp een functie “leg mijn fout uit” die helpt te begrijpen waar je een fout hebt gemaakt. Deze functies draaien op GPT en worden benaderd via de OpenAI API.
LangChain biedt een framework boven op verschillende API’s voor LLM’s. Het is ontworpen om softwareontwikkelaars en data-engineers productiever te maken bij het opnemen van LLM-gebaseerde AI in hun applicaties en datapijplijnen.
Deze tutorial legt uit welke problemen LangChain oplost en wat de belangrijkste use-cases zijn, zodat je begrijpt waarom en waar je het gebruikt. Het is handig om eerst het basisidee van een LLM te kennen. De tutorial How NLP is Changing the Future of Data Science is een goede plek om je kennis op te frissen.
Welke problemen lost LangChain op?
Er zijn grofweg twee workflows om met LLM’s te werken.
- “Chatten” houdt in dat je een prompt schrijft, die naar de AI stuurt en een tekstueel antwoord terugkrijgt.
- “Embedden” houdt in dat je een prompt schrijft, die naar de AI stuurt en een numerieke array als antwoord terugkrijgt.
Zowel de chat- als de embedding-workflow kent problemen die LangChain probeert aan te pakken.
Prompts staan vol boilerplate-tekst
Een van de problemen bij zowel chatten als embedden is dat een goede prompt meer vergt dan alleen het definiëren van een taak. Je moet ook de persoonlijkheid en schrijfstijl van de AI beschrijven en instructies opnemen om feitelijke nauwkeurigheid te bevorderen. Je zou bijvoorbeeld een simpele prompt kunnen schrijven die een taak beschrijft:
Write an outline for a 500-word blog post targeted at teenagers about the health benefits of doing yoga.
Maar om een goed antwoord te krijgen, moet je eerder zoiets schrijven als:
You are an expert sports scientist. Your writing style is casual but terse.
Write an outline for a 500-word blog post targeted at teenagers about the health benefits of doing yoga.
Only include factually correct information. Explain your reasoning.
Veel van deze boilerplate in de prompt is telkens hetzelfde. Idealiter schrijf je die tekst één keer, waarna die automatisch wordt opgenomen in de prompts waarvoor je dat wilt.
LangChain lost het probleem van boilerplate-tekst in prompts op met prompttemplates. Die combineren de nuttige invoer van de prompt (in dit geval de tekst over het schrijven van een blogpost over yoga) met de boilerplate (de schrijfstijl en het verzoek om feitelijk correcte informatie).
Antwoorden zijn ongestructureerd
In chatworkflows is het antwoord van het model gewoon tekst. Maar als de AI in software wordt gebruikt, is het vaak wenselijk om gestructureerde output te hebben waartegen je kunt programmeren. Als het doel bijvoorbeeld is om een dataset te genereren, wil je het antwoord in een specifiek formaat zoals CSV of JSON.
Als je ervan uitgaat dat je een prompt kunt schrijven waarmee de AI consistent antwoordt in een geschikt formaat, heb je een manier nodig om die output te verwerken. LangChain biedt hiervoor outputparser-tools.
Wisselen tussen LLM’s is lastig
Hoewel GPT enorm succesvol is, zijn er heel veel andere LLM’s beschikbaar. Als je rechtstreeks tegen de API van één bedrijf programmeert, leg je je software vast in dat ecosysteem. Het is goed denkbaar dat je na het bouwen van AI-functies op GPT tot de conclusie komt dat sterkere meertalige mogelijkheden nodig zijn voor je product. Dan wil je misschien overstappen naar Polyglot of van een AI gebruiken naar een AI in je product opnemen en heb je een compacter model nodig zoals StableLM van Stability AI.
LangChain biedt een LLM-klasse, en dankzij deze abstractie is het veel eenvoudiger om van het ene model naar het andere te wisselen of zelfs meerdere modellen binnen je software te gebruiken.
LLM’s hebben een kort geheugen
De reactie van een LLM wordt gegenereerd op basis van het eerdere gesprek (zowel de prompts van de gebruiker als de eerdere antwoorden). LLM’s hebben echter een vrij kort geheugen. Zelfs de state-of-the-art GPT-4 heeft standaard een geheugen van 8.000 tokens (ongeveer 6.000 woorden).
In een chatworkflow kunnen de antwoorden van de AI inconsistent worden als het gesprek de geheugengrens overschrijdt (omdat het zich het begin van het gesprek niet meer herinnert). Chatbots zijn een voorbeeld waar dit problematisch kan zijn. Idealiter onthoudt de chatbot het hele gesprek met de klant om tegenstrijdige informatie te voorkomen.
LangChain lost het geheugenprobleem op met tools voor chatberichtgeschiedenis. Daarmee kun je eerdere berichten opnieuw aan de LLM voeren om het te herinneren waarover het ging.
LLM-gebruik integreren in pijplijnen is lastig
Als AI wordt gebruikt in datapijplijnen of softwareapplicaties, is de AI vaak slechts één onderdeel van een grotere functionaliteit. Je wilt bijvoorbeeld data uit een database ophalen, die naar de LLM sturen, vervolgens het antwoord verwerken en het resultaat aan een ander systeem voeren.
LangChain biedt tooling voor pipeline-achtige workflows via chains en agents. Chains zijn eenvoudige objecten die in essentie meerdere componenten aaneenrijgen (voor lineaire pijplijnen). Agents zijn geavanceerder en laten je via bedrijfslogica bepalen hoe componenten moeten samenwerken. Je kunt bijvoorbeeld conditionele logica gebruiken op basis van de output van een LLM om te beslissen wat de volgende stap is.
Data aan de LLM doorgeven is lastig
Door het tekstgebaseerde karakter van LLM’s is het vaak niet helemaal duidelijk hoe je data aan het model doorgeeft. Het probleem bestaat uit twee delen.
Ten eerste moet je data opslaan in een formaat waarmee je kunt bepalen welke delen van de dataset naar de LLM worden gestuurd. (Voor rechthoekige datasets zoals een DataFrame of SQL-tabel wil je doorgaans rij voor rij data sturen.)
Ten tweede moet je bepalen hoe je die data in de prompt opneemt. De eenvoudigste aanpak is om de dataset simpelweg in de prompt op te nemen (“prompt stuffing”), maar er zijn meer geavanceerde opties.
LangChain lost het eerste deel op met indexen. Die bieden functionaliteit om data te importeren uit databases, JSON-bestanden, pandas DataFrames, CSV-bestanden en andere formaten, en ze op te slaan in een formaat dat geschikt is om rij-voor-rij aan een LLM aan te bieden.
LangChain biedt index-gerelateerde chains om het tweede deel van het probleem op te lossen en heeft klassen voor vier technieken om data aan de LLM door te geven.
Prompt stuffing plaatst de hele dataset in de prompt. Het is heel eenvoudig, maar werkt alleen bij kleine datasets.
Map-reduce splitst de data in stukken, roept de LLM aan met een initiële prompt op elk stuk data (het “map”-gedeelte), en roept de LLM daarna opnieuw aan met een andere prompt die de antwoorden uit de eerste ronde bevat. Dit is geschikt wanneer je zou denken aan een “group by”-opdracht.
Refine is een iteratieve aanpak in Bayesian-stijl, waarbij je een prompt op het eerste datastuk uitvoert en voor elk extra stuk een prompt gebruikt die de LLM vraagt het resultaat te verfijnen op basis van de nieuwe data. Deze aanpak werkt goed als je het antwoord wilt laten convergeren naar een specifiek resultaat.
Map-rerank is een variant op map-reduce. Het eerste deel is hetzelfde: de data in stukken splitsen en op elk stuk een prompt draaien. Het verschil is dat je de LLM vraagt om een vertrouwensscore voor het antwoord, zodat je de uitkomsten kunt rangschikken. Deze aanpak werkt goed voor aanbevelingstaken waarbij het resultaat één “beste” antwoord is.
Welke programmeertalen ondersteunt LangChain?
LangChain is te gebruiken vanuit JavaScript via het langchain-nodepakket. Dit is geschikt om AI in webapplicaties in te bouwen.
Het is ook te gebruiken vanuit Python via het langchain-pakket (PyPI, conda). Dit is geschikt om AI op te nemen in datapijplijnen of Python-gebaseerde software.
Wat zijn de belangrijkste use-cases van LangChain?
LangChain is te gebruiken waar je ook een LLM zou willen inzetten. Hier behandelen we enkele datagerelateerde voorbeelden en lichten we toe welke LangChain-functies relevant zijn.
Datasets bevragen met natuurlijke taal
Een van de meest ingrijpende use-cases van LLM’s voor data-analyse is de mogelijkheid om SQL-queries (of gelijkwaardige Python- of R-code) te schrijven met natuurlijke taal. Dit maakt verkennende data-analyse toegankelijk voor mensen zonder codeerervaring.
Er zijn verschillende varianten van de workflow. Bij kleine datasets kun je de LLM de resultaten direct laten genereren. Dit houdt in dat je de data in een geschikt formaat laadt met de documentloaders van LangChain, de data via index-gerelateerde chains aan de LLM doorgeeft en het antwoord met een outputparser verwerkt.
Vaker geef je details over de datastructuur (zoals tabelnamen, kolomnamen en -typen, en bijvoorbeeld welke kolommen ontbrekende waarden hebben) door aan de LLM en vraag je om SQL/Python/R-code. Daarna voer je de resulterende code uit. Deze flow is eenvoudiger, omdat je geen data hoeft door te geven, al blijft LangChain nuttig doordat het de stappen kan moduleren.
Een andere variant is een tweede aanroep naar de LLM om de resultaten te laten interpreteren. Dit type workflow met meerdere LLM-aanroepen is waar LangChain echt helpt. In dit geval kun je de tools voor chatberichtgeschiedenis gebruiken om te waarborgen dat de interpretatie van de resultaten consistent is met de eerder aangeleverde datastructuur.
Werken met API’s
Voor datagebruikscases zoals het bouwen van een datapijplijn is het opnemen van AI uit een LLM vaak onderdeel van een langere workflow met andere API-calls. Je wilt bijvoorbeeld een API gebruiken om beursdata op te halen of te communiceren met een cloudplatform.
De chain- en agentfuncties van LangChain, die je deze stappen in volgorde laten koppelen (en extra bedrijfslogica voor vertakkende pijplijnen bieden), zijn ideaal voor deze use-case.
Een chatbot bouwen
Chatbots zijn een van de populairste AI-use-cases, en generatieve AI biedt veel perspectief voor chatbots die realistischer gedrag vertonen. Het kan echter lastig zijn om de persoonlijkheid van de chatbot te sturen en te zorgen dat hij de context van het gesprek onthoudt.
De prompttemplates van LangChain geven je controle over zowel de persoonlijkheid van de chatbot (toon en communicatiestijl) als over de antwoorden die hij geeft.
Daarnaast zijn de tools voor berichtgeschiedenis handig om de chatbot een geheugen te geven dat langer is dan de paar honderd of duizend woorden die LLM’s standaard bieden, wat zorgt voor meer consistentie binnen een gesprek of zelfs over meerdere gesprekken heen.
Andere toepassingen
Deze tutorial raakt slechts het topje van de ijsberg. Er zijn nog veel meer use-cases van LLM’s voor dataprofessionals. Of je nu een persoonlijke assistent wilt maken, rapporten wilt samenvatten of vragen over ondersteuningsdocumentatie of een knowledge base wilt beantwoorden: LangChain biedt een framework om AI op te nemen in elke datapijplijn of data-applicatie die je maar kunt bedenken.
Ga een stap verder
Er komt binnenkort content over LangChain naar DataCamp. In de tussentijd kun je meer leren over een van de hier besproken use-cases met de cursus Building Chatbots in Python.
