11.4    Aider in der Praxis

Nach dieser Vorstellung der Grundfunktionen haben wir uns angesehen, wie sich Aider in der Praxis schlägt. Unser Fazit ist ein wenig wie der Grundtenor dieses Buchs: Es kommt darauf an – und zwar auf die Komplexität des Projekts, die Aufgabenstellung, die eingesetzten Programmiersprachen und Bibliotheken usw.

Beispiel 1: Fotos sortieren

Anhand des folgenden Beispiels zeigen wir Ihnen, wie die Arbeit mit Aider bei einem neuen Projekt aussehen kann. Sie wollen ein Python-Script entwickeln, das Fotos anhand ihres Aufnahmedatums in Verzeichnisse der Art 2024/09 verschiebt.

Prompt: I have a directory with photos (JPEGs with EXIF). I need a Python script to move the files to a new location according to their creation date, with year and month as subdirectories, for example destination-directory/2024/08/myphoto.jpg. The source and destination directories are passed as arguments. If the destination directory is empty, create it.

Certainly! I’ll create a Python script that accomplishes this task. Since you haven’t shared any existing files, I’ll create a new file called organize_photos.py with the required functionality. Here’s the script.

(50 lines of code, more explaination …)

To use this script, you’ll need to install the Pillow library:

pip install Pillow

Das Script sieht auf den ersten Blick vernünftig aus. Damit Sie unkompliziert ein Python-Environment zum Testen einrichten können, bitten Sie noch um eine Requirements-Datei.

Prompt: Please create requirements.txt.

Jetzt öffnen Sie ein zweites Terminal-Fenster oder einen Tab und richten dort die Testumgebung ein. (Sie können die Umgebung natürlich auch in einem anderen Verzeichnis als dem Projektverzeichnis erstellen, wenn Ihnen das lieber ist.)

python3 -m venv .
source bin/activate
pip3 install -r requirements.txt
python3 organize_photos.py ~/unsorted-pictures ~/pictures-by-date

Tipp: Arbeiten Sie in kleinen Schritten

Auch wenn Aider viel selbstständiger agiert als z. B. GitHub Copilot, gibt es doch einen gemeinsamen Nenner zwischen aktuellen KI-Tools, egal welchen Levels. Prompts mit zu vielen oder zu komplexen Aufgabenstellungen überfordern Aider. Entwickeln Sie Ihr Projekt bzw. lösen Sie Ihre Aufgabe in kleinen Schritten. Vielleicht gibt es Ihnen eine gewisse Befriedigung, dass KI-Tools bei all ihrer tatsächlichen oder vorgeblichen »Intelligenz« in diesem Punkt noch erschreckend eingeschränkt sind.

Das Script funktioniert auf Anhieb. Großartig! Jetzt wollen Sie das Script um einige Features erweitern. Als Erstes wünschen Sie sich eine Option, damit das Script die Fotos nicht verschiebt, sondern kopiert. Gerade zum Testen ist das sehr praktisch.

Prompt: Add an option to copy instead of move the photos.

Certainly! I’ll modify the organize_photos.py script …

(code changes and explaination …)

These changes will allow the user to specify whether they want to copy or move the photos. The script can now be run like this:

python organize_photos.py <source_directory> \
<destination_directory> copy

or

python organize_photos.py <source_directory> \
<destination_directory> move

Aider hat die »Option« also in Form eines zusätzlichen Parameters implementiert, den Sie nach dem Quell- und Zielverzeichnis angeben sollen. Das macht Sie nicht glücklich – Sie hatten eher an einen Parameter in der Art --copy wie unter Linux oder macOS gedacht. Aider kann nicht hellsehen, aber das Tool ist nicht beleidigt, wenn es den Code in einem weiteren Schritt umbauen soll.

Prompt: Please use a Linux style option (--copy) which can be passed at any position.

Aider führt nach jeder Änderung automatisch einen Syntax-Check durch, um Fehler zu erkennen. In diesem Fall hat Aider in den Code sys.exit eingefügt, aber offensichtlich import sys vergessen. Aider fragt, ob es versuchen soll, den Fehler zu beheben.

Running: /Users/kofler/no-sync/aider/bin/python3.12 \
-m flake8 --select=E9,F821,F823,F831,F406,\
F407,F701,F702,F704,F706 --show-source \
--isolated organize_photos.py

organize_photos.py:55:9: F821 undefined name 'sys'
sys.exit(1)

Attempt to fix lint errors? y

Der Fehler ist trivial, Aider gelingt die Korrektur. Sie wechseln zurück in Ihr Test-Terminal und probieren die neue Option --copy aus. Alles funktioniert. Sie bitten um weitere Verbesserung, einerseits zwei zusätzliche Optionen, andererseits um die Verwendung eines eigenen Verzeichnisses für Fotos ohne EXIF-Daten. (Bisher hat das Script die File Modification Time verwendet, um solche Fotos zu sortieren, aber das ist selten zweckmäßig.)

Prompt: Add two more options: --quiet to suppress output (but show error messages) and --help to show a help text; also add short options -c for --copy, -h for --help and -q for --quiet.

Prompt: Change the handling for files without EXIF data or with invalid EXIF data: move/copy these files into a special directory no-exif-data; also show a warning, even when --quiet is set.

Manche Ihrer Fotos nehmen Sie mit Ihrem iPhone auf. Dieses verwendet standardmäßig das HEIC-Format. Wäre es nicht toll, wenn Ihr Script auch mit solchen Bildern zurechtkäme?

Prompt: Next, add support for HEIC files.

To add support for HEIC files, we need to make a few changes to the organize_photos.py file. We’ll need to add the pillow-heif library to handle HEIC files, update the file extension check, and modify the get_creation_date function to work with HEIC files. Here are the necessary changes …

Zum Test im zweiten Terminal müssen Sie zuerst pip3 install -r requirements.txt wiederholen, um das zusätzlich benötigte Modul pillow-heif in das Virtual Environment zu laden. Danach treten zum ersten Mal Probleme auf: Das Script zeigt an, dass es bei den HEIC-Dateien keine EXIF-Daten findet. Mit einem Bildeditor vergewissern Sie sich. Die EXIF-Tags sind definitiv vorhanden. Aber pillow-heif hat anscheinend Probleme mit dem Auslesen.

Jetzt ist der Moment erreicht, wo Sie sich erstmals mit dem Code auseinandersetzen müssen. (Bitte vergegenwärtigen Sie sich, dass Sie bisher keine Zeile am Code angerührt haben! Bis zu dieser Stelle im Beispiel hätten Sie gar keinen Editor gebraucht.)

Ihre erste Idee besteht darin, zu überprüfen, ob Aider aktuelle Versionen von pillow und pillow-heif verwendet. Das ist nicht der Fall. Sie recherchieren im Internet, tragen die neuesten Versionsnummern in requirements.txt ein, wiederholen pip3 install und testen das Programm neuerlich. Leider tritt keine Verbesserung ein.

Veraltetes Trainingsmaterial

Alte Versionsnummern sind ein typisches Problem gängiger Sprachmodelle. Das Sprachmodell, bei diesem Test von Anthropic, wurde mit altem Code trainiert und verwendet entsprechend oft alte Versionen. Werfen Sie immer einen Blick auf Versionsnummern in Requirements-Dateien, Dockerfiles oder anderen Textdateien, die Software-Versionen festschreiben! Aktualisieren Sie diese Nummern auf den gerade aktuellsten Stand, auch um mögliche Sicherheitsprobleme zu vermeiden.

Nun beginnt eine neue Phase der Programmentwicklung, die Fehlersuche. Sie weisen Aider auf das Problem hin und bitten um Nachbesserung.

Prompt: The script does not work for HEIC files (shows warning ‘no valid EXIF data …’); please try to fix it.

Aider baut in den Code eine Fallunterscheidung ein, die zwischen JPEG- und HEIF-Dateien unterscheidet. Beide Codezweige enthalten aber exakt den gleichen Code, dementsprechend ändert sich am fehlerhaften Verhalten nichts. Mit /undo widerrufen Sie den letzten Commit. Überraschend ist die Reaktion auf Ihre lapidare Feststellung, dass der Fix wirkungslos war. Aider baut unaufgefordert Logging-Code ein, um Ihnen eine Chance zu geben, dem Fehler auf den Grund zu gehen.

Prompt: /undo

Prompt: Your last fix didn’t work.

I apologize for the confusion. Let’s try a different approach to fix the issue with HEIC files. We’ll modify the get_creation_date function to handle both JPEG and HEIC files more explicitly. Here’s the proposed change …

Additionally, let’s add some debug logging to help identify any issues …

Sie testen das Programm erneut und werfen einen Blick auf die zahlreichen Ausgaben. Es stellt sich heraus, dass pillow-heif von den ca. 30 EXIF-Attributen nur einen Bruchteil sieht. Das vom Script ausgewertete Attribut DateTimeOriginal (Tag 36867) fehlt, aber immerhin ist DateTime (Tag 306) sichtbar. Dieses Attribut gibt den Zeitpunkt der letzten Änderung des Bilds an. Viele Bilder werden nie geändert – dann stimmt die Information mit dem Aufnahmedatum überein.

Also bitten Sie Aider, zuerst DateTimeOriginal auszuwerten, aber bei Bedarf in einem zweiten Schritt auf DateTime zu berücksichtigen. (Wir möchten hier feststellen, dass der Fehler beim Auslesen der EXIF-Daten durch Unzulänglichkeiten der Pillow-Bibliothek oder Inkompatibilitäten im HEIC-Format verursacht wurde, nicht durch Aider. Wenn Sie den Code ohne KI-Werkzeuge entwickelt hätten, wären Sie an dieser Stelle auch gestolpert.)

Prompt: Apparently, the script can only access a limited set of EXIF properties for HEIC files; first try to read 36867; if this fails, use tag 306 instead.

Prompt: This works; now remove the debugging code.

Bis zu diesem Zeitpunkt sind Kosten bei Anthropic in Höhe von 0,26 $ angefallen – das ist verkraftbar. Inklusive Debugging betrug der Zeitaufwand knapp 90 Minuten. Das finale Script besteht aus 85 Zeilen Code.

Bemerkenswert an diesem Beispiel ist aus unserer Sicht weniger das Ergebnis (sollten Sie sich für den Code interessieren, werfen Sie einen Blick in die Beispieldateien zu diesem Buch), als vielmehr der Weg dorthin: Natürlich hätten wir das Script mit ChatGPT- oder Copilot-Unterstützung auch selbst in einem Editor schreiben können. Aber stattdessen haben wir wirklich das gesamte Coding delegiert und uns ausschließlich um das Testen gekümmert. Das ist eine vollkommen neue Vorgehensweise. Natürlich müssen Sie nicht ausschließlich so arbeiten: Sie haben weiterhin volle Kontrolle über Ihren Code und können diesen jederzeit ändern oder erweitern, bevor Sie für eine neue Aufgabe wieder Aider um Hilfe bitten.

Aider bietet noch einen Vorteil im Vergleich zur herkömmlichen Programmentwicklung: Der gesamte Prozess wird wunderbar dokumentiert, einerseits durch ein Protokoll aller Prompts und Ausgaben in der Datei .aider.chat.history.md im Projektverzeichnis, andererseits durch eine gut lesbare Git-Message-Abfolge:

git log --pretty=format:"%s" --reverse

feat: Implement photo organization script
feat: add requirements.txt
feat: add option to copy or move photos
feat: Add Linux-style --copy option to organize_photos script
fix: import sys module
feat: Add --quiet and --help options to organize_photos.py
feat: Handle files without EXIF data or with invalid EXIF data
feat: Add support for HEIC files
fix: Move `register_heif_opener()` call after its import
fix: Handle HEIC files in get_creation_date function
feat: Add fallback to DateTime EXIF tag for HEIC files
refactor: remove debugging code

Beispiel 2: Web-Scraping

Bevor Sie glauben, Aider sei das neu Wunder-Tool, möchten wir Sie mit dem nächsten Beispiel wieder auf den Boden der Realität zurückholen. Unser Ziel besteht darin, ein Script zu programmieren, das die Top-5-Bestseller von https://www.sap-press.com per Web-Scraping extrahiert – wirklich keine besonders schwierige Aufgabe. Zuerst bitten wir Aider mit /web, die Bestsellerseite zu laden und die fünf Titel anzuzeigen. Das hat nur den Sinn zu überprüfen, ob Aider mit der Webseite überhaupt zurechtkommt.

Prompt: /web https://www.sap-press.com/bestsellers

Prompt: List the top five titles of https://www.sap-press.com/bestsellers.

  1. Materials Management with SAP S/4HANA: Business Processes and Configuration

  2. Cloud Integration with SAP Integration Suite: The Comprehensive Guide

  3. Developing AI Applications: An Introduction

  4. SAP Build: No-Code Development, Centralized Access, and Process Automation

  5. SAP Signavio: Business Process Transformation

Aider versteht also den Aufbau der Webseite. Jetzt soll Aider diese Aufgabe per Python-Script automatisieren.

Prompt: Please write a Python script to extract the top five bestseller titles from https://www.sap-press.com/bestsellers.

Prompt: Add a requirement file to the project.

In VS Code werfen wir einen Blick auf bestseller_scraper.py und requirements.txt. Beide Dateien sehen vernünftig aus. Wir richten wieder ein Virtual Environment ein, installieren die Module und testen das Programm. Leider ist das Ergebnis enttäuschend: Das Script gibt nur eine Überschrift aus, die eigentliche Liste bleibt leer. Also bitten wir um Nachbesserung.

Prompt: bestseller_scraper.py only outputs an empty list; please try to fix the code.

I understand that the bestseller_scraper.py is outputting an empty list, and we need to fix the code. Let’s analyze and modify the script to address this issue. The problem likely lies in how we’re selecting elements from the webpage. We’ll adjust the HTML parsing to correctly identify and extract the book titles.

(new code …)

Aider baut den Code ein wenig um und ändert die Namen der HTML-Klassen, nach denen das Script sucht. Um es kurz zu machen: Aider scheitert neuerlich, das Script liefert weiterhin eine leere Liste. Das ist insofern enttäuschend, als Aider ja über das Kommando /web HTML-Seiten lesen, auswerten und verstehen kann. Allerdings bezieht sich diese Funktionalität auf den Inhalt der Seite, weniger auf deren HTML-Struktur. Nach ein paar weiteren Versuchen brechen wir diesen Test ohne Erfolgserlebnis ab. Aider bringt hier keinen Vorteil im Vergleich zu einer »ehrlichen«, eigenen Programmentwicklung.

API-Fehler

Die hier beschriebenen HTML-Verständnisprobleme sind leider nicht das einzige Ärgernis, das bei unseren Aider-Tests aufgetreten ist. Relativ oft wurden unsere Prompts mit Fehlermeldungen beantwortet, die darauf hinweisen, dass das von uns eingesetzte KI-Backend (Anthropic) gerade überlastet war oder aus einem anderen Grund keine Antwort gab. Meist half es, den Prompt einfach noch einmal auszuführen.

Natürlich sind derartige API-Fehler höchstwahrscheinlich nicht die Schuld von Aider, sondern haben mit Unzulänglichkeiten des jeweiligen KI-Anbieters zu tun. Auf der anderen Seite hatten wir diesbezüglich mit keinem anderen in diesem Buch präsentierten Tool so viele Schwierigkeiten wie mit Aider. Merkwürdig.

Beispiel 3: Änderungen in einem großen Projekt durchführen

Zuletzt haben wir versucht, mit Aider Änderungen in einem komplexen, realen Projekt durchzuführen, das aus mehreren Hundert Dateien (PHP, JavaScript, CSS) besteht. Die folgenden Absätze zeigen ein paar exemplarische Prompts. Unser Ziel bestand darin, Details einer HTML-Tabelle zu verändern, die durch Funktionen der Datei statistics.php ausgegeben wird. (Alle in den Prompts genannten Funktionen befinden sich in dieser Datei.) Da die in der HTML-Tabelle dargestellten Daten aus einer Datenbank stammen, haben wir auch das Schema der Datenbank in den Kontext übernommen.

Prompt: /add accounts/statistics.php

Prompt: /read doc/accounting-schema.sql

Prompt: in getUsageStatistics() add exception handling for the call connectToCustomerDatabase(); if the connection fails, continue loop with next customer.

Prompt: showUsage() displays the customer name in the first column of an HTML table; make this name a link to editCustomers.php?id=nnn where nnn is the customer id.

Prompt: still in the first column of the HTML table created by showUsage(): after the link, add the year of the initial order; you get the neccessary data from the database column customers.initialOrderDate.

Unsere Erfahrungen waren durchwachsen, nicht total schlecht, aber auch nicht großartig:

Kurz und gut: Ein rein auftragsorientiertes Programmieren ist gewöhnungsbedürftig, aber durchaus spannend. Allerdings hatten wir nicht das Gefühl, dass uns Aider viel Zeit erspart. Wahrscheinlich ist der Nutzen dieser Arbeitsweise dann am größten, wenn Sie von Grund auf neuen Code entwickeln – sei es nun ein ganz neues Projekt oder eine neue Methode oder Klasse in einem vorhandenen Projekt.

Mehr Prompting-Beispiele und Video-Tipps

Aider speichert den Prompt-Verlauf inklusive aller Antworten standardmäßig in der Markdown-Datei .aider.chat.history.md. Eine daraus abgeleitete Sammlung von zumeist kurzen Beispielen (jeweils Prompt plus Antwort in optisch ansprechender Formatierung) finden Sie auf der folgenden Webseite:

https://aider.chat/examples/README.html

Es gibt im Internet auch eine ganze Reihe von Videos, die Aider bei der Arbeit zeigen. Aider-Entwickler haben Links zu solchen Videos hier zusammengestellt:

https://aider.chat/docs/usage/tutorials.html

Diese Beispiele zeigen verschiedene Aspekte des Aider-Einsatzes und vermitteln viele Anwendungsideen. Allerdings hatten wir den Eindruck, dass manche Beispiele richtiggehend für Aider optimiert waren und insofern ein übertrieben optimistisches Bild vermitteln. Wie bei allen anderen in diesem Buch vorgestellten KI-Tools müssen Sie auch beim Praxiseinsatz von Aider mit Problemen und Fehlern rechnen.