Strukturierte Ausgaben: Zuverlässiges JSON aus einem Sprachmodell herausholen
Die erste Version jeder LLM-Integration analysiert Prosa. Sie fragen nach „den drei Hauptrisiken, eines pro Zeile“, aufgeteilt in Zeilenumbrüche, und es funktioniert bis zu dem Tag, an dem das Modell zuerst einen einleitenden Satz schreibt. Es gibt strukturierte Ausgaben, um diese Schleife zu beenden: Sie übergeben dem Modell ein JSON-Schema, der Decoder ist eingeschränkt, sodass er nichts ausgeben kann, was dagegen verstößt, und Sie erhalten eine Nutzlast mit den von Ihnen angeforderten Feldern zurück. Diese Garantie ist real, aber enger, als es sich anhört, und der Unterschied besteht darin, wo die Käfer leben.
Was die Garantie eigentlich abdeckt
Eingeschränkte Dekodierungsgarantien Form. Die Antwort wird als JSON geparst, sie enthält Ihre Schlüssel, die Typen stimmen überein und Aufzählungsfelder enthalten einen Ihrer aufgelisteten Werte. Das ist eine große Verbesserung gegenüber Prompt-and-Hope.
Es garantiert nichts darüber Inhalt. Ein als Zeichenfolge eingegebenes Feld enthält eine Zeichenfolge. Ob diese Zeichenfolge korrekt ist oder zur Erfüllung des Schemas erfunden wurde, bleibt gegenüber zuvor unverändert. Tatsächlich macht ein striktes Schema die Wahrscheinlichkeit einer Erfindung etwas höher, da ein erforderliches Feld mit etwas gefüllt werden muss und das Modell keine Möglichkeit hat zu sagen „nicht in der Quelle vorhanden“. Dies ist der häufigste Fehler in der Produktion: ein erforderlicher Fehler invoice_number in einem Dokument, das keines hat.
Design darum herum. Lassen Sie Null zu, wenn Abwesenheit möglich ist, und fügen Sie eine explizite hinzu found: boolean oder ein "unknown" Enum-Mitglied und machen Sie niemals ein Feld zu einem Pflichtfeld, es sei denn, die Antwort ist tatsächlich in jeder Eingabe vorhanden.
Entwerfen eines Schemas, das ein Modell füllen kann
Für die Validierung geschriebene Schemata und für die Generierung geschriebene Schemata sehen unterschiedlich aus. Einige Regeln, die für alle Anbieter gelten:
- Flache Beats verschachtelt. Auf jeder Verschachtelungsebene verliert das Modell den Überblick. Drei flache Objekte, die in drei Aufrufen extrahiert wurden, schlagen einen tief verschachtelten Baum.
- Enums schlagen freie Saiten. Wenn ein Feld fünf zulässige Werte hat, listen Sie diese auf. Sie entfernen eine ganze Klasse von Normalisierungscode und der eingeschränkte Decoder erzwingt ihn für Sie.
- Feldnamen sind Anweisungen.
due_date_iso8601erzeugt eine bessere Ausgabe alsdateDas Format wird in einer separaten Eingabeaufforderung erläutert. Die Namen stehen im Kontext; Benutze sie. - Verwenden
descriptionauf Feldern. Die meisten Anbieter übergeben Schemabeschreibungen an das Modell. Ein Satz pro mehrdeutigem Feld ist billiger und zuverlässiger als ein Absatz mit Prosaanweisungen oben. - Satz
additionalProperties: false. Mehrere Anbieter verlangen es ohnehin für den strikten Modus, und es verhindert, dass das Modell hilfreich einen zusätzlichen Schlüssel erfindet, den Ihr Parser stillschweigend ignoriert. - Bevorzugen Sie Anordnungen flacher Objekte gegenüber Karten. Dynamische Schlüssel – ein Objekt, dessen Eigenschaftsnamen im Voraus unbekannt sind – werden von strikten Modi schlecht unterstützt und sind auf der Empfängerseite umständlich einzugeben.
Anbieter beschränken außerdem, welche JSON-Schema-Schlüsselwörter sie im strikten Modus unterstützen: oneOf, Mustereinschränkungen, numerische Grenzen und Rekursion werden häufig eingeschränkt oder ignoriert. Gehen Sie davon aus, dass das Schema nur die Struktur einschränkt, und setzen Sie Ihre Geschäftsregeln nach dem Parsen selbst durch.
Trotzdem validieren
Validieren Sie auch im strikten Modus jede Antwort, bevor sie Ihre Datenbank berührt. Der strikte Modus kann durch eine Konfigurationsänderung deaktiviert werden, ein Fallback-Pfad kann auf ein Modell treffen, das ihn nicht unterstützt, ein Netzwerkwiederholungsversuch kann ein Fehlerobjekt zurückgeben und die Antwort kann durch ein Token-Limit in der Mitte des Objekts abgeschnitten werden – was zu ungültigem JSON führt, was kein Schema-Modus verhindert.
Wenn eine Nutzlast fehlschlägt, ist die nützliche Frage, welches Feld und warum. Der JSON-Schema-Validator Nimmt das Dokument und das Schema und meldet eine Zeile pro Problem, mit dem JSON-Zeigerpfad, dem fehlgeschlagenen Schlüsselwort und dem tatsächlich gefundenen Wert. Das ist genau das Formular, das Sie aus zwei Gründen benötigen: zum Korrigieren Ihres Schemas während der Entwicklung und zum Zurückmelden bei einem Wiederholungsversuch – ein in eine Folgenachricht eingefügter fehlgeschlagener Validierungsbericht ist eine bemerkenswert effektive Reparaturaufforderung, da das Modell genau erkennen kann, was falsch gelaufen ist.
Begrenzen Sie die Wiederholungsversuche auf ein oder zwei. Ein Modell, das zweimal an einem Schema scheitert, wird normalerweise nach etwas gefragt, das die Eingabe nicht enthält, und beim dritten Versuch wird es erfunden.
Von einer Beispielnutzlast bis zum Code
Die meisten Schemata beginnen mit einer Beispielantwort, die jemand in einen Chat eingefügt hat. Das von Hand in getippten, validierten Code umzuwandeln ist mühsam und fehleranfällig, also tun Sie es nicht.
Fügen Sie die Probe ein JSON-zu-Zod-Schema und Sie erhalten ein Zod-Schema plus den abgeleiteten TypeScript-Typ. Es schließt pro Feld, anstatt alles pauschal als Zeichenfolge einzugeben: Werte, die wie E-Mails, URLs, UUIDs oder ISO-Daten aussehen .email(), .url(), .uuid() Und .datetime() statt einer nackten z.string(), Arrays tragen ihren Elementtyp, und ein Feld, dessen Typ je nach Vorkommen variiert, wird zu einer Union, anstatt stillschweigend das erste Feld auszuwählen, das es sieht. Es lohnt sich, dieses letzte Verhalten bewusst zu nutzen: Fügen Sie drei oder vier echte Antworten verkettet ein, nicht eine, sodass optionale und polymorphe Felder als Vereinigungen angezeigt werden, anstatt an das gebunden zu sein, was die erste Stichprobe zufällig enthielt.
Wenn Sie nur Typen und keine Laufzeitvalidierung benötigen – weil die Nutzlast von einer Quelle stammt, der Sie bereits vertrauen – JSON zu TypeScript Erzeugt die Schnittstellen direkt, wobei verschachtelte Objekte als benannte Unterschnittstellen und nicht als eingebundene anonyme Blobs aufgeschlüsselt werden.
Halten Sie die Richtung der Wahrheit klar: eine Schemadefinition, aus der alles andere generiert wird. Ein Zod-Schema und ein JSON-Schema, die separat verwaltet werden, stimmen innerhalb eines Monats nicht überein, und die Meinungsverschiedenheit wird sich als Produktionsanalysefehler und nicht als Testfehler bemerkbar machen.
Lesen, was zurückkam
Modellantworten kommen verkleinert in einer Zeile an, was das Betrachten erschwert. Der JSON-Formatierer rückt sie ein und sortiert sie in etwas Lesbares, und seine Validierung erkennt den Kürzungsfall sofort – eine Nutzlast, die mitten in der Zeichenfolge endet, ist die Signatur eines Treffer-Token-Limits, und die Korrektur ist eine höhere Ausgabeobergrenze oder ein kleineres Schema, keine sofortige Änderung.
Wenn Sie vergleichen, was zwei Modelle aus derselben Eingabe erzeugt haben, oder prüfen, ob eine sofortige Änderung die Ausgabe auf eine Weise verändert hat, die Sie nicht beabsichtigt haben, vergleichen Sie die formatierten Nutzlasten, anstatt beide zu lesen. Strukturelle Unterschiede, die in einer JSON-Wand unsichtbar sind – ein Feld, das stillschweigend zu einer Ziffernfolge anstelle einer Zahl wurde – fallen in einem Diff sofort auf.
Versionierung
Schemata ändern sich und die Modellausgabe ändert sich mit ihnen. Fügen Sie ab dem ersten Tag ein Versionsfeld in die Nutzlast ein, damit gespeicherte Datensätze die Form haben, unter der sie geschrieben wurden. Das Nachrüsten, nachdem Sie eine Million Zeilen JSON ohne Tags haben, ist die Art von Migration, für die niemand Zeit einplant.
Alle diese Tools werden lokal in Ihrem Browser ausgeführt, was für diesen Workflow wichtiger ist als sonst: Bei den Beispielnutzlasten, die Sie in Schemata umwandeln, handelt es sich in der Regel um echte API-Antworten mit echten Kundendaten und sie sollten nicht zur Verschönerung auf einen Formatierungsdienst hochgeladen werden.
Schöpfer von TextArray – Entwicklung kostenloser, datenschutzorientierter Tools, die vollständig in Ihrem Browser ausgeführt werden.