← Retour

Methodologie

Comment un modele SAT classifie les opportunites commerciales terrain

Le Dana Theorem — Construction SAT

Toute fonction indicatrice sur un domaine discret fini peut etre encodee en instance SAT en temps polynomial. C'est le fondement theorique de Snake.

f: {0,1}^n → {0,1}  ⇒  φ_C en CNF, construction O(n × b × m)

Snake ne resout pas SAT (NP-dur). Il construit des formules structurees a partir des donnees ou les donnees sont l'assignation. La construction est polynomiale, l'inference aussi.

Complexite d'entrainement: O(L × n × m × b) ou L = couches, n = echantillons, m = features, b = taille de bucket.
Complexite d'inference: O(L × clauses_par_bucket) par prediction. <5ms.

27 features en 10 iterations

Le modele n'est pas arrive a 27 features d'un coup. Chaque iteration a ajoute des features, teste leur impact, et ajuste les hyperparametres.

IterFeatures ajouteesMacro AUROCDelta
114 features de base (volume, insatisfaction, decideur, engagement, signaux, objections, budget, duree, segment, activite, type_projet, norme)0.708
2+signaux_liste, objections_liste (texte pipe-delimited)0.606-0.102
3+volume_tier, signal_objection_ratio0.717+0.111
4+besoins_liste0.716-0.001
5+insatisfaction_x_volume, decideur_x_engagement0.724+0.008
6+duree_bucket, budget_range0.765+0.041
7+proxy_temperature_hint0.813+0.048
8+segment_activite0.841+0.028
9+engagement_grade0.851+0.010
10+ca_potentiel_mensuel0.860+0.009

Observations cles

L'incident de fuite

Iter 7 v1: 100% accuracy instantanee. Le feature composite_score etait la fonction de scoring exacte utilisee pour generer le label. Snake l'a trouvee en 2.7 secondes et a classe parfaitement.

C'est un cas d'ecole de data leakage. Le feature contenait litteralement la reponse. Detecte par le saut brutal de 58% a 100%, corrige en remplacant par un proxy bruite proxy_temperature_hint — correle au label mais pas deterministe. L'accuracy est redescendue a 60% (iter 7 v2), confirmant que le modele apprenait vraiment a partir du proxy, pas de la reponse.

Lecon: quand un feature fait sauter l'accuracy de 40 points, ce n'est pas un bon feature — c'est une fuite.

Tiede: la classe difficile

ClasseAUROC (iter 10)Difficulte
Chaud0.941Facile — signaux positifs forts et nombreux
Froid0.864Moyen — absence de signaux, minoritaire (~14%)
Tiede0.773Difficile — entre-deux, signaux ambigus

Tiede est la classe comprimee. Elle est definie par l'absence de conviction dans les deux sens: ni assez de signaux positifs pour etre Chaud, ni assez d'absence pour etre Froid. Les clauses SAT de Snake fonctionnent mieux avec des signaux positifs (le literal capture une presence, pas une absence). C'est un probleme structurel du formalisme SAT pour les classes "molles".

Piste d'amelioration

Inverser le probleme: au lieu de classifier Tiede directement, classifier "pas Chaud" et "pas Froid", puis inferer Tiede par exclusion. Deux modeles binaires avec AUROC ~0.90+ chacun donneraient un meilleur Tiede que le multiclasse direct.

Noise as enrichment

Le meilleur modele (iter 10) utilise bucket=50, noise=3.0. Ca signifie: 50 echantillons core par bucket + 150 injectes depuis la population totale = bucket effectif de ~200.

C'est le finding LLPS applique: des petits buckets avec du bruit fort donnent un meilleur signal que des gros buckets purs. Le noise injecte la diversite globale dans chaque partition locale. Chaque bucket voit le monde entier, pas juste son voisinage.

Config optimale trouvee: 30 couches, bucket 50, noise 3.0, profil categorical.
Macro AUROC: 0.860 | Accuracy: 77% | Chaud F1: 0.849 | Tiede F1: 0.785 | Froid F1: 0.400

Resilience — anthropic=False par defaut

L'endpoint /comprendre accepte un flag anthropic (defaut: false). Quand false, l'extraction est faite par regex/mots-cles — pas d'appel reseau, pas de dependance API, pas de latence LLM. Snake classifie sur les signaux extraits par keywords.

Le design est delibere : le feeling AI vient de Snake, pas de Haiku. Les 30 couches SAT, les 600 lookalikes, les probabilites calibrees — c'est ca le modele. Haiku est un bonus de precision sur l'extraction en amont. En mode keyword, les signaux forts (volume, insatisfaction, decideur, engagement) sont detectes par pattern matching. Snake les transforme en temperature avec la meme mecanique SAT.

Resultat : l'endpoint est toujours disponible, meme si Bedrock tombe, meme si la cle API expire, meme hors ligne. Le scoring degrade gracieusement — moins precis sur les nuances, mais le signal principal est preserve.

Architecture du pipeline

Notes terrain (voix / texte)
  |
  v
Claude Haiku -- extraction structuree
  |  client_info, opportunite, besoins_techniques,
  |  contraintes, signaux_achat, objections_detectees
  v
_extracted_to_snake_features() -- 27 features
  |  segment, activite, volume_mensuel, type_projet, norme,
  |  insatisfaction_concurrent, motif_insatisfaction,
  |  engagement_detecte, decision_maker_present, duree_visite_min,
  |  n_signaux_achat, n_objections, n_besoins_techniques,
  |  budget_specifie, signaux_liste, objections_liste,
  |  volume_tier, signal_objection_ratio, besoins_liste,
  |  insatisfaction_x_volume, decideur_x_engagement,
  |  duree_bucket, budget_range, proxy_temperature_hint,
  |  segment_activite, engagement_grade, ca_potentiel_mensuel
  v
Snake SAT (30 layers, 602 lookalikes)
  |
  v
Chaud / Tiede / Froid + probabilities + audit trail