Belangrijke concepten en overwegingen voor ontwikkelaars die generatieve AI-oplossingen bouwen
Grote taalmodellen (LLM's) zijn geweldig, maar zelfs ze hebben hun beperkingen. Ontwikkelaars moeten deze beperkingen begrijpen, welke LLM's 'out-of-the-box' kunnen gebruiken en hoe ze kunnen worden aangepast om de beste resultaten te krijgen voor de generatieve AI-oplossingen die ze bouwen. In dit artikel worden verschillende uitdagingen en beperkende factoren beschreven, en worden veelvoorkomende manieren uitgelegd om deze uitdagingen te overwinnen en de controle te nemen over het proces voor het genereren van inhoud, ongeacht welk type generatieve AI-functies u in uw toepassing bouwt.
Technische uitdagingen bij het werken met LLM's
De belangrijkste uitdagingen of beperkingen waarmee u rekening moet houden bij het werken met LLM's:
Kennisbeperking : vanwege de hoge kosten van het trainen van een LLM is hun kennis beperkt tot waar ze op een bepaald moment op zijn getraind. Zonder invoegtoepassingen of andere accommodaties hebben ze geen toegang tot realtime informatie en hebben ze ook geen toegang tot persoonlijke gegevens.
Hallucinatie : een LLM maakt gebruik van statistische waarschijnlijkheden en een beetje willekeurigheid om informatie te genereren. Er zijn mechanismen om gegenereerde antwoorden te houden die zijn afgestemd op de intentie van de mens in de vragen die worden gesteld en de informatie waarop ze zijn getraind, maar het is mogelijk dat ze antwoorden maken die niet nauwkeurig zijn.
Transparantie : als gevolg van de manier waarop de modellen worden getraind, hebben ze geen toegang meer tot de basiskennis waarop ze zijn getraind. En zelfs als ze dat deden, is er geen garantie dat informatie waarheidsgetrouw was en in de eerste plaats geaard was. Bovendien is er geen verificatiestap om ervoor te zorgen dat het gegenereerde antwoord nauwkeurig is.
Geen domeinspecifieke kennis - Vergelijkbaar met 'kennisbezuiniging, als u persoonlijke informatie hebt, zoals interne bedrijfsdocumenten, is de LLM niet getraind op deze informatie en heeft daarom geen domeinspecifieke kennis.
Wat kunt u doen om de mogelijke uitdagingen of problemen met LLM's te beperken en de best mogelijke resultaten te krijgen om uw gebruikers en uw organisatie te helpen? Begin met het begrijpen van de manieren waarop u kunt aanvullen waar de LLM gegevens vandaan haalt.
Informatie over waar LLM's hun informatie krijgen
Een goed uitgangspunt voor het verkrijgen van de beste resultaten van een LLM is om te begrijpen waar of hoe LLM's hun informatie krijgen. De volgende categorieën vertegenwoordigen verschillende benaderingen voor de interactie van LLM's met verschillende informatiebronnen om antwoorden te genereren.
Retrieval-Off Generation (ROG): dit is de manier waarop LLM's op traditionele wijze werken, waarbij het model antwoorden genereert op basis van de kennis waarop het is getraind, zonder externe informatie te openen of op te halen tijdens het generatieproces. De kennis van het model is statisch, beperkt tot wat is opgenomen in de trainingsgegevens tot de grensdatum. Naast creatief schrijven kan het vragen beantwoorden over informatie die groot is op internet.
Ophalen-Augmented Generation (RAG): combineert de generatieve mogelijkheden van LLM's met de mogelijkheid om gegevens op te halen uit externe databases of documenten in realtime. Het model voert een query uit op een externe bron om relevante informatie te vinden, die vervolgens wordt gebruikt om het antwoord ervan te informeren. Met deze benadering kan het model nauwkeurigere en actuelere informatie bieden dan mogelijk is op basis van de vooraf getrainde kennis alleen. Gebruiksvoorbeelden omvatten feitencontrole, het beantwoorden van vragen op basis van realtime gegevens of privégegevens, domeinspecifieke gegevens.
Retrieval-Centric Generation (RCG) - Plaatst nog meer nadruk op de extern opgehaalde inhoud, waarbij vaak reacties worden gestructureerd rond de informatie die is opgehaald uit externe bronnen. Het model kan rechtstreeks grote segmenten van opgehaalde tekst opnemen in de uitvoer, bewerken of aantekeningen toevoegen aan de query van de gebruiker. Deze benadering kan worden gezien als een hybride methode tussen ophaalt en generatieve methoden, waarbij het evenwicht de informatie die wordt opgehaald over de eigen generatieve mogelijkheden van het model sterk kan bevorderen. Gebruiksvoorbeelden omvatten samenvatting van een langer document, onderzoeksondersteuning voor vergelijkingen en thematische verkenningen in meerdere vergelijkbare documenten, en het compileren of sorteren van verschillende bronnen van materiaal in een gecombineerde uitvoer.
Een goed voorbeeld van Retrieval-Off Generation (ROG) is ChatGPT. Copilot (via Bing) breidt de LLM daarentegen uit met behulp van externe bronnen uit nieuwsbronnen (en koppelingen naar deze bronnen).
Op het eerste gezicht klinkt het ophalen van augmented generation (RAG) en Retrieval-Centric Generation (RCG) vergelijkbaar omdat beide betrekking hebben op het integreren van externe informatie in het taalgeneratieproces. Ze verschillen echter van de prioriteit en het gebruik van de opgehaalde informatie binnen het generatieproces.
In RAG-systemen wordt het ophalen van externe gegevens gebruikt om de generatieve mogelijkheden van een vooraf getraind taalmodel te verbeteren . De opgehaalde informatie biedt meer context of specifieke gegevens die door het model worden gebruikt om de antwoorden ervan te informeren. Hier blijft het generatieve aspect van het taalmodel centraal in het antwoord, terwijl de opgehaalde gegevens fungeren als een ondersteunend element om de nauwkeurigheid of diepte te verbeteren.
RCG-systemen daarentegen leggen een sterkere nadruk op de opgehaalde informatie zelf. In deze systemen zijn de opgehaalde gegevens vaak het middelpunt van het antwoord, met de rol van het generatieve model voornamelijk om de opgehaalde tekst te verfijnen, op te maken of iets te verbeteren. Deze aanpak wordt vooral gebruikt wanneer nauwkeurigheid en directe relevantie van de informatie van cruciaal belang zijn, en minder creatieve synthese of extrapolatie is vereist.
De mechanismen voor het extern ophalen van gegevens die zowel RAG als RCG mogelijk maken, worden besproken in artikelen over het opslaan van gevectoriseerde insluitingen van documenten versus het verfijnen van een LLM, de twee gangbare benaderingen om de kennis die beschikbaar is voor de LLM aan te vullen op basis van de eerste training.
Inzicht in het verschil tussen het ophalen van modellen kan helpen bij het kiezen van de juiste benadering voor specifieke toepassingen, waarbij de behoefte aan creatieve synthese wordt afgestemd op de noodzaak van nauwkeurigheid en betrouwbaarheid van bronmateriaal.
Inzicht in factoren die invloed hebben op hoe deductie werkt
Aangezien u waarschijnlijk bekend bent met de webgebruikersinterface van ChatGPT, kunt u begrijpen hoe het werkt om vragen te beantwoorden, u helpen concepten te begrijpen die essentieel zijn bij het bouwen van generatieve AI-functies in uw eigen toepassingen.
Wanneer een gebruiker met ChatGPT chat, geeft het ontwerp van de gebruikersinterface de illusie van een langlopende chatsessie die de status behoudt tijdens verschillende back-and-out uitwisselingen tussen u en de LLM. In werkelijkheid worden voor een bepaalde chatsessie alle prompts en alle antwoorden van de LLM (ook wel voltooiingen genoemd ) verzonden met elke nieuwe prompt. Naarmate uw gesprek groeit, stuurt u steeds meer tekst naar de LLM die moet worden verwerkt, namelijk alle vorige prompts en voltooiingen. ChatGPT maakt gebruik van de context van de hele chatsessie, niet alleen de huidige prompt, bij het opstellen van een antwoord op uw huidige prompt. De volledige chatsessie wordt het contextvenster genoemd.
Er is een limiet voor contextvensterlengte, afhankelijk van de versie van ChatGPT waarmee u werkt. Elk deel van uw chatgesprek dat de limiet voor de lengte van het contextvenster overschrijdt, wordt genegeerd bij het opstellen van een antwoord op uw meest recente prompt.
Lange gesprekken lijken in het begin misschien een goed idee, maar lange contextvensters kunnen van invloed zijn op de hoeveelheid rekenkracht die nodig is om de prompt te verwerken en een voltooiing op te stellen. Dit is van invloed op de latentie van het antwoord en hoeveel het kost voor OpenAI om de aanvraag te verwerken.
Wat is de limiet voor het contextvenster van ChatGPT? Of in plaats daarvan, met hoeveel woorden kan ChatGPT werken? De limiet voor het contextvenster is afhankelijk van het LLM-model, de versie en de editie waarmee u werkt. Bovendien worden contextlengten gemeten in tokens, niet in woorden. Tokens zijn de kleinste teksteenheden die het model kan begrijpen en genereren. Deze eenheden kunnen woorden, delen van woorden (zoals lettergrepen of stengels) of zelfs afzonderlijke tekens zijn. Tokens vormen het hart van natuurlijke taalverwerking (NLP).
Het gebruik van tokens heeft gevolgen voor twee belangrijke overwegingen voor ontwikkelaars:
- De maximale limiet voor contextvensters
- De prijs per prompt en voltooiing
Wat is tokenisatie?
Tokenisatie is het proces van het converteren van tekst naar tokens. Het is een cruciale stap bij het voorbereiden van gegevens voor training of deductie (het proces van het opstellen van voltooiingen op basis van prompts) met een LLM. Het proces omvat verschillende stappen, waaronder het opsplitsen van complexe tekst in beheerbare stukken (tokens), die het model vervolgens kan verwerken. Dit proces kan eenvoudig zijn, zoals het splitsen van tekst op spaties en leestekens, of complexer, waarbij geavanceerde algoritmen worden gebruikt voor het verwerken van verschillende talen, morfologieën (de structuur van woorden) en syntaxis (de rangschikking van woorden). LLM-onderzoekers en -ontwikkelaars bepalen de methode van tokenisatie op basis van wat ze willen bereiken. OpenAI heeft een handige pagina waarin meer wordt uitgelegd over tokenisatie en zelfs een rekenmachine die laat zien hoe een zin of alinea wordt opgesplitst in tokens.
Zoals in de notitie onder aan de OpenAI Tokenizer-pagina staat dat in typische Engelse teksten één token gelijk is aan ongeveer vier tekens. Dit betekent dat gemiddeld 100 tokens ongeveer gelijk zijn aan 75 woorden of driekwart van een woord per token.
Op de pagina OpenAI Tokenizer wordt ook gesproken over tiktoken, een pakket voor Python en JavaScript waarmee u programmatisch kunt schatten hoeveel tokens u gaat gebruiken voor een bepaalde prompt die naar de OpenAI-API wordt verzonden.
Tokengebruik is van invloed op facturering
Elke Azure OpenAI-API heeft een andere factureringsmethode. Voor het verwerken en genereren van tekst met de API voor chatvoltooiingen wordt u gefactureerd op basis van het aantal tokens dat u als prompt verzendt en het aantal tokens dat als resultaat wordt gegenereerd (voltooiing).
Elk LLM-model (bijvoorbeeld gpt-3.5, gpt-3.5-turbo, gpt-4, enzovoort) heeft meestal een andere prijs, die de hoeveelheid rekenkracht weerspiegelt die nodig is voor het verwerken en genereren van tokens. Vaak wordt de prijs weergegeven als 'prijs per 1000 tokens' of 'prijs per één miljoen tokens'.
Dit prijsmodel heeft een aanzienlijke invloed op de wijze waarop u de interacties van de gebruiker ontwerpt en de hoeveelheid pre- en postverwerking die u toevoegt.
Systeem- versus gebruikersprompts
Tot nu toe heeft de discussie zich uitsluitend gericht op 'gebruikersprompts': de prompts die de uitwisseling tussen een gebruiker en ChatGPT vormen.
OpenAI heeft de 'systeemprompt' (ook wel 'aangepaste instructies' genoemd) geïntroduceerd. Dit is een uitgebreide reeks instructies die u definieert en wordt toegevoegd aan al uw chatgesprekken. U kunt het beschouwen als een set meta-instructies die u wilt dat de LLM altijd bekijkt telkens wanneer u een nieuwe chatsessie start. U kunt bijvoorbeeld de systeemprompt instellen op 'altijd reageren in de poëtische vorm van haiku'. Vanaf dat moment resulteert elke nieuwe prompt voor ChatGPT in een haiku die het antwoord bevat.
Hoewel 'antwoord in haiku-formulier' geen nuttig voorbeeld is, illustreert het het idee dat u de voltooiing van een LLM kunt beïnvloeden in uw prompt door de prompt zelf te wijzigen.
Waarom wilt u de prompt van de gebruiker wijzigen? Als u een generatieve AI-functie of -toepassing bouwt voor een professionele doelgroep, waaronder werknemers, klanten en partners van het bedrijf, wilt u ongetwijfeld beveiliging toevoegen om het bereik van onderwerpen of domeinen te beperken die kunnen worden beantwoord.
Maar het wijzigen van de prompt van de gebruiker is slechts één methode om de gebruikerservaring voor het genereren van tekst te verbeteren.
Methoden voor het verbeteren van de ervaring voor het genereren van tekst voor gebruikers in ChatGPT
Om de resultaten van het genereren van tekst te verbeteren, zijn ontwikkelaars beperkt tot het simpelweg verbeteren van de prompt en er zijn veel technische technieken die u kunnen helpen. Als u echter uw eigen generatieve AI-toepassing bouwt, zijn er verschillende manieren om de ervaring voor het genereren van tekst voor gebruikers te verbeteren en kunt u experimenteren met het implementeren van al deze toepassingen:
- De gebruikersprompts programmatisch wijzigen
- Een deductiepijplijn implementeren
- Ophalen-Augmented Generation (besproken in andere artikelen)
- Afstemming (besproken in andere artikelen)
Gebruikersprompts programmatisch wijzigen
Vanuit programmatisch oogpunt is er geen speciale API voor het toevoegen van een systeemprompt aan de gesprekken van uw gebruikers. U voegt alleen instructies toe aan de prompt indien nodig. Er zijn echter enkele technieken voor het verbeteren van gebruikersprompts:
- Contextueel primen: maak systeemprompts die expliciet de context van het gesprek in uw gewenste domein instellen. Dit omvat het verstrekken van een korte beschrijving of een set instructies aan het begin van elke interactie, waardoor de AI binnen het probleemdomein blijft.
- Richtlijnen op basis van voorbeelden: neem voorbeelden op van de typen vragen en antwoorden die relevant zijn voor uw domein in de eerste prompt. Dit helpt de AI inzicht te krijgen in het verwachte soort reacties.
Bovendien kunnen alle prompt-engineeringtechnieken worden toegepast. Als u dit programmatisch kunt doen, kunt u de prompt van de gebruiker namens de gebruiker verbeteren.
Het nadeel van deze benadering is dat hoe langer de prompt, hoe duurder elke aanroep naar de LLM. Toch is dit waarschijnlijk de goedkoopste van de benaderingen die zullen worden besproken.
Een deductiepijplijn implementeren
De volgende stap voorbij het programmatisch wijzigen van de prompt van de gebruiker is het maken van een volledige deductiepijplijn.
Een deductiepijplijn is het end-to-end-proces dat onbewerkte invoer (zoals tekst of afbeeldingen) gebruikt en 'schoont het op' voordat u deze gebruikt om uw primaire prompt (voorverwerking) uit te voeren of om de voltooiing te controleren om ervoor te zorgen dat deze voldoet aan de behoeften van de gebruiker voordat deze aan de gebruiker wordt weergegeven (na verwerking).
Voorverwerking kan betrekking hebben op het controleren van trefwoorden, het beoordelen van relevantie of het transformeren van de query zodat deze beter past bij de verwachte domeintaal. U kunt bijvoorbeeld de eerste prompt analyseren die door de gebruiker is ingediend en eerst de LLM vragen als de prompt zinvol is, als deze binnen de grenzen valt van wat u wilt accepteren, als deze is gebaseerd op een foutieve premisse of opnieuw moet worden geschreven om bepaalde vooroordelen te voorkomen. Als de LLM de prompt analyseert en problemen vindt, kunt u een stap verder gaan: vraag de LLM de prompt opnieuw te zeggen om het antwoord mogelijk te verbeteren.
Naverwerking kan betrekking hebben op het valideren van de relevantie en geschiktheid van het antwoord voor het domein. Dit kan zijn onder andere het verwijderen of markeren van antwoorden die niet voldoen aan de domeinvereisten. U kunt bijvoorbeeld de voltooiing van de LLM inspecteren om ervoor te zorgen dat deze voldoet aan uw kwaliteits- en veiligheidsvereisten. U kunt de LLM vragen om het antwoord te evalueren om te zien of het inderdaad voldoet aan de vereisten waaraan u het hebt gevraagd om te voldoen. Als dat niet zo is, kunt u de LLM vragen de voltooiing te wijzigen en dit herhalen totdat u een bevredigend resultaat hebt.
Er is één kanttekening bij het toevoegen van voorverwerkingsstappen: telkens wanneer u een aanroep aan een LLM toevoegt in uw deductiepijplijn, verhoogt u de totale latentie (tijd om te reageren) en de kosten van elke interactie met de gebruiker. Als ervaren softwareontwikkelaar bent u waarschijnlijk al op de hoogte van dit soort afwegingen die moeten worden gemaakt door leiderschap die van invloed zijn op het budget, de prestaties en de effectiviteit van het softwaresysteem.
In het artikel Geavanceerde systemen voor ophalen en augmented generation bouwen wordt dieper ingegaan op specifieke stappen voor het bouwen van een deductiepijplijn.
Andere factoren die invloed hebben op voltooiingen
Naast het programmatisch wijzigen van de prompt, het maken van een deductiepijplijn en andere technieken, worden verdere details besproken in Het uitbreiden van een Groot taalmodel met Ophalen-Augmented Generation en Fine-tuning. Daarnaast zijn er parameters die kunnen worden gewijzigd bij het aanroepen naar de Azure OpenAI-API.
De documentatie over chateindpunten bevat vereiste en optionele parameters die kunnen worden doorgegeven die van invloed kunnen zijn op verschillende aspecten van de voltooiing. Als u in plaats daarvan een SDK gebruikt, raadpleegt u de SDK-documentatie voor de taal van uw keuze. Als u wilt experimenteren met de parameters, kunt u dit doen in de Speeltuin.
Temperatuur: Beheer de willekeurigheid van de uitvoer die door het model wordt gegenereerd. Bij nul wordt het model deterministisch, waarbij het meest waarschijnlijke volgende token uit de trainingsgegevens wordt geselecteerd. Bij een temperatuur van 1 balanceert het model tussen het kiezen van tokens met hoge waarschijnlijkheid en het introduceren van willekeurigheid in de uitvoer.
Maximumtokens: hiermee bepaalt u de maximale lengte van het antwoord. Het instellen van een hogere of lagere limiet kan van invloed zijn op de details en het bereik van de gegenereerde inhoud.
Top P (Kernsampling): wordt gebruikt met de temperatuur om de willekeurigheid van het antwoord te bepalen. Top P beperkt de AI om alleen het hoogste P-percentage waarschijnlijkheidsmassa te overwegen bij het genereren van elk token. Lagere waarden leiden tot meer gerichte en voorspelbare tekst, terwijl hogere waarden meer diversiteit bieden.
Frequentiestraf: vermindert de kans dat het model dezelfde lijn of woordgroep herhaalt. Door deze waarde te vergroten, voorkomt u redundantie in de gegenereerde tekst.
Aanwezigheidsstraf: moedigt het model aan om nieuwe concepten en termen in de voltooiing te introduceren. Aanwezigheidsstraf is handig voor het genereren van diversere en creatieve outputs.
Stopreeksen: u kunt een of meer reeksen opgeven om de API te laten instrueren dat er geen verdere tokens meer worden gegenereerd. Store Sequences zijn handig voor het beheren van de structuur van de uitvoer, zoals het beëindigen van een voltooiing aan het einde van een zin of alinea.
Logit Bias: Hiermee kunt u de kans wijzigen dat opgegeven tokens worden weergegeven in de voltooiing. Logit Bias kan worden gebruikt om de voltooiing in een bepaalde richting te begeleiden of om ongewenste inhoud te onderdrukken.
Informatie over Microsoft OpenAI-beveiligingen
Naast het behouden van de antwoorden van de LLM voor specifieke onderwerpen of domeinen, zult u zich waarschijnlijk zorgen maken over de soorten vragen die uw gebruikers stellen van de LLM. Het is belangrijk om rekening te houden met de soorten antwoorden die worden gegenereerd.
Api-aanroepen naar Microsoft OpenAI Services filteren eerst automatisch inhoud die mogelijk aanstootgevend is en rapporteert dit aan u in veel filtercategorieën.
U kunt de Beheer-API van OpenAI rechtstreeks gebruiken om expliciet inhoud te controleren op mogelijk schadelijke inhoud.
Ten tweede kunt u Azure AI Content Safety gebruiken om te helpen bij tekstbeheer, afbeeldingstoezicht, jailbreakrisicodetectie en beveiligde materiaaldetectie. Hiermee wordt een portalinstallatie, configuratie en rapportage-ervaring gecombineerd met code die u aan uw toepassing kunt toevoegen om schadelijke inhoud te identificeren.
Laatste overwegingen die van invloed kunnen zijn op uw ontwerpbeslissingen voor toepassingen
Het begrijpen van tokenisatie, prijzen, contextvensters en het implementeren van programmatische verbeteringen om de ervaring voor het genereren van tekst van gebruikers te verbeteren, is van invloed op hoe u uw generatieve AI-systeem ontwerpt. Hier volgt een korte lijst met zaken die u kunt overwegen en andere punten uit dit artikel die van invloed zijn op uw beslissingen over het ontwerp van uw toepassing:
- Evalueer de noodzaak van het gebruik van het nieuwste AI-model op basis van kostenoverwegingen. Minder dure modellen zijn mogelijk voldoende voor de behoeften van uw toepassing, waardoor de prestaties worden afgestemd op budgetbeperkingen.
- Overweeg de duur van het contextvenster te optimaliseren om kosten te beheren zonder dat dit van invloed is op de gebruikerservaring. Het bijsnijden van onnodige delen van het gesprek kan de verwerkingskosten verminderen en tegelijkertijd kwaliteitsinteracties behouden.
- Evalueer hoe tokenisatie en de granulariteit van uw invoer en uitvoer van invloed zijn op de prestaties. Als u begrijpt hoe uw gekozen LLM tokenisatie afhandelt, kunt u de efficiëntie van uw API-aanroepen optimaliseren, de kosten verlagen en de reactietijden verbeteren.
Als u direct wilt experimenteren met het bouwen van een generatieve AI-oplossing, raden we u aan om aan de slag te gaan met de chat met behulp van uw eigen gegevensvoorbeeld voor Python. Er zijn ook versies van de zelfstudie beschikbaar in .NET, Java en JavaScript.