Code-Vervollständigung mithilfe Künstlicher Intelligenz GitHub Copilot – der maschinelle Pair Programmer

Von Mirco Lang

Microsoft spendiert GitHub ein Helferlein, das beim Schreiben von Code hilft. Copilot soll wie der Kollege sein, mit dem man bei der Paarprogrammierung zusammenarbeitet – und der immer offen für ein „Wie geht das gleich?“ ist.

Anbieter zum Thema

GitHub Copilot soll nicht weniger werden, als der freundliche Tandem-Programmierer von nebenan.
GitHub Copilot soll nicht weniger werden, als der freundliche Tandem-Programmierer von nebenan.
(Bild: GitHub / Microsoft)

GitHub Copilot wurde bereits Mitte 2021 angekündigt, ist allerdings noch nicht frei zugänglich. Derzeit läuft das KI-Tools als Technical Preview, Zugang gibt es über eine Warteliste – was sich erfahrungsgemäß durchaus ein paar Monate hinziehen kann. Klar, das Interesse ist riesig!

Copilot basiert auf OpenAI Codex, einem System, das natürliche Sprache in Code übersetzt. Wenn Sie mit Codex beispielsweise anführende Leerzeichen aus einem Text entfernen wollen, genügt eine Anweisung wie „Lösche alle anführenden Leerzeichen“ – und schon erstellt das System entsprechenden Code in zum Beispiel JavaScript, Go, Perl, PHP, Ruby, Swift oder Shell.

GitHub Copilot in Aktion in Visual Studio Code.
GitHub Copilot in Aktion in Visual Studio Code.
(Bild: Lang / Microsoft)

Ganz so weit geht Copilot nicht, grundsätzlich müssen Sie schon Code schreiben. Die Hilfe geht aber eben weit über simple Autovervollständigung hinaus. Auch Copilot versteht über ein Dutzend Sprachen, explizit hervorgehoben werden zurzeit Python, JavaScript, TypeScript, Ruby, Java und Go. Nutzen lässt sich das vielversprechende AI-Tool über Erweiterungen für Neovim, JetBrains und Visual Studio Code.

Einmal in der gewünschten IDE gelandet, soll Copilot wie folgt arbeiten: Der Nutzer gibt einen Kontext vor, beispielsweise den (sprechenden) Namen einer Funktion oder einen Kommentar, und Copilot liefert dann ganz konkreten Beispielcode – und zwar in Form kompletter Funktionen und Aufrufe. Der gelieferte Code basiert dabei auf Trainingsdaten aus öffentlich zugänglichem Code, also etwa GitHub-Repositories.

Im besten Fall kann diese Unterstützung tatsächlich jede Menge Zeit sparen. Zum einen, weil redundanter Code schneller umgesetzt werden kann. Wenn Sie etwa zehn nahezu identische Zeilen zum Definieren von Variablen benötigten, müssen Sie lediglich die erste komplett schreiben, den Rest kann Copilot mehr oder minder so einfügen, dass Sie nur noch Kleinigkeiten ändern müssen. Zum anderen, weil es viel Sucherei nach konkreten Syntaxbeispielen oder passenden Stellen in der Dokumentation ersparen kann.

GitHub sagt aber auch gleich, dass es sich dabei nicht immer um lauffähigen Code handelt! Noch nicht einmal zwangsläufig um sinnvollen Code. Wer also nun geglaubt hätte, Einsteiger ohne Programmierkenntnisse könnten mal eben ganze Projekte umsetzen, liegt komplett falsch. Für Entwickler mit mindestens Grundkenntnissen hingegen, könnte Copilot immer wieder mal den einen entscheidenden Hinweis liefern, was Syntax oder Aufbau eines Code-Blocks angeht.

Ein wenig Praxis

Die Arbeit mit GitHub Copilot ist im Grunde trivial, hier mal am Beispiel Visual Studio Code: Derzeit müssen Sie sich noch für die Preview anmelden und auf die Warteliste setzen lassen. Einmal freigeschaltet, installieren Sie das Plug-in über den Visual-Studio-Marktplatz direkt in der IDE selbst.

Sobald Sie nun eine neue Datei angelegt und eine zugehörige Programmiersprache ausgewählt haben, beginnt Copilot seine Arbeit. Angenommen, Sie benötigen eine Funktion, um Tabs gegen Leerzeichen zu tauschen und tippen folgendes ein:

function changeTabsTo

Dann wird Copilot sofort „changeTabsToSpaces“ vorschlagen – verständlich, schließlich dürfte diese Aufgabe in den Trainingsdaten tausendfach vorkommen. Mittels „TAB“ können derlei Vorschläge angenommen werden, mit „ALT+PLUS“ und „ALT+MINUS“ werden Alternativen angezeigt. Oder man öffnet direkt ein separates Fenster mit allen Copilot-Vorschlägen.

Sobald die erste Zeile der Funktion akzeptiert wurde, legt Copilot richtig los und produziert „richtigen“ Code – in unterschiedlichen Qualitäten. Hier mal die vorgeschlagenen Varianten für das Tauschen von Tabs gegen Leerzeichen einmal in JavaScript und einmal in Python. Zunächst JavaScript:

function changeTabsToSpaces(text) {
   var newText = text.replace(/\t/g, " ");
   return newText;

Und hier für Python:

function changeTabsToSpaces() {
   sed -i 's/\t/     /g' $1
}

Die grundsätzliche Idee ist in beiden Fällen identisch und durchaus korrekt, nämlich dateiweites Suchen-und-Ersetzen über die passenden regulären Ausdrücke. Ohne jetzt groß auf die – keineswegs repräsentative – Code-Qualität einzugehen, dürfte auf den ersten Blick klar sein, dass sich die Aufgabe in Python vielleicht doch ein wenig eleganter lösen ließe, als ein externes sed-Statement aufzurufen – was ein zweiter Versuch dann auch bestätigte:

function changeTabsToSpaces(fileName):
   file = open(fileName, 'r')
   fileContent = file.read()
   file.close()
   fileContent = fileContent.replace('\t', '    ')
   file = open(fileName, 'w')
   file.write(fileContent)
   file.close()

Auch wenn der JavaScript-Code deutlich besser aussieht und sicherlich hilfreich sein könnte, lauffähig sieht anders aus, wie ein zweites Beispiel zeigt – immer noch trivial, aber ein wenig komplexer: Das Abrufen der Status von smarten Philips-Hue-Lampen. Vorgegeben wurde lediglich der Funktionsname.

Jetzt Newsletter abonnieren

Verpassen Sie nicht unsere besten Inhalte

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung
function getStatusOfHueLamp(ip, id) {
   var url = "http://" + ip + "/api/" + id + "/lights/" + id + "/state";
   var xhr = new XMLHttpRequest();
   xhr.open("GET", url, false);
   xhr.send();
   var response = JSON.parse(xhr.responseText);
   return response.state.on;
}

Zumindest die zusammengestellte URL ist nicht ganz falsch, auch wenn für den Abruf eigentlich kein „/state“ am Ende benötigt wird. Dieser Code-Schnipsel funktioniert zwar in der Form nicht, liefert aber doch deutlich mehr Hinweise auf die Lösung als ein leeres Blatt Papier.

Was ist zu erwarten?

GitHub Copilot ist derzeit sicherlich noch keine Revolution, aber durchaus mehr als die natürliche Evolution der Autovervollständigung. Das Potenzial, die Produktivität massiv zu steigern und das Lernen enorm zu vereinfachen, ist definitiv gegeben – zumal man nicht vergessen darf, dass es sich noch um eine Vorschau handelt und AI-Systeme naturgemäß im Laufe der Zeit und durch Nutzung kontinuierlich besser werden.

Die Free Software Foundation [https://www.fsf.org/blogs/licensing/fsf-funded-call-for-white-papers-on-philosophical-and-legal-questions-around-copilot] wirft allerdings Fragen rund um die rechtlichen Aspekte von Copilot auf. Unter anderem geht es um die Frage, ob das Trainieren von neuralen Netzwerken mit öffentlich verfügbaren Daten unter Fair Use fällt – eine Frage, die hierzulande, wo es zum Leidwesen vieler gar keine Fair-Use-Regelung gibt, noch deutlich komplizierter werden könnte.

Fürderhin steht die Frage nach etwaigen Copyright-Verletzungen im Raum, schließlich fügt Copilot eigenständig durchaus größere Code-Brocken in Projekte ein. Laut GitHub haben eigene Untersuchung allerdings nur sehr wenige 1:1 aus den Trainingsdaten übernommene Vorschäge aufgezeigt, sofern es sich nicht um ganz universelle Lösungen handelt.

Ein Grund dafür dürfte auch der übergebene Kontext sein: Copilot berücksichtigt nicht bloß die aktuelle Eingabe, sondern das Dokument im Ganzen. In einem leeren Dokument stehen die Chancen daher schlechter, gute individuelle Vorschläge zu erhalten. Apropos: In den Trainingsdaten finden sich natürlich auch immer wieder mal persönliche Daten der Besitzer der Repositories – und auch solche können in den Vorschlägen landen.

Das sind jetzt nur zwei von vielen Aspekten, die die FSF aufwirft. Eine mitunter spannende Frage für Lizenz-Spezialisten: Wenn Copilot von AGPL-lizenziertem Code lernt, ist das dann bereits ein Verstoß gegen die AGPL? Die Affero GPL greift im Gegensatz zur GPL nicht erst bei der Distribution des Codes, sondern schon beim Zugriff darauf über ein Netzwerk.

Eine interessante Abhandlung zu dem Thema mit gänzlich konträrem Standpunkt gibt es von Julia Reda, die zum Beispiel das Thema Schöpfungshöhe thematisiert: „Das Urheberrecht ist bislang nur auf geistige Schöpfungen anwendbar – wo keine Schöpferin, da kein Werk.“

Maschinengenerierter Code wie der von GitHubs Copilot stelle damit kein Werk im urheberrechtlichen Sinne dar, so Reda, also auch kein abgeleitetes Werk. Wenn man das so stehen lässt, braucht es aber sicherlich keinen Superschurken, um eine dumme KI zu schaffen, die geschützte Inhalte von Dritten einliest und so minimal verändert, dass sie plötzlich als urheberrechtlich nicht relevanter Output einer Maschine gewertet werden.

Zusammengefasst: GitHub Copilot ist ein sehr vielversprechender Syntax-Assistent in einem sehr frühen Stadium, der noch sehr viele Fragen abseits der reinen Technik aufwerfen wird. Aber dass künstliche Intelligenz nicht nur MINTler, sondern auch Philosophen zunehmend beschäftigen wird, ist in der Theorie sowieso längst klar. Jetzt zieht die Praxis nach.

Dieser Beitrag stammt von unserem Partnerportal Dev-Insider.de.

(ID:47887652)