Über die Schulter geschaut - Prof. Dr. Bernd Finkbeiner, Frederik Schmitt - CISPA

 
WEITER LESEN
Über die Schulter geschaut - Prof. Dr. Bernd Finkbeiner, Frederik Schmitt - CISPA
Titel | Codesynthese

Künstliche Intelligenz in der Softwareentwicklung

Über die Schulter
geschaut
Prof. Dr. Bernd Finkbeiner,
Frederik Schmitt

Künstliche Intelligenz hilft
Entwicklern beim Coden.
Die Frage ist, ob KI
Entwickler-Know-how auch
ersetzen kann. Der Artikel beleuchtet
den derzeitigen Forschungsstand.

E
      ntwicklerinnen und Entwickler müs­       gramm­ieraufgabe automatisch, also durch      zum Berechnen von Fibonacci-Zahlen er­
      sen in der modernen Softwareent­         einen Algorithmus, in ein Computerpro­        zeugt GPT-3 den im Listing gezeigten
      wicklung immer seltener Probleme         gramm zu übersetzen, sodass das Programm      Python-­Code.
von Grund auf neu lösen. Ein Großteil der      die Aufgabe für jede mögliche Eingabe
Funktionen steckt in Bibliotheken, und         kor­rekt löst?
Plattformen wie GitHub und Stack Over­            Heute, mehr als 60 Jahre später, scheint   Websites automatisch mit
flow liefern Millionen Codebeispiele zu        die Antwort zum Greifen nah. Sprachmo­        GPT-3 programmieren
nahezu jeder denkbaren Programmierauf­         delle wie das vom kalifornischen Start-up
gabe. Machine Learning könnte die Pro­         OpenAI im letzten Jahr vorgestellte GPT-3     Eine der beeindruckendsten Anwendungen
grammierarbeit noch einmal vereinfachen.       (Generative Pre-trained Transformer 3)        dieser Technologie ist die automatische Pro­
    Der Wunsch nach Programmen, die            sind in der Lage, in natürlicher Sprache      grammierung von Websites. Auf Twitter
Programme schreiben, ist so alt wie die In­    formulierte Anforderungen vollautoma­         kursieren Videos, etwa von Debuild-Grün­
formatik. Schon 1957 formulierte Alonzo        tisch in ein Computerprogramm zu über­        der Sharif Shameem, die zeigen, wie GPT-3
Church, einer der Gründer der damals noch      setzen. Aus der Beschreibung “compute         aus einer beliebigen Layoutbeschreibung
jungen Disziplin, die Herausfor­derung:        the greatest common divisor of two inte­      JSX-­Code macht (Abbildung 1). Nutzer ge­
Ist es möglich, die Spezifikation einer Pro­   gers” und einem einzigen Codebeispiel         ben lediglich einen kurzen englischen Text
                                                                                             ein, beispielsweise: “the google logo, a
                                                                                             search box, 2 lightgrey buttons that say
                                      1-TRACT                                                ‘Search Google’ and ‘I’m feeling Lucky’
                                                                                             with padding in-between them”. Doch es
     ⚫⚫ Entwicklerinnen und Entwickler erhalten beim Programmieren Hilfe durch
                                                                                             stellt sich die Frage, wie zuverlässig das ist
        künstliche Intelligenz.
                                                                                             und ob die automatische Code­generierung
     ⚫⚫ Sprachmodelle wie GPT-3 übertragen in natürlicher Sprache gegebene                   mehr als nur automatisiertes Copy-and-
        Anfor­derungen in ein Programm.                                                      Paste ist.
     ⚫⚫ Die Programmsynthese aus logischen Spezifikationen eignet sich für                      Das Potenzial von Sprachmodellen wie
        sicherheitskritische Systeme.                                                        GPT-3 hat auch Microsoft erkannt und im
                                                                                             Jahr 2019 eine Milliarde US-Dollar in
                                                                                             OpenAI investiert. Jetzt stellte die Micro­

40                                                                                                                                 iX 8/2021
Über die Schulter geschaut - Prof. Dr. Bernd Finkbeiner, Frederik Schmitt - CISPA
Quelle: Twitter
soft-­ Tochter GitHub gemeinsam mit
­Open­AI den GitHub Copilot vor (siehe
 Kasten auf S. 42). Copilot nutzt Codex,
 eine Weiterentwicklung von GPT-3: Die
 KI analysiert Kommentare und das bisher
 geschriebene ­Programm, um damit ein­
 zelne Codezeilen oder ganze Funktionen
 zu vervollständigen.
     Erste Reaktionen sind mehrheitlich po­
 sitiv, doch nicht immer funktioniert der
 von Copilot produzierte Code. GitHub
 selbst rät dazu, den generierten Code sorg­
 fältig zu prüfen. Die Verantwortung dafür,
 dass das Programm am Ende stimmt, bleibt
 beim menschlichen Programmierer.
     Der Klassiker unter den Methoden für
 die Codegenerierung ist die Programmsyn­
 these aus logischen Spezifikationen. Genau
 wie eine informelle Beschreibung der Pro­
 grammfunktionalität in natürlicher Spra­
 che ist eine logische Spezifikation deklara­
 tiv, das heißt, sie kann viele verschiedene
 Ausführungen zulassen. Zum Beispiel for­
 dert die Formel x > 0 nur, dass der Wert von
 x positiv ist; ein Programm, das x auf 1 setzt,
 erfüllt die Anforderung genauso wie eines,                          Automatisiertes Webdesign: GPT-3 kann Websites aus kurzen englischsprachigen
 das x auf 2 oder 500 setzt. Im Gegensatz zu                         Beschreibungen erzeugen (Abb. 1).
 natürlicher Sprache haben formale Logi­
 ken eine mathematisch präzise Semantik:                             schiedener Master niemals überlappen. Aus      G (!(g_0 && g_1))
 Ist eine Anforderung einmal als logische                            der logischen Spezifikation erzeugt ein Syn­
 Formel spezifiziert, gibt es keine Unsicher­                        thesewerkzeug wie das am CISPA Helm­           besagt, dass die Ausgabesignale g_0 und
 heit mehr darüber, wie die Anforderung zu                           holtz-Zentrum für Informationssicherheit       g_1 niemals gleichzeitig den Wert 1 haben
 verstehen ist.                                                      entwickelte BoSy (siehe ix.de/zgnu) au­to­     dürfen. Der für diese Spezifikation gene­
     Ein typisches Beispiel für Systeme, die                         matisch korrekten Verilog-­Code, der sich      rierte Verilog-Code ist rechts in der Abbil­
 sich gut für die automatische Synthese aus                          direkt in Hardware oder auf einem FPGA         dung 2 zu sehen. Die synthetisierte Lösung
 logischen Spezifikationen eignen, ist der                           (Field Programmable Gate Array) reali­         wechselt zwischen dem Ausgangssignal g_0
 AMBA-AHB-Buscontroller von ARM. Die                                 sieren lässt.                                  und dem Ausgangssignal g_1.
 Advanced Microcontroller Bus Architec­                                 Abbildung 2 zeigt das Prinzip an einem         Mathematisch gesehen ist die Pro­
 ture (AMBA) ist ein Kommunikationsstan­                             einfacheren Beispiel, der Synthese eines       grammsynthese aus logischen Spezifi­
 dard für den On-Chip-Nachrichtenaus­                                Arbiters: Jeder Request ist mit einem Grant    kationen perfekt: Der generierte Code ist
 tausch zwischen Prozessorkernen, Cache                              zu beantworten, aber niemals dürfen zwei       beweisbar korrekt, das heißt, er erfüllt mit
 Memory und DMA-Controllern. An den                                  Grants zugleich vergeben werden. Der von       Sicherheit die gestellten Anforderungen,
 Bus sind sechzehn solcher Geräte als Mas­                           BoSy automatisch generierte Verilog-Code       egal auf welchen Eingaben er angewendet
 ter und weitere sechzehn als Slave ange­                            wählt die einfachste Lösung: Er wechselt       wird. Diesem Vorteil steht allerdings ein
 schlossen; die Master melden dem Bus                                einfach zwischen den Grants hin und her.       hoher Rechenaufwand gegenüber. Deshalb
 Kommunikationswünsche an bestimmte                                     Im Detail finden sich drei logische For­    lassen sich derzeit nur relativ kleine Pro­
 Slaves und bekommen vom Buscontroller                               meln:                                          gramme synthetisieren. In der Praxis ist da­
 entsprechende Zeitfenster zugewiesen. Der                           (G ((r_0) -> (F (g_0))))
                                                                                                                    rüber hinaus der Aufwand für das logische
 Standard wurde in eine logische Spezifika­                                                                         Formalisieren der gewünschten Programm­
 tion übersetzt und wird seither oft als Bench­                      bedeutet, dass ein Wert 1 auf dem Eingang      eigenschaften oft eine nicht zu unterschät­
 mark für die Codegenerierung verwendet.                             r_0 (ein Request) die Ausgabe g_0 (ein         zende Hürde.
     Die Spezifikation besteht aus fünfzehn                          Grant) auf den Wert 1 setzt.
 Formeln, die beispielsweise ausdrücken,
 dass jeder Master, dem ein Zeitfenster zu­
                                                                     (G ((r_1) -> (F (g_1))))                       Praktisch und schnell:
 geteilt wird, dieses auch tatsächlich ver­                          meint das Gleiche für das Eingabesignal        Code aus Beispielen
 langt hat und dass sich die Zeitfenster ver­                        r_1 und das Ausgabesignal g_1. Die Formel
                                                                                                                    Eine intuitive Art, das gewünschte Verhal­
 Listing: Von GPT-3 generierter Python-Code erscheint nur auf den ersten Blick korrekt
                                                                                                                    ten eines Programms festzulegen, ist die
                                                                                                                    Angabe von Beispielen. Microsoft-Anwen­
 n = int(input("Enter n: "))                                                                                        der kennen diese Form der Spezifikation
 m = int(input("Enter m: "))
 def gcd(x, y):
                                                                                                                    durch das Flash-Fill-Feature (Blitzvor­
     return x if x == y else gcd(y, x % y)                                                                          schau) in Excel. Gibt man in Excel Daten
 print(f"The greatest common divisor of {x} and {y} is {gcd(x, y)}" )                                               ein, die ein bestimmtes Muster aufweisen,
                                                                                                                    etwa die Trennung vollständiger Namen

iX 8/2021                                                                                                                                                     41
Über die Schulter geschaut - Prof. Dr. Bernd Finkbeiner, Frederik Schmitt - CISPA
Titel | Codesynthese

in Vor- und Nachnamen, dann kann Excel
dieses Muster erkennen und eine Tabelle
automatisch vervollständigen.
    Hinter den Kulissen verwendet Excel
eine Programmiersprache für String-Trans­
formationen mit Operationen für reguläre
Ausdrücke, Fallunterscheidungen, Schlei­
fen und Ähnliches. Für das automatische
Vervollständigen der Tabelle in Abbil­
dung 4 generiert Excel ein Programm in
dieser Sprache, das aus der ersten Spalte,
in der die vollständigen Namen aufgelis­
tet sind, eine zweite Spalte mit den Nach­
namen erzeugt. Die vollständigen Namen
können dabei entweder in der Form „Vor­
name Nachname“ oder in der Form „Nach­
name, Vorname“ angegeben sein.
    Das Programm extrahiert dazu aus ei­
nem gegebenen String das Wort vor dem
Komma oder – falls der String kein
Komma enthält – das letzte Wort im
String. Das Flash-Fill-Feature erzeugt die­
ses Programm in weniger als 0,1 Sekun­
den aus den vom Nutzer vorgegebenen                 Automatische Synthese von Verilog-Code aus einer logischen Spezifikation: Links stehen
Beispielen. Der Codegenerierungsalgo­               drei Formeln, rechts ist der für diese Spezifikation generierte Verilog-Code zu sehen
rithmus berechnet dazu zunächst für jede            (Abb. 2).
Beispielzeile eine Menge von Program­
men, deren Ergebnis diesem Beispiel ent­                Das Prinzip hinter Flash Fill ist die      der Analyse von Logfiles, beim Extrahie­
spricht. Wenn ein Programm darunter ist,            Syntax-­Guided Synthesis (SyGuS). Beim         ren von Daten aus PDF-Dokumenten und
das in allen Beispielen funktioniert, dann          Einsatz von SyGuS besteht der zentrale         beim Codieren von Datenbankabfragen
ist dieses Programm die gesuchte Lösung.            Schritt darin, die Menge aller möglichen       als SQL-­Abfragen. SyGuS spielt seine Stär­
Andernfalls werden die Beispiele in ver­            Programme mithilfe einer domänenspe­           ken immer dann aus, wenn es sich um ei­
schiedene Klassen partitioniert, die je­            zifischen Sprache (DSL) zu formalisieren.      nen überschaubaren und kompakt als DSL
weils eine gemeinsame Lösung haben.                 Frameworks wie PROSE von Microsoft             beschreibbaren Aufgabenbereich handelt.
Hier im Beispiel haben „Anna-Maria                  berechnen dann aus den gegebenen Bei­
Schmidt“ und „Julia Richards“ dieselbe              spielen ein möglichst einfaches, in der DSL
Lösung (das letzte Wort), „Brinkmann,               ausgedrücktes Programm, das sich auf den       Hey Siri, schreib ein
Klaus“ dagegen eine andere (das Wort vor            Beispielen richtig verhält.                    Python-Programm!
dem Komma). Die verschiedenen Klas­                     Anschließend lässt sich das Programm
sen werden dann mithilfe einer Fallunter­           auf neuen Daten ausführen. SyGuS ist           Der Erfolg von Sprachassistenten wie
scheidung kombiniert.                               in vielen Anwendungen einsetzbar: bei          Siri und Alexa legt die Idee nahe, auch Pro­

                                           GitHub Copilot: KI schreibt Code
  Kurz vor Redaktionsschluss dieser Ausgabe haben GitHub und OpenAI
  den GitHub Copilot vorgestellt. Der „AI Pair Programmer“ schlägt beim
  Programmieren nicht nur einzelne Codezeilen, sondern auch komplette
  Funktionen vor. Grundlage der Vorschläge ist der restliche Inhalt der
  Datei, insbesondere auch der natürlichsprachliche Kontext wie Funk­
  tions- und Variablennamen, Kommentare und Docstrings. In vielen
  Demonstrationen genügen Funktionskopf und Kommentar, um die kom-
  plette Funktion zu vervollständigen.

  Laut GitHub trifft der Copilot in 43 % der Fälle auf Anhieb die richtige
  Lösung, bei zehn Versuchen soll sich die Quote auf 57 % erhöhen. Die
  Vorschläge liefert das von OpenAI entwickelte Codex-Modell, das auf
  Milliarden öffentlicher Programm- und Textzeilen trainiert wurde. Ent-
  sprechend funktioniert der Copilot besonders gut für populäre Sprachen
  wie Python und JavaScript. Derzeit steht der GitHub Copilot als Erwei-
  terung für Visual Studio Code nur einer kleinen, ausgewählten Gruppe
  von Testern zur Verfügung. Nach erfolgreicher Testphase will GitHub
  eine kommerzielle Version anbieten.                                        Der GitHub Copilot schreibt ganze Funktionen (Abb. 3).

42                                                                                                                                     iX 8/2021
grammieraufgaben in natürlicher Sprache                                                        cklungsplattformen ist erfolgversprechend
zu beschreiben. Neuronale Netze haben in                                                       (siehe Artikel „Code-Diktat“ auf S. 56).
den letzten Jahren neue Maßstäbe beim                                                             Für die Forschung besteht die Heraus­
Verarbeiten natürlicher Sprache gesetzt.                                                       forderung jetzt darin, die Erfolge der Sprach­
Im Blickpunkt der aktuellen Forschung                                                          modelle bei der Verarbeitung natürlicher
stehen dabei zunehmend allgemeine                                                              Sprache auf die Programmiersprachen mit
Sprachmodelle. Dabei werden neuronale                                                          ihrer sehr viel präziseren Semantik zu über­
Netzwerke auf einer generischen Aufgabe                                                        tragen. Welches Potenzial in diesem Weg
wie dem Vervollständigen eines Textes                                                          steckt, lässt der Erfolg des etablierten Code-­
vortrainiert (Pre-­Training).                                                                  Com­ple­tion-Werkzeugs Tabnine erahnen
    Das Netzwerk lernt auf diese Weise den                                                     (siehe Artikel „KInematik“ auf S. 44). Ge­
Auf­bau und die Struktur natürlicher Spra­                                                     nau wie der GitHub Copilot macht Tabnine
che. Anschließend wird das vortrainierte        Das Flash-Fill-Feature in Microsoft Excel      Programmierern während des Editierens
Modell in einem weiteren Training auf eine      vervollständigt automatisch die obere zur      Vorschläge, wie die Codezeile weitergehen
Anwendung spezialisiert (Finetuning).           unteren Tabelle (Abb. 4).                      könnte. Tabnine setzt auf GPT-2 auf, dem
Sprachmodelle wie GPT-3 gehen sogar so                                                         Vorgänger von GPT-3. Das Tool trainiert
weit, dass gar kein ausgedehntes zweites        Teiler im Listing Fehler eingeschlichen ha­    auf Millionen von Open-Source-Program­
Training mehr nötig ist. GPT-3 lässt sich       ben: Er ruft die Python-Funktion gcd fälsch­   men und zusätzlich auf der indivi­duellen
aus dem Stand (Zero-Shot), mit einem ein­       licherweise mit den Variablen x und y statt    Codebasis des Programmierers. Tabnine
zelnen Beispiel (One-Shot) oder mit eini­       n und m auf. Problematisch ist außerdem        „kennt“ dadurch nicht nur die Syntax ver­
gen wenigen Beispielen (Few-Shot) für           die Bedingung x == y, die nach der Rekur­      schiedenster Programmiersprachen, son­
neue Anwendungen einsetzen. Die weni­           sionsfolge (5,10) -> (10, 5) -> (5, 0) zu      dern auch gängige Ausdrücke, typische
gen Beispiele dienen als eine Art Blaupause     einem ZeroDivisionError bei der Modulo-­       Variablennamen und die richtige Verwen­
für den neu zu generierenden Text.              Operation führt, statt den erwarteten Wert 5   dung von Bibliotheken.
    Um Python-­Code zu generieren, genügt       zurückzugeben. Korrekt wäre an dieser             Künftig sollte es möglich sein, die ein­
ein einziges Paar von einer natürlichsprach­    Stelle die Bedingung y == 0. Dass Sprach­      fache Benutzbarkeit und das Hintergrund­
lichen Beschreibung und dazugehörigem           modelle wie GPT-3 Programmierfehler            wissen der Sprachmodelle mit der mathe­
Python-Code, um GPT-3 darauf vorzube­           machen, ist nicht weiter überraschend. Ein     matischen Präzision der Programmsynthese
reiten, anschließend den Python-Code für        offensichtlicher Grund ist, dass die Trai­     aus logischen Spezifikationen zu verbin­
den größten gemeinsamen Teiler zu ge­           ningsdaten aus dem Web stammen. Wenn           den. Hybride Algorithmen, die Deep Lear­
nerieren (siehe Listing). Die Größe von         die Trainingsdaten Fehler enthalten, dann      ning mit klassischen Methoden der Logik
GPT-3 (175 Milliarden Parameter) sowie          ist auch der generierte Code falsch. Das lo­   kombinieren, könnten helfen, die komplexe
die Menge und Vielfalt der Daten, auf de­       gische Denken, mit dem man solche Feh­         Codesynthese aus logischen Spezifika­
nen trainiert wurde (300 Milliarden Token),     ler erkennen könnte, fehlt heutigen Sprach­    tionen besser in den Griff zu bekommen.
ermöglichen das Few-Shot-Lernen. Die            modellen noch völlig.                          Darüber hinaus könnten Sprachmodelle
Daten basieren zu einem großen Teil auf                                                        Nutzer beim Entwerfen und Verstehen der
denen von Common Crawl, die Petabytes                                                          logischen Spezifikationen unterstützen.
im Web gesammelter Daten umfassen               Fazit                                          Denn selbst wenn die KI dem Menschen ir­
(siehe ix.de/zgnu). Da Common Crawl auch                                                       gendwann einmal das Programmieren kom­
Daten von Plattformen wie GitHub und            Sorgen, dass die KI menschliche Software­      plett abnehmen sollte, muss man ihr immer
Stack Overflow sammelt, beherrscht GPT-3        entwickler bald überflüssig machen wird,       noch sagen, welche Funktion die Software
die Syntax verschiedenster Programmier­         muss man sich wohl nicht machen. Der           nun eigentlich erbringen soll.(nb@ix.de)
sprachen, ohne dafür noch einmal geson­         Weg zu einer KI, die für beliebige Pro­
dert trainieren zu müssen.                      grammieraufgaben zuverlässig Code ho­          Quellen
    Die große und vielfältige Datenmenge,       her Qualität generiert, ist noch weit. In
auf der GPT-3 trainiert wurde, ermöglicht       spezialisierten Bereichen leistet die KI-ba­   Synthesetool BoSy, Common Crawl und
es auch, Aufgaben zu stellen, die mathema­      sierte Codegenerierung aber heute schon        GitHub Copilot: ix.de/zgnu
tische Kenntnisse oder schlicht Allgemein­      Erstaunliches. Die Programmsynthese aus
wissen erfordern. So kann GPT-3 erfolg­         logischen Spezifikationen ist insbesondere     Prof. Dr. Bernd Finkbeiner
reich Python-Code generieren, der überprüft,    dann sinnvoll, wenn es um Anwendungen             lehrt Informatik an der Universität des
ob eine Zahl eine Primzahl oder ob ein Jahr     geht, bei denen Programmierfehler teuer           Saarlandes und forscht im Bereich auto­
ein Schaltjahr ist – und das ohne eine Defi­    oder gefährlich sind, etwa im Bereich der         matischer Methoden für die Programm­
nition, was darunter zu verstehen ist.          cyber-physischen Systeme.                         verifikation und -synthese am CISPA
    Der Anschein, dass die KI die Bedeu­            Die Codegenerierung aus Beispielen mit        Helmholtz-Zentrum für Informations­
tung der Begriffe „versteht“, ist jedoch trü­   SyGuS skaliert noch nicht bis zum Entwi­          sicherheit in Saarbrücken.
gerisch. Eine minimale Variation der Auf­       ckeln vollständiger Applikationen, kann
gabenstellung, etwa ob statt der gegebenen      aber das Erstellen kniffliger Programm­
Zahl die Zahl „minus vier“ eine Primzahl        stücke wie SQL-Abfragen vereinfachen.          Frederik Schmitt
ist, lässt GPT-3 noch scheitern. Und auch       Die Codesynthese aus Sprachmodellen               promoviert im Bereich Deep Learning und
wenn die Programmieraufgabe erfolgreich         schließlich kann noch nicht mit den Qua­          Programmsynthese an der Universität des
gelöst wird, ist Vorsicht geboten.              litätsansprüchen der klassischen Methoden         Saarlandes und arbeitet als wissenschaft­
    Aufmerksamen Leserinnen und Lesern          mithalten, ist aber gerade im schnellen Pro­      licher Mitarbeiter am CISPA Helmholtz-­
mag schon aufgefallen sein, dass sich in        totyping oft verblüffend kreativ. Der Ein­        Zentrum für Informationssicherheit in
den Code für den größten gemeinsamen            satz in Designtools und Low-Code-Entwi­           Saarbrücken.

iX 8/2021                                                                                                                                  43
Sie können auch lesen