Wat is TOON?
We zijn er allemaal geweest. U maakt een prompt voor een Large Language Model (LLM) en u moet gestructureerde gegevens doorgeven. Je reikt naar JSON. Het is tenslotte de industriestandaard. Maar terwijl je ziet hoe je contextvenster zich vult met eindeloze accolades, herhaalde sleutels en aanhalingstekens rond eenvoudige gehele getallen, begin je je af te vragen: Is er een betere manier?
YAML biedt leesbaarheid, maar lijdt aan dubbelzinnigheid. CSV is compact maar mist hiërarchie.
Voer TOON in.
TOON is een dataserialisatieformaat dat aanvoelt als een verademing voor ontwikkelaars en een moedertaal voor AI-modellen. Het overbrugt de kloof tussen menselijke leesbaarheid en machine-efficiëntie. Laten we vandaag diep in de syntaxis en werking van TOON duiken om te begrijpen waarom het snel een favoriet aan het worden is voor zeer efficiënte gegevensuitwisseling.
De filosofie: JSON-semantiek, YAML-esthetiek
In de kern deelt TOON exact hetzelfde datamodel als JSON. Als je het in JSON kunt weergeven (primitieven (strings, getallen, booleans, null), objecten en arrays), kun je het ook in TOON weergeven. De presentatie is echter radicaal anders.
TOON laat de beugels achterwege. Het gebruikt inspringing om de hiërarchie weer te geven, net als YAML. Een eenvoudig object ziet er schoon en benaderbaar uit:
In tegenstelling tot YAML is TOON echter streng als het om typen gaat. Er valt niet te raden of 'nee' 'onwaar' betekent of de tekenreeks 'nee'. In TOON hebben strings alleen aanhalingstekens nodig als dat absoluut noodzakelijk is, bijvoorbeeld als ze speciale tekens bevatten, op cijfers lijken of leeg zijn. Als u bericht: Hallo wereld typt, krijgt u een string. Als je count: 42 typt, krijg je een getal.
Identiteitskaart: 123
naam: Ada
actief: waar
De kracht van arrays: lengte en tabellen
Waar TOON zich echt van de rest onderscheidt, is de omgang met arrays. Dit is de ‘killer feature’ voor tokenoptimalisatie.
Elke array in TOON vermeldt expliciet zijn lengte tussen haakjes, zoals items[3]. Voor een mens lijkt dit misschien overbodig, maar voor een LLM is het een superkracht. Hierdoor kan het model de structuur onmiddellijk valideren en afkapping detecteren. Als de stream na twee items wordt afgebroken, maar de header drie items belooft, weet de parser dat er iets mis is gegaan.
TOON biedt effectief drie manieren om met arrays om te gaan, waarbij automatisch de meest efficiënte wordt gekozen:
- Inline Primitieven: Voor eenvoudige lijsten met getallen of tekenreeksen houdt TOON het compact.
tags[3]: admin,ops,dev
- Standaardlijsten: Voor gemengde typen wordt een lijstsyntaxis met koppeltekens gebruikt, vergelijkbaar met YAML.
- Tabulaire objecten: Dit is de game-changer.
Als u een array van objecten heeft die dezelfde sleutels delen (een veel voorkomend patroon in databaserecords), draait TOON naar een Tabelformaat. in plaats van de sleutels voor elke afzonderlijke rij te herhalen, worden de sleutels één keer in de koptekst gedeclareerd.
In het bovenstaande voorbeeld vertelt users[2]{id,name,role}: ons dat we twee rijen hebben en wordt het schema gedefinieerd. De gegevens volgen in een CSV-achtige structuur. Dit elimineert de enorme token-overhead van het herhalen van "id":, "name": en "role": voor elke gebruiker.
gebruikers[2]{id,naam,rol}:
1, Alice beheerder, beheerder
2, Bob Smith, gebruiker
Scheidingstekens en tokenefficiëntie
Mogelijk ziet u het gebruik van komma's in de bovenstaande voorbeelden. TOON ondersteunt feitelijk drie scheidingstekens: komma's (standaard), tabs en pijpen (|).
Waarom doet dit er toe? Tokenisatie.
In veel LLM-tokenizers kan een komma gevolgd door een aanhalingsteken worden opgesplitst in meerdere tokens. Een tabteken tokeniseert echter vaak heel netjes. Met TOON kunt u tussen scheidingstekens schakelen op array-headerniveau. Als u een tabscheidingsteken gebruikt, hoeft u tekenreeksen die spaties bevatten vaak niet eens aan te halen, waardoor uw gegevens verder worden gecomprimeerd.
Het formaat is slim genoeg om 'botsingen' aan te kunnen. Als uw gegevens het actieve scheidingsteken bevatten, citeert TOON eenvoudigweg die specifieke waarde.
artikelen[2]{sku,naam,aantal}:
A1, Widgetnaam, 2
B2,Gadgetnaam,1
Sleutelvouwen: de curve afvlakken
Een ander kenmerk dat de focus van TOON op efficiëntie benadrukt, is Key Folding. Diep geneste objecten resulteren meestal in een "trap" van inkepingen die horizontale ruimte en tokens opslokt.
Als je een diepe hiërarchie hebt waarin tussenliggende objecten geen broers en zussen hebben, kan TOON ze samenvouwen tot een pad met puntnotatie.
In plaats van te schrijven:
Je kunt schrijven:
gegevens:
metagegevens:
artikelen[2]: a,b
Deze functie, beschikbaar sinds spec v1.5, vermindert het aantal regels en inspringingstokens aanzienlijk. Belangrijk is dat dit volledig omkeerbaar is. Wanneer u de gegevens decodeert terwijl paduitbreiding is ingeschakeld, wordt de diepe objecthiërarchie perfect gereconstrueerd.
data.metadata.items[2]: a,b
Striktheid en veiligheid
Ondanks de beknopte uitstraling is TOON niet los van data. Het houdt zich aan een strikte reeks regels voor citeren en ontsnappen.
Tekenreeksen blijven over het algemeen niet geciteerd, wat goed is voor de leesbaarheid. TOON dwingt echter het citeren af voor randgevallen om de gegevensintegriteit te garanderen. Als een string op een getal lijkt (bijvoorbeeld "05" of "1e-6"), wordt deze tussen aanhalingstekens geplaatst om te voorkomen dat deze als een getal wordt geparseerd. Als een string een gereserveerd woord is, zoals 'true' of 'null', wordt het tussen aanhalingstekens geplaatst.
Bovendien normaliseert TOON cijfers. Het zendt canonieke decimale vormen uit – geen wetenschappelijke notatie of volgnullen in de uitvoer – waardoor consistentie wordt gegarandeerd. Het kan zelfs 'BigInt' veilig verwerken; als een getal het veilige gehele bereik overschrijdt, wordt het geserialiseerd als een string om precisieverlies tijdens transport te voorkomen.
Wortelvormen
Terwijl de meesten van ons met Root Objects werken, is TOON flexibel. Een document hoeft niet te beginnen met een sleutel-waardepaar. Het ondersteunt Root Arrays (onmiddellijk beginnend met [N]:) of zelfs een enkele Root Primitive. Deze pariteit met JSON betekent dat je TOON kunt omwisselen naar vrijwel elke pijplijn waar JSON momenteel wordt gebruikt, op voorwaarde dat je de parser aan de andere kant hebt.
Laatste gedachten
TOON is niet zomaar 'een ander format'. Het is een gespecialiseerd hulpmiddel voor een tijdperk waarin gegevens net zo vaak worden geconsumeerd door probabilistische modellen als door deterministische code. Door het rigide datamodel van JSON te combineren met de dichtheid van CSV en de leesbaarheid van YAML, wordt het specifieke probleem van context-vensteroptimalisatie opgelost zonder dat dit ten koste gaat van de typeveiligheid.
Als je agenten aan het bouwen bent, modellen aan het verfijnen bent, of gewoon moe bent van het scrollen door eindeloze sluitbeugels, dan is het tijd om TOON eens te bekijken.