Zephyrnet-Logo

Anpassen von Coding Companions für Organisationen | Amazon Web Services

Datum:

Generative KI-Modelle für Coding Companions werden meist auf öffentlich verfügbarem Quellcode und Text in natürlicher Sprache trainiert. Während die große Größe des Trainingskorpus es den Modellen ermöglicht, Code für häufig verwendete Funktionen zu generieren, kennen diese Modelle den Code in privaten Repositorys und die damit verbundenen Codierungsstile nicht, die bei der Entwicklung mit ihnen erzwungen werden. Folglich müssen die generierten Vorschläge möglicherweise neu geschrieben werden, bevor sie für die Aufnahme in ein internes Repository geeignet sind.

Wir können diese Lücke schließen und zusätzliche manuelle Bearbeitung minimieren, indem wir Codewissen aus privaten Repositories in ein auf öffentlichem Code trainiertes Sprachmodell einbetten. Aus diesem Grund haben wir eine Anpassungsfunktion für entwickelt Amazon Code Whisperer. In diesem Beitrag zeigen wir Ihnen zwei Möglichkeiten zur Anpassung von Coding Companions mithilfe von Retrieval Augmented Generation und Fine-Tuning.

Unser Ziel mit der Anpassungsfunktion von CodeWhisperer besteht darin, Organisationen die Möglichkeit zu geben, das CodeWhisperer-Modell mithilfe ihrer privaten Repositorys und Bibliotheken anzupassen, um organisationsspezifische Codeempfehlungen zu generieren, die Zeit sparen, Organisationsstil und -konventionen befolgen und Fehler oder Sicherheitslücken vermeiden. Dies kommt der Entwicklung von Unternehmenssoftware zugute und hilft, die folgenden Herausforderungen zu meistern:

  1. Spärliche Dokumentation oder Informationen für interne Bibliotheken und APIs, was Entwickler dazu zwingt, Zeit damit zu verbringen, zuvor geschriebenen Code zu untersuchen, um die Verwendung zu replizieren.
  2. Mangelndes Bewusstsein und mangelnde Konsistenz bei der Implementierung unternehmensspezifischer Codierungspraktiken, -stile und -muster.
  3. Unbeabsichtigte Verwendung veralteten Codes und APIs durch Entwickler.

Durch die Verwendung interner Code-Repositorys für zusätzliches Training, die bereits Codeüberprüfungen unterzogen wurden, kann das Sprachmodell die Verwendung interner APIs und Codeblöcke aufzeigen, die die oben aufgeführten Probleme lösen. Da der Referenzcode bereits überprüft wurde und die hohen Anforderungen des Kunden erfüllt, wird auch die Wahrscheinlichkeit der Einführung von Fehlern oder Sicherheitslücken minimiert. Und durch die sorgfältige Auswahl der für die Anpassung verwendeten Quelldateien können Unternehmen die Verwendung veralteten Codes reduzieren.

Design Herausforderungen

Das Anpassen von Codevorschlägen basierend auf den privaten Repositorys einer Organisation bringt viele interessante Designherausforderungen mit sich. Der Einsatz großer Sprachmodelle (LLMs) zur Oberflächencodevorschläge verursacht feste Kosten für die Verfügbarkeit und variable Kosten aufgrund der Schlussfolgerung basierend auf der Anzahl der generierten Token. Daher kann es unerschwinglich teuer sein, für jeden Kunden separate Anpassungen vorzunehmen und diese individuell zu hosten, wodurch zusätzliche Fixkosten entstehen. Andererseits erfordert die gleichzeitige Durchführung mehrerer Anpassungen auf demselben System eine mandantenfähige Infrastruktur, um proprietären Code für jeden Kunden zu isolieren. Darüber hinaus sollte die Anpassungsfunktion über Knöpfe verfügen, um die Auswahl der geeigneten Trainingsteilmenge aus dem internen Repository anhand verschiedener Metriken zu ermöglichen (z. B. Dateien mit einem Verlauf mit weniger Fehlern oder Code, der kürzlich in das Repository übernommen wurde). Durch die Auswahl des Codes basierend auf diesen Metriken kann die Anpassung mit höherwertigem Code trainiert werden, was die Qualität der Codevorschläge verbessern kann. Selbst bei sich ständig weiterentwickelnden Code-Repositories sollten die mit der Anpassung verbundenen Kosten minimal sein, damit Unternehmen Kosteneinsparungen durch eine höhere Entwicklerproduktivität erzielen können.

Ein grundlegender Ansatz zur Erstellung individueller Anpassungen könnte darin bestehen, das Modell auf einem einzelnen Trainingskorpus vorab zu trainieren, der aus dem vorhandenen (öffentlichen) Vortrainingsdatensatz und dem (privaten) Unternehmenscode besteht. Während dieser Ansatz in der Praxis funktioniert, erfordert er eine (redundante) individuelle Vorschulung unter Verwendung des öffentlichen Datensatzes für jedes Unternehmen. Außerdem sind redundante Bereitstellungskosten erforderlich, die mit dem Hosten eines individuellen Modells für jeden Kunden verbunden sind, das nur Kundenanfragen bearbeitet, die von diesem Kunden stammen. Durch die Entkopplung des Trainings von öffentlichem und privatem Code und die Bereitstellung der Anpassung auf einem mandantenfähigen System können diese redundanten Kosten vermieden werden.

So passen Sie an

Auf hoher Ebene gibt es zwei Arten möglicher Anpassungstechniken: Retrieval-Augmented Generation (RAG) und Fine-Tuning (FT).

  • Abruf-erweiterte Generierung: RAG findet in einem Repository übereinstimmende Codeteile, die einem bestimmten Codefragment ähneln (z. B. Code, der in der IDE unmittelbar vor dem Cursor steht) und erweitert die Eingabeaufforderung zur Abfrage des LLM mit diesen übereinstimmenden Codefragmenten. Dies bereichert die Eingabeaufforderung und hilft dem Modell, relevanteren Code zu generieren. In der Literatur werden einige Techniken in diesem Sinne untersucht. Sehen Retrieval-Augmented Generation für wissensintensive NLP-Aufgaben, REICH, kNN-LM und RETRO.

  • Feinabstimmung: FT nimmt ein vorab trainiertes LLM und trainiert es weiter auf einer spezifischen, kleineren Codebasis (im Vergleich zum vorab trainierten Datensatz), um es für das entsprechende Repository anzupassen. Durch die Feinabstimmung werden die Gewichtungen des LLM auf der Grundlage dieser Schulung angepasst, sodass sie besser auf die individuellen Bedürfnisse der Organisation zugeschnitten sind.

Sowohl RAG als auch Feinabstimmung sind leistungsstarke Werkzeuge zur Verbesserung der Leistung der LLM-basierten Anpassung. RAG kann sich schnell und mit geringerer Schulungskomplexität und geringeren Kosten an private Bibliotheken oder APIs anpassen. Das Durchsuchen und Erweitern abgerufener Codefragmente in der Eingabeaufforderung erhöht jedoch die Latenz zur Laufzeit. Stattdessen erfordert die Feinabstimmung keine Erweiterung des Kontexts, da das Modell bereits auf privaten Bibliotheken und APIs trainiert ist. Dies führt jedoch zu höheren Schulungskosten und einer Komplexität bei der Bereitstellung des Modells, wenn mehrere benutzerdefinierte Modelle für mehrere Unternehmenskunden unterstützt werden müssen. Wie wir später besprechen werden, können diese Bedenken durch eine weitere Optimierung des Ansatzes ausgeräumt werden.

Erweiterte Generation abrufen

Bei RAG sind einige Schritte erforderlich:

Indizierung

Wenn der Administrator ein privates Repository eingibt, wird ein Index erstellt, indem die Quellcodedateien in Blöcke aufgeteilt werden. Vereinfacht ausgedrückt wandelt Chunking die Codeschnipsel in verdauliche Teile um, die für das Modell wahrscheinlich am informativsten sind und angesichts des Kontexts leicht abzurufen sind. Die Größe eines Blocks und die Art und Weise, wie er aus einer Datei extrahiert wird, sind Designentscheidungen, die sich auf das Endergebnis auswirken. Chunks können beispielsweise basierend auf Codezeilen oder syntaktischen Blöcken usw. aufgeteilt werden.

Administrator-Workflow


Kontextsuche

Durchsuchen Sie eine Reihe indizierter Codeausschnitte basierend auf einigen Codezeilen über dem Cursor und rufen Sie relevante Codeausschnitte ab. Dieser Abruf kann mithilfe verschiedener Algorithmen erfolgen. Zu diesen Auswahlmöglichkeiten könnten gehören:

  • Beutel voller Wörter (BM25) - Eine Funktion zum Abrufen von Wörtern, die eine Reihe von Code-Snippets basierend auf der Häufigkeit der Abfragebegriffe und der Länge der Code-Snippets ordnet.

BM25-basierter Abruf

Die folgende Abbildung veranschaulicht die Funktionsweise von BM25. Um BM25 verwenden zu können, wird zunächst ein invertierter Index erstellt. Hierbei handelt es sich um eine Datenstruktur, die den Codeausschnitten, in denen diese Begriffe vorkommen, verschiedene Begriffe zuordnet. Bei der Suche suchen wir anhand der in der Abfrage vorhandenen Begriffe nach Codeausschnitten und bewerten sie anhand der Häufigkeit.

Semantischer Abruf

BM25 konzentriert sich auf den lexikalischen Abgleich. Daher ändert das Ersetzen von „Hinzufügen“ durch „Löschen“ möglicherweise nicht den BM25-Score basierend auf den Begriffen in der Abfrage, aber die abgerufene Funktionalität ist möglicherweise das Gegenteil von dem, was erforderlich ist. Im Gegensatz dazu konzentriert sich der semantische Abruf auf die Funktionalität des Code-Snippets, auch wenn Variablen- und API-Namen unterschiedlich sein können. Typischerweise kann eine Kombination aus BM25 und semantischen Abfragen gut zusammenarbeiten, um bessere Ergebnisse zu liefern.

Erweiterte Inferenz

Wenn Entwickler Code schreiben, wird ihr vorhandenes Programm verwendet, um eine Abfrage zu formulieren, die an den Abrufindex gesendet wird. Nachdem wir mit einer der oben beschriebenen Techniken mehrere Codeausschnitte abgerufen haben, stellen wir sie der ursprünglichen Eingabeaufforderung voran. Hier gibt es viele Designoptionen, einschließlich der Anzahl der abzurufenden Snippets, der relativen Platzierung der Snippets in der Eingabeaufforderung und der Größe des Snippets. Die endgültige Designauswahl wird in erster Linie durch empirische Beobachtungen bestimmt, indem verschiedene Ansätze mit dem zugrunde liegenden Sprachmodell untersucht werden, und spielt eine Schlüsselrolle bei der Bestimmung der Genauigkeit des Ansatzes. Der Inhalt der zurückgegebenen Blöcke und der Originalcode werden kombiniert und an das Modell gesendet, um angepasste Codevorschläge zu erhalten.

Entwickler-Workflow

Feinabstimmung:

Feintuning Es wird ein Sprachmodell erstellt Transferlernen bei dem die Gewichte eines vorab trainierten Modells auf neue Daten trainiert werden. Das Ziel besteht darin, das entsprechende Wissen aus einem bereits auf einem großen Korpus trainierten Modell beizubehalten und neues Wissen aus dem neuen Korpus – in unserem Fall einer neuen Codebasis – zu verfeinern, zu ersetzen oder hinzuzufügen. Das einfache Training einer neuen Codebasis führt zu katastrophales Vergessen. Beispielsweise kann das Sprachmodell sein Sicherheitswissen „vergessen“. oder die APIs, die bisher in der Unternehmenscodebasis nur spärlich verwendet werden. Es gibt eine Vielzahl von Techniken wie Wiederholung erleben, GEM und PP-TF die zur Bewältigung dieser Herausforderung eingesetzt werden.

Feintuning

Es gibt zwei Möglichkeiten zur Feinabstimmung. Ein Ansatz besteht darin, die zusätzlichen Daten zu verwenden, ohne die Eingabeaufforderung zur Feinabstimmung des Modells zu erweitern. Ein anderer Ansatz besteht darin, die Eingabeaufforderung während der Feinabstimmung durch den Abruf relevanter Codevorschläge zu erweitern. Dies trägt dazu bei, die Fähigkeit des Modells zu verbessern, bessere Vorschläge bereitzustellen, wenn abgerufene Codeausschnitte vorhanden sind. Das Modell wird dann nach dem Training anhand einer Reihe von Beispielen bewertet. Anschließend wird das angepasste Modell bereitgestellt und zur Generierung der Codevorschläge verwendet.

Trotz der Vorteile der Verwendung dedizierter LLMs zum Generieren von Code in privaten Repositorys können die Kosten für kleine und mittlere Unternehmen unerschwinglich sein. Dies liegt daran, dass dedizierte Rechenressourcen erforderlich sind, auch wenn diese angesichts der Größe der Teams möglicherweise nicht ausreichend genutzt werden. Eine Möglichkeit, Kosteneffizienz zu erreichen, besteht darin, mehrere Modelle auf derselben Recheneinheit bereitzustellen (z. B. SageMaker-Mehrmandantenfähigkeit). Sprachmodelle erfordern jedoch eine oder mehrere dedizierte GPUs über mehrere Zonen hinweg, um Latenz- und Durchsatzbeschränkungen zu bewältigen. Daher ist eine Mandantenfähigkeit des vollständigen Modellhostings auf jeder GPU nicht realisierbar.

Wir können dieses Problem lösen, indem wir mit Small mehrere Kunden auf derselben Rechenleistung bedienen Adapter zum LLM. Parametereffiziente Feinabstimmungstechniken (PEFT) wie schnelle Abstimmung, Präfix-Tuningund Low-Rank-Anpassung (LoRA) werden verwendet, um die Schulungskosten ohne Genauigkeitsverlust zu senken. Insbesondere LoRA hat große Erfolge darin erzielt, eine ähnliche (oder bessere) Genauigkeit zu erreichen wie die Feinabstimmung des vollständigen Modells. Die Grundidee besteht darin, eine Matrix mit niedrigem Rang zu entwerfen, die dann zu den Matrizen mit dem ursprünglichen Matrixgewicht der Zielschichten des Modells hinzugefügt wird. Typischerweise werden diese Adapter dann zum Servieren mit den ursprünglichen Modellgewichten zusammengeführt. Dies führt zu derselben Größe und Architektur wie das ursprüngliche neuronale Netzwerk. Indem wir die Adapter getrennt halten, können wir dasselbe Basismodell mit vielen Modelladaptern bedienen. Damit kommen die Skaleneffekte wieder unseren kleinen und mittelständischen Kunden zugute.

Low-Rank-Anpassung (LoRA)

Messung der Wirksamkeit der Anpassung

Wir benötigen Bewertungsmetriken, um die Wirksamkeit der maßgeschneiderten Lösung zu beurteilen. Offline-Bewertungsmetriken dienen als Schutz gegen Versandanpassungen, die im Vergleich zum Standardmodell unterdurchschnittlich sind. Durch die Erstellung von Datensätzen aus einem zurückgehaltenen Datensatz im bereitgestellten Repository kann der Anpassungsansatz auf diesen Datensatz angewendet werden, um die Wirksamkeit zu messen. Der Vergleich des vorhandenen Quellcodes mit dem angepassten Codevorschlag quantifiziert den Nutzen der Anpassung. Zu den für diese Quantifizierung häufig verwendeten Maßen gehören Metriken wie Ähnlichkeit bearbeiten, genaue Übereinstimmung und CodeBLEU.

Es ist auch möglich, den Nutzen zu messen, indem man quantifiziert, wie oft interne APIs durch die Anpassung aufgerufen werden, und diese mit den Aufrufen in der bereits vorhandenen Quelle vergleicht. Für einen erfolgreichen Abschluss ist es natürlich wichtig, dass beide Aspekte richtig sind. Für unseren Anpassungsansatz haben wir eine maßgeschneiderte Metrik namens Customization Quality Index (CQI) entwickelt, eine einzelne benutzerfreundliche Kennzahl zwischen 1 und 10. Die CQI-Metrik zeigt die Nützlichkeit der Vorschläge aus dem angepassten Modell im Vergleich zum Code Vorschläge mit einem generischen öffentlichen Modell.

Zusammenfassung

Wir haben die Anpassungsfähigkeit von Amazon CodeWhisperer basierend auf einer Mischung der führenden technischen Techniken, die in diesem Blogbeitrag besprochen werden, entwickelt und sie anhand von Benutzerstudien zur Entwicklerproduktivität bewertet, die von Persistent Systems durchgeführt wurden. In diesen beiden von AWS in Auftrag gegebenen Studien wurden Entwickler gebeten, eine medizinische Softwareanwendung in Java zu erstellen, die die Verwendung ihrer internen Bibliotheken erforderte. In der ersten Studie benötigten Entwickler ohne Zugriff auf CodeWhisperer (durchschnittlich) etwa 8.2 Stunden, um die Aufgabe abzuschließen, während diejenigen, die CodeWhisperer (ohne Anpassung) verwendeten, die Aufgabe 62 Prozent schneller in (durchschnittlich) etwa 3.1 Stunden erledigten.

In der zweiten Studie mit einer anderen Gruppe von Entwicklerkohorten erledigten Entwickler, die CodeWhisperer verwendeten, der mithilfe ihrer privaten Codebasis angepasst wurde, die Aufgabe im Durchschnitt in 2.5 Stunden, 28 Prozent schneller als diejenigen, die CodeWhisperer ohne Anpassung verwendeten und die Aufgabe in etwa 3.5 Stunden erledigten Stunden im Durchschnitt. Wir sind fest davon überzeugt, dass Tools wie CodeWhisperer, die an Ihre Codebasis angepasst werden, eine Schlüsselrolle bei der weiteren Steigerung der Entwicklerproduktivität spielen und empfehlen, sie auszuprobieren. Weitere Informationen und den Einstieg finden Sie unter Amazon CodeWhisperer-Seite.


Über die Autoren

Qing Sun ist Senior Applied Scientist in AWS AI Labs und arbeitet an AWS CodeWhisperer, einem generativen KI-gestützten Codierungsassistenten. Ihre Forschungsinteressen liegen in der Verarbeitung natürlicher Sprache, AI4Code und generativer KI. In der Vergangenheit hatte sie an mehreren NLP-basierten Diensten gearbeitet, beispielsweise Comprehend Medical, einem medizinischen Diagnosesystem bei Amazon Health AI und dem maschinellen Übersetzungssystem bei Meta AI. Sie promovierte 2017 an der Virginia Tech.

Arash Farahani ist angewandter Wissenschaftler bei Amazon CodeWhisperer. Seine aktuellen Interessen liegen in den Bereichen generative KI, Suche und Personalisierung. Arash ist leidenschaftlich daran interessiert, Lösungen zu entwickeln, die die Probleme der Entwickler lösen. Er hat an mehreren Funktionen innerhalb von CodeWhisperer gearbeitet und NLP-Lösungen in verschiedene interne Arbeitsabläufe eingeführt, die alle Amazon-Entwickler betreffen. Er erhielt seinen Doktortitel 2017 von der University of Illinois in Urbana-Champaign.

Xiaofei Ma ist Manager für angewandte Wissenschaft in AWS AI Labs. Er kam 2016 als angewandter Wissenschaftler innerhalb der SCOT-Organisation zu Amazon und arbeitete 2018 später bei AWS AI Labs an Amazon Kendra. Xiaofei war als Wissenschaftsmanagerin für mehrere Dienste tätig, darunter Kendra, Contact Lens und zuletzt CodeWhisperer und CodeGuru Security. Seine Forschungsinteressen liegen im Bereich AI4Code und Natural Language Processing. Er erhielt seinen Doktortitel 2010 von der University of Maryland, College Park.

Murali Krishna Ramanathan ist leitender angewandter Wissenschaftler in den AWS AI Labs und Co-Leiter von AWS CodeWhisperer, einem generativen KI-gestützten Codierungsbegleiter. Seine Leidenschaft gilt der Entwicklung von Softwaretools und Arbeitsabläufen, die zur Verbesserung der Entwicklerproduktivität beitragen. In der Vergangenheit entwickelte er Piranha, ein automatisiertes Refactoring-Tool zum Löschen von Code aufgrund veralteter Feature-Flags, und leitete Initiativen zur Codequalität bei Uber Engineering. Er ist Träger des Google Faculty Award (2015), des ACM SIGSOFT Distinguished Paper Award (ISSTA 2016) und des Maurice Halstead Award (Purdue 2006). 2008 erhielt er seinen Doktortitel in Informatik von der Purdue University.

Ramesh Nallapati ist Senior Principal Applied Scientist in AWS AI Labs und Co-Leiter von CodeWhisperer, einem generativen KI-gestützten Codierungsbegleiter, und Titan Large Language Models bei AWS. Seine Interessen liegen vor allem in den Bereichen Natural Language Processing und Generative AI. In der Vergangenheit war Ramesh wissenschaftlich führend bei der Bereitstellung vieler NLP-basierter AWS-Produkte wie Kendra, Quicksight Q und Contact Lens. Er hatte Forschungspositionen bei Stanford, CMU und IBM Research inne und erhielt seinen Ph.D. in Informatik an der University of Massachusetts Amherst im Jahr 2006.

spot_img

Neueste Intelligenz

spot_img