JSON vs. TOON Prompting für Large Language Models
Large Language Models (LLMs) können Anweisungen in vielen unterschiedlichen Formaten verarbeiten. Dazu gehören unter anderem reiner Text, JSON, CSV, Markdown, YAML, XML und weitere strukturierte oder halbstrukturierte Formate. Viele Entwickler testen verschiedene Eingabeformate, um herauszufinden, welche Struktur die Genauigkeit verbessern kann und gleichzeitig möglichst wenige Tokens verbraucht.
Prompts im JSON-Format (JavaScript Object Notation) werden häufig für einfache Anweisungen sowie für das Einfügen von Datensätzen in den Prompt-Kontext verwendet. Ein neueres Format namens TOON (Token Oriented Object Notation) erhält ebenfalls zunehmend Aufmerksamkeit, da es ähnliche Inhalte wie JSON abbilden kann, dabei aber weniger Tokens benötigt.
Dieses Tutorial erklärt die Unterschiede zwischen Prompts im JSON- und TOON-Format. Außerdem enthält es Beispiele, die dabei helfen können einzuschätzen, ob TOON-Prompts für den eigenen Anwendungsfall geeignet sind.
Wichtige Erkenntnisse
- Daten im TOON-Format können als Alternative zu JSON-formatierten Daten verwendet werden, wenn Anfragen an LLMs gesendet werden. TOON gibt an, den Verbrauch von Eingabetokens um etwa 40 % reduzieren zu können.
- TOON-formatierte Daten können außerdem die Genauigkeit von Prompts verbessern. Das gilt vor allem für strukturierte Datenformate und nicht für Prompts, die ursprünglich als Fließtext erstellt und anschließend in JSON umgewandelt wurden.
- TOON ersetzt JSON nicht bei Modellausgaben. Für Parsing, Function Calling und andere Szenarien, in denen JSON-Ausgaben hilfreich sind, hat sich TOON bisher noch nicht als gleichwertige Alternative erwiesen.
Warum JSON Prompting manchmal verwendet wird
Es gibt zwei zentrale Gründe, warum Entwickler JSON-Strukturen in LLM-Prompts einsetzen. Der erste Grund ist, dass einige Entwickler JSON-formatierte Prompts gegenüber reinem Text bevorzugen, weil die Struktur klar, einheitlich und gut lesbar ist.
Beispiel
json_prompt = {
"task": "summarize_email",
"email": "Love the app, but it keeps crashing. It shows me a black screen with no words appearing. I've tried logging out and back in again.",
"output": "list",
"max_points": 3
}
Das oben gezeigte JSON kann in einen Python-String umgewandelt und anschließend an ein LLM übergeben werden, um eine Antwort wie im folgenden Beispiel zu erzeugen. Dieser Ansatz ist eine Alternative zu ausformulierten Textanweisungen, in denen die Rolle des LLM beschrieben und die Zusammenfassung der E-Mail in drei Listenpunkten angefordert wird.
Ausgabe
- The user is experiencing repeated app crashes, specifically encountering a black screen without text.
- They have attempted troubleshooting by logging out and back in without success.
- The user expresses overall satisfaction with the app despite the prevailing issue.
Reine Textanweisungen durch JSON-formatierte Prompts zu ersetzen, kann bei bestimmten Architekturen gut funktionieren. Allgemein ist jedoch nicht eindeutig belegt, dass JSON in den meisten Fällen besser abschneidet als normaler Text. JSON kann häufig mehr Tokens benötigen als Fließtext, und formale Untersuchungen zeigen nicht durchgehend eine höhere Genauigkeit. In einer Studie, die reinen Text, Markdown, JSON und YAML verglich, zeigte sich, dass die Genauigkeit je nach Modell stark variieren kann und kein einzelnes Format in allen Fällen klar überlegen war. Ob reiner Text durch JSON ersetzt werden sollte, sollte daher anhand des jeweiligen Modells und des konkreten Anwendungsfalls getestet werden.
Der zweite Grund für den Einsatz von JSON besteht darin, dass ein größerer Bestand strukturierter Daten in den Prompt-Kontext des LLM eingebunden werden soll.
JSON_dataset = {
"animals": [
{
"name": "African Elephant",
"category": "mammal",
"habitat": "savanna",
"diet": "herbivore"
},
{
"name": "Red-Eyed Tree Frog",
"category": "amphibian",
"habitat": "rainforest",
"diet": "carnivore"
},
{
"name": "Bald Eagle",
"category": "bird",
"habitat": "forests near water",
"diet": "carnivore"
},
{
"name": "Great White Shark",
"category": "fish",
"habitat": "ocean",
"diet": "carnivore"
}
]
}
prompt = f"Based on their habitat and diet, which of the following animals would be most difficult to keep in a zoo? Respond with only the name of the animal. {JSON_dataset}"
Im oben gezeigten Prompt werden beispielhafte Datenbankeinträge zusammen mit einer Textanweisung an ein LLM übergeben. Dadurch kann das Modell eine logikbasierte Abfrage auf einem Teil des Datensatzes ausführen. In diesem Beispiel soll das Modell anhand der vorhandenen Attribute bestimmen, welches Tier am schwierigsten in einem Zoo zu halten wäre. Die Ausgabe ist unten dargestellt.
Ausgabe
Great White Shark.
In diesem Anwendungsfall wurde der JSON-Kontext nicht aus Fließtext erzeugt. Stattdessen stammt er aus einer Quelle, in der die Daten bereits strukturiert vorliegen. Diese Daten werden normalerweise mit Textanweisungen kombiniert. Genau in solchen Situationen können Datenformate wie TOON nützlich sein.
Warum TOON verwenden?
Der wichtigste Grund für TOON ist, die Vorteile von JSON oder anderen strukturierten Datenformaten beizubehalten und gleichzeitig den Tokenverbrauch zu senken. Wenn das vorherige JSON-Beispiel in das TOON-Format codiert wird, sinkt die Anzahl der Tokens deutlich, da TOON weniger ausführlich ist und viele wiederholte Bestandteile vermeidet, während die enthaltenen Informationen weitgehend erhalten bleiben.
TOON_dataset = """animals[4]{name,category,habitat,diet}:
African Elephant,mammal,savanna,herbivore
Red-Eyed Tree Frog,amphibian,rainforest,carnivore
Bald Eagle,bird,forests near water,carnivore
Great White Shark,fish,ocean,carnivore"""
prompt = f"Based on their habitat and diet, which of the following animals would be most difficult to keep in a zoo? Respond with only the name of the animal. {TOON_dataset}"
Der oben dargestellte Datensatz enthält dieselben Informationen wie das JSON-Beispiel, wurde jedoch in das TOON-Format übertragen. Er benötigt weniger Tokens: 71 Tokens im Vergleich zu 172 Tokens in der JSON-Version. Das entspricht einer Reduzierung um 59 %. Die folgende Ausgabe liefert dasselbe Ergebnis wie die JSON-Variante.
Ausgabe
Great White Shark
Auf der GitHub-Release-Seite wird TOON als Format beschrieben, das im Vergleich zu JSON eine höhere Genauigkeit erreichen kann und gleichzeitig rund 40 % weniger Tokens über vier verschiedene Modellanbieter hinweg verwendet. Zusätzlich steht ein Python-Konverter bereit, mit dem JSON vor der Übergabe an ein LLM in das TOON-Format umgewandelt werden kann. Die folgenden Abschnitte zeigen, wie dieser Konverter eingesetzt wird.
Das passende Prompting-Format auswählen
Um das beste Prompting-Format für eine Anwendung zu bestimmen, sollte zunächst geprüft werden, ob strukturierte Daten aus einer Datenbank oder einer anderen Quelle an das LLM übergeben werden müssen. Diese Daten können beispielsweise als JSON, CSV, XML, YAML oder in einem ähnlichen Format vorliegen. Wenn keine strukturierten Daten vorhanden sind und die Prompts bereits in natürlicher Sprache formuliert sind, ist TOON wahrscheinlich nicht die beste Wahl. In diesem Fall ist es sinnvoller, bei natürlich formulierten Prompts zu bleiben und diese gezielt zu optimieren.
Wenn strukturierte Daten an das Modell übergeben werden sollen, kann es sich lohnen, TOON-formatierte Prompts für die eigene Anwendung zu testen. Wie bei allen Prompt-Formaten lässt sich der Nutzen am besten messbar bewerten, indem die Anzahl der verwendeten Tokens verglichen wird. Teste unterschiedliche Formate, ermittle, welche davon die gewünschte Genauigkeit erreichen, und wähle anschließend die Variante mit dem geringsten Tokenverbrauch. In diesem Tutorial wird ein Python-Paket für TOON verwendet, um einen Workflow zu erstellen, der JSON vor dem Senden an einen LLM-Endpunkt in TOON umwandelt.
Schritt 1 — Umgebung einrichten
Zunächst wird die Umgebung vorbereitet, indem Python und die TOON-Python-Bibliothek installiert werden.
pip install git+https://github.com/toon-format/toon-python.git
Erstelle anschließend ein Python-Skript mit dem Namen TOON_demo.py. Stelle sicher, dass Zugriff auf eine API für ein Large Language Model vorhanden ist. In diesem Tutorial wird ein Mistral-3-Modell verwendet, das auf einem GPU-basierten virtuellen Server nach einem allgemeinen Bereitstellungsprozess für Mistral 3 eingerichtet wurde.
Schritt 2 — Abhängigkeiten importieren
Als Nächstes werden die Python-Abhängigkeiten importiert und eine Funktion erstellt, die das LLM aufruft. Ersetze den Platzhalter your_server_ip durch die öffentliche IPv4-Adresse der Instanz. Alternativ kann diese Funktion angepasst werden, um einen LLM-API-Dienst zu verwenden.
TOON_demo.py
import requests
import json
from toon_format import encode, decode
url = "http://your_server_ip:8000/v1/completions"
def call_LLM(dataset):
prompt = f"Based on their habitat and diet, which of the following animals would be most difficult to keep in a zoo? Respond with only the name of the animal. {dataset}"
data = {
"model": "mistralai/Ministral-3-14B-Instruct-2512",
"prompt": prompt,
"max_tokens": 500
}
response = requests.post(url, json=data)
response_message = response.json()['choices'][0]['text']
print(response_message)
Schritt 3 — TOON Encoder verwenden
Nun wird die encode-Funktion aus der Bibliothek toon_format genutzt, um die JSON-Daten vor dem Aufruf des LLM umzuwandeln.
TOON_demo.py
JSON_dataset = {
"animals": [
{
"name": "African Elephant",
"category": "mammal",
"habitat": "savanna",
"diet": "herbivore"
},
{
"name": "Red-Eyed Tree Frog",
"category": "amphibian",
"habitat": "rainforest",
"diet": "carnivore"
},
{
"name": "Bald Eagle",
"category": "bird",
"habitat": "forests near water",
"diet": "carnivore"
},
{
"name": "Great White Shark",
"category": "fish",
"habitat": "ocean",
"diet": "carnivore"
}
]
}
TOON_dataset = encode(JSON_dataset)
print(TOON_dataset)
Das Codieren des JSON-Datensatzes gibt einen String im TOON-Format zurück.
Ausgabe
animals[4]{name,category,habitat,diet}:
African Elephant,mammal,savanna,herbivore
Red-Eyed Tree Frog,amphibian,rainforest,carnivore
Bald Eagle,bird,forests near water,carnivore
Great White Shark,fish,ocean,carnivore
Beim Decodieren des TOON-Datensatzes entsteht ein minimiertes JSON-Objekt ohne die Zeilenumbrüche und Leerzeichen, die bei formatiertem JSON üblicherweise enthalten sind.
TOON_demo.py
JSON_formatted_dataset = decode(TOON_dataset)
print(TOON_dataset)
Ausgabe
{'animals': [{'name': 'African Elephant', 'category': 'mammal', 'habitat': 'savanna', 'diet': 'herbivore'}, {'name': 'Red-Eyed Tree Frog', 'category': 'amphibian', 'habitat': 'rainforest', 'diet': 'carnivore'}, {'name': 'Bald Eagle', 'category': 'bird', 'habitat': 'forests near water', 'diet': 'carnivore'}, {'name': 'Great White Shark', 'category': 'fish', 'habitat': 'ocean', 'diet': 'carnivore'}]}
Schritt 4 — JSON- und TOON-Datensätze ausführen
Im nächsten Schritt werden sowohl der JSON- als auch der TOON-Datensatz ausgeführt, um zu prüfen, ob die Ergebnisse korrekt sind.
TOON_demo.py
print("JSON Dataset")
call_LLM(JSON_dataset)
print("\n\nTOON Dataset")
call_LLM(TOON_dataset)
Ausgabe
JSON Dataset
Great White Shark
TOON Dataset
Great White Shark
Schritt 5 — Tokens zählen und Einsparungen schätzen
Die Bibliothek toon_format enthält eine Funktion namens estimate_savings, mit der sich der Tokenverbrauch vergleichen lässt. Importiere die Funktion und übergib den JSON_dataset.
TOON_demo.py
from toon_format import estimate_savings
savings = estimate_savings(JSON_dataset)
print(f"Estimated savings: {savings}")
Ausgabe
{'json_tokens': 169, 'toon_tokens': 71, 'savings': 98, 'savings_percent': 57.98816568047337}
Die Anzahl der Tokens kann je nach Modell unterschiedlich ausfallen. Die Funktion gibt jedoch die geschätzte Tokenanzahl für jedes Datenformat sowie den prozentualen Anteil der eingesparten Tokens zurück.
FAQ zu JSON und TOON Prompting
Unterstützt TOON verschachtelte oder komplexe JSON-Strukturen?
Ja. TOON kann verschachtelte JSON-Objekte und Arrays abbilden, da der toon-python-Encoder hierarchische Daten automatisch in das TOON-Format konvertiert. Mit zunehmender Tiefe und Komplexität der Struktur solltest du jedoch prüfen, ob die Token-Einsparungen weiterhin sinnvoll sind und ob das Zielmodell die codierten Daten korrekt interpretiert.
Kann TOON als Ausgabeformat verwendet werden?
Ja, allerdings hängt die Praxistauglichkeit vom jeweiligen Modell ab. Du kannst ein LLM anweisen, Antworten im TOON-Format zu erzeugen und das Ergebnis anschließend für die Weiterverarbeitung wieder in JSON umzuwandeln. Da TOON noch ein relativ neues Format ist, hatten die meisten Sprachmodelle während des Trainings deutlich weniger Kontakt damit als mit JSON. Deshalb können Modelle weniger zuverlässig sein, wenn sie gültige TOON-Ausgaben erzeugen sollen. Während JSON für Aufgaben wie strukturiertes Parsing und Function Calling weiterhin die bevorzugte Wahl bleibt, können TOON-basierte Ausgaben zusätzliche Tests oder Fine-Tuning erfordern.
Gibt es Kompatibilitätsprobleme bei der Verwendung von TOON mit unterschiedlichen LLMs?
Grundsätzlich sollte TOON mit jedem Sprachmodell funktionieren, das auf breiten Textkorpora trainiert wurde, und es wurde bereits erfolgreich mit mehreren Modellen getestet. Da TOON jedoch neuer als JSON ist, können einige Modelle während des Trainings vergleichsweise wenige TOON-Beispiele gesehen haben. Daher empfiehlt es sich, die Performance mit dem konkret eingesetzten Modell zu validieren.
Kann ich Plain-Text-Anweisungen im TOON-Format schreiben?
Du kannst Instruktions-Prompts mit TOON strukturieren, allerdings verbessert das nicht automatisch die Modellleistung. Frühere Untersuchungen haben gezeigt, dass die Umwandlung gewöhnlicher Text-Prompts in strukturierte Darstellungen wie JSON nicht zwangsläufig zu höherer Antwortgenauigkeit führt. TOON ist daher vor allem dann nützlich, wenn die Kontextinformationen bereits als strukturierte Daten vorliegen – weniger, wenn natürliche Sprachanweisungen formatiert werden sollen.
Machen JSON- oder TOON-Prompts Modellausgaben deterministischer?
Darauf gibt es keine eindeutige Antwort. Einige Praktiker berichten, dass strukturierte Prompt-Formate, insbesondere JSON, konsistentere Antworten erzeugen können. Dennoch bleiben Sprachmodelle grundsätzlich nicht-deterministisch, sodass identische Prompts weiterhin unterschiedliche Ausgaben erzeugen können. Es gibt viele Techniken zur Verbesserung der Konsistenz, und strukturiertes Prompting ist nur eine davon. Ob TOON zusätzliche Deterministik bietet, hängt vom konkreten Modell, Datensatz und Anwendungsfall ab. Empirische Tests sind daher der zuverlässigste Weg, um den Effekt zu bewerten.
Fazit
TOON-formatierte Daten können eine effizientere und kostengünstigere Alternative zu JSON sein, wenn JSON-Daten in den Kontext eines LLM-Prompts eingefügt werden sollen. Das Format benötigt rund 40 % weniger Tokens und kann dabei vergleichbare oder teilweise sogar bessere Genauigkeit liefern. Da LLMs große Datenmengen über Kontexttokens verarbeiten, können Formate, die Informationen erhalten und gleichzeitig den Tokenverbrauch reduzieren, die Effizienz verbessern und möglicherweise auch die Genauigkeit steigern. TOON ist ein Beispiel für ein solches Format, und weitere Alternativen werden voraussichtlich folgen.
In diesem Tutorial wurde ein TOON Encoder verwendet, um JSON-Daten umzuwandeln und zu schätzen, wie viele Tokens durch das alternative Format eingespart werden können. Der nächste Schritt besteht darin, diesen Ansatz in einer Anwendung einzusetzen und zu testen, ob die Ergebnisse für den jeweiligen Anwendungsfall geeignet sind und ob der Tokenverbrauch tatsächlich sinkt.


