8 min de lecture AI Data Stream Team

Ajouter un modèle System One : quand une décision typée bat un LLM

AI Data Stream fait désormais tourner deux types de modèles. Les LLM de pointe continuent de parler ; Jev, de TypeSafe AI, prend de petites décisions calibrées en moins d'une seconde. Ce qu'est un modèle System One, en quoi il diffère d'un LLM, et comment nous l'avons utilisé pour corriger la case « Unassigned » de GA4.

AI Data Stream a toujours fonctionné avec des modèles de langage de pointe : Claude, GPT, Gemini et DeepSeek, sur vos propres clés API. Ils rédigent l’analyse, exécutent les outils et tiennent la conversation. Pour ce travail, il n’y a rien de mieux.

Mais un produit d’analytics est plein de petites décisions qui ne sont pas des conversations. Ce référent est-il un assistant IA ? Cette étape est-elle celle du « gagné » ? Ce résultat de recherche est-il pertinent pour la question ? Chaque fois que nous sollicitions un LLM pour trancher, nous payions une génération de texte complète, attendions plusieurs secondes, extrayions de la prose ou du JSON de la réponse, et récupérions une confiance verbalisée qui ne voulait pas dire grand-chose. Et chaque fois que nous ne le faisions pas, nous écrivions une liste de mots-clés en croisant les doigts.

Cette semaine, nous avons ajouté un second type de modèle à l’application. Ce billet explique ce que c’est, en quoi il diffère des modèles que vous utilisez déjà ici, et le premier endroit où il a été mis en production.

Ce qu’est un modèle System One

TypeSafe AI appelle ses modèles « System One », d’après le mode de pensée rapide et intuitif décrit par Kahneman, par opposition au raisonnement lent et délibéré. Leur premier modèle est Jev, et son contrat ne ressemble à aucune API de LLM :

  • Vous envoyez un état (state) : une chaîne, ou un objet JSON décrivant la situation.
  • Vous envoyez une carte de questions typées. Il en existe trois types. Un Choice choisit une option dans une liste que vous définissez. Un Noul répond oui ou non. Un Score place l’état sur des niveaux ordonnés que vous décrivez.
  • Vous recevez des réponses typées avec des probabilités. Un Choice renvoie la distribution complète sur vos options plus une confiance. Un Noul renvoie la probabilité du oui. Rien d’autre. Le modèle ne génère jamais de texte.

Une requête ressemble à ceci :

{
  "state": { "source": "perplexity", "medium": "(not set)", "ga4_channel": "Unassigned" },
  "model": "jev-latest",
  "questions": {
    "channel": {
      "type": "choice",
      "instructions": "Which acquisition channel does this session source really belong to?",
      "criteria": {
        "ai_assistant": "An AI assistant, chatbot or AI search product",
        "organic_search": "A web search engine result",
        "self_referral": "The business's own domains or hosted pages",
        "link_scanner_or_tool": "A link scanner, widget CDN or collaboration tool, not a human"
      }
    },
    "is_ai": { "type": "noul", "instructions": "Is this source an AI product?" }
  }
}

Et la réponse :

{
  "answers": {
    "channel": {
      "type": "choice",
      "choice": "ai_assistant",
      "probabilities": { "ai_assistant": 0.99, "organic_search": 0.01, "self_referral": 0.0, "link_scanner_or_tool": 0.0 },
      "confidence": 0.99
    },
    "is_ai": { "type": "noul", "noul": 0.96 }
  }
}

En quoi cela diffère d’un LLM

Quatre différences comptent en pratique.

Le type de sortie. Un LLM renvoie une chaîne. Même en mode sortie structurée, il renvoie une chaîne qui se trouve être du JSON valide, et il peut toujours placer dans l’énumération une valeur que vous n’avez pas définie, ou un nombre avec le mauvais signe. Jev renvoie une valeur de l’ensemble que vous lui avez donné, ou une probabilité. Il n’y a pas d’étape d’analyse et pas de chemin « sortie invalide ». Cela paraît mineur jusqu’au jour où l’on a écrit la logique de relance pour l’autre type de modèle.

L’échantillonnage. Un LLM produit sa réponse un token à la fois : classer vingt lignes signifie vingt générations séquentielles ou une seule très longue. Jev évalue toutes les questions d’une requête en parallèle sur l’état partagé. Nous envoyons vingt lignes et quarante questions dans un seul appel et récupérons quarante réponses ensemble, en une seconde environ.

La confiance. Demandez à un LLM à quel point il est sûr et il écrira un nombre qui se lit bien. Jev est entraîné par apprentissage par renforcement pour des décisions calibrées, donc sa confiance est une statistique sur laquelle on peut fixer un seuil. Dans nos tests, toutes les réponses fausses sont revenues avec une confiance inférieure à 0,5, et toutes les réponses justes au-dessus de 0,9. Cet écart, c’est tout le produit.

Le coût et la vitesse. Le prix annoncé par TypeSafe en accès anticipé est de 0,042 $ par million de tokens en entrée, sans frais pour la sortie. Les nouveaux comptes démarrent avec 5 $ de crédit, et après tous nos développements et tests sur plusieurs projets, le solde affiche encore 4,98 $. À ce tarif, classer 156 sources de trafic revient à moins d’un demi-centime. La latence de bout en bout depuis nos serveurs a été de 650 ms à 1,2 s par requête. À ce prix, on cesse de se demander si une décision vaut un appel de modèle.

Ce qu’il abandonne, c’est tout ce pour quoi un LLM existe. Il ne peut pas expliquer sa réponse, rédiger un résumé ni tenir une conversation. Le code doit posséder le flux de travail et poser des questions étroites ; le modèle apporte le jugement là où du code ordinaire aurait besoin d’une liste de mots-clés.

Premier usage : la case « Unassigned » de GA4

Google Analytics 4 regroupe le trafic en canaux par défaut avec des règles sur les chaînes source et medium. Les règles sont correctes, et cette année elles ont gagné un canal AI Assistant. Mais une règle ne se déclenche que si la balise de medium attendue est présente. Sur l’un de nos propres sites, superyachtwatch.com, GA4 a attribué 510 sessions à AI Assistant sur les 90 derniers jours, et en a laissé 23 autres dans Unassigned sous perplexity / (not set), copilot.com / (not set) et un chatgpt.com / (none) sans balise. Sur les propriétés que nous avons testées, Referral contenait les propres sous-domaines de l’entreprise et des pages d’aperçu HubSpot, des aperçus de liens Microsoft Teams, des pages Salesforce, des outils de lien en bio et du spam de référents, tous comptés comme de vrais visiteurs externes.

Corriger cela avec des règles, c’est maintenir une liste de chaque produit d’IA, de chaque scanner et de chaque motif d’auto-référence pour chaque client. Le corriger avec un LLM, c’est une génération de plusieurs secondes à chaque requête sur le trafic. C’est exactement la forme de problème pour laquelle un modèle System One est fait.

Les questions. Pour chaque ligne que GA4 a rangée dans Referral ou Unassigned, nous posons un Choice sur une taxonomie de seize options (assistant IA, auto-référent, scanner ou outil, spam de référents, référent sectoriel, autre référent, les canaux standard recherche, social, vidéo, e-mail et display, hors ligne ou balise de campagne, inconnu) et un Noul : cette source est-elle un produit d’IA ? L’état contient une courte description de la propriété, car « auto-référent » suppose de savoir à qui appartient le site, plus les lignes elles-mêmes. Vingt lignes partent dans une seule requête, référencées par chemin dans les instructions de chaque question.

La validation. Avant de l’intégrer, nous avons fait passer 156 lignes réelles source/medium issues de deux propriétés. Il était d’accord avec GA4 sur 116. Sur les 40 désaccords, presque tous étaient des cas où GA4 avait renoncé : assistants IA dans Unassigned, propres domaines et scanners de liens dans Referral, Brave Search et ya.ru dans Referral, un webmail dans Referral, QR codes et libellés de campagne dans Unassigned. Trois réponses étaient fausses. Toutes trois affichaient une confiance inférieure à 0,5.

Les règles de conception qui en ont découlé.

  1. Seules les lignes Referral et Unassigned sont envoyées. google / organic n’a pas besoin d’un second avis.
  2. Sous 0,7 de confiance, le regroupement GA4 reste et la réponse du modèle n’est jointe qu’à titre de suggestion. GA4 demeure la source de vérité pour la ligne.
  3. Chaque réponse est mise en cache 30 jours par propriété, source et medium. Chaque hôte est jugé une fois ; la seconde supplémentaire ne s’applique qu’à la première consultation.
  4. Une panne du modèle, un délai dépassé ou une limite de débit donne un résultat nul, jamais une erreur. La ligne revient exactement comme GA4 l’a renvoyée. Les API en accès anticipé changent leurs limites sans préavis, et nous préférons dégrader en silence plutôt que faire échouer une requête sur le trafic.
  5. Quand la taxonomie change, la version de la clé de cache change avec elle, pour que les anciennes réponses soient rejugées face aux nouvelles options. Nous l’avons déjà fait une fois, pour ajouter referrer_spam après qu’un domaine de service de crawl a atterri dans other_referral.

Le résultat est un channel, un indicateur is_ai_assistant et un channel_confidence sur les lignes qui en avaient besoin, plus un bloc de statut indiquant si la classification a tourné. Votre IA peut totaliser l’indicateur et vous donner un chiffre honnête du trafic IA.

Notes d’ingénierie

Quelques leçons qui ne figurent pas dans la documentation.

Les candidats vont dans les critères, les preuves dans l’état. Le modèle ne peut pas choisir une option que vous n’avez pas proposée : pour toute question du type « lequel de ces enregistrements existants correspond », les enregistrements eux-mêmes sont les options du Choice et une option none est obligatoire. Le texte complet vit dans l’état, indexé pour que les instructions puissent y pointer.

Posez les questions indépendantes ensemble. Les questions d’une même requête ne voient pas les réponses des autres, mais elles partagent l’état et s’exécutent en parallèle. Les questions spéculatives ne coûtent presque rien : posez d’emblée la question propre à une branche et ignorez la réponse si la branche n’est pas prise.

La confiance porte sur la distribution, pas sur le monde. Une réponse fausse et confiante est possible quand la bonne option manque dans les critères. La calibration vous dit que le modèle est sûr parmi les options qu’on lui a données. La couverture, c’est votre travail.

C’est une clé de plateforme, pas du BYOK. Contrairement aux LLM d’AI Data Stream, ce modèle tourne sur notre clé, pas la vôtre. Au prix actuel c’est le bon choix, mais c’est aussi pourquoi la fonctionnalité est une bêta optionnelle plutôt qu’un défaut : les conditions sont celles d’un accès anticipé, et nous voulons voir un usage réel avant de nous y appuyer davantage.

La suite

Une fois qu’on dispose d’un jugement bon marché, rapide et calibré, on lui trouve des usages partout. Sur notre liste : reclasser les résultats de recherche de la base de connaissances sans dépendre d’embeddings, vérifier qu’un rapport planifié répond vraiment à sa consigne avant de l’envoyer par e-mail, et décider si un nouveau souvenir d’équipe fait doublon avec un existant. Chacun est une intégration à une question, avec la même règle de repli.

La classification du trafic est disponible dès maintenant en bêta expérimentale sur les plans Pro et Business. Les propriétaires d’équipe peuvent l’activer dans Paramètres d’équipe → Fonctionnalités bêta, comparer une requête sur les sources de trafic avec et sans, et nous dire où le modèle se trompe sur une source. La documentation de TypeSafe est sur docs.typesafe.ai si vous voulez essayer le modèle directement.

Articles associes