Comment un modele SAT classifie les opportunites commerciales terrain
Toute fonction indicatrice sur un domaine discret fini peut etre encodee en instance SAT en temps polynomial. C'est le fondement theorique de Snake.
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.
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.
| Iter | Features ajoutees | Macro AUROC | Delta |
|---|---|---|---|
| 1 | 14 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_ratio | 0.717 | +0.111 |
| 4 | +besoins_liste | 0.716 | -0.001 |
| 5 | +insatisfaction_x_volume, decideur_x_engagement | 0.724 | +0.008 |
| 6 | +duree_bucket, budget_range | 0.765 | +0.041 |
| 7 | +proxy_temperature_hint | 0.813 | +0.048 |
| 8 | +segment_activite | 0.841 | +0.028 |
| 9 | +engagement_grade | 0.851 | +0.010 |
| 10 | +ca_potentiel_mensuel | 0.860 | +0.009 |
signal_objection_ratio compresse l'information des signaux et objections en un seul nombre. Plus exploitable pour les clauses SAT.insatisfaction_x_volume capture "ils sont mecontents ET gros" — un signal Chaud fort que ni l'un ni l'autre seul ne porte.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.
| Classe | AUROC (iter 10) | Difficulte |
|---|---|---|
| Chaud | 0.941 | Facile — signaux positifs forts et nombreux |
| Froid | 0.864 | Moyen — absence de signaux, minoritaire (~14%) |
| Tiede | 0.773 | Difficile — 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".
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.
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.
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.
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