Heim >Backend-Entwicklung >PHP-Tutorial >Nutzung des OpenAI-Assistenten für die Erkennung benannter Entitäten in PHP/Symfony 7

Nutzung des OpenAI-Assistenten für die Erkennung benannter Entitäten in PHP/Symfony 7

Patricia Arquette
Patricia ArquetteOriginal
2024-12-26 02:44:13764Durchsuche

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.

Was können Sie erwarten?

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.

Welche Themen werden wir behandeln?

  • 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.

Voraussetzungen für OpenAI PHP-Projekte

  1. OpenAI-Konto Sie benötigen ein Konto auf openai.com.
  2. Optional: Konto für Gewichtungen und Verzerrungen Das Einrichten eines Kontos auf wandb.ai ist optional, wird aber dringend empfohlen. Es ist ein hervorragendes Tool zum Verfolgen von KI-Experimenten und zum Visualisieren von Ergebnissen.

Das Problem definieren

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:

  1. Konsistente Formatierung Stellt sicher, dass Adressen einem Standardformat für eine nahtlose Verarbeitung folgen.
  2. Adressvalidierung (optional) Ermöglicht uns zu überprüfen, ob die Adresse gültig ist oder existiert.

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.

Ein intelligenterer KI-Workflow

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:

  • Trainingsdaten:Wird verwendet, um dem Modell beizubringen, was es tun soll.
  • Testdaten:Wird verwendet, um zu bewerten, wie gut das Modell funktioniert.

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.

Strukturieren des Datensatzes

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.

Einrichten Ihres OpenAI API-Kontos

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:

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

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.

Entwerfen einer Systemaufforderung für die Erkennung benannter Entitäten

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:

  • Strukturierung der anfänglichen „schmutzigen“ Systemaufforderung, um klare Ergebnisse zu erzielen.
  • Spätere Verfeinerung der Eingabeaufforderung, um die Effizienz zu verbessern und die Kosten zu minimieren.

Beginnend mit der Few-Shot-Technik

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:

1. Klares Ziel

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.

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

2. Formatierungsanweisung

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.

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

3. Beispiele

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.

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

4. Korrekturinformationen

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.

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

Konfigurieren und Testen Ihres Assistenten

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

  • Gehen Sie zum OpenAI-Dashboard
  • Wählen Sie im Menü links „Assistenten“
  • Sie werden zur Seite zum Erstellen des Assistenten weitergeleitet. Gehen Sie zurück zum OpenAI-Dashboard und wählen Sie im Menü auf der linken Seite „Assistenten“ aus. Sie werden zum Assistant-Ersteller weitergeleitet.

Schritt 2: Konfigurieren Sie Ihren Assistenten

  • Geben Sie Ihrem Assistenten einen Namen: Wählen Sie einen aussagekräftigen Namen für Ihren Assistenten, der seinen Zweck widerspiegelt (z. B. „Adressparser“).
  • Fügen Sie die Systemanweisungen ein: Kopieren Sie Ihre gesamte gestaltete Eingabeaufforderung und fügen Sie sie in das Eingabefeld für Systemanweisungen ein. Dies definiert das Verhalten Ihres Assistenten und steuert seine Ausgaben.
  • Speichern Sie Ihren Assistenten: Nachdem Sie die Eingabeaufforderung eingefügt haben, klicken Sie auf Speichern, um die Konfiguration zu speichern.

Schritt 3: Wählen Sie das richtige Modell

Für dieses Projekt habe ich GPT-4o-mini gewählt, weil:

  • Es ist günstiger als GPT-3.5 Turbo
  • Es ist genauer :)

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.

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

Definieren des Ausgabeschemas

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:

  • Übernehmen Sie die JSON-Ausgabestruktur aus Ihrer Eingabeaufforderung (aus einem der Beispiele)
  • Fügen Sie es in das Feld „Generieren“ ein.

Das Tool leistet hervorragende Arbeit bei der automatischen Generierung eines Schemas, das Ihrer Struktur entspricht.

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

--
Um konsistente und vorhersehbare Reaktionen zu gewährleisten, stellen Sie die Temperatur so niedrig wie möglich ein.

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

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.

Den Assistenten testen

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:

  • Wo das Modell halluziniert (irrelevante oder falsche Informationen generiert).
  • Potenzielle Mängel in Ihrer Eingabeaufforderung oder Ihrem Schema.

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.

Den Assistenten in Ihre PHP-Symfony-Anwendung einbinden

Jetzt ist es an der Zeit, alles in Ihre PHP-Symfony-Anwendung zu integrieren. Die Einrichtung ist unkompliziert und folgt einer klassischen asynchronen Architektur.

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

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:

  • Reaktionsfähigkeit: Das Frontend bleibt schnell und reaktionsschnell.
  • Skalierbarkeit:Aufgaben können auf mehrere Mitarbeiter verteilt werden.

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:

abgewickelt

bin/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:

1. Initialisierung des OpenAI-Clients und des Assistentenabrufs

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.

1. Erstellen und Ausführen eines Threads

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"
}
  • Assistenten-ID: Die ID des Assistenten bestimmt, welche Modellinstanz die Eingabe verarbeitet.
  • Nachrichten: Jeder Thread enthält eine Folge von Nachrichten. In diesem Fall hat die Nachricht eine Rolle, die angibt, ob die Nachricht vom Benutzer (Eingabe) oder vom System (Antwort) stammt. Und der zweite ist Inhalt – enthält den eigentlichen Eingabetext (z. B. eine Adresse).

3. Umgang mit der Thread-Antwort

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.

Machen Sie Assistant Blazing präzise mit Feinabstimmung und Wissensdatenbank (Retrieval Augmented Generation)

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.

Was ist Feinabstimmung?

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:

  • Erfordert kleinere Eingabeaufforderungen: Reduziert den Bedarf an langen Anweisungen oder eingebetteten Beispielen.
  • Reduziert die Kosten:Kürzere Eingabeaufforderungen und weniger Beispiele senken den Token-Verbrauch.
  • Verbessert die Inferenzzeit:Schnellere Antworten bedeuten eine bessere Echtzeitleistung.

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.

Vorbereiten des Feinabstimmungsdatensatzes

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:

  • Systemaufforderung: Die erste Anweisung für den Assistenten.
  • Benutzereingabe: Die rohen Eingabedaten (z. B. eine unordentliche Adresse).
  • Erwartete Ausgabe: Die gewünschte strukturierte Antwort.

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:

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

Jeder Eintrag soll eine echte Interaktion zwischen dem Benutzer und dem Assistenten simulieren und Folgendes zusammenfassen:

  • Zweck und Umfang des Assistenten.
  • Das Eingabeszenario des Benutzers.
  • Die erwartete strukturierte Ausgabe.

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

  • Stellt ein detailliertes Szenario oder eine detaillierte Abfrage bereit, in der der Benutzer eine bestimmte Adresseingabe macht. Dieser Teil der Dateneingabe ist von entscheidender Bedeutung, da er direkten Einfluss darauf hat, wie das Modell lernt, auf ähnliche Eingaben in Betriebsumgebungen zu reagieren.

3. Nachricht zur Rolle des Assistenten

  • Enthält die erwartete Antwort des Assistenten, formatiert in JSON. Diese Reaktion ist entscheidend, da sie das Modell auf das gewünschte Ausgabeformat und die gewünschte Präzision trainiert.

Erstellen einer Validierungsdatei zur Feinabstimmung

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.

Struktur der Validierungsdatei

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

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?

  • Genauigkeitstests: Misst, wie gut das fein abgestimmte Modell bei nicht sichtbaren Daten funktioniert.
  • Verallgemeinerung:Überprüft die Fähigkeit des Modells, neue, komplexe oder fehleranfällige Eingaben zu verarbeiten.
  • Feedback-Schleife: Hilft bei der Identifizierung von Bereichen, in denen zusätzliche Feinabstimmungen oder Daten erforderlich sind.

Manuelle Feinabstimmung Ihres Assistenten

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

  • Gehen Sie zum Dashboard und klicken Sie im Menü auf der linken Seite auf „Fine-Tuning“.
  • Klicken Sie auf die grüne Schaltfläche „Erstellen“, um das Feinabstimmungsmenü zu öffnen.

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

Schritt 2: Feinabstimmung konfigurieren

Aktualisieren Sie im Feinabstimmungsmenü die folgenden Einstellungen:

  • Basismodell: Zum Zeitpunkt des Verfassens dieses Artikels ist gpt-4o-mini-2024-07-18 das kostengünstigste und leistungsstärkste Basismodell. Wählen Sie das Basismodell, das Ihren Leistungs- und Budgetanforderungen am besten entspricht.
  • Trainings- und Validierungsdaten – Laden Sie die Trainingsdaten und Validierungsdatendateien hoch, die Sie zuvor erstellt haben.
  • Anzahl der Epochen – Legen Sie die Anzahl der Epochen fest (Iterationen des Trainingsprozesses über den gesamten Datensatz). Ich empfehle, mit 3 Epochen zu beginnen, aber Sie können mit mehr Epochen experimentieren, wenn Ihr Budget es zulässt.

Schritt 3: Überwachen Sie den Feinabstimmungsprozess

Sobald der Feinabstimmungsprozess beginnt, können Sie seinen Fortschritt im Feinabstimmungs-Dashboard verfolgen:

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

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.

  • Abnehmende Verluste: Sowohl Trainings- als auch Validierungsverluste sollten im Laufe der Zeit idealerweise abnehmen und sich schließlich stabilisieren. Überanpassung: Tritt auf, wenn der Trainingsverlust weiter abnimmt, während der Validierungsverlust zunimmt oder zu schwanken beginnt. Dies weist darauf hin, dass das Modell übermäßig auf die Trainingsdaten spezialisiert ist und bei unsichtbaren Daten eine schlechte Leistung erbringt.

Unteranpassung: Tritt auf, wenn beide Verluste hoch bleiben, was zeigt, dass das Modell nicht effektiv lernt.

Schließen Sie das Modell an und bewerten Sie es

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:

Harnessing OpenAI Assistant  for Named Entity Recognition in PHP/Symfony 7

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn