2 Punkte von GN⁺ 2024-12-09 | 1 Kommentare | Auf WhatsApp teilen

Strukturierte Ausgaben

6. Dezember 2024

Ollama unterstützt jetzt strukturierte Ausgaben, mit denen sich die Modellausgabe auf ein bestimmtes, durch ein JSON-Schema definiertes Format beschränken lässt. Die Ollama-Bibliotheken für Python und JavaScript wurden aktualisiert, um strukturierte Ausgaben zu unterstützen.

  • Anwendungsfälle für strukturierte Ausgaben:
    • Parsen von Daten aus Dokumenten
    • Extrahieren von Daten aus Bildern
    • Strukturierung aller Antworten von Sprachmodellen
    • Höhere Zuverlässigkeit und Konsistenz als im JSON-Modus

Erste Schritte

  • Neueste Version von Ollama herunterladen
  • Ollama-Python- oder JavaScript-Bibliothek auf die neueste Version aktualisieren
cURL
  • Mit dem Parameter format lassen sich strukturierte Ausgaben an das Modell übergeben
Ausgabe
  • Die Antwort wird in einem Format zurückgegeben, das durch das JSON-Schema der Anfrage definiert ist
Python
  • Mit der Ollama-Python-Bibliothek das Schema als JSON-Objekt an den Parameter format übergeben
  • Es wird empfohlen, das Schema mit Pydantic zu serialisieren
Ausgabe
  • name='Canada' capital='Ottawa' languages=['English', 'French']
JavaScript
  • Mit der Ollama-JavaScript-Bibliothek das Schema als JSON-Objekt an den Parameter format übergeben
  • Es wird empfohlen, das Schema mit Zod zu serialisieren
Ausgabe
  • { name: "Canada", capital: "Ottawa", languages: [ "English", "French" ] }

Beispiele

Datenextraktion

  • Ein Schema definieren, das die Informationen beschreibt, um strukturierte Daten aus Text zu extrahieren
  • Das Modell extrahiert die Informationen und gibt die Daten im definierten Schema als JSON zurück
Beispielausgabe
  • pets=[ Pet(name='Luna', animal='cat', age=5, color='grey', favorite_toy='yarn'), Pet(name='Loki', animal='cat', age=2, color='black', favorite_toy='tennis balls') ]

Bildbeschreibung

  • Strukturierte Ausgaben können zusammen mit Vision-Modellen verwendet werden
  • Mit llama3.2-vision ein Bild beschreiben und strukturierte Ausgaben zurückgeben
Beispielausgabe
  • summary='A palm tree on a sandy beach with blue water and sky.'
  • objects=[ Object(name='tree', confidence=0.9, attributes='palm tree'), Object(name='beach', confidence=1.0, attributes='sand') ]
  • scene='beach', colors=['blue', 'green', 'white'], time_of_day='Afternoon', setting='Outdoor', text_content=None
OpenAI-Kompatibilität
  • Kompatibel mit strukturierten Ausgaben bei Verwendung des OpenAI-Clients

Tipps

  • Für eine zuverlässige Nutzung strukturierter Ausgaben:
    • Antwortschema mit Pydantic (Python) oder Zod (JavaScript) definieren
    • Im Prompt "als JSON zurückgeben" ergänzen, damit das Modell die Anfrage versteht
    • Die Temperatur auf 0 setzen, um deterministischere Ausgaben zu erhalten

Nächste Schritte

  • Logit Exposure für kontrollierte Generierung
  • Verbesserung von Leistung und Genauigkeit strukturierter Ausgaben
  • GPU-Beschleunigung für Sampling
  • Unterstützung zusätzlicher Formate über JSON-Schema hinaus

1 Kommentare

 
GN⁺ 2024-12-09
Hacker-News-Kommentar
  • Über die gbnf-Funktion von llama.cpp lassen sich stärkere Ausgabebeschränkungen festlegen

  • Nützlich, weil sich beim Strukturieren normaler Prompts und ihrer Umwandlung in CSV-Daten unnötiger Text entfernen lässt

  • Mit gemma2:2b kann man Text eingeben und erhält eine strukturierte Ausgabe im JSON-Format

    • Beispiel-Eingabe: "You have spent 190 at Fresh Mart. Current balance: 5098"
    • Beispiel-Ausgabe: {"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"}
  • Es gibt die Meinung, dass interessant ist, wie sich Beschränkungen auf die Ausgabequalität von LLMs auswirken

    • Je nach Fall kann das Parsen als Markdown oder Klartext eine bessere Qualität liefern
  • Es wird gefragt, ob sich das mit unterstützten Modellen verwenden lässt

    • Auf privater Hardware lassen sich nur Modelle von 1b bis 3b stabil ausführen
  • Es gibt Neugier, ob llama.cpp und ollama die Funktion für strukturierte Ausgaben von Llama nutzen oder ob das anders implementiert ist

    • Auf Metas Llama-Seite wird erwähnt, dass das Modell strukturierte Ausgaben ursprünglich unterstützt
  • Es wird gefragt, welchen Mehrwert es im Vergleich zu outlines gibt

  • Der Grund, weiterhin oobabooga zu verwenden, ist die exlv2-Unterstützung, die auf Dual-3090s effizientere Inferenz bietet

  • Ein curl-Beispiel sollte besser zuerst kommen

    • Ich mag Pydantic, aber das direkte Codieren des Schemas erleichtert es, einen Prototyp nach Go zu übertragen
  • Es wird gefragt, was die beste Methode ist, LLMs strukturierte Eingaben zu geben

    • Beispiel: 100 Sätze eingeben und jeden auf unterschiedliche Weise klassifizieren
    • Strukturierte Daten zu erhalten ist einfach, aber die Methode, Zeilennummern als Präfix zu verwenden, wirkt unhandlich