Delen via


Belangrijkste concepten en overwegingen voor het bouwen van generatieve AI-oplossingen

Grote taalmodellen (LLM's) zijn geweldig, maar ze hebben beperkingen. Als ontwikkelaar moet u deze beperkingen begrijpen, waar LLM's 'out-of-the-box' toe in staat zijn en hoe u ze kunt aanpassen om de optimale resultaten te behalen voor de generatieve AI-oplossingen die u ontwikkelt. In dit artikel worden verschillende uitdagingen en beperkingen van LLM's beschreven. Er worden veelvoorkomende manieren uitgelegd om de uitdagingen te overwinnen en controle te nemen over het proces voor het genereren van inhoud, ongeacht het type generatieve AI-functies dat u in uw toepassing bouwt.

Technische uitdagingen bij het werken met LLM's

De volgende lijst bevat een overzicht van de belangrijkste uitdagingen of beperkingen waarmee u rekening moet houden wanneer u met LLM's werkt:

  • Knowledge cutoff: Vanwege de hoge kosten van het trainen van een LLM, is de kennisbasis van een LLM beperkt tot wat op een bepaald tijdstip is gebruikt voor training. Zonder invoegtoepassingen of andere aanpassingen heeft een LLM geen toegang tot realtime informatie en ook niet 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 een LLM is getraind, maar het is mogelijk dat een LLM antwoorden maakt die niet nauwkeurig zijn.

  • Transparantie: Ook vanwege de manier waarop een LLM wordt getraind, heeft deze geen toegang meer tot de basiskennis waarop deze is getraind. Zelfs als dat het geval was, is er geen garantie dat de informatie waarheidsgetrouw en onderbouwd was om mee te beginnen. Er is ook geen verificatiestap om ervoor te zorgen dat het gegenereerde antwoord juist is.

  • geen domeinspecifieke kennis: vergelijkbaar met de afkap van kennis, als u persoonlijke gegevens hebt, zoals interne bedrijfsdocumenten, is de LLM niet getraind op deze informatie. Er is geen kennis van domeinspecifieke gegevens.

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 een LLM de gegevens ophaalt.

Waar LLM's hun gegevens ophalen

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.

nl-NL: Diagram waarin drie verschillende typen van retrievalgeneratie worden weergegeven: retrieval-uit generatie, retrieval-uitgebreide generatie en retrieval-gecentreerde generatie.

  • Rog (Retrieval-off generation): traditionele LLM's gebruiken dit model. Het model genereert antwoorden op basis van de kennis waarop het is getraind, zonder externe informatie te openen of op te halen tijdens het genereren. De kennis van het model is statisch en beperkt tot wat is opgenomen in de trainingsgegevens tot de grensdatum. Naast creatief schrijven kan het vragen beantwoorden over informatie die direct beschikbaar is op internet.

  • RAG (Retrieval-augmented generation): combineert de generatieve mogelijkheden van LLM's met de mogelijkheid om informatie 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. Vervolgens wordt de informatie gebruikt om het antwoord te vormen. Met deze benadering kan het model nauwkeurigere en up-to-datuminformatie bieden dan het biedt door alleen de vooraf getrainde kennis te gebruiken. Gebruiksvoorbeelden zijn onder andere het controleren van feiten, het beantwoorden van vragen op basis van realtime gegevens of het beantwoorden van vragen op basis van persoonlijke, domeinspecifieke gegevens.

  • RCG (Retrieval-Centric Generation): plaatst nog meer nadruk op de extern opgehaalde inhoud, waarbij antwoorden vaak worden gestructureerd rond de informatie die uit externe bronnen is opgehaald. 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 tussen ophaalgebaseerde en generatieve methoden, waarbij de balans sterk in het voordeel kan zijn van de informatie die wordt opgehaald, boven de eigen generatieve capaciteiten van het model. 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 ROG is ChatGPT. Copilot (via Bing) breidt daarentegen een LLM uit met behulp van externe bronnen uit nieuwsbronnen (en door koppelingen naar die bronnen aan te bieden).

Op het eerste gezicht lijken RAG en RCG op elkaar omdat beide betrekking hebben op het integreren van externe informatie in het proces voor het genereren van talen. Ze verschillen echter van de prioriteit en het gebruik van opgehaalde gegevens in het generatieproces.

In een RAG-systeem wordt het ophalen van externe gegevens gebruikt om uitbreiding de generatieve mogelijkheden van een vooraf getraind taalmodel. De opgehaalde informatie biedt meer context of specifieke gegevens die door het model worden gebruikt om de antwoorden ervan te informeren. In een RAG-systeem blijft het generatieve aspect van het taalmodel centraal in het antwoord. Opgehaalde gegevens fungeren als een ondersteunend element om de nauwkeurigheid of diepte te verbeteren.

Een RCG-systeem legt een sterkere nadruk op de opgehaalde informatie zelf. In een RCG-systeem zijn de opgehaalde gegevens vaak het middelpunt van het antwoord, en de rol van het generatieve model is 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 onderscheid tussen het ophalen van modellen kan u helpen bij het kiezen van de juiste benadering voor specifieke toepassingen. Het helpt u de noodzaak van creatieve synthese versus nauwkeurigheid en betrouwbaarheid van bronmateriaal te verdelen.

Factoren die van invloed zijn op de werking van deductie

Omdat u waarschijnlijk bekend bent met de webgebruikersinterface van ChatGPT, kunt u begrijpen hoe het werkt om vragen te beantwoorden, u inzicht krijgen in concepten die essentieel zijn wanneer u generatieve AI-functies in uw eigen toepassingen bouwt.

Wanneer een gebruiker met ChatGPT chat, wekt het ontwerp van de gebruikersinterface de illusie van een langdurige chatsessie die de status behoudt gedurende verschillende wisselwerkingen tussen jou en de LLM. In werkelijkheid worden voor een bepaalde chatsessie alle prompts en alle LLM-antwoorden (ook wel afrondingengenoemd) verzonden met elke nieuwe prompt. Naarmate uw gesprek groeit, verzendt u steeds meer tekst naar de LLM die moet worden verwerkt. Met elke nieuwe prompt verzendt u alle vorige prompts en voltooiingen. ChatGPT maakt gebruik van de context van de hele chatsessie, en niet alleen de huidige prompt, wanneer deze een antwoord op uw huidige prompt opstelt. De volledige chatsessie wordt het contextvenstergenoemd.

Een contextvenster heeft een lengtelimiet die verschilt per versie van ChatGPT waarmee u werkt. Een deel van uw chatgesprek dat de limiet voor de lengte van het contextvenster overschrijdt, wordt genegeerd wanneer ChatGPT een antwoord op uw meest recente prompt opstelt.

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. De grootte van de contextvensters 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? 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 aanzet en afwerking

Wat is tokenisatie?

tokenisatie is het proces van het omzetten van tekst in tokens. Het is een cruciale stap bij het voorbereiden van gegevens voor training of inferentie (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.

Op de pagina OpenAI tokenizer wordt meer uitgelegd over tokenisatie. De pagina heeft zelfs een rekenmachine die laat zien hoe een zin of alinea wordt opgesplitst in tokens.

Als de notitie onderaan de OpenAI Tokenizer-pagina staat, is in typische Engelse teksten één token gelijk aan ongeveer vier tekens. Gemiddeld zijn 100 tokens ongeveer gelijk 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 dat u kunt gebruiken om programmatisch te schatten hoeveel tokens er nodig zijn om een specifieke prompt naar de OpenAI-API te verzenden.

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 of GPT-4) 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 1.000 tokens' of 'prijs per 1 miljoen tokens'.

Dit prijsmodel heeft een aanzienlijk effect op de wijze waarop u de interacties van de gebruiker ontwerpt en de hoeveelheid voorverwerking en naverwerking die u toevoegt.

Systeemprompts versus gebruikersprompts

Tot nu toe heeft de discussie zich uitsluitend gericht op gebruikersprompts. Een gebruikersprompt is het type prompt dat de uitwisseling tussen een gebruiker en ChatGPT vormt.

OpenAI heeft de systeemprompt geïntroduceerd (ook wel aangepaste instructiesgenoemd). Een systeemprompt is een overkoepelende set instructies die u definieert en toevoegt 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-vorm' geen nuttig voorbeeld is, illustreert het wel het idee dat je de voltooiing van een LLM kunt beïnvloeden 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 bedrijfsmedewerkers, klanten en partners, wilt u ongetwijfeld beveiliging toevoegen om het bereik van onderwerpen of domeinen te beperken die kunnen worden beantwoord.

Maar het wijzigen van de gebruikersprompt 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 wilt u misschien experimenteren met het implementeren van al deze toepassingen:

  • Wijzig de gebruikersprompts programmatisch.
  • Een deductiepijplijn implementeren.
  • Retrieval-Augmented Generatie (besproken in andere artikelen).
  • Fijnstelling (besproken in andere artikelen).

Gebruikersprompts programmatisch wijzigen

Als u een systeemprompt wilt toevoegen aan een gebruikersgesprek, gebruikt u geen speciale API. U voegt zo nodig alleen instructies toe aan de prompt.

U kunt echter een aantal technieken gebruiken om gebruikersprompts te verbeteren:

  • Contextueel primen: Systeemprompts maken die expliciet de context van het gesprek binnen het domein vastleggen. Deze aanpak omvat het verstrekken van een korte beschrijving of een set instructies aan het begin van elke interactie. De instructies begeleiden AI om binnen het probleemdomein te blijven.
  • voorbeeldrichtlijnen: neem in de eerste prompt voorbeelden op van de typen vragen en antwoorden die relevant zijn voor uw domein. Deze aanpak helpt AI inzicht te krijgen in wat voor soort reacties u kunt verwachten.

U kunt elke techniek voor prompt-engineering gebruiken. Als u dit programmatisch kunt doen, kunt u de gebruikersprompt namens hen verbeteren.

Het nadeel van deze benadering is dat hoe langer de prompt, hoe hoger de kosten voor elke aanroep naar de LLM. Toch is deze benadering waarschijnlijk de minst dure benadering die in dit artikel wordt beschreven.

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 een end-to-end proces waarmee onbewerkte invoer (zoals tekst of een afbeelding) wordt opgeschoond voordat u deze gebruikt om uw primaire prompt (voorverwerking) uit te voeren of de voltooiing controleert om ervoor te zorgen dat deze voldoet aan de behoeften van de gebruiker voordat deze wordt weergegeven (naverwerking).

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 de gebruiker verzendt. Vraag eerst de LLM of de prompt zinvol is, als deze binnen de grenzen valt van wat u bereid bent te accepteren, als deze is gebaseerd op een defecte premisse of als deze moet worden herschreven om bepaalde vooroordelen te voorkomen. Als de LLM de prompt analyseert en problemen vindt, kunt u een stap verder gaan. U kunt de LLM vragen de prompt opnieuw te verwoorden om het antwoord mogelijk te verbeteren.

Naverwerking kan betrekking hebben op het valideren van de relevantie en geschiktheid van het antwoord voor het domein. Het kan bestaan uit het verwijderen of markeren van antwoorden die niet voldoen aan de domeinvereisten. U wilt wellicht bijvoorbeeld het resultaat van de LLM inspecteren om ervoor te zorgen dat het voldoet aan uw kwaliteits- en veiligheidsvereisten. U kunt de LLM vragen om het antwoord te evalueren om te zien of het in feite voldoet aan de vereisten waaraan u het hebt gevraagd om te voldoen. Als dat niet het geval is, kunt u de LLM vragen om de voltooiing te wijzigen. Herhaal deze stappen 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 van invloed zijn op het budget, de prestaties en de effectiviteit van een softwaresysteem.

Zie Een geavanceerd retrieval-verrijkt generatiesysteem bouwenvoor meer informatie over de specifieke stappen die moeten worden uitgevoerd om een inferentie pijplijn te bouwen.

Andere factoren die invloed hebben op voltooiingen

Naast het programmatisch wijzigen van de prompt, het maken van een deductiepijplijn en andere technieken, worden meer details besproken in Een groottaalmodel uitbreiden met het ophalen van uitgebreide generatie en het verfijnen van. U kunt ook parameters wijzigen wanneer u aanroept naar de Azure OpenAI-API.

Om de vereiste en optionele parameters te controleren die invloed kunnen hebben op verschillende aspecten van het voltooiingsproces, raadpleegt u de documentatie van het Chat-eindpunt. Als u een SDK gebruikt, raadpleegt u de SDK-documentatie voor de taal die u gebruikt. U kunt experimenteren met de parameters in de Playground.

  • Temperature: beheer de willekeurigheid van de uitvoer die het model genereert. 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 een hoge waarschijnlijkheid en het introduceren van willekeurigheid in de uitvoer.

  • Max Tokens: bepaalt 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 inhoud die wordt gegenereerd.

  • Top P (kernsampling): wordt gebruikt met Temperature om de willekeurigheid van het antwoord te bepalen. Top P beperkt AI om alleen het hoogste percentage kansdichtheid (P) te overwegen wanneer elk token wordt gegenereerd. Lagere waarden leiden tot tekst die meer gericht en voorspelbaar is. Hogere waarden zorgen voor meer diversiteit.

  • Frequency Penalty: vermindert de kans dat het model dezelfde regel of woordgroep herhaalt. Door deze waarde te vergroten, voorkomt u redundantie in de gegenereerde tekst.

  • Presence Penalty: moedigt het model aan om nieuwe concepten en termen in de voltooiing te introduceren. Presence Penalty is handig voor het genereren van diversere en creatieve outputs.

  • Stop Sequences: U kunt een of meer reeksen opgeven om de API te laten stoppen met het genereren van meer tokens. Store Sequences zijn handig voor het controleren van de structuur van de uitvoer, zoals het beëindigen van een voltooiing aan het einde van een zin of alinea.

  • Logit Bias: Hiermee kun je de waarschijnlijkheid aanpassen dat opgegeven tokens in de voltooiing verschijnen. Logit Bias kan worden gebruikt om de voltooiing in een bepaalde richting te begeleiden of om specifieke inhoud te onderdrukken.

Microsoft OpenAI-beveiligingen

Naast het behouden van de antwoorden van de LLM voor specifieke onderwerpen of domeinen, maakt u zich waarschijnlijk ook zorgen 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 de API mogelijk aanstootgevend vindt en rapporteert dit in veel filtercategorieën.

U kunt de OpenAI-beheer-API rechtstreeks gebruiken om inhoud te controleren op mogelijk schadelijke inhoud.

Vervolgens kunt u Azure AI Content Safety gebruiken om te helpen bij tekstbeheer, afbeeldingsbeheer, 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 voor toepassingsontwerp

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 kunnen zijn op uw ontwerpbeslissingen voor uw toepassing:

  • Evalueer de noodzaak van het gebruik van het nieuwste AI-model op basis van kostenoverwegingen. Modellen die goedkoper zijn, kunnen voldoende zijn voor de behoeften van uw toepassing. Balans vinden tussen prestaties en budgetbeperkingen.
  • Overweeg om de duur van het contextvenster te optimaliseren om kosten te beheren zonder dat dit van invloed is op de gebruikerservaring. Het beperken van onnodige delen van het gesprek kan de verwerkingskosten verminderen terwijl de interacties van kwaliteit 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 onmiddellijk wilt beginnen met experimenteren met het bouwen van een generatieve AI-oplossing, raden we u aan om Aan de slag te gaan met de chat waarbij u uw eigen gegevensvoorbeeld voor Python gebruikt. De zelfstudie is ook beschikbaar in .NET-, Javaen JavaScript-.