Zephyrnet-logo

Codeerhulpmiddelen voor organisaties aanpassen | Amazon-webservices

Datum:

Generatieve AI-modellen voor codeerbegeleiders zijn meestal getraind op openbaar beschikbare broncode en tekst in natuurlijke taal. Hoewel de modellen door de grote omvang van het trainingscorpus code kunnen genereren voor veelgebruikte functionaliteit, zijn deze modellen zich niet bewust van code in privรฉrepository's en de bijbehorende codeerstijlen die worden afgedwongen bij het ontwikkelen ermee. Bijgevolg moeten de gegenereerde suggesties mogelijk opnieuw worden geschreven voordat ze geschikt zijn voor opname in een interne opslagplaats.

We kunnen deze kloof dichten en extra handmatige bewerking minimaliseren door codekennis uit particuliere repository's in te bedden bovenop een taalmodel dat is getraind op publieke code. Daarom hebben we een aanpassingsmogelijkheid ontwikkeld voor Amazon Code Whisperer. In dit bericht laten we u twee mogelijke manieren zien om codeerbegeleiders aan te passen met behulp van verbeterde generatie en verfijning van het ophalen.

Ons doel met de aanpassingsmogelijkheden van CodeWhisperer is om organisaties in staat te stellen het CodeWhisperer-model aan te passen met behulp van hun privรฉrepository's en bibliotheken om organisatiespecifieke codeaanbevelingen te genereren die tijd besparen, de stijl en conventies van de organisatie volgen en bugs of beveiligingsproblemen voorkomen. Dit komt de ontwikkeling van bedrijfssoftware ten goede en helpt de volgende uitdagingen te overwinnen:

  1. Schaarse documentatie of informatie voor interne bibliotheken en API's waardoor ontwikkelaars tijd moeten besteden aan het onderzoeken van eerder geschreven code om het gebruik te repliceren.
  2. Gebrek aan bewustzijn en consistentie bij het implementeren van bedrijfsspecifieke codeerpraktijken, -stijlen en -patronen.
  3. Onbedoeld gebruik van verouderde code en API's door ontwikkelaars.

Door interne codeopslagplaatsen te gebruiken voor aanvullende training die al codereviews hebben ondergaan, kan het taalmodel het gebruik van interne API's en codeblokken aan het licht brengen die de voorgaande lijst met problemen overwinnen. Omdat de referentiecode al is beoordeeld en voldoet aan de hoge eisen van de klant, wordt ook de kans op het introduceren van bugs of beveiligingskwetsbaarheden geminimaliseerd. En door zorgvuldig de bronbestanden te selecteren die voor aanpassing worden gebruikt, kunnen organisaties het gebruik van verouderde code verminderen.

Ontwerp uitdagingen

Het aanpassen van codesuggesties op basis van de privรฉrepository's van een organisatie brengt veel interessante ontwerpuitdagingen met zich mee. Het implementeren van grote taalmodellen (LLM's) om codesuggesties naar boven te halen, brengt vaste kosten met zich mee voor de beschikbaarheid en variabele kosten als gevolg van gevolgtrekkingen op basis van het aantal gegenereerde tokens. Daarom kan het onbetaalbaar zijn om voor elke klant afzonderlijke aanpassingen aan te brengen en deze afzonderlijk te hosten, waardoor extra vaste kosten ontstaan. Aan de andere kant vereist het hebben van meerdere aanpassingen tegelijkertijd op hetzelfde systeem een โ€‹โ€‹infrastructuur met meerdere tenants om de eigen code voor elke klant te isoleren. Bovendien zou de aanpassingsmogelijkheid knoppen moeten opleveren om de selectie van de juiste trainingssubset uit de interne repository mogelijk te maken met behulp van verschillende statistieken (bijvoorbeeld bestanden met een geschiedenis van minder bugs of code die onlangs in de repository is vastgelegd). Door de code te selecteren op basis van deze statistieken, kan de aanpassing worden getraind met behulp van code van hogere kwaliteit, waardoor de kwaliteit van codesuggesties kan worden verbeterd. Ten slotte zouden, zelfs met voortdurend evoluerende coderepository's, de kosten die gepaard gaan met maatwerk minimaal moeten zijn om bedrijven te helpen kostenbesparingen te realiseren door een hogere productiviteit van ontwikkelaars.

Een basisbenadering voor het bouwen van maatwerk zou kunnen zijn om het model vooraf te trainen op een enkel trainingscorpus dat bestaat uit de bestaande (openbare) pretraining-dataset samen met de (privรฉ) bedrijfscode. Hoewel deze aanpak in de praktijk werkt, vereist het een (redundante) individuele vooropleiding waarbij gebruik wordt gemaakt van de openbare dataset voor elke onderneming. Het vereist ook redundante implementatiekosten die gepaard gaan met het hosten van een aangepast model voor elke klant dat alleen klantverzoeken van die klant verwerkt. Door de training van publieke en private code te ontkoppelen en het maatwerk in te zetten op een multi-tenant systeem, kunnen deze overtollige kosten worden vermeden.

Aanpassen

Op een hoog niveau zijn er twee soorten mogelijke maatwerktechnieken: retrieval-augmentedgeneration (RAG) en fine-tuning (FT).

  • Retrieval-augmented generatie: RAG vindt overeenkomende stukjes code in een repository die vergelijkbaar zijn met een bepaald codefragment (bijvoorbeeld code die onmiddellijk voorafgaat aan de cursor in de IDE) en vergroot de prompt die wordt gebruikt om de LLM te bevragen met deze overeenkomende codefragmenten. Dit verrijkt de prompt om het model te helpen relevantere code te genereren. In de literatuur zijn in deze zin een aantal technieken onderzocht. Zien Retrieval-Augmented Generation voor kennisintensieve NLP-taken, RIJK, kNN-LM en RETRO.

  • Scherpstellen: FT neemt een vooraf getrainde LLM en traint deze verder op een specifieke, kleinere codebase (vergeleken met de pre-training dataset) om deze aan te passen voor de juiste repository. Fine-tuning past de gewichten van de LLM aan op basis van deze training, waardoor deze beter wordt afgestemd op de unieke behoeften van de organisatie.

Zowel RAG als verfijning zijn krachtige hulpmiddelen om de prestaties van op LLM gebaseerd maatwerk te verbeteren. RAG kan zich snel aanpassen aan privรฉbibliotheken of API's met lagere trainingscomplexiteit en lagere kosten. Het zoeken en uitbreiden van opgehaalde codefragmenten naar de prompt verhoogt echter de latentie tijdens runtime. In plaats daarvan vereist verfijning geen enkele uitbreiding van de context, omdat het model al is getraind op privรฉbibliotheken en API's. Het leidt echter tot hogere trainingskosten en complexiteit bij het bedienen van het model, wanneer meerdere aangepaste modellen moeten worden ondersteund door meerdere zakelijke klanten. Zoals we later zullen bespreken, kunnen deze zorgen worden verholpen door de aanpak verder te optimaliseren.

Verbeterde generatie ophalen

Er zijn een paar stappen betrokken bij RAG:

Indexeren

Gegeven een privรฉrepository als invoer door de beheerder, wordt er een index gemaakt door de broncodebestanden in stukjes te splitsen. Simpel gezegd: chunking verandert de codefragmenten in verteerbare stukken die waarschijnlijk het meest informatief zijn voor het model en die, gezien de context, gemakkelijk terug te vinden zijn. De grootte van een stuk en hoe het uit een bestand wordt geรซxtraheerd, zijn ontwerpkeuzes die het eindresultaat beรฏnvloeden. Brokken kunnen bijvoorbeeld worden gesplitst op basis van coderegels of op basis van syntactische blokken, enzovoort.

Beheerdersworkflow


Contextueel zoeken

Zoek een reeks geรฏndexeerde codefragmenten op basis van een paar regels code boven de cursor en haal relevante codefragmenten op. Dit ophalen kan gebeuren met behulp van verschillende algoritmen. Deze keuzes kunnen het volgende omvatten:

  • Zak met woorden (BM25) - Een functie voor het ophalen van een reeks woorden die een reeks codefragmenten rangschikt op basis van de frequenties van de zoektermen en de lengte van de codefragmenten.

Op BM25 gebaseerd ophalen

De volgende afbeelding illustreert hoe BM25 werkt. Om BM25 te kunnen gebruiken, wordt eerst een omgekeerde index gebouwd. Dit is een datastructuur die verschillende termen toewijst aan de codefragmenten waarin die termen voorkomen. Tijdens het zoeken zoeken we codefragmenten op op basis van de termen in de zoekopdracht en scoren we deze op basis van de frequentie.

Semantisch ophalen

BM25 richt zich op lexicale matching. Daarom kan het vervangen van โ€œaddโ€ door โ€œdeleteโ€ de BM25-score op basis van de termen in de query niet veranderen, maar de opgehaalde functionaliteit kan het tegenovergestelde zijn van wat vereist is. Semantisch ophalen richt zich daarentegen op de functionaliteit van het codefragment, ook al kunnen de namen van variabelen en API's verschillen. Normaal gesproken kan een combinatie van BM25 en semantische opzoekingen goed samenwerken om betere resultaten op te leveren.

Verbeterde gevolgtrekking

Wanneer ontwikkelaars code schrijven, wordt hun bestaande programma gebruikt om een โ€‹โ€‹query te formuleren die naar de ophaalindex wordt verzonden. Nadat we meerdere codefragmenten hebben opgehaald met behulp van een van de hierboven besproken technieken, voegen we ze toe aan de oorspronkelijke prompt. Er zijn hier veel ontwerpkeuzes, waaronder het aantal op te halen fragmenten, de relatieve plaatsing van de fragmenten in de prompt en de grootte van het fragment. De uiteindelijke ontwerpkeuze wordt voornamelijk gedreven door empirische observatie door verschillende benaderingen te verkennen met het onderliggende taalmodel en speelt een sleutelrol bij het bepalen van de nauwkeurigheid van de aanpak. De inhoud van de geretourneerde chunks en de originele code worden gecombineerd en naar het model verzonden om aangepaste codesuggesties te krijgen.

Werkstroom voor ontwikkelaars

Scherpstellen:

Scherpstellen er is een taalmodel voor gemaakt overdracht leren waarin de gewichten van een vooraf getraind model worden getraind op nieuwe gegevens. Het doel is om de juiste kennis te behouden van een model dat al op een groot corpus is getraind en om nieuwe kennis uit het nieuwe corpus te verfijnen, vervangen of toe te voegen โ€“ in ons geval een nieuwe codebase. Gewoon trainen op een nieuwe codebase leidt tot catastrofaal vergeten. Het taalmodel kan dat bijvoorbeeld zijn โ€˜vergeetโ€™ zijn kennis van veiligheid of de API's die tot nu toe spaarzaam worden gebruikt in de bedrijfscodebase. Er zijn verschillende technieken zoals ervaring herhaling, GEM GEVONDEN en PP-TF die worden ingezet om deze uitdaging aan te pakken.

Scherpstellen

Er zijn twee manieren om te verfijnen. Eรฉn benadering is om de aanvullende gegevens te gebruiken zonder de prompt te vergroten om het model te verfijnen. Een andere benadering is om de prompt tijdens het afstemmen te vergroten door relevante codesuggesties op te halen. Dit helpt het vermogen van het model te verbeteren om betere suggesties te geven in de aanwezigheid van opgehaalde codefragmenten. Nadat het model is getraind, wordt het model vervolgens geรซvalueerd op basis van een reeks voorbeelden. Vervolgens wordt het maatwerkmodel ingezet en gebruikt voor het genereren van de codesuggesties.

Ondanks de voordelen van het gebruik van speciale LLM's voor het genereren van code in privรฉrepository's, kunnen de kosten onbetaalbaar zijn voor kleine en middelgrote organisaties. Dit komt omdat speciale computerbronnen nodig zijn, ook al worden deze mogelijk onderbenut gezien de omvang van de teams. Eรฉn manier om kostenefficiรซntie te bereiken is het aanbieden van meerdere modellen op dezelfde computer (bijvoorbeeld SageMaker multi-tenancy). Taalmodellen vereisen echter een of meer speciale GPU's in meerdere zones om met latentie- en doorvoerbeperkingen om te gaan. Daarom is multi-tenancy van volledige modelhosting op elke GPU onhaalbaar.

We kunnen dit probleem oplossen door meerdere klanten op dezelfde computer te bedienen door gebruik te maken van small adapters naar de LLM. Parameter-efficiรซnte fine-tuning (PEFT) technieken zoals snelle afstemming, voorvoegsel afstemmenen aanpassing op laag niveau (LoRA) worden gebruikt om de trainingskosten te verlagen zonder verlies van nauwkeurigheid. Vooral LoRA heeft veel succes geboekt bij het bereiken van een vergelijkbare (of betere) nauwkeurigheid dan bij het afstemmen van het volledige model. Het basisidee is om een โ€‹โ€‹matrix van lage rang te ontwerpen die vervolgens aan de matrices wordt toegevoegd met het oorspronkelijke matrixgewicht van de beoogde lagen van het model. Meestal worden deze adapters vervolgens samengevoegd met de originele modelgewichten om te serveren. Dit leidt tot dezelfde omvang en architectuur als het oorspronkelijke neurale netwerk. Door de adapters gescheiden te houden, kunnen we hetzelfde basismodel met veel modeladapters bedienen. Dit brengt de schaalvoordelen terug naar onze kleine en middelgrote klanten.

Aanpassing op lage rang (LoRA)

Het meten van de effectiviteit van maatwerk

We hebben evaluatiegegevens nodig om de doeltreffendheid van de op maat gemaakte oplossing te beoordelen. Offline evaluatiestatistieken fungeren als vangrail tegen verzendaanpassingen die ondermaats zijn vergeleken met het standaardmodel. Door datasets op te bouwen uit een bestaande dataset vanuit de aangeboden repository, kan de maatwerkbenadering op deze dataset worden toegepast om de effectiviteit te meten. Het vergelijken van de bestaande broncode met de op maat gemaakte codesuggestie kwantificeert het nut van het maatwerk. Veelgebruikte maatstaven die voor deze kwantificering worden gebruikt, zijn onder meer statistieken zoals gelijkenis bewerken, exacte overeenkomst, en CodeBLEU.

Het is ook mogelijk om het nut te meten door te kwantificeren hoe vaak interne API's worden aangeroepen door de aanpassing en deze te vergelijken met de aanroepen in de reeds bestaande bron. Uiteraard is het belangrijk om beide aspecten goed te laten verlopen voor een succesvolle afronding. Voor onze maatwerkaanpak hebben we een op maat gemaakte statistiek ontworpen die bekend staat als Customization Quality Index (CQI), een enkele gebruiksvriendelijke maatstaf variรซrend tussen 1 en 10. De CQI-statistiek toont het nut van de suggesties uit het aangepaste model in vergelijking met code suggesties met een generiek publiek model.

Samengevat

We hebben de aanpassingsmogelijkheden van Amazon CodeWhisperer gebouwd op basis van een combinatie van de toonaangevende technische technieken die in deze blogpost worden besproken en deze geรซvalueerd met gebruikersonderzoeken naar de productiviteit van ontwikkelaars, uitgevoerd door Persistent Systems. In deze twee onderzoeken, uitgevoerd in opdracht van AWS, werd ontwikkelaars gevraagd een medische softwareapplicatie in Java te maken waarvoor gebruik gemaakt moest worden van hun interne bibliotheken. In het eerste onderzoek hadden ontwikkelaars zonder toegang tot CodeWhisperer (gemiddeld) ~8.2 uur nodig om de taak te voltooien, terwijl degenen die CodeWhisperer (zonder maatwerk) gebruikten de taak 62 procent sneller voltooiden in (gemiddeld) ~3.1 uur.

In het tweede onderzoek met een andere groep ontwikkelaarscohorten voltooiden ontwikkelaars die CodeWhisperer gebruikten en die waren aangepast met behulp van hun privรฉcodebase de taak gemiddeld in 2.5 uur, 28 procent sneller dan degenen die CodeWhisperer zonder aanpassingen gebruikten, en voltooiden de taak in ~3.5 uur. gemiddeld uur. Wij zijn ervan overtuigd dat tools zoals CodeWhisperer, die zijn aangepast aan uw codebase, een sleutelrol kunnen spelen bij het verder verhogen van de productiviteit van ontwikkelaars en raden u aan dit eens te proberen. Ga voor meer informatie en om aan de slag te gaan naar de Amazon CodeWhisperer-pagina.


Over de auteurs

Qing zon is een Senior Applied Scientist bij AWS AI Labs en werkt aan AWS CodeWhisperer, een generatieve AI-aangedreven codeerassistent. Haar onderzoeksinteresses liggen bij Natural Language Processing, AI4Code en generatieve AI. In het verleden had ze gewerkt aan verschillende NLP-gebaseerde diensten, zoals Comprehend Medical, een medisch diagnosesysteem bij Amazon Health AI en Machine Translation-systeem bij Meta AI. Ze promoveerde in 2017 aan Virginia Tech.

Arash Farahani is een toegepast wetenschapper bij Amazon CodeWhisperer. Zijn huidige interesses liggen bij generatieve AI, zoeken en personalisatie. Arash heeft een passie voor het bouwen van oplossingen die pijnpunten voor ontwikkelaars oplossen. Hij heeft aan meerdere functies binnen CodeWhisperer gewerkt en NLP-oplossingen geรฏntroduceerd in verschillende interne werkstromen die alle Amazon-ontwikkelaars raken. Hij promoveerde in 2017 aan de Universiteit van Illinois in Urbana-Champaign.

Xiaofei Ma is een Applied Science Manager bij AWS AI Labs. Hij kwam in 2016 bij Amazon als Applied Scientist binnen de SCOT-organisatie en later bij AWS AI Labs in 2018, waar hij aan Amazon Kendra werkte. Xiaofei heeft gediend als wetenschapsmanager voor verschillende diensten, waaronder Kendra, Contact Lens en meest recentelijk CodeWhisperer en CodeGuru Security. Zijn onderzoeksinteresses liggen op het gebied van AI4Code en Natural Language Processing. Hij promoveerde in 2010 aan de Universiteit van Maryland, College Park.

Murali Krishna Ramanathan is een Principal Applied Scientist bij AWS AI Labs en mede-leider van AWS CodeWhisperer, een generatieve AI-aangedreven codeerpartner. Hij heeft een passie voor het bouwen van softwaretools en workflows die de productiviteit van ontwikkelaars helpen verbeteren. In het verleden bouwde hij Piranha, een geautomatiseerde refactoringtool om code te verwijderen vanwege verouderde feature-vlaggen, en leidde hij initiatieven voor codekwaliteit bij Uber Engineering. Hij ontving de Google Faculty Award (2015), de ACM SIGSOFT Distinguished Paper Award (ISSTA 2016) en de Maurice Halstead Award (Purdue 2006). Hij promoveerde in 2008 in computerwetenschappen aan de Purdue University.

Ramesh Nallapati is een Senior Principal Applied Scientist bij AWS AI Labs en is mede-leider van CodeWhisperer, een generatieve AI-aangedreven codeerpartner, en Titan Large Language Models bij AWS. Zijn interesses liggen vooral op het gebied van natuurlijke taalverwerking en generatieve AI. In het verleden heeft Ramesh wetenschappelijk leiderschap geleverd bij het leveren van veel NLP-gebaseerde AWS-producten zoals Kendra, Quicksight Q en Contact Lens. Hij bekleedde onderzoeksfuncties bij Stanford, CMU en IBM Research, en behaalde zijn Ph.D. in Computerwetenschappen aan de Universiteit van Massachusetts Amherst in 2006.

spot_img

Laatste intelligentie

spot_img