Generative AI Testing Konferenz (1/2)
Thema 1: Don't Forget to Test: Crafting Reliable Chatbots
Was ist ein Chatbot?
Ein Chatbot ist ein Computerprogramm, das eine menschliche Konversation mit einer/einem Endbenutzer:in simuliert. Moderne Chatbots verwenden zunehmend Konversations-KI-Techniken wie die Verarbeitung natürlicher Sprache (NLP) und LLMs (Large Language Models), um Fragen von Benutzenden zu verstehen und Antworten darauf zu automatisieren.
Chatbots benutzen ein RAG-System, um Daten zu bearbeiten.
RAG (Retrieval Augmented Generation):
- Retrieval: Es sucht Informationen, um die Frage zu beantworten.
- Augmented: Es ruft Fakten aus dem LLM ab.
- Generation: Es analysiert die Fakten mit der Frage, um eine passende Antwort zu generieren.
Ein RAG-System besteht aus mehreren Komponenten:
- Einer Abfrage,
- einem LLM,
- einer Datenbank,
- einem Speicher,
- einem Prompt-Template
- sowie APIs/Tools.
Unit-Tests sind bei großen Sprachmodellen (LLMs) schwierig. Die Antwort ist nicht immer richtig und eine Frage kann zu mehreren unterschiedlichen Antworten führen. Die Antwort wird von Faktoren wie z. B. Kontext oder Datenvolumen beeinflusst.
Um die Qualität der Antworten zu verbessern, müssen die Chatbots getestet werden. Um die Richtigkeit der Antworten zu prüfen, müssen kontextbasierte Metriken (KPI) definiert werden.
Der Textprozess von Chatbots besteht aus:
- Generieren von Testszenarien
- Test der Abfrage
- Test der Chatbot-Generierung
- Auswertung der Ergebnisse
- Optimierungsschleife
Ein Testszenario hat drei Komponenten: eine Frage, eine erwartete Antwort und eine Liste von Hilfsmitteln, die für das Testen relevant sind.
Hier kann man die sogenannte „Factual similarity“ (tatsächliche Ähnlichkeit) prüfen. Sie beschreibt die tatsächliche Überschneidung zwischen der generierten Antwort und der tatsächlichen Antwort.
Außerdem können die Chatbots auf Schadensverursachung (Test for Harmfulness) getestet werden. Wie schädlich ist der Chatbot? Sind die Antworten richtig und ergeben sie einen Sinn?
Einige Frameworks helfen beim Testen von Chatbots:
- Trulens: https://www.trulens.org/
- LlamaIndex Evaluation: https://docs.llamaindex.ai/en/stable/optimizing/evaluation/evaluation.html
- Langchain Evaluation: https://python.langchain.com/docs/guides/evaluation/
- MLFlow Evaluation: https://mlflow.org/docs/latest/model-evaluation/index.html#guides-and-tutorials-for-llm-model-evaluation
- Langcheck: https://github.com/citadel-ai/langcheck
- Spelltest: https://github.com/artas728/spelltest
- PromptFoo: https://github.com/promptfoo/promptfoo
- Prompttools: https://github.com/hegelai/prompttools
Chatbots (LLMs) haben viele Einschränkungen:
- Sie bevorzugen lange Antworten, auch wenn diese nicht unbedingt besser sind.
- Sie bevorzugen möglicherweise Antworten aus ihrem eigenen Pool.
- Sie können Fragen manchmal nicht selbst beantworten und daher Antworten nicht sinnvoll bewerten (oder die zu bewertenden Antworten können sie in die Irre führen).
Fazit
Von generativer KI gesteuerte Chatbots haben durch ihr Verständnis der Alltagssprache und komplexer Abfragen, die Fähigkeit, sich an den Gesprächsstil eines/einer Benutzer:in anzupassen und beim Beantworten von Fragen Empathie einzusetzen.
Chatbots müssen ständig kontextspezifisch eingesetzt und getestet werden, um die Effektivität zu steigern. Der Mensch sollte immer die Kontrolle über die KI haben, um Schaden zu minimieren.
Thema 2: Pattern Thinking for Prompt Engineers: A Case Study in Test Design
Thematisiert wurde in diesem Vortrag, wie man LLMs anwenden kann, um komplexe oder fortgeschrittene Probleme zu lösen. Wie soll man ein Prompt (eine Abfrage) formulieren, um die bestmögliche Antwort von der KI zu bekommen?
Was ist Pattern Thinking?
Ein Muster (Pattern) ist eine Reihe oder eine Anordnung von Dingen. In der Welt gibt es unendlich viele Muster. Diese hängen meistens vom Kontext ab.
Wenn man das Wort „Muster“ auf digitale Erfahrungen anwendet, beschreibt es wiederverwendbare Lösungen für standardmäßige Problemsätze.
Pattern Thinking ist das Erkennen und Anwenden von Szenarien oder Erfahrungen in einer bestimmten Reihenfolge, um ein Problem zu lösen.
Was ist Prompt Engineering?
Prompt Engineering ist der Prozess, bei dem man Lösungen mit generativer künstlicher Intelligenz (generativer KI) so steuert, dass sie die gewünschten Ergebnisse erzielen.
Damit die Menschen Probleme lösen können und eine bessere Welt schaffen können, müssen sie einen guten Umgang miteinander haben und insbesondere eine sehr gute Kommunikation untereinander pflegen. Bei Prompt Engineering gilt das gleiche Prinzip.
Damit das LLM (Large Language Model) hochwertige und bessere Antworten geben kann, muss man die Qualität der Abfragen (Prompts) und die Qualität des Gesprächs mit der KI deutlich erhöhen. Wie mit Menschen; konkrete Fragen liefern bessere Antworten und bessere Gespräche liefern bessere Ergebnisse.
Um bessere Abfragen zu formulieren und bessere Gespräche zu führen, braucht man ein besseres „Pattern Thinking“.
Damit „Pattern Thinking“ wirklich funktioniert, sollte man eigene Abfragen (Prompts) erstellen bzw. formulieren. Man muss über den Tellerrand hinausschauen und seine Kreativität einsetzen.
Die Nutzung von „Patterns“ (Muster) oder „Prompts“ Anderer ist nicht „Pattern Thinking“. Man soll seine eigenen Muster „denken“ bzw. kreieren.
Damit „Pattern Thinking“ und „Prompt Engineering“ optimal funktionieren, sollte man bereits über Know-how in dem jeweiligen Thema verfügen, um einschätzen zu können, in welchem Bereich Hilfe von der KI benötigt wird.
Hier muss man wissen, was die menschliche Rolle und was die Rolle des LLM beinhaltet. LLMs können lügen oder in die Irre führen. LLMs helfen denjenigen, die das Thema verstehen; das ist das Muster.
Ein:e Softwareentwickler:in oder Softwaretester:in würde keine guten Ergebnisse erzielen, wenn sie oder er Lösungen in den Themen Medizin und Biologie generieren würde. Sie hätten keine Ahnung von der Medizin oder Biologie.
Um am meisten vom LLMs zu profitieren, sollte man eine Meta-Sprache statt einer natürlichen Sprache anwenden.
Einige kleine Blöcke, die man für „Pattern Thinking“ benutzen kann, sind:
- Das Ziel
- Die Rolle (z. B. Tester:in, Manager ...)
- Die Größe (Aufgabe, Ergebnisse, Firma …)
- Der Kontext (Medizin, Informatik, Sport, Scrum, Kanban …)
- Die Sprache (natürliche Sprache, Meta-Sprache …)
- Zielgruppe (Lösung für Frauen, Männer, Kinder …)
Fazit
Die Kombination von „Pattern Thinking“ und „Prompt Engineering“ mit generativer KI (LLMs) ist ein mächtiges Tool, um komplexe Probleme schneller zu lösen.
Leider sind die meisten keine „Pattern Thinker“. Sie folgen dem Trend, indem sie den Mustern von Anderen folgen. Sie können oder wollen ihre eigenen Muster nicht denken bzw. kreieren. Wie Wallace D. Wattles gesagt hat: „Denken ist die schwierigste Arbeit der Welt“.
Thema 3: Unit Test on Steroids: Leveraging Fuzz Testing and Generative AI for a scalable Testing Strategy
Hier geht es darum, die White-Box-Tests mit Whitebox Fuzzing und generativer KI zu verbessern.
Was ist Fuzz-Testing (Fuzzing)?
Fuzz-Testing (Fuzzing) ist ein Qualitätssicherungsverfahren, das zur Entdeckung von Programmierfehlern oder Bugs und Sicherheitslücken in Software, Betriebssystemen und Netzwerken eingesetzt wird.
Beim Fuzzing werden große Mengen an Zufallsdaten, Fuzz genannt, in das Testobjekt eingegeben, um es zum Absturz zu bringen. Das Programm wird mit absichtlich falsch aufgebauten, unerwarteten oder völlig zufälligen Eingaben gefüttert, um zu sehen, wie es darauf reagiert.
Anwendung von Fuzzing
Fuzzing wird in der Regel mit automatisierter Software durchgeführt, die neue Testfälle erzeugt und das zu testende Programm mit Eingaben füttert.
Fuzzer eignen sich am besten zum Aufspüren von Schwachstellen, die Bedrohungsakteur:innen für verschiedene Arten von Angriffen ausnutzen könnten, zum Beispiel Pufferüberläufe, Denial of Service, Cross-Site-Scripting und SQL Injection.
Dies sind Schemata, die böswillige Hacker verwenden, um in kürzester Zeit so viel Schaden wie möglich anzurichten.
Fuzz Testing ist derzeit die effektivste Methode, um Fehler und Sicherheitslücken zu finden.
Wie funktioniert Whitebox Fuzzing?
Testfälle werden vom einer selbstlernenden KI generiert, um die Codeabdeckung zu maximieren.
Einige Methoden für Fuzz-Tests sind die nachfolgend genannten:
- Beim Protokoll-Fuzzing wird die Funktionalität auf Protokollebene getestet, indem mutierte Netzwerkpakete als Eingabe verwendet werden.
- Das Dateiformat-Fuzzing beginnt mit einem legitimen Dateimuster und verändert es wiederholt, bis das Programm beim Versuch, die Datei zu öffnen, abstürzt.
- Beim Anwendungs-Fuzzing werden die Benutzeroberfläche, Texteingaben und Befehlszeilenoptionen getestet.
Die Vorteile von Fuzz Tests
Im Folgenden sind einige der spezifischen Vorteile von Fuzz Tests aufgeführt:
- Automatisierung: Sobald eine Fuzzer-Anwendung konfiguriert ist, können Algorithmen verwendet werden, um Tests automatisch und mit wenig bis gar keinem menschlichen Eingriff durchzuführen, was Geld und Zeit spart.
- Systematischer Ansatz: Fuzz ist eine völlig zufällige Eingabe, sodass sie nicht der Voreingenommenheit der/des Software-Tester:in unterliegt und Schwachstellen aufdecken kann, die ein:e menschliche:r Tester:in übersehen würde.
- Ideal für geschlossene Systeme: Es ist unmöglich, das Innenleben eines Programms oder Geräts zu kennen, das auf einem geschlossenen System aufgebaut ist, daher ist das Testen von Zufallsdaten die einzige Option. Bei Anwendungen für künstliche Intelligenz und Deep Learning ist es beispielsweise unmöglich, die genaue Beziehung zwischen Eingaben und Ausgaben zu erkennen.
Die Grenzen von Fuzz Tests
Fuzz Tests unterliegen einigen wesentlichen Einschränkungen, darunter den folgenden:
- Nicht abgedeckte Angriffsarten: Fuzz Tests sind weniger geeignet, um Software-Sicherheitsbedrohungen zu entdecken, die keine Programmabstürze aufgrund von fehlerhaften Eingaben verursachen. Zu diesen Arten von Bedrohungen gehören Spyware, einige Viren, Würmer, Trojaner und Keylogger.
- Schwierige Einrichtung: Für die Verwaltung und Überwachung von Fuzz Tests und den richtigen Umgang mit den gefundenen Fehlern sind umfangreiche Programmierkenntnisse erforderlich.
- Begrenzter Umfang: Die meisten Arten von Fuzz-Tests liefern kein vollständiges Bild von der Sicherheit, Qualität und Effektivität eines Programms. Sie finden lediglich Fehler. Auch andere Arten von Softwaretests wie Funktionstests und Betatests werden im Softwareentwicklungsprozess benötigt.
Nutzung generativer KI zur automatischen Generierung von Fuzz-Tests
Die Nutzung der statischen Analyse und der Codeanalyse- und Generierungsfunktionen von LLMs führt zu guten Ergebnissen:
- Überblick über eine Codebasis.
- Automatische Identifizierung von Fuzzing-Kandidaten.
- Automatische Generierung von Fuzz Tests.
- Verbesserung bestehender Tests.
- Automatisierte Fehlerbehebung (experimentell)
Fazit
Fuzz Testing hat ein sehr gutes Kosten-Nutzen-Verhältnis und deckt oft Fehler auf, die beim Schreiben und Debuggen von Software übersehen werden. Allerdings ist die Entwicklung hochwertiger Fuzz Tests anspruchsvoll und zeitaufwändig.
Die Nutzung generativer KI beim Fuzzing optimiert den Testprozess.
Selbstlernende KI durch Feedback-basiertes Fuzzing haben viele Vorteile:
- Ist die effektivste Methode, um Fehler und Sicherheitslücken zu finden.
- Verwendet die CPU-Zeit (billig) statt die Entwicklungs-/Engineering-Zeit (teuer).
- Ist am effektivsten, wenn es kontinuierlich durchgeführt wird (integriert in CI/CD).
- Sie ermöglichen die Entwicklung hochwertiger Tests.
Seminarempfehlung
MACHINE LEARNING BASICS DB-AI-01
Mehr erfahrenBei Updates im Blog, informieren wir per E-Mail.
Kommentare