Arithmétique exacte dans les LLM : génération de code exécutable
Les LLM ne sont pas conçus pour des calculs précis — l'architecture transformer prédit des tokens en fonction de probabilités, pas d'opérations mathématiques. Une requête comme « 18 × 38,76 » peut renvoyer 697,68 ou une erreur comme 680, en raison d'une approximation de motifs tirée des données d'entraînement. Il s'agit d'une limitation systémique, non d'un déclin du modèle.
Solution : maintenir le LLM à l'écart du calcul direct. Le modèle génère un script Python pour la tâche, qui s'exécute dans un environnement isolé. Python garantit la précision : 18 * 38,76 renvoie toujours exactement 697,68.
Architecture du système
Flux de traitement : utilisateur → LLM → script Python → conteneur Docker → résultat (texte + Excel).
Exemple : calcul des factures d'utilités (Tomsk) :
- Entrée utilisateur : « Eau froide 320, eau chaude 229, électricité 7422, ancien : Eau froide 302, eau chaude 222, électricité 7133 ».
- LLM avec prompt système (taux depuis la configuration) génère un script.
- Script calcule la consommation, applique les tarifs et construit un tableau.
- Exécution en sandbox, fichier retourné.
Code généré simplifié :
# Consommation des compteurs
froide_courant, froide_prev = 320, 302
chaude_courant, chaude_prev = 229, 222
elec_courant, elec_prev = 7422, 7133
# Consommation
froide_consom = froide_courant - froide_prev # 18 m³
chaude_consom = chaude_courant - chaude_prev # 7 m³
elec_consom = elec_courant - elec_prev # 289 kWh
# Tarifs à Tomsk 2025 (issus de la config, non du modèle)
tarifs = {
'eau_froide': 38.76,
'eau_chaude': 142.63,
'electricite': 4.94,
'assainissement': 27.04,
}
# Calcul
froide_cout = froide_consom * tarifs['eau_froide'] # 697.68
chaude_cout = chaude_consom * tarifs['eau_chaude'] # 998.41
elec_cout = elec_consom * tarifs['electricite'] # 1427.66
drain_cout = (froide_consom + chaude_consom) * tarifs['assainissement'] # 676.00
total = froide_cout + chaude_cout + elec_cout + drain_cout # 3799.75
# Génération Excel
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
ws.append(['Service', 'Consommation', 'Tarif, ₽', 'Montant, ₽'])
ws.append(['Eau froide', f'{froide_consom} m³', tarifs['eau_froide'], froide_cout])
ws.append(['Eau chaude', f'{chaude_consom} m³', tarifs['eau_chaude'], chaude_cout])
ws.append(['Électricité', f'{elec_consom} kWh', tarifs['electricite'], elec_cout])
ws.append(['Assainissement', f'{froide_consom + chaude_consom} m³', tarifs['assainissement'], drain_cout])
ws.append(['TOTAL', '', '', total])
wb.save('communal.xlsx')
Les tarifs proviennent d’un fichier de configuration externe mis à jour via des sources officielles — aucune hallucination du modèle.
Choix du LLM et du sandbox
Modèles :
- Qwen (Alibaba) : API gratuite, génération fiable de code pour les tâches simples.
- DeepSeek V3 : pour les scénarios complexes (analyse de documents), prend en charge le cache de prompts.
GPT-4/Claude sont surdimensionnés pour les scripts de moins de 20 lignes.
Sandbox : conteneur Docker à la demande.
- Isolation des utilisateurs.
- Bibliothèques de base : openpyxl, math, datetime.
- Timeout de 30 secondes.
- Pandas/numpy bloqués dans les prompts.
Problèmes courants et solutions
| Problème | Solution |
|--------|----------|
| Hallucinations de tarifs | Injection des tarifs depuis la config dans le prompt |
| Calcul direct sans code | Validation + relance avec instruction : « uniquement du code » |
| Texte corrompu dans Excel | Utilisation de encoding='utf-8', validation post-exécution |
| Importations manquantes | Restriction des bibliothèques dans l’image et le prompt |
| UX : comptage incorrect de tokens | Comptage côté backend |
| Erreurs de code | Retour de stderr au modèle pour corrections itératives |
Retourner stderr réduit les itérations de 5 fois — les modèles analysent les traces et corrigent plus vite.
Extensions : analyse budgétaire
Pour vérifier des budgets (fichier Excel, ville) : le modèle génère 150–200 lignes de code.
- Analyse de structures arbitraires.
- Comparaison avec les prix du marché depuis la config.
- Détection d'erreurs arithmétiques.
- Génération de rapports avec coloration (openpyxl).
Exemple : budget de rénovation de salle de bains (Tomsk) — surcharge de 25,9 %, 8 articles >50 % au-dessus, écarts de 1 à 4 roubles.
Points clés
- Les calculs sont 100 % précis : exécutés via Python.
- Les tarifs proviennent de données externes, jamais du modèle.
- Le sandbox est obligatoire pour la sécurité.
- Les itérations basées sur stderr accélèrent le débogage.
- Évolutive : mise à jour de la config sans re-entraînement.
— Editorial Team
Aucun commentaire pour le moment.