Présentation du projet

STROT (Agentic Schema Intent + Compiler & State + Code + Execution + NLU) propose de synthétiser une intention exprimée à l’aide d’un grand modèle de langage (LLM) une seule fois, puis de déployer un artefact Python autonome qui prend des décisions sur chaque enregistrement sans appel supplémentaire à un LLM. La compilation utilise le modèle Anthropic Claude‑Opus‑4‑8 uniquement lors de la phase initiale, puis le système s’appuie sur un modèle de décision local, par défaut SupersonicLabs/Julia‑1, qui compte 144 M de paramètres.

Architecture de compilation

Le flux de compilation se compose de cinq étapes : l’intention et un jeu d’exemples sont synthétisés, puis filtrés par le « golden gate », annotés par des « teacher labels », et enfin calibrés. Cette chaîne produit un fichier .py contenant un modèle de décision figé. Le processus inclut une validation « golden‑record » : l’artefact ne passe en production que si les réponses connues sont correctement reproduites. Le code suivant montre l’installation et l’appel de la fonction de compilation :

pip install strot-ai
import strot
result = strot.run(
    tickets,
    query="Triage incoming support tickets into the correct workflow.",
    action_registry={
        "billing_dispute":  "Refunds, invoice corrections, double charges",
        "technical_defect": "Crashes, bugs, broken behavior",
    },
    llm="anthropic/claude-opus-4-8"
)
for o in result.outcomes:
    print(o["action"], round(o["confidence"], 2))
# billing_dispute 0.97
# technical_defect 0.94

Le modèle local Julia‑1 s’installe via pip install strot-ai[local] et peut être intégré dans une image Docker, garantissant une exécution hors‑ligne.

Modèle d’exécution et garanties de fiabilité

En phase d’exécution, chaque enregistrement est projeté vers le modèle de décision (144 M, ~60 ms sur CPU). Le modèle renvoie un JSON typé contenant la décision, la probabilité et un score de confiance. Si la confiance est inférieure à un seuil défini, le système abstient plutôt que de deviner, ce qui élimine toute hallucination structurelle. Les garanties sont obtenues par un calibrage basé sur le temperature scaling et la prédiction conforme séparée : le taux d’erreur marginal est limité à α, le reste des cas étant abstenu. Un second extrait de code illustre l’appel de la fonction decide :

result = strot.decide(records, questions={
    "is_bug_report":     {"type": "boolean", "instructions": "mentions crashes/errors?"},
    "customer_sentiment":{"type": "score", "min": 1, "max": 5, "instructions": "1 angry, 5 happy"},
    "routing_bucket":    {"type": "choice", "options": ["billing", "engineering", "spam"]},
})
# → {"booleans": {...}, "scores": {...}, "choices": {...}}  with probabilities + confidence

Les benchmarks fournis dans le dépôt GitHub mesurent les pertes sur des jeux de données réels et publient les courbes de calibration, assurant que les performances observées correspondent aux garanties théoriques.

Implications et limites

Le modèle d’exécution sans appel LLM réduit le coût marginal à zéro et supprime les risques de génération non contrôlée. Cependant, la qualité du système dépend fortement de la pertinence des exemples fournis lors de la compilation ; tout dérive du schéma nécessite une recompilation complète. De plus, la taille du modèle local (144 M) impose une consommation mémoire non négligeable pour des environnements très contraints. Enfin, la méthode repose sur la disponibilité d’un LLM capable de synthétiser correctement l’intention initiale, ce qui peut limiter l’adoption dans des contextes où les modèles propriétaires sont indisponibles.