In diesem Tutorial werden wir ein IBM® Granite Model mithilfe eines synthetischen Datensatzes, der Kundenbewertungen zu einem Hundepflegeunternehmen enthält, anpassen.
Prompt-Tuning ist eine effiziente und kostengünstige Methode, um ein Foundation Model für künstliche Intelligenz (KI) an neue nachgelagerte Aufgaben anzupassen, ohne das gesamte Modell neu zu trainieren und seine Parameter zu aktualisieren zu müssen.
Foundation Models basieren auf großen Sprachmodellen (LLMs) und erhalten große Mengen an Trainingsdaten. Häufige Anwendungsfälle von Foundation Models sind Chatbots und virtuelle Assistenten.
Es gibt verschiedene Möglichkeiten, die Interpretation von Eingaben und die Qualität der Antworten eines Foundation Models zu verbessern. Um diese Nuancen besser zu verstehen, vergleichen wir einige der Methoden.
Harte Prompts sind benutzerorientiert und erfordern eine Reaktion des Benutzers. Ein Hard Prompt kann als Vorlage oder Anweisung für das LLM dienen, um Antworten zu generieren. Als Nächstes wird ein Beispiel für einen harten Prompt vorgestellt. Wir empfehlen Ihnen, die IBM Dokumentationsseite zu lesen, um weitere Informationen zu diesem und mehreren anderen Prompttyp zu erhalten.
Unter Verwendung dieser Hard-Prompt-Vorlage können einem LLM spezifische Anweisungen zur bevorzugten Ausgabestruktur und zum bevorzugten Ausgabestil bereitgestellt werden. Durch diesen expliziten Prompt würde das LLM eher gewünschte Antworten von höherer Qualität liefern.
Soft Prompts werden im Gegensatz zu Hard Prompts nicht in natürlicher Sprache verfasst. Stattdessen werden Prompts als KI-generierte, numerische Vektoren initialisiert, die an den Anfang jeder Eingabe-Einbettung angehängt werden, die das Wissen aus dem größeren Modell destilliert. Diese mangelnde Interpretierbarkeit erstreckt sich auch auf die KI, die für eine bestimmte Aufgabe optimierte Prompts auswählt. Oft kann die KI nicht erklären, warum sie diese Einbettungen ausgewählt hat. Im Vergleich zu anderen Prompting-Methoden sind diese virtuellen Token weniger rechenintensiv als die Feinabstimmung, da das Modell selbst mit festen Gewichtungen eingefroren bleibt. Soft Prompts übertreffen in der Regel auch die von Menschen entwickelten Hard Prompts.
In diesem Tutorial arbeiten wir mit weichen Prompts zur Prompt-Optimierung.
Sie benötigen ein IBM® Cloud-Konto für das Erstellen eines watsonx.ai-Projekts.
Sie können zwar aus mehreren Tools wählen, aber dieses Tutorial führt Sie durch die Einrichtung eines IBM® Kontos für die Verwendung eines Jupyter Notebook.
Melden Sie sich bei watsonx.ai mit Ihrem IBM Cloud-Konto an.
Erstellen Sie ein watsonx.ai-Projekt.
Sie können Ihre Projekt-ID in Ihrem Projekt abrufen. Klicken Sie auf die Registerkarte „Verwalten“. Kopieren Sie dann die Projekt-ID aus dem Abschnitt „Details“ der Seite „Allgemein“. Sie benötigen diese ID für dieses Tutorial.
Erstellen Sie ein Jupyter Notebook.
In diesem Schritt wird eine Notebook-Umgebung geöffnet, in der Sie den Code aus diesem Tutorial kopieren können, um das Prompt-Tuning selbst zu implementieren. Alternativ können Sie dieses Notebook auf Ihr lokales System herunterladen und als Asset in Ihr watsonx.ai-Projekt hochladen. Dieses Jupyter Notebook sowie die verwendeten Datensätzen finden Sie auf GitHub.
Erstellen Sie eine watsonx.ai Runtime -Service-Instanz (wählen Sie Ihre entsprechende Region aus und wählen Sie den Lite-Plan, der eine kostenlose Instanz ist).
Generieren Sie einen API-Schlüssel.
Verknüpfen Sie die Instanz des watsonx.ai-Runtime-Service mit dem Projekt, das Sie in watsonx.ai erstellt haben.
Für dieses Tutorial benötigen wir einige Bibliotheken und Module. Stellen Sie sicher, dass Sie Folgendes importieren; wenn diese nicht installiert sind, können Sie das Problem mit einer schnellen PIP-Installation beheben.
Richten Sie Ihre Zugangsdaten ein. Geben Sie Ihren API-Schlüssel und Ihre Projekt-ID ein.
Erstellen Sie als ersten Schritt beim Einrichten der Umgebung eine Instanz von APIClient mit Ihren Authentifizierungsdaten, und legen Sie Ihre project_id fest.
Ausgabe:
'SUCCESS'
Für dieses Tutorial verwenden wir einen synthetischen Datensatz, der aus Reviews von Hundepflegeunternehmen besteht. Über die entsprechende URL können wir den Datensatz mit dem API-Client verbinden.
Sie können jeden Datensatz Ihrer Wahl verwenden. Auf Plattformen wie HuggingFace sind mehrere Open-Source-Datensätze verfügbar.
Output:
Creating data asset...
ERFOLG
Ausgabe:
3b1db894-8d9e-428d-8fee-d96f328c7726
Um eine Erkenntnis zur Formatierung dieser Kunden-Reviews zu erhalten, laden wir die Daten in einen Pandas-Datenrahmen und geben ein paar Zeilen aus, die sowohl positive als auch negative Reviews anzeigen. Die Ausgabe „1“ steht für positive Bewertungen und „0“ für negative Bewertungen.
Output:
Die Klasse TuneExperiment ist dafür da, Experimente zu erstellen und Tunings zu planen. Damit können wir unser Experiment initialisieren und unser Foundation Model sowie unsere Trainingsdaten sowie unsere Parameter festlegen. Das Ziel dieser Prompt-Tuning-Übung besteht darin, das LLM so zu trainieren, dass es seine Antworten entsprechend den aus unserem Datensatz extrahierten Kundezufriedenheitsbewertungen anpasst. Dies ist eine Klassifizierungsaufgabe, da die Reviews entweder als positiv (1) oder negativ (0) klassifiziert werden können.
Für dieses Tutorial schlagen wir vor, ein IBM Granite Model als großes Sprachmodell zu verwenden, um ähnliche Ergebnisse zu erzielen.
Nachdem wir unser Tuning-Experiment nun eingerichtet haben, müssen wir es mit unserem Datensatz verknüpfen. Verwenden wir hierfür die Klasse DataConnection. Dies erfordert die Asset_ID, die wir zuvor beim Initiieren des Assets mit unserem API-Client erstellt haben.
Sie können ein KI-Modell Ihrer Wahl verwenden. Die Foundation Models, die über watsonx® abgestimmt werden können, finden Sie hier oder mit dem folgenden Befehl.
Output:
{'FLAN_T5_XL': 'google/flan-t5-xl', 'GRANITE_13B_INSTRUCT_V2': 'ibm/granite-13b-instruct-v2', 'LLAMA_2_13B_CHAT': 'meta-llama/llama-2-13b-chat'}
Output:
##############################################
Running '20671f17-ff53-470b-9bfe-04318ecb91d9'
##############################################
pending......
running....................................................................................................................................
completed
Training of '20671f17-ff53-470b-9bfe-04318ecb91d9' finished successfully.
Um sicherzustellen, dass unser Prompt-Tuning abgeschlossen ist, können wir den Status überprüfen. Wenn der Status nicht als „Abgeschlossen“ angezeigt wird, warten Sie bitte, bis das Tuning abgeschlossen ist, bevor Sie fortfahren.
Ausgabe:
completed
Wir können jetzt die Prompt-Tuning-Zusammenfassung abrufen. In dieser Zusammenfassung sehen Sie einen Verlustwert. Bei jedem Trainingsdurchlauf misst die Verlustfunktion die Differenz zwischen den vorhergesagten und den tatsächlichen Ergebnissen. Daher wird ein niedrigerer Verlustwert bevorzugt.
Mithilfe der Funktion plot_learning_curve() können wir die Lernkurve unserer Modellabstimmung darstellen. Eine nach unten abfallende Kurve, die sich der Null annähert, weist darauf hin, dass das Modell die erwartete Ausgabeerzeugung verbessert. Weitere Informationen zur Interpretation von Verlustfunktionsdiagrammen finden Sie in der entsprechenden IBM watsonx-Dokumentation.
Output:
Dieser Schritt, bei dem das optimierte Modell bereitgestellt wird, ist kritisch für die nächsten Schritte, nämlich für den Vergleich der Leistung des optimierten Modells mit der des vortrainierten Modells.
Hinweis: Der SERVING_NAME wird auf das aktuelle Datum und die aktuelle Uhrzeit gesetzt, da es sich dabei um einen eindeutigen Wert handeln muss.
Ausgabe:
######################################################################################
Synchronous deployment creation for id: '6aa5dd5c-0cc4-44e0-9730-18303e88e14a' started
######################################################################################
initializing.......................
ready
-----------------------------------------------------------------------------------------------
Successfully finished deployment creation, deployment_id='24a97b84-47d0-4490-9f5f-21ed2376fdd6'
-----------------------------------------------------------------------------------------------
Testen wir nun die Leistung sowohl des abgestimmten Modells als auch des ursprünglichen Foundation Models, um die Auswirkungen unseres Optimierungsprozesses zu sehen. Laden wir zunächst den Testdatensatz. Dieser Datensatz sollte eine Teilmenge von Daten sein, die bei der Optimierung nicht vorhanden waren. Oft ist der Testdatensatz auch kleiner als der Trainingsdatensatz. Außerdem enthält jede Eingabe im Testdatensatz das Prompt als Präfix des Kommentars des Benutzers.
Zeigen wir einen kleinen Teil des Datensatzes an, um seine Struktur besser zu verstehen.
Output:
Nachdem wir den Testdatensatz geladen haben, extrahieren wir die Eingaben und Ausgaben.
Um zu veranschaulichen, wie wir den Inhalt des Datensatzes extrahiert haben, können wir ein Beispiel für Eingabe und Ausgabe drucken.
Output:
'Extract the satisfaction from the comment. Return simple 1 for satisfied customer or 0 for unsatisfied.\nComment: Long wait times.\nSatisfaction:\n'
In diesem Beispiel wird das Prompt eingeführt, gefolgt von der Kunden-Review zu langen Wartezeiten und schließlich ist die Zufriedenheit 0, was eine negative Bewertung bedeutet.
Ausgabe:
0
Nachdem wir nun den Testdatensatz haben, wollen wir die Genauigkeit und den F1-Wert unseres abgestimmten Modells testen. Der F1-Wert ist der Mittelwert für Präzision und Rückruf des Modells. Dazu benötigen wir deployment_id. Beachten Sie, dass concurrency_limit auf 2 gesetzt ist, um zu vermeiden, dass das Ratenlimit der API erreicht wird. Dies ist die Anzahl der Anfragen, die parallel gesendet werden.
Output:
accuracy_score: 0.9827586206896551, f1_score: 0.9827586206896551
Angesichts der hohen Genauigkeit und des F1-Wertes unseres Modells testen wir die Leistung desselben Granite-Modells ohne jegliche Optimierung.
Output:
base model accuracy_score: 0.9310344827586207, base model f1_score: 0.9298245614035088
Unser optimiertes Modell übertrifft das vortrainierte Foundation Model. Da das optimierte Modell auf das Extrahieren von Zufriedenheitswerten spezialisiert ist, kann es für andere Aufgaben der Zufriedenheitsanalyse verwendet werden. Gut gemacht!
In diesem Tutorial haben Sie mit der watsonx API ein Prompt-Tuning an einem IBM Granite-Modell durchgeführt. Ihr optimiertes und bereitgestelltes Modell hat das Foundation Model mit einer um etwa 5 % höheren Genauigkeit erfolgreich übertroffen.