Dela via


Viktiga begrepp och överväganden för att skapa generativa AI-lösningar

Stora språkmodeller (LLM) är fantastiska, men de har begränsningar. Som utvecklare måste du förstå dessa begränsningar, vilka LLM:er som kan "out of the box" och hur du ändrar dem för att få bästa resultat för de generativa AI-lösningar som du skapar. Den här artikeln identifierar flera utmaningar och begränsar faktorer för LLM:er. Den förklarar vanliga sätt att övervinna utmaningarna och ta kontroll över processen för innehållsgenerering oavsett vilken typ av generativ AI-funktioner du skapar i ditt program.

Tekniska utmaningar när du arbetar med LLM:er

I följande lista sammanfattas de viktigaste utmaningarna eller begränsningarna som du bör känna till när du arbetar med LLM:er:

  • Kunskapsavgränsning: På grund av den höga kostnaden för att träna en LLM är dess kunskapsomfång begränsat till det kunskapsområde som täcktes under träningen vid en viss tidpunkt. Utan plugins eller andra tillägg har en LLM ingen åtkomst till realtidsdata och den kan inte komma åt privat data.

  • Hallucination: En LLM använder statistiska sannolikheter och lite slumpmässighet för att generera information. Mekanismer finns på plats för att hålla genererade svar anpassade till människans avsikt i frågorna som ställs och den information som en LLM har tränats på, men det är möjligt för en LLM att skapa svar som inte är korrekta.

  • Transparens: Också på grund av hur en LLM tränas har den inte längre tillgång till den grundläggande kunskap som den utbildades på. Även om det gjorde det, finns det ingen garanti för att informationen var sanningsenlig och grundad till att börja med. Det finns heller inget verifieringssteg för att säkerställa att det genererade svaret är korrekt.

  • Ingen domänspecifik kunskap: Om du har privat information som interna företagsdokument har LLM inte tränats på den här informationen. Den har ingen kunskap om domänspecifika data.

Vad kan du göra för att minimera eventuella utmaningar eller problem med LLM:er och få bästa möjliga resultat för att hjälpa dina användare och din organisation? Börja med att förstå hur du kan komplettera var en LLM hämtar sina data.

Var LLM:er får sin information

En bra utgångspunkt för att få bästa resultat från en LLM är att förstå var eller hur LLM får sin information. Följande kategorier representerar olika metoder för hur LLM:er interagerar med olika informationskällor för att generera svar.

diagram som visar tre olika typer av hämtningsgenerering: retrieval-off-generering, hämtningsförstärkt generering och hämtningscentrisk generering.

  • Hämtningsgenerering (ROG): Traditionella LLM:er använder den här modellen. Modellen genererar svar baserat enbart på den kunskap den har tränats på, utan att komma åt eller hämta någon extern information under genereringsprocessen. Modellens kunskaper är statiska och begränsade till vad som ingick i dess träningsdata fram till slutdatumet. Förutom kreativt skrivande kan det svara på frågor om information som är lättillgänglig på Internet.

  • RAG(Retrieval Augmented Generation): Kombinerar de generativa funktionerna i LLM:er med möjligheten att hämta information från externa databaser eller dokument i realtid. Modellen frågar en extern källa för att hitta relevant information. Den använder sedan informationen för att bilda sitt svar. Med den här metoden kan modellen tillhandahålla mer exakt och up-todatuminformation än den tillhandahåller med hjälp av enbart förtränad kunskap. Användningsfall inkluderar faktakontroll, svar på frågor baserade på realtidsdata eller svar på frågor baserade på privata, domänspecifika data.

  • Hämtningscentrerad generering (RCG): Lägger ännu större vikt vid externt hämtat innehåll, vilket ofta strukturerar svar kring den information som hämtas från externa källor. Modellen kan direkt införliva stora segment av hämtad text i sina utdata, redigera eller kommentera dem för att passa användarens fråga. Den här metoden kan ses som en hybrid mellan hämtningsbaserade och generativa metoder, där balansen i hög grad kan gynna den information som hämtas framför modellens egna generativa funktioner. Användningsfall omfattar sammanfattning av ett längre dokument, forskningshjälp för att tillhandahålla jämförelser och tematiska utforskningar i flera liknande dokument samt kompilering eller sortering av olika materialkällor i en kombinerad utdata.

Ett bra exempel på ROG är ChatGPT. Däremot utökar Copilot (via Bing) en LLM genom att använda externa källor från nyhetskällor (och genom att tillhandahålla länkar till dessa källor).

Vid första anblicken verkar RAG och RCG liknande eftersom båda omfattar integrering av extern information i språkgenereringsprocessen. De skiljer sig dock åt i hur de prioriterar och använder hämtad information i genereringsprocessen.

I ett RAG-system används den externa datahämtningen för att utöka generativa funktioner i en förtränad språkmodell. Den hämtade informationen ger mer kontext eller specifika data som modellen använder för att informera sina svar. I ett RAG-system är den generativa aspekten av språkmodellen fortfarande central för svaret. Hämtade data fungerar som ett stödjande element för att förbättra noggrannheten eller djupet.

Ett RCG-system lägger större vikt vid själva den hämtade informationen. I ett RCG-system är de hämtade data ofta mittpunkten svaret, och generativmodellens roll är främst att förfina, formatera eller förbättra den hämtade texten något. Den här metoden används särskilt när informationens noggrannhet och direkta relevans är av största vikt och mindre kreativ syntes eller extrapolering krävs.

Mekanismerna för extern hämtning av data som driver både RAG och RCG beskrivs i artiklar om lagring av vektoriserade inbäddningar av dokument jämfört med finjustering av en LLM, de två vanliga metoderna för att komplettera den kunskap som är tillgänglig för LLM baserat på den inledande utbildningen.

Genom att förstå skillnaderna mellan hämtningsmodeller kan du välja rätt metod för specifika program. Det hjälper dig att balansera behovet av kreativ syntes kontra noggrannhet och återgivning till källmaterial.

Faktorer som påverkar hur slutsatsdragning fungerar

Eftersom du förmodligen är bekant med ChatGPT:s webbaserade användargränssnitt kan förståelse för hur det fungerar för att besvara frågor hjälpa dig att förstå begrepp som är viktiga när du skapar generativa AI-funktioner i dina egna program.

När en användare chattar med ChatGPT, ger designen av användargränssnittet intrycket av en långvarig chattsession som bevarar kontinuiteten genom flera växelvisa utbyten mellan användaren och LLM. I själva verket, för en viss chattsession, skickas faktiskt alla uppmaningar och alla LLM-svar (benämns också slutföranden) med varje ny uppmaning. I takt med att konversationen växer skickar du allt mer text till LLM för att bearbetas. Med varje ny fråga skickar du alla tidigare frågor och slutföranden. ChatGPT använder hela chattsessionens kontext, och inte bara den aktuella prompten, när den skapar ett svar på din aktuella fråga. Hela chattsessionen kallas kontextfönster.

Ett kontextfönster har en längdgräns som varierar beroende på vilken version av ChatGPT du arbetar med. Alla delar av chattkonversationen som överskrider längdgränsen för kontextfönstret ignoreras när ChatGPT skriver ett svar på din senaste fråga.

Långa konversationer kan verka som en bra idé i början, men långa kontextfönster kan påverka hur mycket beräkning som krävs för att bearbeta uppmaningen och generera ett resultat. Storleken på kontextfönstren påverkar svarstiden och hur mycket det kostar för OpenAI att bearbeta begäran.

Vad är ChatGPT:s kontextfönstergräns? Det vill säga hur många ord kan ChatGPT fungera med?

Begränsningen för kontextfönstret beror på vilken LLM-modell, version och utgåva du arbetar med. Dessutom mäts kontextlängder i token, inte i ord. Token är de minsta textenheterna som modellen kan förstå och generera. Dessa enheter kan vara ord, delar av ord (t.ex. stavelser eller stjälkar) eller till och med enskilda tecken. Token står i centrum för bearbetning av naturligt språk (NLP).

Användningen av token påverkar två viktiga överväganden för utvecklare:

  • Gräns för maximalt antal kontextfönster
  • Priset per uppgift och slutförande

Vad är tokenisering?

Tokenisering är processen att konvertera text till token. Det är ett viktigt steg i att förbereda data för träning eller slutsatsdragning (processen för att skapa slutföranden baserat på frågor) med en LLM. Processen omfattar flera steg, bland annat att dela upp komplex text i hanterbara delar (token) som modellen sedan kan bearbeta. Den här processen kan vara enkel, till exempel att dela upp text efter blanksteg och skiljetecken, eller mer komplex, med avancerade algoritmer för att hantera olika språk, morfologier (ordstrukturen) och syntaxer (ordordningen). LLM-forskare och utvecklare bestämmer sig för tokeniseringsmetoden baserat på vad de försöker åstadkomma.

Sidan OpenAI tokenizer förklarar mer om tokenisering. Sidan har till och med en kalkylator som illustrerar hur en mening eller ett stycke delas upp i token.

Som anteckningen längst ned på sidan OpenAI Tokenizer står, i typiska engelska texter, motsvarar en token cirka fyra tecken. I genomsnitt är 100 token ungefär lika med 75 ord eller tre fjärdedelar av ett ord per token.

På sidan OpenAI Tokenizer beskrivs även tiktoken, ett paket för Python och JavaScript som du kan använda för att programmatiskt uppskatta hur många token som krävs för att skicka en specifik uppmaning till OpenAI-API:et.

Tokenanvändning påverkar fakturering

Varje Azure OpenAI-API har olika faktureringsmetoder. För bearbetning och generering av text med API:et för chattslutsättning debiteras du baserat på antalet token som du skickar som en uppmaning och antalet token som genereras som ett resultat (slutförande).

Varje LLM-modell (till exempel GPT-3.5, GPT-3.5 Turbo eller GPT-4) har vanligtvis ett annat pris, vilket återspeglar den mängd beräkning som krävs för att bearbeta och generera token. Många gånger visas priset som "pris per 1 000 tokens" eller "pris per 1 miljon token".

Den här prismodellen har en betydande effekt på hur du utformar användarinteraktioner och mängden förbearbetning och efterbearbetning som du lägger till.

Systemprompter jämfört med användarprompter

Fram tills nu har diskussionen enbart fokuserat påanvändaruppmaningar . En användarprompt är den typ av fråga som utgör utbytet mellan en användare och ChatGPT.

OpenAI introducerade system prompt (kallas även anpassade instruktioner). En systemprompt är en övergripande uppsättning instruktioner som du definierar och lägger till i alla dina chattkonversationer. Tänk på det som en uppsättning metainstruktioner som du vill att LLM alltid ska observera varje gång du startar en ny chattsession. Du kan till exempel ställa in systemprompten på "svara alltid i poetisk form av haiku". Från och med då resulterar varje ny uppmaning till ChatGPT i en haiku som innehåller svaret.

Även om "svara i haikuform" inte är ett användbart exempel, illustrerar det tanken att du kan påverka en LLM:s respons på din uppmaning genom att ändra själva prompten.

Varför skulle du vilja ändra användarens uppmaning? Om du skapar en generativ AI-funktion eller ett program för en professionell målgrupp, som kan omfatta företagsanställda, kunder och partner, vill du utan tvekan lägga till skydd för att begränsa omfattningen av ämnen eller domäner som den kan svara på.

Men att ändra användarprompten är bara en metod för att förbättra textgenereringsupplevelsen för användare.

Metoder för att förbättra textgenereringsupplevelsen för användare i ChatGPT

För att förbättra textgenereringsresultaten är utvecklarna begränsade till att helt enkelt förbättra uppmaningen, och det finns många tekniska tekniker som kan vara till hjälp. Men om du skapar ett eget generativt AI-program finns det flera sätt att förbättra textgenereringsupplevelsen för användare, och du kanske vill experimentera med att implementera alla:

  • Ändra användarprompterna programmatiskt.
  • Implementera en slutsatsdragningspipeline.
  • Retrieval-Augmented Generation (beskrivs i andra artiklar).
  • Finjustering (beskrivs i andra artiklar).

Ändra användarprompter programmatiskt

Om du vill lägga till en systemprompt i en användarkonversation använder du inte ett särskilt API. Du lägger bara till instruktioner i prompten efter behov.

Men du kan använda några tekniker för att förbättra användaruppmaningar:

  • Kontextuell inramning: Craft system prompts som uttryckligen anger kontexten för konversationen inom ämnet. Den här metoden omfattar en kort beskrivning eller en uppsättning instruktioner i början av varje interaktion. Anvisningarna hjälper AI att hålla sig inom problemdomänen.
  • Exempelbaserad vägledning: I den första prompten innehåller du exempel på de typer av frågor och svar som är relevanta för din domän. Den här metoden hjälper AI att förstå vilken typ av svar som kan förväntas.

Du kan använda valfri teknik för promptdesign. Om du kan göra det programmatiskt kan du förbättra användarens upplevelse på deras vägnar.

Nackdelen med den här metoden är att ju längre uppmaningen är, desto högre blir kostnaden för varje anrop till LLM. Trots detta är den här metoden förmodligen den billigaste metoden som beskrivs i den här artikeln.

Implementera en slutsatsdragningspipeline

Nästa steg utöver att ändra användarens uppmaning programmatiskt är att skapa en hel slutsatsdragningspipeline.

En inlärningsflöde är en process från början till slut som "rensar" råa indata (till exempel text eller en bild) innan du använder den för att utföra huvuduppgiften (förbehandling) eller kontrollerar slutförandet för att säkerställa att den uppfyller användarens behov innan resultatet visas (efterbehandling).

Förbearbetning kan omfatta nyckelordskontroll, relevansbedömning eller transformering av frågan för att bättre passa det förväntade domänspråket. Du kan till exempel analysera den första uppmaningen som användaren skickar. Börja med att fråga LLM om uppmaningen är meningsfull, om den ligger inom gränserna för vad du är villig att acceptera, om den baseras på en felaktig premiss eller om den behöver skrivas om för att undvika vissa fördomar. Om LLM analyserar prompten och hittar problem kan du gå ett steg längre. Du kan be LLM att formulera om uppmaningen för att eventuellt förbättra svaret.

Efterbearbetning kan innebära att verifiera svarets relevans och lämplighet för domänen. Det kan vara att ta bort eller flagga svar som inte passar domänkraven. Du kanske till exempel vill inspektera slutförandet som tillhandahålls av LLM för att säkerställa att det uppfyller dina kvalitets- och säkerhetskrav. Du kan be LLM att utvärdera svaret för att se om det faktiskt uppfyller de krav som du bad den att följa. Om den inte gör det kan du be LLM att ändra slutförandet. Upprepa de här stegen tills du har ett tillfredsställande resultat.

Det finns en varning för att lägga till förbearbetningssteg: varje gång du lägger till ett anrop till en LLM i din slutsatsdragningspipeline ökar du den totala svarstiden (tid att svara) och kostnaden för varje interaktion med användaren. Som erfaren programvaruutvecklare är du förmodligen redan medveten om den här typen av kompromisser som påverkar budgeten, prestandan och effektiviteten i ett programvarusystem.

Information om de specifika åtgärder som ska utföras för att skapa en slutsatsdragningspipeline finns i Skapa ett avancerat hämtningsförhöjd generationssystem.

Andra faktorer som påverkar slutföranden

Förutom att programmatiskt ändra prompten, skapa en inferenspipeline och använda andra tekniker, diskuteras mer information i , Utöka en storspråksmodell med hämtningsförstärkt generation och finjustering. Du kan också ändra parametrar när du gör anrop till Azure OpenAI-API:et.

Information om hur du granskar obligatoriska och valfria parametrar som kan påverka olika aspekter av slutförandet finns i dokumentationen om Chat-slutpunkt. Om du använder ett SDK kan du läsa SDK-dokumentationen för det språk du använder. Du kan experimentera med parametrarna i Playground-.

  • Temperature: Kontrollera slumpmässigheten i utdata som modellen genererar. Vid noll blir modellen deterministisk och väljer konsekvent den mest sannolika nästa token från sina träningsdata. Vid en temperatur på 1 balanserar modellen mellan att välja token med hög sannolikhet och att införa slumpmässighet i utdata.

  • Max Tokens: Styr svarets maximala längd. Om du anger en högre eller lägre gräns kan det påverka detaljerna och omfånget för det innehåll som genereras.

  • Top P (nucleus sampling): Används med Temperature för att kontrollera slumpmässigheten i svaret. Top P begränsar AI till att endast ta hänsyn till den högsta procenten av sannolikhetsmassan (P) när varje token genereras. Lägre värden leder till text som är mer fokuserad och förutsägbar. Högre värden möjliggör mer mångfald.

  • Frequency Penalty: Minskar sannolikheten för att modellen upprepar samma rad eller fras. Om du ökar det här värdet kan du undvika redundans i den genererade texten.

  • Presence Penalty: Uppmuntrar modellen att introducera nya begrepp och termer i slutförandet. Presence Penalty är användbart för att generera mer mångsidiga och kreativa resultat.

  • Stop Sequences: Du kan ange en eller flera sekvenser för att instruera API:et att sluta generera fler token. Store Sequences är användbara för att kontrollera strukturen för utdata, till exempel att avsluta ett slutförande i slutet av en mening eller ett stycke.

  • Logit Bias: Gör att du kan ändra sannolikheten för att angivna token visas i slutförandet. Logit Bias kan användas för att vägleda slutförandet i en viss riktning eller för att utelämna specifikt innehåll.

Microsoft OpenAI-skydd

Förutom att hålla LLM:s svar bundna till specifika ämnen eller domäner är du förmodligen också bekymrad över de typer av frågor som användarna ställer till LLM. Det är viktigt att tänka på vilka typer av svar det genererar.

Först filtrerar API-anrop till Microsoft OpenAI Services automatiskt bort innehåll som API:et finner potentiellt stötande och rapporterar tillbaka detta till dig inom många olika filtreringskategorier.

Du kan använda OpenAI Moderation API direkt för att kontrollera innehåll om det finns potentiellt skadligt innehåll.

Sedan kan du använda Azure AI Content Safety för att hjälpa till med textmoderering, bildmoderering, riskidentifiering av jailbreak och identifiering av skyddat material. Detta kombinerar en portalkonfiguration, konfiguration och rapportering med kod som du kan lägga till i ditt program för att identifiera skadligt innehåll.

Slutliga överväganden för programdesign

Att förstå tokenisering, prissättning, kontextfönster och implementering av programmässiga förbättringar för att förbättra användarnas textgenerering påverkar hur du utformar ditt generativa AI-system.

Här är en kort lista över saker att tänka på och andra lärdomar från den här artikeln som kan påverka dina beslut om programdesign:

  • Utvärdera nödvändigheten av att använda den senaste AI-modellen mot kostnadsöverväganden. Modeller som är billigare kan räcka för din applikations behov. Balansera prestanda med budgetbegränsningar.
  • Överväg att optimera kontextfönstrets längd för att hantera kostnader utan att avsevärt påverka användarupplevelsen. Att trimma onödiga delar av konversationen kan minska bearbetningsavgifterna samtidigt som kvalitetsinteraktioner bibehålls.
  • Utvärdera hur tokenisering och kornigheten för dina indata och utdata påverkar prestandan. Att förstå hur din valda LLM hanterar tokenisering kan hjälpa dig att optimera effektiviteten för dina API-anrop, vilket kan minska kostnaderna och förbättra svarstiderna.

Om du vill börja experimentera med att skapa en generativ AI-lösning omedelbart rekommenderar vi att du tar en titt på Kom igång med chatten med hjälp av ditt eget dataexempel för Python. Handledning finns också tillgänglig i .NET, Javaoch JavaScript.