Als VoiceBooker sehen wir jeden Tag, dass Large Language Models sich grundlegend von klassischer Software unterscheiden, weil ihre Entscheidungen auf Wahrscheinlichkeiten statt auf deterministischen Regeln basieren. Dadurch kann selbst bei identischem Input das Verhalten - etwa beim Function Calling - variieren, was Entwickler zunächst oft frustriert. Moderne Modelle sind zwar deutlich zuverlässiger geworden, dennoch bleiben präzise Prompts, sorgfältiges Debugging und das Verständnis von Kontextwechselwirkungen entscheidend für vorhersehbare Ergebnisse. Um die Qualität und Stabilität von KI-Anwendungen sicherzustellen, helfen automatisierte End-to-End-Tests dabei, Bot-Verhalten systematisch zu überprüfen und Regressionen frühzeitig zu erkennen.
Einführung
Wer aus der klassischen Softwareentwicklung kommt, erlebt beim Arbeiten mit Large Language Models (LLMs) oft einen kleinen Kulturschock. Jahrzehntelang waren wir es gewohnt, deterministische Systeme zu entwickeln: Wenn ein Programm bei einem bestimmten Input einen Fehler produziert, korrigieren wir den Code - und sobald die Lösung funktioniert, können wir davon ausgehen, dass sie künftig bei derselben Eingabe wieder funktioniert. Gleicher Input, gleicher Output. Das ist die Welt, in der sich Softwareentwickler seit Jahrzehnten bewegen. Mit LLMs sieht die Realität anders aus.
Von deterministischen Programmen zu Wahrscheinlichkeitsmaschinen
Ein Large Language Model arbeitet nicht wie ein klassisches Programm mit festen Entscheidungsbäumen. Stattdessen basiert es auf Wahrscheinlichkeiten. Jede Antwort, jede Entscheidung und auch jeder Function Call entsteht aus statistischen Bewertungen möglicher nächster Schritte. Das führt zu einem Phänomen, das viele Entwickler anfangs frustriert: Ein identischer Gesprächsverlauf kann bei zwei Durchläufen zu unterschiedlichen Ergebnissen führen. Man könnte es mit Roulette vergleichen: Die Rahmenbedingungen sind dieselben, trotzdem kann das Ergebnis variieren. Gerade Entwickler, die aus der Welt von APIs, Datenbanken und Business-Logik kommen, empfinden diese fehlende Deterministik zunächst als ungewohnt oder sogar problematisch.
Unsere ersten Erfahrungen mit Function Calling
Als Unternehmen haben wir 2023 unsere ersten Versuche unternommen, eine Terminbuchung über ein LLM abzuwickeln, und waren zeitweise fast verzweifelt. Der Gesprächsablauf war identisch:
- Nutzer nennt Terminwunsch
- Bot sammelt die notwendigen Informationen
- Funktion zur Terminbuchung soll aufgerufen werden
Trotzdem passierte Folgendes: Beim ersten Test wurde die Funktion korrekt aufgerufen. Beim zweiten Test mit praktisch identischem Ablauf wurde sie plötzlich nicht mehr ausgeführt. Für jemanden, der klassische Software entwickelt hat, wirkt das zunächst wie ein Bug. Tatsächlich handelt es sich jedoch oft nicht um einen Fehler des Systems, sondern um die natürliche Folge eines probabilistischen Modells, das Kontext interpretiert und Entscheidungen anhand von Wahrscheinlichkeiten trifft.
Die gute Nachricht: Modelle werden immer zuverlässiger
Seit den frühen GPT-3.5-Zeiten hat sich enorm viel getan. Moderne Modelle sind deutlich besser geworden in:
- Instruction Following
- Tool Usage
- Function Calling
- Kontextverständnis
- Einhaltung komplexer Prompts
Die Vorhersagbarkeit hat sich dadurch massiv verbessert. Dennoch existiert weiterhin eine wichtige Balance zwischen Zuverlässigkeit und Geschwindigkeit.
Warum mehr Determinismus oft mehr Latenz bedeutet
Viele der leistungsfähigsten Modelle arbeiten heute deutlich strukturierter und zuverlässiger als ihre Vorgänger. Der Preis dafür ist jedoch häufig zusätzlicher Reasoning-Aufwand. Vereinfacht gesagt: Das Modell denkt länger nach, analysiert mehr Kontext und trifft dadurch robustere Entscheidungen. Das erhöht die Wahrscheinlichkeit, dass eine gewünschte Funktion korrekt aufgerufen wird. Gleichzeitig steigt jedoch die Antwortzeit.
Gerade im Voice-Bereich kann das problematisch werden. Ein Telefonassistent, der mehrere Sekunden über jeden Funktionsaufruf nachdenken muss, wirkt für den Anrufer schnell unnatürlich. Deshalb setzen viele produktive Systeme bewusst auf kleinere und schnellere Modelle. Diese Modelle liefern hervorragende Latenzen und führen Funktionen ebenfalls erstaunlich zuverlässig aus - allerdings nur dann, wenn die Prompts möglichst wenig Interpretationsspielraum zulassen. Bereits kleine Änderungen im Kontext können dazu führen, dass ein zuvor perfekt funktionierender Ablauf plötzlich anders interpretiert wird.
Wenn Function Calls plötzlich ausbleiben
Ein typisches Muster in der Praxis: Ein Bot funktioniert über Wochen zuverlässig. Dann wird eine scheinbar harmlose Änderung am Prompt vorgenommen. Plötzlich wird eine bestimmte Funktion nur noch gelegentlich oder gar nicht mehr aufgerufen. In solchen Situationen lohnt es sich, nicht sofort das Modell verantwortlich zu machen. Oft liegt die Ursache in einer unerwarteten Wechselwirkung zwischen mehreren Instruktionen. Eine neue Regel kann beispielsweise unbewusst mit einer bestehenden Anweisung konkurrieren. Das Modell steht dann vor widersprüchlichen Zielen und entscheidet sich nachvollziehbar gegen den Function Call.
Prompt-Debugging statt Code-Debugging
Während klassische Softwareentwickler Code debuggen, debuggen LLM-Entwickler zunehmend Prompts. Ein Vorgehen, das sich bei uns bewährt hat: Wir laden das vollständige Transkript als JSON herunter - inklusive System-Prompts, Tool-Definitionen und Nutzereingaben - und lassen anschließend ein weiteres LLM analysieren, warum ein bestimmtes Verhalten aufgetreten ist. Die Ergebnisse sind oft überraschend. Häufig erkennt das Modell Widersprüche oder Mehrdeutigkeiten, die man selbst beim Schreiben des Prompts übersehen hat. Nicht selten müssen wir dem Modell sogar zustimmen: Bei genauer Betrachtung war die Instruktion tatsächlich nicht präzise genug oder stand in Konflikt mit anderen Anweisungen. Interessanterweise reagieren Menschen in solchen Situationen oft ähnlich. Wenn zwei Anweisungen widersprüchlich formuliert sind, entstehen zwangsläufig Interpretationsspielräume.
Von Unit-Tests zu Bot-Tests
Eine weitere wichtige Erkenntnis aus der Praxis: Manuelles Testen skaliert nicht. Wer jede Änderung am Bot durch manuelle Chats oder Testanrufe überprüft, verliert schnell viel Zeit. Deshalb haben wir in VoiceBooker sogenannte End-to-End-Tests eingeführt. Dabei kann ein Bot einen anderen Bot anrufen oder mit ihm chatten. Ein Testbot erhält beispielsweise die Aufgabe:
Reserviere einen Tisch für vier Personen am Dienstag um 18 Uhr.
Da der Testbot selbst programmierbar ist, können Parameter wie Datum, Uhrzeit oder Personenzahl automatisch variiert werden. Dadurch entstehen im Prinzip Unit-Tests für Conversational AI. Die Vorteile liegen auf der Hand:
- Wiederholbare Testszenarien
- Automatische Regressionstests
- Schnelle Validierung von Prompt-Änderungen
- Frühes Erkennen unerwarteter Verhaltensänderungen
Besonders im Chat-Modus lassen sich hunderte Testfälle in kurzer Zeit durchspielen, da lediglich die Latenz der verwendeten Modelle den Durchsatz begrenzt.
Fazit
Der vielleicht größte mentale Wandel beim Arbeiten mit LLMs besteht darin, sich von der Vorstellung absoluter Deterministik zu lösen. LLMs sind keine klassischen Programme. Sie sind Wahrscheinlichkeitsmaschinen. Das bedeutet jedoch nicht, dass zuverlässige Systeme unmöglich sind. Durch präzise Prompts, saubere Tool-Definitionen, systematisches Prompt-Debugging und automatisierte End-to-End-Tests lassen sich heute erstaunlich robuste und vorhersehbare KI-Anwendungen entwickeln. Der entscheidende Unterschied zur klassischen Softwareentwicklung besteht lediglich darin, dass man nicht mehr ausschließlich Code optimiert - sondern zunehmend das Verhalten eines intelligenten Systems. Und genau darin liegt gleichzeitig die größte Herausforderung und die größte Faszination moderner KI-Entwicklung.

