LLMs als neue Meta-Programmiersprache  
Large Language Models (LLMs) wie GPT-4 oder Gemini revolutionieren die Art und Weise, wie wir mit Computern interagieren. Sie ermöglichen es uns, komplexe Probleme und Aufgaben in natürlicher Sprache zu formulieren, ohne tiefes technisches Wissen über die zugrunde liegenden Systeme oder Programmiersprachen zu benötigen. Diese Modelle agieren wie eine neue Meta-Programmiersprache, indem sie natürliche Sprache in konkrete Aktionen, Code oder strukturierte Antworten übersetzen können.
Im Vergleich zu klassischen Programmiersprachen liegt der Fokus bei LLMs nicht mehr auf der exakten Syntax, sondern auf der Absicht des Nutzers. Dadurch wird die Hürde zur Automatisierung und Problemlösung deutlich gesenkt, insbesondere für Menschen ohne tiefgehende Programmierkenntnisse.
Dies birgt jedoch auch Risiken. Ohne jegliche Fachkenntnisse werden gegebenenfalls auch Ergebnisse vom LLM generiert, die der Nutzer nicht als falsch oder richtig zuodnen kann. Das liegt entweder an einer schlecht formulierten Anfrage des Nutzers oder auch an einer Halluzination des LLMs. Daher sollten die Antworten eines LLMs immer (z.B. über ein anderes LLM) plausibiliert werden.
Für kritische Aufgabestellungen können LLMs die IT-Expertise und die "klassische Programmierung", die die Eingabemöglichkeit und damit die Freiheitsgrade des Systems einschränkt, nicht ersetzen.
Allerdings können massive Arbeitserleichterungen für Routinearbeiten extrem schnell und effektiv umgesetzt werden. Hier liegt die große Stärke der LLMs.
Ein praktisches Beispiel: Dankesmails
Stellen Sie sich vor, Sie möchten eine Dankesmail an eine Gruppe von 30 Gästen schreiben. Einige dieser Gäste sind Frauen, andere Männer, und manche sprechen Sie mit "Sie", andere mit "du" an. In einem klassischen Programmieransatz (z.B. Python) wäre dies eine relativ komplexe Aufgabe, die eine Vielzahl von Bedingungen und Schleifen erfordert und könnte so aussehen:
def generiere_email(gast):
if gast["perDu"]:
anrede = "Lieber" if gast["geschlecht"] == "Mann" else "Liebe"
text = (f"{anrede} {gast['name']},\\n\\n"
"vielen Dank, dass du an unserem Event teilgenommen hast! "
"Wir hoffen, es hat dir gefallen und freuen uns darauf, dich bald wiederzusehen.\\n\\n"
"Herzliche Grüße,\\n[Dein Name]")
else:
anrede = "Sehr geehrter" if gast["geschlecht"] == "Mann" else "Sehr geehrte"
text = (f"{anrede} {gast['name']},\\n\\n"
"vielen Dank, dass Sie an unserem Event teilgenommen haben. "
"Es war eine Freude, Sie als Gast zu begrüßen, und wir hoffen, dass es Ihnen gefallen hat.\\n\\n"
"Mit freundlichen Grüßen,\\n[Ihr Name]")
return text
Mit einem LLM hingegen kann dieselbe Aufgabe auf intuitive Weise durch einen geeigneten Prompt gelöst werden. Der Prompt beschreibt, wie die Mails personalisiert werden sollen und das Modell generiert die Mails automatisch, ohne dass die zugrunde liegende Logik explizit programmiert werden muss. Dies macht den Prozess nicht nur effizienter, sondern auch flexibler, da Anpassungen schnell durch Änderungen im Prompt vorgenommen werden können. Ein Prompt für ein Dankesmail könnte so aussehen:
Du bist ein Textassistent, der Dankesmails generiert. Das Ereignis war mein Geburtstag.
Ich gebe dir eine Liste von Gästen mit den folgenden Informationen:
- Name
- Geschlecht (Mann/Frau)
- PerDu (Ja/Nein)
Erstelle personalisierte Dankesmails. Nutze bei Frauen und Männern passende Anreden
("Liebe"/"Lieber" oder "Sehr geehrte"/"Sehr geehrter") basierend auf "PerDu".
Das Modell würde daraufhin die Mails generieren, vollständig personalisiert und passend zur Höflichkeitsform. Der Prompt wäre zudem schnell geändert, z.B. für eine Geburtstagseinladung, Hochzeit etc.
Während im Python-Code das Mail streng determinisistsch vorgegeben ist, gibt es bei der Reaktion des LLM viele Freiheitsgrade. Dies ist bei dieser Aufagbe harmlos, kann aber bei anderen Anwendungen zu Problemen führen. Ein zu unkritischer Umgang mit LLMs birgt - trotz aller Arbeitserleichterung - daher durchaus Gefahren.
Anwendungsentwicklung
In der klassischen Anwendungsentwickung stehen Anforderung, Planung und Konzeption, Entwurf, Implementierung und Testen durch ausgewählte Test-User und Testfälle vor der Bereitstellung der Anwendung im Vordergrund. Durch die deterministische Programmierung sind zudem nachträgliche Änderungswünsche nur schwer umsetzbar.
LLM-Anwendungen dagegen sind flexibler und erfordern auch ein anderes Vorgehen. Aufgrund der Flexibilität kann das System in manchen Situationen anders reagieren als vorgesehen. Daher ist es wichtig, die LLM-Anwendung möglichst schnell einem umfangreichen produktiven Test mit möglichst vielen zukünftigen Anwendern zu unterziehen. Unerwartete Reaktionen können dann unmittelbar (z.B. durch Anpassungen in den unterschiedlichen System-Prompts) unterdrückt werden.
Fazit
Large Language Models eröffnen eine neue Ära der Programmierung. Sie fungieren als Meta-Programmiersprachen, die es ermöglichen, Aufgaben durch intuitive Beschreibungen in natürlicher Sprache zu lösen. Die Vorteile sind klar: weniger technische Hürden, mehr Flexibilität und schnellere Iterationen. Der Dankesmail-Anwendungsfall verdeutlicht, wie LLMs traditionelle Ansätze nicht nur vereinfachen, sondern komplett transformieren können. Diese Technologie hat das Potenzial, Programmierung in vielen Bereichen neu zu definieren.
Anwendungen, die LLMs nutzen, erfordern ein Umdenken bei der Einführung. Nicht ein vollständig ausgreiftes und getestet Modell geht hier produktiv, sondern eine Anwendung, die während der Nutzung weiterentwickelt und angepasst wird. Die Mitarbeiter, die das System nutzen, tragen hier unmittelbar zu dessen Programmierung bei.