Heim >Backend-Entwicklung >PHP-Tutorial >Nutzung des OpenAI-Assistenten für die Erkennung benannter Entitäten in PHP/Symfony 7
Die Integration großer Sprachmodelle in reale Produkt-Backends ist das neueste Schlachtfeld für Innovationen. Aber wie bei allen Technologietrends sind die wahren Gewinner nicht diejenigen, die sich beeilen, alles zu wissen. Stattdessen geht es darum, innezuhalten, nachzudenken und kluge Entscheidungen zu treffen.
Auch wenn KI zugänglicher denn je ist, ist es ein großer Fehler zu glauben, dass es sich um eine triviale Aufgabe handelt. Das Gebiet steckt noch in den Kinderschuhen und fast jeder in Technik und Wirtschaft versucht herauszufinden, wie man es verstehen kann. Das Internet ist überfüllt mit zuverlässigen Informationen und irreführendem Hype.
Ob Sie es glauben oder nicht, Sie müssen sich nicht auf jeden KI-Klatsch einlassen, den Sie hören. Treten Sie einen Schritt zurück und gehen Sie nachdenklich an die Sache heran.
Wenn Sie PHP-Entwickler sind oder mit einer PHP-Codebasis arbeiten, kommt Ihnen KI möglicherweise wie ein Fremdwort vor. Klassen, Schnittstellen, Nachrichtenwarteschlangen und Frameworks scheinen Welten von NLP, Feinabstimmung, stochastischen Gradientenabstiegen, LoRA, RAG und all dem Fachjargon entfernt zu sein. Ich verstehe es. Um diese Konzepte, wie alles in der Softwareentwicklung, systematisch zu erlernen, brauchen wir Zeit und gute Praxis.
Aber sind KI, maschinelles Lernen und Datenwissenschaft nicht die Domäne von Python- oder R-Programmierern? Du hast teilweise recht. Der Großteil des grundlegenden maschinellen Lernens wird in Python durchgeführt. Und ehrlich gesagt macht es Spaß, Python zu lernen – es ist vielseitig und kann auf unzählige interessante Projekte angewendet werden. Vom Erstellen und Trainieren eines Sprachmodells bis hin zur Bereitstellung über eine API – Python ist für Sie da.
Aber kommen wir zurück zu PHP.
Keine Sorge – Sie werden als normaler Softwareentwickler nicht veraltet sein. Ganz im Gegenteil. Da zunehmend von uns erwartet wird, dass wir verwandte Bereiche wie Containerisierung, CI/CD, Systemtechnik und Cloud-Infrastruktur verstehen, wird KI schnell zu einer weiteren wesentlichen Fähigkeit in unserem Toolkit. Es gibt keinen besseren Zeitpunkt als jetzt, um mit dem Lernen zu beginnen.
Dennoch empfehle ich nicht, sich kopfüber in den Aufbau neuronaler Netze von Grund auf zu stürzen (es sei denn, Sie möchten es wirklich). Es ist leicht, überwältigt zu werden. Stattdessen zeige ich Ihnen einen praktischen Ausgangspunkt für Ihre KI-Experimente.
Das werden wir in diesem Leitfaden behandeln:
Asynchrone KI-Workflows
Ich zeige Ihnen, wie Sie einen KI-Workflow mithilfe einer Nachrichtenwarteschlange implementieren – sei es RabbitMQ, Amazon SQS oder Ihr bevorzugter Broker.
Produktionsfertige Lösung
Sie sehen ein reales Beispiel der in einem Produktionssystem eingesetzten Lösung, die grundlegende Geschäftsanforderungen mit KI erfüllt
Symfony-Integration
Die Lösung ist vollständig im Symfony PHP-Framework implementiert.
OpenAI-Tools
Wir verwenden die OpenAI PHP-Bibliothek und die neuesten OpenAI Assistants 2.0.
Datensatzstruktur
So erstellen Sie einen Datensatz zum Trainieren und Bewerten Ihres KI-Modells.
Feinabstimmung von OpenAI-Modellen
Erfahren Sie, wie Sie eine geeignete .jsonl-Datei vorbereiten und das GPT-4o-mini-Modell oder ein anderes Modell aus der GPT-Familie für Ihren spezifischen Geschäftsanwendungsfall optimieren.
Erstellen und Testen eines OpenAI Assistant 2.0
Erfahren Sie, wie Sie einen OpenAI-Assistenten einrichten und ihn im OpenAI Playground testen.
Wissensdatenbanken
Tauchen Sie ein in das Konzept der Wissensdatenbanken: Warum GPT nicht alles weiß und wie man es mit dem richtigen Kontext versorgt, um die Genauigkeit erheblich zu steigern.
PHP- und Symfony-Integration
Erfahren Sie, wie Sie Ihren KI-Agenten nahtlos mit Ihrer Symfony-Anwendung verbinden.
Interessiert? Lasst uns rollen.
Lassen Sie uns in das Problem eintauchen, das wir lösen.
Im Kern haben wir es mit einem Textblock zu tun, der etwas darstellt – in unserem Fall eine Adresse. Ziel ist es, die Komponenten in vordefinierte Gruppen einzuteilen.
Wenn uns also ein Benutzer eine Adresse sendet, möchten wir eine JSON-Struktur zurückgeben, die die Adresse in ihre Teile segmentiert. Zum Beispiel:
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Warum ist das wichtig?
Nun, diese Adressen werden von Menschen – unseren Kunden – eingegeben und sind oft inkonsistent. Aus diesem Grund benötigen wir strukturierte, analysierte Daten:
Um dies zu erreichen, zerlegen wir die Adresse in vordefinierte Gruppen wie „Straße“, „Haus“, „Postleitzahl“ usw. und fügen sie dann wieder in der gewünschten Reihenfolge zusammen.
Warum nicht reguläre Ausdrücke verwenden?
Auf den ersten Blick klingt es einfach. Wenn wir die Formatierung für neue Kunden erzwingen oder wissen, dass sie Adressen normalerweise auf eine bestimmte Weise schreiben, scheinen reguläre Ausdrücke eine vernünftige Lösung zu sein.
Betrachten wir jedoch Beispiele für rumänische Adressen:
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Rumänische Adressen sind oft komplex, in keiner bestimmten Reihenfolge geschrieben und enthalten häufig Elemente wie die Postleitzahl. Selbst die ausgefeiltesten regulären Ausdrücke haben Schwierigkeiten, mit solchen Schwankungen zuverlässig umzugehen.
Hier glänzen KI-Modelle wie GPT-3.5 Turbo oder GPT-4o-mini – sie können Inkonsistenzen und Komplexitäten bewältigen, die weit über das hinausgehen, was statische Regeln wie Regex bewältigen können.
Ja, wir entwickeln einen KI-Workflow, der den traditionellen Ansatz deutlich verbessert.
Jedes maschinelles Lernprojekt läuft auf zwei wesentliche Elemente hinaus: Daten und Modell. Und während Modelle wichtig sind, sind Daten weitaus wichtiger.
Modelle werden vorverpackt und getestet geliefert und können ausgetauscht werden, um zu sehen, welches Modell eine bessere Leistung erbringt. Aber der wahre Game-Changer ist die Qualität der Daten, die wir dem Modell zur Verfügung stellen.
Die Rolle von Daten beim maschinellen Lernen
Normalerweise teilen wir unseren Datensatz in zwei oder drei Teile auf:
Für dieses Projekt möchten wir eine Adresse in ihre Bestandteile zerlegen – was dies zu einer Klassifizierungsaufgabe macht. Um mit einem großen Sprachmodell (LLM) wie GPT gute Ergebnisse zu erzielen, benötigen wir mindestens 100 Beispiele in unserem Trainingsdatensatz.
Das Rohformat unseres Datensatzes spielt keine große Rolle, aber ich habe eine Struktur gewählt, die intuitiv und einfach zu verwenden ist:
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Hier ist ein Beispiel:
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Wie Sie sehen, besteht das Ziel darin, eine strukturierte JSON-Antwort basierend auf der Eingabeadresse zu erstellen.
Zuerst benötigen Sie ein OpenAI API-Konto. Es ist ein unkomplizierter Prozess, und ich empfehle, zunächst etwas Geld hinzuzufügen – 10 oder 20 US-Dollar reichen für den Anfang aus. OpenAI verwendet ein praktisches Prepaid-Abonnementmodell, sodass Sie die volle Kontrolle über Ihre Ausgaben haben.
Hier können Sie die Abrechnung Ihres Kontos verwalten:
Erkundung des OpenAI-Spielplatzes
Sobald Ihr Konto eingerichtet ist, gehen Sie zum OpenAI Playground.
Nehmen Sie sich einen Moment Zeit, um sich mit der Benutzeroberfläche vertraut zu machen. Wenn Sie bereit sind, suchen Sie im Menü links nach dem Abschnitt „Assistenten“.
Hier erstellen wir unsere benutzerdefinierte GPT-Instanz.
Anpassen Ihres GPT-Assistenten
Wir passen unseren GPT-Assistenten in zwei Schritten an unsere spezifischen Bedürfnisse an:
Detaillierte Systemanleitung mit Beispielen
Dieser Schritt hilft uns, schnell zu testen und zu validieren, ob die Lösung funktioniert. Dies ist der schnellste Weg, Ergebnisse zu sehen.
Feinabstimmung mit Wissensdatenbank (einfaches RAG)
Sobald wir mit den ersten Ergebnissen zufrieden sind, werden wir das Modell verfeinern. Dieser Prozess reduziert die Notwendigkeit, in jeder Eingabeaufforderung ausführliche Beispiele bereitzustellen, was wiederum die Inferenzzeit verkürzt (wie lange es dauert, bis das Modell über die API antwortet).
Beide Schritte kombiniert liefern uns die genauesten und effizientesten Ergebnisse.
Also, fangen wir an.
Für unser Named Entity Recognition-System benötigen wir das Modell, um strukturierte JSON-Antworten konsistent auszugeben. Um dies zu erreichen, ist die Erstellung einer durchdachten Systemaufforderung von entscheidender Bedeutung.
Darauf konzentrieren wir uns:
Die „Few-Shot“-Technik ist ein leistungsstarker Ansatz für diese Aufgabe. Es funktioniert, indem es dem Modell einige Beispiele für die gewünschte Input-Output-Beziehung zur Verfügung stellt. Anhand dieser Beispiele kann das Modell Eingaben verallgemeinern und verarbeiten, die es zuvor noch nicht gesehen hat.
Schlüsselelemente einer Few-Shot-Eingabeaufforderung:
Die Eingabeaufforderung besteht aus mehreren Teilen, die für optimale Ergebnisse sorgfältig strukturiert sein sollten. Die genaue Reihenfolge kann zwar variieren, die folgenden Abschnitte müssen jedoch unbedingt enthalten sein:
Der erste Teil der Eingabeaufforderung bietet einen allgemeinen Überblick darüber, was wir von dem Modell erwarten.
In diesem Anwendungsfall handelt es sich bei der Eingabe beispielsweise um eine rumänische Adresse, die möglicherweise Rechtschreibfehler und falsche Formatierungen enthält. Dieser Kontext ist wichtig, da er die Grundlage für das Modell bildet und erklärt, welche Art von Daten es verarbeiten wird.
Nachdem wir die Aufgabe definiert haben, leiten wir die KI bei der Formatierung ihrer Ausgabe an.
Hier wird die JSON-Struktur ausführlich erläutert, einschließlich der Art und Weise, wie das Modell jedes Schlüssel-Wert-Paar aus der Eingabe ableiten soll. Zur Verdeutlichung der Erwartungen sind Beispiele enthalten. Darüber hinaus werden alle Sonderzeichen ordnungsgemäß maskiert, um gültiges JSON sicherzustellen.
Beispiele sind das Rückgrat der „Few-Shot“-Technik. Je mehr relevante Beispiele wir bereitstellen, desto besser ist die Leistung des Modells.
Dank des umfangreichen Kontextfensters von GPT (bis zu 16.000 Token) können wir eine große Anzahl von Beispielen einbinden.
So erstellen Sie den Beispielsatz:
Beginnen Sie mit einer einfachen Eingabeaufforderung und bewerten Sie die Ausgabe des Modells manuell.
Wenn die Ausgabe Fehler enthält, korrigieren Sie diese und fügen Sie die korrigierte Version dem Beispielsatz hinzu.
Dieser iterative Prozess verbessert die Leistung des Assistenten im Laufe der Zeit.
Es ist unvermeidlich – Ihr Assistent wird Fehler machen. Manchmal kann es wiederholt zu demselben Fehler kommen.
Um dieses Problem zu beheben, fügen Sie Ihrer Aufforderung klare und höfliche Korrekturinformationen hinzu. Erklären Sie deutlich:
Welche Fehler der Assistent macht.
Was Sie stattdessen von der Ausgabe erwarten.
Dieses Feedback hilft dem Modell, sein Verhalten anzupassen und bessere Ergebnisse zu erzielen.
Nachdem wir nun die erste Eingabeaufforderung für unsere Proof-of-Concept-Few-Shot-Lösung erstellt haben, ist es an der Zeit, den Assistenten zu konfigurieren und zu testen.
Schritt 1
Schritt 2: Konfigurieren Sie Ihren Assistenten
Schritt 3: Wählen Sie das richtige Modell
Für dieses Projekt habe ich GPT-4o-mini gewählt, weil:
Dennoch sollten Sie Ihr Modell immer auf der Grundlage eines ausgewogenen Verhältnisses zwischen Genauigkeit und Kosten auswählen. Führen Sie Benchmarks durch oder suchen Sie danach, um herauszufinden, was für Ihre spezifische Aufgabe am besten funktioniert.
Nachdem die Erstkonfiguration erfolgt ist, können wir nun das Ausgabeschema direkt im Assistant Creator angeben.
Schritt 1: Verwenden der Option „Generieren“
Anstatt das Schema manuell zu erstellen, habe ich die vom Assistenten-Ersteller bereitgestellte Option „Generieren“ verwendet. So geht's:
Das Tool leistet hervorragende Arbeit bei der automatischen Generierung eines Schemas, das Ihrer Struktur entspricht.
--
Um konsistente und vorhersehbare Reaktionen zu gewährleisten, stellen Sie die Temperatur so niedrig wie möglich ein.
Was ist Temperatur?
Die Temperatur steuert die Zufälligkeit der Antworten des Modells. Ein niedriger Temperaturwert bedeutet, dass das Modell vorhersehbarere und deterministischere Ergebnisse liefert.
Für unseren Anwendungsfall ist das genau das, was wir wollen. Wenn dem Modell die gleiche Adresse wie als Eingabe gegeben wird, sollte es immer die gleiche, korrekte Antwort zurückgeben. Konsistenz ist der Schlüssel für zuverlässige Ergebnisse.
Wenn alle Parameter festgelegt sind, gehen Sie zum Playground, um Ihre Lösung zu testen.
Der Playground bietet eine Konsole, auf der Sie Ihren Assistenten einsetzen können. Hier beginnt der Spaß – Sie können Ihre Basislösung ausgiebig testen, um Folgendes herauszufinden:
Diese Erkenntnisse helfen Ihnen dabei, den Abschnitt Korrekturinformationen Ihrer Eingabeaufforderung zu verfeinern und Ihren Assistant robuster zu machen.
Unten finden Sie ein Beispiel eines Ergebnisses aus einem meiner manuellen Tests:
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Warum ist manuelles Testen wichtig?
Praxisnahe Tests der alten Schule sind die Grundlage für den Aufbau einer zuverlässigen Lösung. Durch die manuelle Auswertung der Modellausgaben können Sie Probleme schnell erkennen und verstehen, wie Sie sie beheben können. Während die Automatisierung später erfolgen wird, sind manuelle Tests ein unschätzbarer Schritt bei der Erstellung eines soliden Proof-of-Concept.
Jetzt ist es an der Zeit, alles in Ihre PHP-Symfony-Anwendung zu integrieren. Die Einrichtung ist unkompliziert und folgt einer klassischen asynchronen Architektur.
Hier ist eine Aufschlüsselung des Ablaufs:
1.Frontend-Interaktion
Im Allgemeinen handelt es sich hier um ein klassisches asynchrones Setup mit Nachrichtenwarteschlange. Wir haben zwei Instanzen der Symfony-Anwendung, die im Docker-Container ausgeführt werden. Der erste ist die Interaktion mit dem Frontend-Client.
Zum Beispiel, wenn ein Kunde Folgendes eingibt:
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Die Anwendung verarbeitet die Eingabeadresse und verpackt sie in ein Message-Objekt.
Das Message-Objekt wird dann in eine Symfony Messenger Envelope-Instanz verpackt. Die Nachricht wird in das JSON-Format serialisiert, mit zusätzlichen Metadaten zur Verarbeitung.
Symfony Messenger eignet sich perfekt für die Bearbeitung asynchroner Aufgaben. Dadurch können wir zeitaufwändige Vorgänge, wie den Aufruf der OpenAI-API, auf Hintergrundprozesse verlagern.
Dieser Ansatz gewährleistet:
Unten ist die für unser System verwendete Nachrichtenklasse aufgeführt:
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Die Anwendung stellt über die amqp-PHP-Erweiterung eine Verbindung zu einer RabbitMQ-Instanz her. Um dies einzurichten, müssen Sie den Transport und die Nachrichtenbindung in Ihrer Messenger.yaml-Konfigurationsdatei definieren.
Ausführliche Anleitungen finden Sie in der offiziellen Symfony Messenger-Dokumentation:
Symfony Messenger-Transportkonfiguration
Dokumentation: https://symfony.com/doc/current/messenger.html#transport-configuration
Sobald die Nachricht an den Broker (z. B. RabbitMQ, AmazonMQ oder AWS SQS) weitergeleitet wird, wird sie von der zweiten Instanz der Anwendung aufgenommen. Diese Instanz führt den Messenger-Daemon aus, um Nachrichten zu konsumieren, wie im Architekturschema mit 3 markiert.
Der Verbrauchsprozess wird durch Ausführen von:
abgewickeltbin/console Messenger:consume
funktioniert wie es ist.
Der Daemon holt die Nachricht aus der konfigurierten Warteschlange, deserialisiert sie zurück in die entsprechende Nachrichtenklasse und leitet sie zur Verarbeitung an den Nachrichtenhandler weiter.
Hier ist der Nachrichtenhandler, in dem die Interaktion mit dem OpenAI-Assistenten stattfindet:
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Wichtige Punkte des Handlers
Protokollierung
Protokolliert den Beginn der Verarbeitung zur Rückverfolgbarkeit und Fehlerbehebung.
Normalisierungsdienst
Der OpenAIAddressNormalizationService wird aufgerufen, um die Eingabeadresse über den Assistenten zu verarbeiten.
Beharrlichkeit
Die normalisierte Adresse wird mit dem EntityManager von Doctrine in der Datenbank gespeichert.
Der Nachrichtenhandler mag wie Standard-Symfony-Code erscheinen, aber der Kern befindet sich in dieser Zeile:
INPUT: <what goes into the LLM> OUTPUT: <what the LLM should produce>
Dieser Dienst ist für die Interaktion mit OpenAI über die angegebene PHP-Bibliothek verantwortlich.
OpenAI PHP-Client
Lassen Sie uns in die Implementierung des Dienstes mithilfe des PHP-Clients eintauchen.
Hier ist die vollständige Implementierung des OpenAIAddressNormalizationService:
input: STRADA EREMIA GRIGORESCU, NR.11 BL.45B,SC.B NR 11/38, 107065 PLOIESTI output: {{"street": "Eremia Grigorescu", "house_number": "11", "flat_number": "38", "block": "45B", "staircase": "45B", floor: "", "apartment": "", "landmark": "", "postcode": "107065", "county": "Prahova", 'commune': '', 'village': '', "city" "Ploiesti"}}
Der Workflow zum Erhalten einer Schlussfolgerung (oder Vervollständigung) – im Wesentlichen der Antwort von GPT – mithilfe der openai-php/client-Bibliothek folgt drei Hauptphasen:
Der erste Schritt besteht darin, den OpenAI-Client einzurichten und den konfigurierten Assistenten abzurufen:
INPUT: BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124 OUTPUT: { "street": "Bdul 21 Decembrie 1989", "house": "93", "flat": "50", "block": "", "staircase": "", "floor": "", "apartment": "", "landmark": "", "intercom": "", "postcode": "400124", "county": "Cluj", "commune": "", "village": "", "city": "Cluj" }
Client-Initialisierung: Die OpenAI::client()-Methode erstellt einen neuen Client mithilfe Ihres API-Schlüssels und Ihrer Organisations-ID.
Assistant-Abruf: Die Retrie()-Methode stellt eine Verbindung zu der spezifischen Assistant-Instanz her, die für Ihre Aufgabe konfiguriert ist und durch ihre eindeutige ID identifiziert wird.
Sobald der Client und der Assistent initialisiert sind, können Sie einen Thread erstellen und ausführen, um die Interaktion zu starten. Ein Thread fungiert als Kommunikationspipeline und wickelt den Nachrichtenaustausch zwischen dem Benutzer und dem Assistenten ab.
So wird der Thread initiiert:
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Nachdem der Thread initiiert wurde, verarbeitet die Anwendung die Antwort. Da OpenAI-Prozesse möglicherweise nicht sofort abgeschlossen werden, müssen Sie den Status des Threads abfragen, bis er als „abgeschlossen“ markiert wird:
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Abfrage: Die Anwendung überprüft wiederholt den Status des Threads (in der Warteschlange oder in Bearbeitung). Sobald sich der Status in „abgeschlossen“ ändert, enthält der Thread die endgültige Ausgabe.
Sobald der Thread abgeschlossen ist, ruft die Anwendung die Antwortnachrichten ab, um die normalisierte Adresse zu extrahieren:
INPUT: <what goes into the LLM> OUTPUT: <what the LLM should produce>
Die normalisierte Adresse kann jetzt zur sofortigen Verwendung an den Frontend-Client zurückgegeben oder zur späteren Verarbeitung als strukturierte Entität wie CustomerAddressNormalized in der Datenbank gespeichert werden.
Wenn Sie dieses Setup ausführen, sollten Sie in der Lage sein, strukturierte Ausgaben von OpenAI für die Erkennung benannter Entitäten und andere Klassifizierungs- oder Generierungsaufgaben zu extrahieren und zu speichern.
In manchen Fällen reichen einfache KI-Lösungen nicht aus. Wenn die Einhaltung gesetzlicher Vorschriften und Geschäftsanforderungen eine hohe Genauigkeit erfordern, müssen wir noch einen Schritt weiter gehen, um sicherzustellen, dass die Ausgabe sachlich und zuverlässig ist.
Beim Generieren einer JSON-Struktur müssen wir beispielsweise sicherstellen, dass deren Inhalt mit der Realität übereinstimmt. Ein häufiges Risiko besteht darin, dass das Model Informationen halluziniert – etwa einen Ort auf der Grundlage einer angegebenen Postleitzahl erfindet. Dies kann zu ernsthaften Problemen führen, insbesondere in Umgebungen mit hohem Risiko.
Ground Truth mit Wissensdatenbank
Um Halluzinationen auszuschließen und die sachliche Richtigkeit sicherzustellen, müssen wir dem Assistenten eine fundierte Wissensbasis zur Verfügung stellen. Dies dient als definitive Referenz für das Modell und stellt sicher, dass es während der Inferenz genaue Informationen verwendet.
Mein Ansatz: Eine Wissensdatenbank zu Postleitzahlen
Ich habe eine einfache (aber ziemlich große – etwa 12 MB) JSON-Datei erstellt, die die vollständige Abgrenzung aller Postleitzahlen in Rumänien enthält. Diese wörterbuchähnliche Struktur bietet:
Postleitzahl:Der Eingabewert.
Validierte Informationen: Fakten wie die entsprechende Stadt, der Landkreis und der allgemeine Ortsname.
Diese Wissensdatenbank dient dem Assistenten als Referenzpunkt bei der Durchführung der Erkennung benannter Entitäten.
Struktur der Wissensdatenbank
Hier ist ein Beispielausschnitt der JSON-Struktur der Wissensdatenbank:
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Sobald die Wissensdatenbank fertig ist, ist es an der Zeit, den Assistenten anzuweisen, sie effektiv zu nutzen. Sie könnten dies zwar direkt in die Eingabeaufforderung einbetten, dieser Ansatz erhöht jedoch die Token-Nutzung und die Kosten. Dies macht es zu einem hervorragenden Zeitpunkt, um die Feinabstimmung einzuführen.
Bei der Feinabstimmung werden die äußersten Schichten (insbesondere die Gewichtsmatrizen) eines vorab trainierten Modells geändert und an eine bestimmte Aufgabe angepasst. In unserem Fall ist Named Entity Recognition (NER) ein perfekter Kandidat.
Ein fein abgestimmtes Modell:
Das Hauptziel besteht darin, das Modell besser an die Nuancen der realen Daten anzupassen, die es verarbeiten wird. Durch das Training mit domänenspezifischen Daten kann das Modell besser verstehen und geeignete Antworten generieren. Es reduziert auch den Bedarf an Nachbearbeitung oder Fehlerkorrektur durch die Anwendung.
Zur Feinabstimmung des Modells benötigen wir einen ordnungsgemäß formatierten Datensatz im .jsonl-Format (JSON Lines), wie von OpenAI gefordert. Jeder Eintrag im Datensatz umfasst:
Dieser Datensatz liefert dem Assistenten domänenspezifische Beispiele, sodass er lernen kann, wie er in Zukunft auf ähnliche Eingabeaufforderungen reagieren soll.
Hier ist ein Beispiel für die Strukturierung eines Feinabstimmungseintrags:
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Lassen Sie uns die Struktur eines Feinabstimmungseintrags in der .jsonl-Datei aufschlüsseln, indem wir unseren rumänischen Adressverarbeitungsfall als Beispiel verwenden:
Jeder Eintrag soll eine echte Interaktion zwischen dem Benutzer und dem Assistenten simulieren und Folgendes zusammenfassen:
Dieser Ansatz hilft dem Modell, das gewünschte Verhalten in realen Kontexten zu lernen.
1. Systemrollenmeldung
Beschreibt die Fähigkeiten des Assistenten und den Umfang seiner Funktionalität und legt Erwartungen für die Arten von Entitäten fest, die er erkennen und extrahieren soll, wie z. B. Straßennamen, Hausnummern und Postleitzahlen.
Beispiel: Das System erklärt, dass der Assistent als Modell zur Erkennung benannter Entitäten für rumänische Adressen konzipiert ist und die Komponenten detailliert beschreibt, die er extrahieren und klassifizieren soll.
2. Benutzerrollennachricht
3. Nachricht zur Rolle des Assistenten
Sobald Sie die Trainingsdatei erstellt haben, besteht der nächste Schritt darin, eine Validierungsdatei vorzubereiten. Diese Datei bewertet die Genauigkeit des fein abgestimmten Assistenten anhand realer Daten. Die Struktur ähnelt der Trainingsdatei, was die Automatisierung der Erstellung beider Dateien einfacher macht.
Die Validierungsdatei dient dazu, die Generalisierungsfähigkeiten des Modells zu testen. Es stellt sicher, dass der fein abgestimmte Assistent mit neuen Eingaben umgehen kann und eine konsistente Leistung erbringt, selbst wenn er mit unbekannten oder herausfordernden Beispielen konfrontiert wird.
Systemmeldung:
Um die Konsistenz mit dem Trainingsprozess zu wahren, sollte die Systemmeldung identisch mit der in der Trainingsdatei verwendeten sein.
Benutzernachricht:
Führt eine neue Eingabe (z. B. eine Adresse) ein, die nicht in der Trainingsdatei enthalten war. Das neue Beispiel sollte realistisch und domänenspezifisch sein und das Modell durch die Einbeziehung kleinerer Fehler oder Komplexitäten in Frage stellen.
Assistent-Nachricht:
Stellt die erwartete strukturierte Antwort für die neue Benutzereingabe bereit.
Dies dient als Goldstandard zur Validierung der Modellgenauigkeit.
Um die Erstellung von Trainings- und Validierungsdateien zu optimieren, können Automatisierungsskripte verwendet werden. Diese Skripte generieren ordnungsgemäß formatierte .jsonl-Dateien basierend auf Eingabedatensätzen.
Besuchen Sie das Repository mit Skripten, um Trainings- und Validierungsdateien zu generieren:
Automatisierte .jsonl-Generierungsskripte
Es handelt sich um eine Python-Version der Feinabstimmung der Automatisierung. Die PHP-Version ist bald verfügbar.
Warum Validierung wichtig ist?
Wenn Sie möchten, können Sie den Assistenten manuell über die grafische Benutzeroberfläche (GUI) von OpenAI verfeinern. Nachdem Sie sowohl die Schulungs- als auch die Validierungsdateien vorbereitet haben, befolgen Sie diese Schritte, um loszulegen:
Schritt 1: Greifen Sie auf den Feinabstimmungsassistenten zu
Schritt 2: Feinabstimmung konfigurieren
Aktualisieren Sie im Feinabstimmungsmenü die folgenden Einstellungen:
Schritt 3: Überwachen Sie den Feinabstimmungsprozess
Sobald der Feinabstimmungsprozess beginnt, können Sie seinen Fortschritt im Feinabstimmungs-Dashboard verfolgen:
Das Dashboard bietet Echtzeitaktualisierungen und zeigt verschiedene Metriken an, die Ihnen bei der Überwachung und Bewertung des Trainingsprozesses helfen.
Wichtige Kennzahlen, die es zu verstehen gilt
Trainingsverlust Misst, wie gut das Modell die Trainingsdaten anpasst. Ein geringerer Trainingsverlust zeigt an, dass das Modell effektiv Muster innerhalb des Datensatzes lernt.
Vollständiger Validierungsverlust Zeigt die Leistung bei nicht sichtbaren Daten aus dem Validierungsdatensatz an. Ein geringerer Validierungsverlust deutet darauf hin, dass sich das Modell gut auf neue Eingaben verallgemeinern lässt.
Schritte und Zeit Trainingsschritte sind die Anzahl der Iterationen, bei denen Modellgewichte basierend auf Datenstapeln aktualisiert werden.
Der Zeitstempel gibt an, wann jeder Schritt verarbeitet wurde, was hilft, die Trainingsdauer und die Intervalle zwischen den Auswertungen zu überwachen.
Interpretation der Metriken
Durch die Überwachung der folgenden Metriken können Sie feststellen, ob der Feinabstimmungsprozess korrekt verläuft oder Anpassungen erforderlich sind.
Unteranpassung: Tritt auf, wenn beide Verluste hoch bleiben, was zeigt, dass das Modell nicht effektiv lernt.
Sobald Ihr Assistant geschult und fein abgestimmt ist, ist es an der Zeit, ihn in Ihre Anwendung zu integrieren und mit der Bewertung seiner Leistung zu beginnen.
Einfach beginnen.
Beginnen Sie mit manuellen Tests, entweder im Assistants Playground oder direkt in Ihrer Anwendung. Vermeiden Sie es, Ihre Bewertung in dieser Phase zu komplizieren; Konzentrieren Sie sich darauf, sicherzustellen, dass die Grundlagen wie erwartet funktionieren.
Sie können beispielsweise ein einfaches Tool wie Google Sheets verwenden, um die Eingabe und Ausgabe manuell zu vergleichen, wie hier gezeigt:
Dies ist der erste Schritt.
KI- und ML-Lösungen erfordern eine kontinuierliche Evaluierung, um sicherzustellen, dass die Leistung konstant bleibt. Für Aufgaben wie die Erkennung benannter Entitäten können automatisierte Tools wie die PromptFlow-Erweiterung für Visual Studio Code dabei helfen, Tests und Validierung zu optimieren.
Referenzen
OpenAI-Feinabstimmungsdokumentation
Symfony Messenger-Dokumentation
OpenAI PHP-Client-Bibliothek
PromptFlow-Erweiterung für VS Code
Vielen Dank!
Vielen Dank, dass Sie sich die Zeit genommen haben, diesen Leitfaden zu erkunden! Ich hoffe, es bietet Ihnen eine solide Grundlage für den Aufbau und die Feinabstimmung Ihrer KI-gestützten Lösungen. Wenn Sie Fragen oder Anregungen haben, können Sie sich gerne an uns wenden oder einen Kommentar hinterlassen.
Viel Spaß beim Codieren und viel Glück bei Ihren KI-Projekten! ?
Das obige ist der detaillierte Inhalt vonNutzung des OpenAI-Assistenten für die Erkennung benannter Entitäten in PHP/Symfony 7. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!