1 Einführung
Dieses »Hello, World!«-Kapitel gibt eine erste Einführung in den Umgang mit KI-Tools bei der Programmentwicklung. Anhand von Beispielen zeigt das Kapitel die Verwendung von Chat-basierten Werkzeugen wie ChatGPT sowie von Coding-Assistenten wie GitHub Copilot.
Höchstwahrscheinlich haben Sie schon KI-Coding-Tools ausprobiert. Überfliegen Sie dennoch die folgenden Seiten – vielleicht können wir Sie schon im Einführungskapitel auf neue Ideen bringen, bevor wir in den weiteren Kapiteln mehr in die Tiefe gehen.
Jedenfalls lesenswert ist Abschnitt 1.5, »Grundlagen von Large Language Models (LLMs)«: Er enthält eine knappe Zusammenfassung, wie Sprachmodelle hinter den Kulissen funktionieren. Dieses Wissen ist nicht zuletzt deswegen hilfreich, um die Grenzen der aktuellen Technik besser zu verstehen.
1.1 Coding per Chat
Den intuitivsten Einstieg in das KI-unterstütze Coding bieten Chat-Systeme wie ChatGPT. Als wir dieses Buch im Sommer 2024 verfassten, standen diverse kostenlose Systeme zur Auswahl:
-
https://chatgpt.com (das Original von OpenAI)
-
https://www.bing.com/chat (Microsoft, greift auf ChatGPT/OpenAI zurück)
-
https://gemini.google.com (Google)
-
https://claude.ai (Anthropic)
Auf den meisten Webseiten haben Sie die Option, mit dem Abschluss eines kostenpflichtigen Abos Zusatzfunktionen freizuschalten. Soweit wir bei der Arbeit für dieses Buch mit öffentlich verfügbaren Chat-Systemen experimentiert haben, war ChatGPT unser bevorzugtes System. Bei dieser Website müssen Sie sich einmalig registrieren. Das geht schnell und kostet nichts. Anschließend ist die Anwendung denkbar einfach: Sie formulieren Ihre Frage und erhalten eine Antwort.
Passwortgenerator
Sie brauchen in einem Python-Script eine Funktion, die ein zufälliges Passwort in einer vorgegebenen Länge liefert. Natürlich können Sie den Code selbst schreiben – aber Sie sparen sich vermutlich ein, zwei Minuten Zeit, wenn Sie diese triviale Aufgabe an ChatGPT abgeben.
Abbildung 1.1 ChatGPT hat einen Passwortgenerator in eine Funktion verpackt.
Den Code können Sie nun unkompliziert kopieren und in Ihr Script einbauen. Vergessen Sie die erforderlichen Importe nicht! Diese werden immer am Beginn des Scripts angegeben.
Deutsch oder Englisch?
Wie das einleitende Beispiel gezeigt hat, versteht ChatGPT Prompts in deutscher Sprache. Dennoch empfehlen wir Ihnen, Prompts in englischer Sprache zu formulieren. Dafür gibt es mehrere Gründe:
-
Sprachmodelle sind nur so gut wie das zugrunde liegende Trainingsmaterial. Naturgemäß gibt es viel mehr englischsprachige Websites, Bücher und Repositorys, die zum Training verwendet wurden. Je spezifischer Ihre Fragestellung, je diffiziler das Problem, desto eher werden Sie korrekte Antworten erhalten, wenn Sie Ihren Prompt englisch formulieren. Das gilt selbst dann, wenn Ihr Englisch nicht perfekt ist.
-
Bei den meisten größeren Software-Projekten ist die Verwendung englischer Klassen-, Funktions- und Variablennamen selbstverständlich oder sogar in den Projektrichtlinien festgeschrieben. Mit einem englischen Prompt bringen Sie zum Ausdruck, dass der KI-Codegenerator englische Begriffe vorziehen soll.
-
Auch wenn ChatGPT gleichermaßen deutsch, englisch, französisch sowie diverse andere Sprachen spricht: Auf diverse andere Sprachmodelle trifft dies nicht zu. Gerade öffentlich verfügbare Sprachmodelle, die lokal ausgeführt werden können (siehe Kapitel 9, »Sprachmodelle lokal ausführen«), funktionieren nur in englischer Sprache zufriedenstellend.
Deswegen arbeiten wir in diesem Buch fast durchgängig mit englischen Prompts. Das führt dazu, dass auch die Erklärungen und der erstellte Code auf Englisch ausgegeben werden. Das entspricht den Standards der meisten Entwicklungsprojekte, besonders wenn unterschiedliche Nationalitäten gemeinsam an einer Codebasis arbeiten. Falls Sie trotzdem deutsche Variablennamen und Funktionsbezeichner nutzen wollen, müssen Sie ChatGPT explizit anweisen.
Falls Sie die englischen Erklärungen einmal nicht verstehen, können Sie natürlich nach einer Übersetzung fragen. ChatGPT hilft Ihnen dann weiter und erläutert den Code auf Deutsch.
Python: Datum suchen und ersetzen
In diesem Beispiel sollen in einer Zeichenkette alle Datumsangaben vom US-Format (12/31/2024) in das ISO-Format (2024-12-31) umgewandelt werden. Als Programmiersprache soll Python verwendet werden.
Der Code verwendet das re-Modul, mit dem in Python reguläre Ausdrücke verarbeitet werden. ChatGPT formuliert den Code als Funktion, was die weitere Anwendung vereinfacht. convert_us_to_iso_date enthält wiederum eine Subfunktion replace, die an re.sub als Parameter übergeben wird und jeden Treffer durch das neu formatierte Datum ersetzt.
Prompt: Python: I want to replace all US dates by ISO dates in a string. Can you help?
Certainly! To replace all U.S. date formats (commonly MM/DD/YYYY) with ISO date formats (YYYY-MM-DD) in a string using Python, you can use the re module to find dates and then rearrange the format. Here’s a Python function that accomplishes this:
import re
def convert_us_to_iso_dates(text):
# Pattern to find dates in MM/DD/YYYY format
date_pattern = r'\b(\d{1,2})/(\d{1,2})/(\d{4})\b'
# Function to replace each match
def replace(match):
month, day, year = match.groups()
return f'{year}-{month.zfill(2)}-{day.zfill(2)}'
# Replace all matches in the text
return re.sub(date_pattern, replace, text)
# Example usage
input_text = "Today's date is 05/09/2024 and the event " +
"was on 12/25/2023."
converted_text = convert_us_to_iso_dates(input_text)
print(converted_text)
This script:
-
Defines a regex pattern to match dates in the format MM/DD/YYYY.
-
Uses a replacement function to rearrange the date components into the ISO format YYYY-MM-DD.
-
Applies this transformation to all occurrences in the provided text.
Der Code funktioniert in der präsentierten Form ausgezeichnet. Wenn Sie mit regulären Ausdrücken nicht vertraut sind, können Sie sich den Aufbau des Musters in einer Folgefrage erläutern lassen:
Prompt: Could you explain the regular pattern?
Certainly! Here’s a breakdown of the pattern r'\b(\d{1,2})/(\d{1,2})/(\d{4})\b':
-
\b: This is a word boundary marker. It ensures that the pattern matches whole words only, which helps prevent partial matches of larger sequences that aren’t dates.
-
(\d{1,2}): This part of the pattern captures one or two digits. The \d denotes a digit (equivalent to [0-9]), and {1,2} specifies that the digit can appear once or twice. This pattern is used for both the month and the day in the date.
-
/: This is a literal forward slash character. It separates the month and day, and day and year, in U.S. date formats.
-
(\d{4}): This captures exactly four digits, representing the year. Here, \d again denotes a digit, and {4} specifies that exactly four digits must be present.
-
\b: Another word boundary marker, ensuring the date is a standalone entity, not part of a larger sequence of numbers or characters.
So, the entire pattern matches strings that start and end with a boundary between words (like spaces or punctuation), followed by one or two digits for the month, a slash, one or two digits for the day, another slash, and finally four digits for the year.
In diesem Buch verzichten wir normalerweise auf die Wiedergabe derartiger Ausführungen bzw. kürzen ChatGPT-Ausgaben, wenn diese allzu wortreich ausfallen. Unser primäres Interesse richtet sich darauf, wie Sie den Prompt am besten formulieren.
ChatGPT verwendet bei Python-Code zumeist mit einem Unterstrich zusammengesetzte Variablennamen (convert_us_to_iso_dates). Wenn Sie andere Konventionen vorziehen bzw. wenn in Ihrem Projekt andere Regeln gelten, können Sie diese direkt im Prompt oder in einer Folgefrage angeben:
Prompt: Could you please regenerate the code with camelCase names?
Sure! Here’s the Python code updated to use camelCase naming conventions for the function and variable names:
def convertUsToIsoDates(text):
# Pattern to find dates in MM/DD/YYYY format
datePattern = r'\b(\d{1,2})/(\d{1,2})/(\d{4})\b'
KI-Ergebnisse sind nicht reproduzierbar!
Wenn Sie die vorhin abgedruckten Prompts eingeben, werden Sie andere Antworten erhalten – selbst dann, wenn Sie exakt die gleiche ChatGPT-Version verwenden. Aktuell gebräuchliche KI-Tools produzieren jedes Mal neuen Text/Code, sodass das Ergebnis mal besser, mal schlechter ausfallen kann.
SQL: Auswertung einer Tabelle
Ausgangspunkt für das folgende Beispiel ist eine Tabelle in MySQL, die Mehrwertsteuersätze für unterschiedliche Länder enthält. Da sich die Steuersätze im Laufe der Zeit ändern können, gibt die Spalte validFrom an, ab welchem Datum der Wert gültig ist. Wie sieht die SELECT-Abfrage aus, die den zu einem bestimmten Zeitpunkt gültigen Steuersatz für ein bestimmtes Land liefert?
Damit ChatGPT hier die richtige Antwort geben kann, müssen Sie ausreichend Kontextinformationen angeben. Insbesondere ist es wichtig, welches DBMS Sie einsetzen (hier MySQL) und wie der genaue Aufbau der Tabelle ist.
Prompt: MySQL: I have a table to store VAT rates for different countries. This is the table definition:
CREATE TABLE vat (
id INT NOT NULL AUTO_INCREMENT,
country CHAR(2) NOT NULL,
rate DOUBLE NOT NULL,
validFrom DATE NOT NULL,
PRIMARY KEY (id)
)
I want to get the VAT rate for a country (i.e. 'de') at a given time ('2024-04-15'). What should the query look like?
To retrieve the VAT rate for a specific country at a given time from your table, you need to write a SQL query that checks for the most recent rate that has been set before or on the date you’re interested in. This involves selecting the correct entry based on the country code and the validFrom date.
Here is the SQL query to find the VAT rate for Germany (‘DE’) as of April 15, 2024:
SELECT rate
FROM vat
WHERE country = 'DE'
AND validFrom <= '2024-04-15'
ORDER BY validFrom DESC
LIMIT 1;
ChatGPT liefert die korrekte Antwort. Im Anschluss daran erklärt das Programm im Detail den Aufbau des SQL-Kommandos (hier nicht abgedruckt). Wenn Sie nicht täglich mit SQL arbeiten, ist das eine große Hilfe beim Verständnis des Codes.
Beachten Sie, dass Sie bei Fragen dieser Art explizit angeben müssen, mit welchem Datenbanksystem Sie arbeiten. LIMIT 1 ist eine MySQL-spezifische Erweiterung der SQL-Syntax. Die gleiche Fragestellung für den SQL Server liefert eine andere Antwort mit TOP statt LIMIT.
Prompt: Would this also work with SQL Server?
The only change needed to make it fully compatible with SQL Server is to replace LIMIT 1 with TOP (1), which is the SQL Server syntax for limiting the number of rows returned. Here’s the revised query for SQL Server:
SELECT TOP (1) rate
FROM vat
WHERE country = 'DE'
AND validFrom <= '2024-04-15'
ORDER BY validFrom DESC;
Das zeigt, wie wichtig es ist, den Kontext der Frage anzugeben.
PHP: Bearer-Token-Authentifizierung
Sie sind mit PHP und den Konzepten von REST-APIs vertraut, aber Sie wissen nicht, wie Sie ein Bearer-Token in einem PHP-Programm auswerten. Kein Problem, ChatGPT hilft weiter:
Prompt: PHP/REST: How can I extract a Bearer Token from a GET request?
In PHP, when handling RESTful API requests that use a Bearer Token for authentication, you typically extract the token from the Authorization header of the incoming GET request. Here’s a step-by-step guide on how to do this:
-
Access the Authorization Header: PHP provides access to request headers through the $_SERVER superglobal array. The Authorization header can be accessed using the key HTTP_AUTHORIZATION within this array.
-
Extract the Bearer Token: The value of the Authorization header generally starts with the word “Bearer”, followed by a space and then the token itself. You’ll need to parse this string to extract the token.
Here’s an example code snippet that demonstrates how to extract a Bearer Token from a GET request:
<?php
// Function to get the bearer token from the
// Authorization header
function getBearerToken() {
if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
// Extract the header value
$header = $_SERVER['HTTP_AUTHORIZATION'];
// Check if the header starts with "Bearer"
if (preg_match('/Bearer\s(\S+)/', $header, $matches)) {
// Return the token part
return $matches[1];
}
}
return null; // Return null if no token was found
}
?>
Handle Edge Cases:
-
Header Not Present: If the Authorization header is not present, your function should handle this gracefully, perhaps returning null or an appropriate error message.
-
Malformed Authorization Header: If the header is present but doesn’t properly include a Bearer Token (e.g., missing the “Bearer” prefix), you should also handle this case, possibly logging the issue or returning an error.
Always ensure that tokens are handled securely:
-
Validate the token if necessary (e.g., check its format, expiration, and authenticity).
-
Use HTTPS to protect the token in transit.
-
Limit the exposure of sensitive token information in logs or error messages.
This approach will help you securely extract and handle a Bearer Token in a PHP-based RESTful API environment.
bash-Script für die PowerShell portieren
ChatGPT kann mehr als nur neuen Code generieren. Es kann auch Fehler in vorgegebenem Code suchen, Code von einer Programmiersprache in eine andere umwandeln, Unit-Tests zu einer gegebenen Funktion entwickeln, vorhandenen Code neu strukturieren, kommentieren und erläutern.
Im letzten Einführungsbeispiel geht es darum, ein einfaches bash-Script für die PowerShell zu portieren. Das ursprüngliche Script überwacht die Markdown-Dateien in einem Verzeichnis. Sobald Änderungen in einer Datei gespeichert werden und die Markdown-Datei neuer als die dazugehörende PDF-Datei ist, wird das PDF-Dokument mit dem Programm pandoc neu erzeugt. Dieser automatisierte Build-Prozess soll nun auf einem Windows-Rechner mit der PowerShell implementiert werden. Kein Problem für ChatGPT!
Prompt: Can you provide a PowerShell equivalent to the following bash script?
#!/bin/bash
while true; do
for mdfile in *.md; do
pdffile=${mdfile%.md}.pdf
if [ $mdfile -nt $pdffile]; then
echo $mdfile
pandoc ... $mdfile -o $pdffile
fi
done
sleep 1
done
Certainly! Below is the PowerShell equivalent of the given Bash script. This script loops continuously, checking for .md files in the current directory. If an .md file is newer than its corresponding .pdf file, it uses Pandoc to convert the Markdown file to a PDF. It also waits for 1 second after each iteration.
while ($true) {
Get-ChildItem -Filter *.md | ForEach-Object {
$mdFile = $_
$pdfFile = "$($mdFile.BaseName).pdf"
if (-Not (Test-Path $pdfFile) -or `
(Get-Item $mdFile).LastWriteTime -gt `
(Get-Item $pdfFile).LastWriteTime)
{
Write-Output $mdFile
pandoc $mdFile -o $pdfFile
}
}
Start-Sleep -Seconds 1
}
Make sure to customize any Pandoc-specific parameters according to your conversion requirements.
ChatGPT »versteht« die Aufgabenstellung des ursprünglichen Scripts, obwohl dieses keinerlei Kommentare enthält. Der neue Code verwendet nicht nur CmdLets der PowerShell, sondern nimmt auch Rücksicht darauf, dass bei der PowerShell vor dem Vergleich des Änderungsdatums zweier Dateien sichergestellt werden muss, dass beide Dateien wirklich existieren. Großartig!
Die von ChatGPT gelieferte Antwort enthält eine schrittweise Erklärung des neuen Scripts, auf dessen Abdruck wir hier aus Platzgründen verzichtet haben. Wir möchten hinzufügen, dass wir bei dieser Art von Übersetzungsaufgaben – egal, für welche Programmiersprachen – auch negative Erfahrungen gemacht haben: Hin und wieder erfindet ChatGPT Kommandos, CmdLets oder Funktionen, die es gar nicht gibt.
Kostenpflichtige ChatGPT-Angebote
ChatGPT ist prinzipiell kostenlos. Wenn Sie bereit sind, 20 $ pro Monat auszugeben (mit Steuern aktuell ca. 22 € pro Monat), bekommen Sie mit »ChatGPT Plus« Zugriff auf das gerade neueste Sprachmodell, auf mehr Ressourcen sowie auf Zusatzfunktionen. In der Vergangenheit (GPT 3.5 versus GTP 4.0) war der Qualitätsunterschied durchaus spürbar. Die Bezahlversion lieferte häufig besseren Code, klarere Beschreibungen und mehr Aktualität (wegen des Trainings mit neuerem Material).
Ein großer Vorteil der Plus-Version ist die Möglichkeit, spezifische GPTs nutzen zu können. Das sind Assistenten, die für bestimmte Aufgaben optimiert sind. Beispielsweise können Sie mit dem Data Analyst Datenmengen statistisch auswerten und visualisieren. Eine Datei mit dem zugrunde liegenden Datenmaterial fügen Sie einfach per Drag-and-drop in den Chat-Verlauf ein. Der produzierte Code wird von ChatGPT gleich ausgeführt, Sie sehen das Ergebnis direkt im Webbrowser.
Zudem können Sie mit minimalem Aufwand eigene GPTs definieren. Ein Beispiel dafür folgt im Abschnitt 1.2, »Die Kunst des Prompting«. Spezifische GPTs können die Erledigung mancher Aufgaben deutlich beschleunigen.
Unternehmen können für 25 $ pro Monat und Mitarbeiter »ChatGPT Team« freischalten. Der Hauptunterschied gegenüber »ChatGPT Plus« besteht darin, dass die übermittelten Daten nicht für das Training von ChatGPT verwendet werden. Datenschutztechnisch ist das natürlich ein Vorteil, ändert aber nichts daran, dass Sie zur Nutzung von ChatGPT dennoch Ihren Code, Ihre Ideen und in letzter Konsequenz Firmengeheimnisse in die Cloud hochladen müssen. Wenn Sie oder Ihre Firma Datenschutzbedenken haben, sollten Sie die lokale Ausführung von Sprachmodellen in Erwägung ziehen. Wir gehen auf dieses Thema ausführlich im zweiten Teil des Buchs ein (siehe insbesondere Kapitel 9, »Sprachmodelle lokal ausführen«).
Bei unseren Experimenten haben wir schon mit der kostenlosen ChatGPT-Variante ausgezeichnete Erfahrungen gemacht. Zum Erlernen einer Programmiersprache oder für Hobby-Anwendungen sind die gebotenen Funktionen großartig und absolut ausreichend.
Wenn Sie aber mit Coding Ihr Geld verdienen, sind 20 € pro Monat für mehr Aktualität und qualitativ bessere Ergebnisse grundsätzlich gut investiert. Allerdings zahlen Sie damit auch für diverse Zusatzfeatures, die für das Coding nicht relevant sind, z. B. Bild-, Audio- und Video-Funktionen. Insofern stellt sich die Frage, ob ein GitHub-Copilot-Abo (siehe Abschnitt 1.3, »Code-Assistenten«) nicht die bessere Investition ist.
Die in diesem Buch dargestellten ChatGPT-Ergebnisse sind zum größten Teil mit den Versionen 4o (4 omni) entstanden. Bis Sie dieses Buch lesen, wird es aber vermutlich schon neuere GPT-Versionen geben, die noch besser funktionieren.
Anthropic Claude
Wir haben bereits in der Einleitung zu diesem Abschnitt auf diverse ChatGPT-Alternativen hingewiesen (Google Gemini, Microsoft Bing Copilot etc.). Was die Software-Entwicklung angeht, ist uns während der Arbeit an diesem Buch besonders Claude der Firma Anthropic ans Herz gewachsen (https://claude.ai).
Claude kann wie ChatGPT in einem begrenzten Ausmaß frei genutzt werden, erfordert aber bei intensiverer Benutzung einen kostenpflichtigen Account. Die Weboberfläche ist sehr ansprechend gestaltet, die Bedienung komfortabel. Die Qualität der Ergebnisse war bei unseren Tests denen von ChatGPT mindestens ebenbürtig, mitunter sogar besser. Außerdem zeichnete sich Claude (Stand September 2024) durch ein größeres Kontextfenster aus, konnte also mehr Benutzerdaten bzw. längere Listings verarbeiten. Probieren Sie es aus!