Dela via


Programdesign för AI-arbetsbelastningar i Azure

Det finns många tillgängliga alternativ att tänka på när du planerar att skapa ett program med AI-funktioner. Dina unika funktionella och icke-funktionella krav hjälper dig att begränsa beslut på hög nivå om din design, till exempel om användningsfallet är traditionell maskininlärning, generativ, deterministisk eller en kombination av AI-typer. När du går från designområden på hög nivå till designområden på lägre nivå finns det flera alternativ att tänka på längs vägen.

Som beskrivs i den Kom igång artikeln är det ett av de första viktiga besluten att välja om du vill skapa en egen modell eller använda en fördefinierad modell. Tänk på följande när du väljer en fördefinierad modell:

  • Katalogkällor. Utforska lagringsplatser som Hugging Face Model Hub, TensorFlow Hub eller Azure AI Studio-modellkatalogen för att hitta förtränade modeller. Dessa plattformar tillhandahåller en omfattande katalog med modeller över olika uppgifter.

  • Licensiering. Se till att modellens licensvillkor passar dina mål för säkerhet, efterlevnad och program, särskilt om du planerar att distribuera programmet eller integrera det med andra tjänster.

  • Viktiga komponenter. Titta på modellens arkitektur, träningsdata, prestanda och licensiering för att avgöra om den är finjusterad för din uppgift eller domän.

Vägledning om hur du väljer en värdplattform finns i Överväganden för modellvärdplattform.

Den här artikeln utforskar många vanliga designområden och faktorer att tänka på när du fattar viktiga beslut om teknik och tillvägagångssätt.

Rekommendationer

Här är sammanfattningen av rekommendationerna i den här artikeln.

Rekommendation beskrivning
Prioritera lösningar utanför hyllan. När det är praktiskt använder du PaaS-lösningar (Plattform som en tjänst) för att hantera arbetsbelastningsfunktioner. Använd fördefinierade och förtränade modeller där det är möjligt för att minimera drift- och utvecklingsbelastningen för dina arbetsbelastnings- och driftteam.
Abstrakta funktioner bort från klienten. Håll klienten så tunn som möjligt genom att utforma serverdelstjänster för att hantera övergripande problem som hastighetsbegränsning och redundansåtgärder.
Blockera åtkomst till datalager. Kod i AI-systemet bör inte direkt röra dina datalager. Dirigera alla databegäranden via ett API-lager. API:erna bör skapas för den specifika uppgift som krävs.
Isolera dina modeller. Precis som datalagren använder du ett API-lager för att fungera som en gateway för begäranden till modellen. Vissa PaaS-lösningar som Azure OpenAI Service och Azure Machine Learning använder SDK:er för detta ändamål. Många verktyg, till exempel PromptFlow, innehåller inbyggt stöd för att sprida API:er till tjänsten.
Utforma komponenter som ska kunna distribueras oberoende av varandra. AI-modeller, datapipelines, klientdelskomponenter och mikrotjänster som förbearbetning av data, extrahering av funktioner och slutsatsdragning bör kunna distribueras oberoende för att optimera flexibiliteten, skalbarheten och arbetsbelastningens funktion.

Containerize-komponenter

För att säkerställa att dina oberoende distribuerade komponenter är helt fristående och för att effektivisera dina distributioner bör du överväga containerisering som en del av din designstrategi. Följande komponenter ska vara containerbaserade:

  • Mikrotjänster: Enskilda mikrotjänster som hanterar specifika funktioner i programmet, till exempel databehandling, modellinferens eller användarautentisering, ska vara containerbaserade. Den här metoden möjliggör oberoende distribution och skalning, vilket underlättar effektivare uppdateringar och underhåll.

  • AI-modeller: Containerisera AI-modeller för att säkerställa att alla beroenden, bibliotek och konfigurationer samlas ihop. Den här metoden isolerar modellmiljön från värdsystemet, förhindrar versionskonflikter och säkerställer konsekvent beteende i olika distributionsmiljöer.

  • Databearbetningspipelines: Alla databearbetningsuppgifter som föregår eller följer modellinferens, till exempel datarensning, transformering och extrahering av funktioner, bör vara containerbaserade. Den här metoden förbättrar reproducerbarheten och förenklar hanteringen av beroenden.

  • Infrastrukturtjänster: Tjänster som tillhandahåller infrastrukturstöd, till exempel databaser eller cachelagringslager, kan också dra nytta av containerisering. Den här metoden hjälper till att upprätthålla versionskonsekvens och underlättar skalning och hantering av dessa komponenter.

Samlokalisera AI-komponenter med andra arbetsbelastningskomponenter

Det finns flera bra skäl att samplacera dina AI-komponenter med andra arbetsbelastningskomponenter, men det finns kompromisser med att göra det. Orsaker till att du kan samlokalisera är:

  • Känslighet för svarstid: Samlokalisera AI-komponenter med andra tjänster, till exempel API-värdtjänster, när det är viktigt med låg svarstid. Om till exempel realtidsinferens krävs för att förbättra användarupplevelsen kan en placering av AI-modeller nära API:et minimera den tid det tar att hämta resultat.

  • Datanärhet: När AI-modeller kräver frekvent åtkomst till specifika datauppsättningar, till exempel ett sökindex, kan samlokalisering av dessa komponenter förbättra prestanda och minska dataöverföringens omkostnader för snabbare bearbetning och slutsatsdragning.

  • Resursanvändning: Om vissa komponenter har kompletterande resursbehov, till exempel PROCESSOR och minne, kan samlokalisering av dem optimera resursanvändningen. En modell som kräver betydande beräkning kan till exempel dela resurser med en tjänst som har lägre krav på samma gång.

Avvägning. Det finns kompromisser med att samlokalisera komponenter som bör beaktas. Du kan förlora möjligheten att distribuera eller skala komponenter separat. Du kan också öka risken för fel genom att öka den potentiella explosionsradien för incidenter.

Utvärdera användningen av orkestratorer i generativa AI-lösningar

En orkestrerare hanterar arbetsflödet som samordnar kommunikationen mellan de olika komponenterna i AI-lösningen som annars skulle vara svår att hantera i komplexa arbetsbelastningar. Vi rekommenderar att du skapar en orkestrerare i din design om din arbetsbelastning har någon av följande egenskaper:

  • Komplexa arbetsflöden: Arbetsflödet omfattar flera steg, till exempel förbearbetning, modelllänkning eller efterbearbetning.

  • Villkorsstyrd logik: Beslut måste fattas dynamiskt baserat på modellutdata, till exempel routningsresultat till olika modeller.

  • Skalning och resurshantering: Du måste hantera resursallokering för program med stora volymer med hjälp av modellskalning baserat på efterfrågan.

  • Tillståndshantering: Du måste hantera tillståndet och minnet för användarinteraktioner.

  • Datahämtning: Du måste kunna hämta förhöjda data från indexet.

Överväganden för att använda flera modeller

När din arbetsbelastning använder flera modeller är det viktigt att använda en orkestrerare. Orchestrator ansvarar för att dirigera data och begäranden till lämplig modell baserat på användningsfallet. Planera för dataflöde mellan modeller, så att utdata från en modell kan fungera som indata för en annan. Planering kan omfatta datatransformering eller berikande processer.

Orkestrering och agenter

För generativa AI-arbetsbelastningar bör du överväga att använda en agentbaserad, ibland kallad agentisk, metod för din design för att lägga till utökningsbarhet i orkestreringen. Agenter refererar till sammanhangsbundna funktioner och delar många egenskaper i mikrotjänststil som utför uppgifter tillsammans med en orkestrerare. Orchestrator kan annonsera uppgifter till en pool med agenter eller agenter kan registrera funktioner med orchestrator. Båda metoderna gör det möjligt för orkestratorn att dynamiskt bestämma hur frågan ska delas upp och dirigeras mellan agenterna.

Agentiska metoder är idealiska när du har en gemensam gränssnittsyta med flera, utvecklande funktioner som kan anslutas till den upplevelsen för att lägga till fler färdigheter och jorda data i flödet över tid.

För komplexa arbetsbelastningar med många agenter är det mer effektivt att tillåta agenter att samarbeta dynamiskt i stället för att använda en dirigerare för att dela upp uppgifter och tilldela dem.

Kommunikationen mellan orkestratorn och agenterna bör följa ett mönster för ämneskö, där agenter är prenumeranter på ett ämne och dirigeraren skickar ut uppgifter via en kö.

Att använda en agentisk metod fungerar bäst med ett orkestreringsmönster snarare än ett koreografimönster.

Mer information finns i Överväganden för orkestreringsplattformen.

Utvärdera användningen av API-gatewayer

API-gatewayer, till exempel Azure API Management, abstraherar funktioner bort från API:er som frikopplar beroenden mellan den begärande tjänsten och API:et. API-gatewayer ger följande fördelar för AI-arbetsbelastningar:

  • Flera mikrotjänster: De hjälper dig att hantera flera AI-modellslutpunkter och du måste tillämpa konsekventa principer, till exempel hastighetsbegränsning och autentisering.

  • Trafikhantering: De hjälper dig att hantera appar med hög trafik effektivt genom att hantera begäranden, cachelagra svar och distribuera belastningar.

  • Säkerhet: De tillhandahåller centraliserad åtkomstkontroll, loggning och hotskydd för API:erna bakom gatewayen.

Dra nytta av designmönster för AI-program

Det finns flera vanliga designmönster som har upprättats i branschen för AI-program som du kan använda för att förenkla din design och implementering. De här designmönstren omfattar:

  • Modellsammansättning: Det här designmönstret omfattar att kombinera förutsägelser från flera modeller för att förbättra noggrannheten och robustheten, vilket minskar svagheterna i enskilda modeller.

  • Arkitektur för mikrotjänster: Att dela upp komponenter i oberoende distribuerade tjänster förbättrar skalbarheten och underhållsbarheten, vilket gör att team kan arbeta på olika delar av programmet samtidigt.

  • Händelsedriven arkitektur: Användning av händelser för att utlösa åtgärder möjliggör frikopplade komponenter och realtidsbearbetning, vilket gör systemet mer dynamiskt och anpassningsbart för att ändra data.

RAG-mönster och segmenteringsstrategier

RAG-mönstret (Retrieval-Augmented Generation) kombinerar generativa modeller med hämtningssystem, vilket gör det möjligt för modellen att komma åt externa kunskapskällor för bättre kontext och noggrannhet. Mer information om det här mönstret finns i Designa och utveckla en RAG-lösningsserie. Det finns två RAG-metoder:

  • Just-in-time: Den här metoden hämtar relevant information dynamiskt vid tidpunkten för en begäran, vilket säkerställer att de senaste data alltid används. Det är fördelaktigt i scenarier som kräver realtidskontext, men kan medföra svarstid.

  • Förberäknad (cachelagrad): Den här metoden omfattar cachelagring av hämtningsresultat, vilket minskar svarstiderna genom att betjäna förberäknade data. Den är lämplig för scenarier med hög efterfrågan där konsekventa data kan lagras, men kanske inte återspeglar den senaste informationen, vilket leder till potentiella relevansproblem.

När du använder ett RAG-mönster är en väldefinierad segmenteringsstrategi avgörande för att optimera arbetsbelastningens prestandaeffektivitet. Börja med vägledningen i serien Designa och utveckla en RAG-lösning. Ytterligare rekommendationer att överväga är:

  • Implementera en dynamisk segmenteringsstrategi som justerar segmentstorlekar baserat på datatyp, frågekomplexitet och användarkrav. Detta kan förbättra hämtningseffektiviteten och kontextbevarandet.

  • Införliva feedbackslingor för att förfina segmenteringsstrategier baserat på prestandadata.

  • Bevara data härstamning för segment genom att underhålla metadata och unika identifierare som länkar tillbaka till jordningskällan. Tydlig ursprungsdokumentation hjälper till att se till att användarna förstår datans ursprung, dess transformeringar och hur de bidrar till utdata.

När designmönster ska användas

Överväg att använda dessa designmönster när ditt användningsfall uppfyller något av villkoren:

  • Komplexa arbetsflöden: När du hanterar komplexa arbetsflöden eller interaktioner mellan flera AI-modeller kan mönster som RAG eller mikrotjänster hjälpa till att hantera komplexitet och säkerställa tydlig kommunikation mellan komponenter.

  • Skalbarhetskrav: Om efterfrågan på ditt program varierar kan enskilda komponenter skalas oberoende av varandra med hjälp av ett mönster som mikrotjänster, vilket gör att varierande belastningar kan anpassas utan att den övergripande systemprestandan påverkas.

  • Datadrivna program: Om ditt program kräver omfattande datahantering kan en händelsedriven arkitektur ge svarstider i realtid och effektiv databehandling.

Kommentar

Mindre program eller POC:er drar vanligtvis inte nytta av att använda något av dessa designmönster och bör byggas med en förenklad design. På samma sätt, om du har resursbegränsningar (budget, tid eller personalstyrka), är det bättre att använda en förenklad design som kan omstruktureras senare än att använda ett komplext designmönster.

Välj rätt ramverk och bibliotek

Valet av ramverk och bibliotek är nära sammanflätat med programdesign, vilket påverkar inte bara arkitekturen utan även prestanda, skalbarhet och underhåll. Omvänt kan designkrav begränsa ramverksval och skapa ett dynamiskt samspel mellan de två. Till exempel uppmuntrar användning av Semantic Kernel SDK (SK) ofta en mikrotjänstbaserad design där varje agent eller funktionalitet kapslas in i sin egen tjänst. Faktorer att tänka på när du väljer ramverk och bibliotek är:

  • Programkrav: De specifika kraven för programmet, till exempel bearbetning i realtid eller batchbearbetning, kan begränsa valet av ramverk. Om programmet till exempel kräver låg svarstid kan ett ramverk med asynkrona funktioner krävas.

  • Integreringsbehov: Designen kan kräva specifika integreringar med andra system eller tjänster. Om ett ramverk inte stöder nödvändiga protokoll eller dataformat kan det kräva att designen omprövas eller att ett annat ramverk väljs.

  • Teamexpertis: Utvecklingsteamets kompetensuppsättning kan begränsa ramverksval. En design som är beroende av ett mindre välbekant ramverk kan leda till ökad utvecklingstid och komplexitet, vilket leder till ett urval av ett mer välbekant verktyg.

Utforma en strategi för identiteter, auktorisering och åtkomst

Generellt sett bör du använda identitet, auktorisering och åtkomst på samma sätt som du normalt utformar program. Du bör använda en identitetsprovider, till exempel Microsoft Entra-ID, för att hantera dessa områden så mycket som möjligt. Det finns dock unika utmaningar för många AI-program som behöver särskild hänsyn. Att bevara åtkomstkontrollistor (ACL: er) via systemet är ibland utmanande eller till och med omöjligt utan att introducera ny utveckling.

Läs vägledningen i den säkra RAG-lösningen med flera klientorganisationer för att lära dig hur du lägger till metadata för säkerhetstrimning i dokument och segment. Den här trimning kan baseras på säkerhetsgrupper eller liknande organisationskonstruktioner.

Överväg de icke-funktionella kraven

Du kan ha icke-funktionella krav för din arbetsbelastning som är utmanande på grund av faktorer som är inneboende i AI-tekniker. Vanliga icke-funktionella krav och deras utmaningar är:

  • Svarstid för modellinferens/timeouter: AI-program kräver ofta realtids- eller nästan realtidssvar. Design för låg svarstid är avgörande, vilket innebär att optimera modellarkitektur, databearbetningspipelines och maskinvaruresurser. Det är också viktigt att implementera cachelagringsstrategier och säkerställa effektiv modellinläsning för att undvika timeouter och ge snabba svar.

  • Begränsningar för token- eller begärandeflöde: Många AI-tjänster begränsar antalet token eller dataflödet för begäranden, särskilt när du använder molnbaserade modeller. Design för dessa begränsningar kräver noggrann hantering av indatastorlekar, batchbearbetningsbegäranden vid behov och potentiellt implementering av hastighetsbegränsnings- eller kömekanismer för att hantera användarnas förväntningar och förhindra tjänststörningar.

  • Kostnads- och återbetalningsscenarier: Design för kostnadstransparens omfattar implementering av funktioner för användningsspårning och rapportering som underlättar återbetalningsmodeller, vilket gör det möjligt för organisationer att allokera kostnader korrekt mellan avdelningar. Återbetalningshantering hanteras normalt av en API-gateway, till exempel Azure API Management.

Nästa steg