Comment utiliser TOON avec les LLM

LLM
Prompt Engineering

Si vous avez déjà collé un grand tableau JSON dans ChatGPT ou Claude, vous avez probablement ressenti la douleur de la fenêtre de contexte qui se referme. JSON est fantastique pour les API web, mais pour les grands modèles de langage (LLM), c'est incroyablement gaspilleur. Répéter des noms de champs comme "id":, "name": et "timestamp": pour chaque enregistrement n'est pas seulement redondant ; cela brûle des tokens qui coûtent de l'argent réel et un espace de contexte précieux.

C'est là que TOON (Table Object Notation) brille. Ce n'est pas seulement un format de données ; c'est une stratégie pour optimiser les interactions LLM. En supprimant la taxe syntaxique de JSON et en ajoutant des en-têtes de structure explicites, TOON vous permet de transmettre plus de données à vos modèles et d'obtenir des sorties structurées plus fiables en retour.

L'économie des tokens de TOON

Pourquoi se donner la peine de changer de format ? Le calcul est simple. Dans un tableau standard d'objets JSON, le schéma est répété pour chaque ligne. Si vous avez une liste de 50 utilisateurs, vous payez pour les noms de champs 50 fois.

TOON élimine cette redondance en déclarant le schéma une fois dans l'en-tête. Les données suivent dans un format dense et rationalisé. En pratique, cela se traduit généralement par une réduction de 30 à 60 % de l'utilisation des tokens pour les tableaux uniformes par rapport au JSON formaté. Lorsque vous traitez des fenêtres de contexte massives ou des appels d'API à volume élevé, cette efficacité se traduit directement par des factures moins élevées et une latence plus faible.

Envoyer des données : La règle "Montrer, ne pas dire"

Lorsque vous avez besoin qu'un LLM analyse des données, votre stratégie de prompt est cruciale. Les débutants écrivent souvent de longs paragraphes expliquant le format des données. Avec TOON, vous n'avez pas besoin de faire cela.

Les LLM sont des moteurs de reconnaissance de motifs. Ils comprennent intuitivement TOON car cela ressemble à un hybride de YAML et de CSV — des formats qu'ils ont vus des milliards de fois pendant l'entraînement.

Pour envoyer des données, enveloppez-les simplement dans un bloc de code délimité. Vous pouvez l'étiqueter toon, mais même si le surligneur de syntaxe du modèle ne le prend pas officiellement en charge, le modèle comprend immédiatement la structure.

Exemple d'entrée

Au lieu de décrire le schéma, fournissez simplement le bloc :

L'en-tête users[3]{id,name,role,lastLogin} indique au modèle tout ce qu'il doit savoir : le type d'entité, le nombre (3 lignes) et l'ordre des champs. L'indentation gère la hiérarchie. Cette nature "autodocumentée" libère votre prompt pour se concentrer sur la tâche logique réelle plutôt que sur les instructions d'analyse syntaxique.

Voici le journal d'activité des utilisateurs. Les données sont au format TOON (indentation de 2 espaces, en-têtes explicites).

```toon
users[3]{id,name,role,lastLogin}:
  1,Alice,admin,2025-01-15T10:30:00Z
  2,Bob,user,2025-01-14T15:22:00Z
  3,Charlie,user,2025-01-13T09:45:00Z

Tâche : Analysez les journaux et identifiez les utilisateurs qui ne se sont pas connectés au cours des dernières 24 heures.

Générer une sortie fiable

Faire en sorte qu'un LLM lise des données est facile ; le faire générer des données structurées valides est la partie difficile. Les modèles adorent halluciner, tronquer le JSON ou oublier les accolades fermantes.

TOON ajoute une couche de sécurité grâce à sa syntaxe d'en-tête, spécifiquement le compteur [N]. Lorsque vous demandez à un modèle de sortir du TOON, vous lui demandez de s'engager sur une structure avant de générer les données.

Prompter pour la génération

Pour obtenir les meilleurs résultats, fournissez le format d'en-tête que vous attendez et demandez au modèle de remplir les lignes.

En demandant au modèle de calculer [N], vous forcez un processus de "chaîne de pensée" où le modèle doit planifier la taille de la sortie. Cette contrainte apparemment petite réduit considérablement la probabilité que le modèle s'arrête à mi-chemin d'une liste.

Tâche : Retournez une liste d'utilisateurs actifs avec le rôle "user".
Format : Utilisez TOON. Définissez la valeur [N] dans l'en-tête pour qu'elle corresponde au nombre exact de lignes que vous générez.

Format attendu :
users[N]{id,name,role,lastLogin}:

Valider avec le mode strict

Lorsque vous recevez la réponse du LLM, vous ne devriez pas simplement lui faire confiance. C'est là que le mode strict de la bibliothèque TOON devient un superpouvoir pour les applications de production.

Si vous utilisez la bibliothèque TypeScript, le décodage avec le mode strict valide que les lignes générées correspondent au nombre de l'en-tête :

Cela vous permet de détecter de manière programmatique les sorties de modèle "paresseuses" ou les troncatures réseau immédiatement, plutôt que de découvrir de mauvaises données en aval dans votre application.

import { decode } from '@toon-format/toon';

try {
  // Si le modèle dit [5] mais fournit 4 lignes, cela lance une erreur.
  const data = decode(modelOutput, { strict: true });
  console.log('Données valides reçues :', data);
} catch (error) {
  console.error('Hallucination du modèle ou troncature détectée :', error.message);
}

Optimisation avancée : L'astuce de la tabulation

Si vous êtes obsédé par l'optimisation (et dans le monde des LLM, vous devriez probablement l'être), vous pouvez extraire encore plus d'efficacité en choisissant judicieusement vos délimiteurs.

Les virgules sont standard, mais les tabulations (\t) sont souvent représentées comme un seul token dans de nombreux vocabulaires de tokenizers. De plus, les tabulations apparaissent rarement à l'intérieur des champs de texte naturel, ce qui réduit le besoin de caractères d'échappement (comme l'encadrement des chaînes entre guillemets).

Vous pouvez encoder vos données en utilisant des tabulations avant de les envoyer au modèle :

N'oubliez pas d'informer le modèle dans le prompt : "Les données sont en TOON séparé par des tabulations." Cela crée une représentation hyper-compacte qui est incroyablement facile à analyser et à générer pour le modèle.

const toonPrompt = encode(data, { delimiter: '\t' });

Un exemple de flux de travail complet

Regardons un scénario du monde réel : filtrage des journaux système. Vous voulez envoyer des journaux bruts au modèle et obtenir une liste structurée d'erreurs en retour.

Le Prompt :

La sortie du modèle :

Journaux système au format TOON (séparés par tabulations) :

```toon
events[4	]{id	level	message	timestamp}:
  1	error	Délai de connexion dépassé	2025-01-15T10:00:00Z
  2,warn,Requête lente,2025-01-15T10:05:00Z
  3	info	Connexion utilisateur	2025-01-15T10:10:00Z
  4	error	Erreur base de données	2025-01-15T10:15:00Z

Tâche : Extrayez tous les événements avec le niveau 'error'. Retournez le résultat sous forme de TOON valide avec un nombre d'en-tête mis à jour.

Le Résultat :

events[2	]{id	level	message	timestamp}:
  1	error	Délai de connexion dépassé	2025-01-15T10:00:00Z
  4	error	Erreur base de données	2025-01-15T10:15:00Z

Le modèle a correctement filtré la liste et, surtout, mis à jour l'en-tête à events[2]. En décodant cette réponse, vous obtenez un tableau propre et sûr du point de vue du typage, prêt pour la logique de votre application.

Résumé

TOON comble le fossé entre la lisibilité humaine et l'efficacité machine. Il respecte les contraintes de coûts des LLM tout en fournissant la structure requise pour un développement logiciel robuste.

  1. Gardez-le petit : Utilisez 2 à 5 lignes dans vos exemples ; le modèle généralisera.
  1. Soyez explicite : Définissez clairement les en-têtes pour que le modèle connaisse le schéma.
  1. Validez strictement : Utilisez les métadonnées du format pour détecter les erreurs de génération.

En vous éloignant du JSON pour vos charges utiles de prompt, vous ne faites pas qu'économiser des tokens — vous construisez un pipeline d'IA plus fiable.