Spaces:
Sleeping
Download algorithme_readme.md from t4transaction/agent: direct link, hf CLI and curl.
- Browser
- Download file 5.35 kB
-
https://huggingface.co/spaces/t4transaction/agent/resolve/main/algorithme_readme.md
- Command line
-
hf download hf://spaces/t4transaction/agent/algorithme_readme.md
-
curl -L -o algorithme_readme.md https://huggingface.co/spaces/t4transaction/agent/resolve/main/algorithme_readme.md
Algorithme de Matching & Valorisation (Dual-Track)
Ce document decrit le moteur implemente dans backend/database.py apres refonte en double entonnoir:
- Track A: Market Intel / affichage (
list_display) - Track B: Valuation / extraction de multiples (
list_valuation)
1) Vue d'ensemble du pipeline
- Embedding de la cible (Mistral).
- Retrieval des candidats (RPC pgvector, fallback Python si erreur).
- Scoring de chaque transaction:
vector_scoresize_scorenaf_scoreweighted_final_score
- Construction de 2 listes:
list_display(pertinence marche/metier pour l'affichage)list_valuation(coherence financiere pour la valorisation)
- Relaxation elastique si quota insuffisant:
list_display: baissesemanticuniquement, par pas de0.05(plancher0.20)list_valuation: haussesized'abord (+10%), puis baissesemantic
- Calcul des multiples:
- priorite a
list_display - complement via
list_valuationsi < 3 valeurs
- priorite a
- Generation d'un CSV d'audit dans
debug_logs/.
2) Parametres configurables (backend/config.py)
Phase 1 - Identification (List Display)
MIN_SEMANTIC_MATCH = 0.80- contrainte de taille retiree sur ce track (focus metier)
- score d'affichage dedie:
display_score = (0.95 * vector_score) + (0.05 * size_score)(si taille connue)- sinon
display_score = vector_score
- relaxation si
< 3resultats:- baisse
MIN_SEMANTIC_MATCHpar pas de0.05jusqu'a0.20
- baisse
Phase 2 - Extraction Multiples (List Valuation)
VALUATION_MIN_SEMANTIC = 0.45VALUATION_MIN_COUNT = 3MAX_CA_MULTIPLE_VALUATION = 20MAX_EBITDA_MULTIPLE_VALUATION = 70- contrainte de taille stricte au depart:
size_delta_percent <= 1.00(±100%) - filtres secondaires:
naf_score(si NAF cible disponible)semantic_score
- relaxation elastique:
- on relache d'abord la taille (
+0.10par pas) - puis la semantique (pas
0.05)
- on relache d'abord la taille (
Relaxation elastique (quota force)
semantic_step = 0.05(jusqu'a0.20)size_step = 0.10list_display: relaxe semantique uniquementlist_valuation: relaxe taille puis semantique
3) Formules de score
3.1 Delta de taille
size_delta_percent = |CA_transaction - CA_cible| / CA_cible
si la taille n'est pas connue: size_delta_percent = null.
3.2 Score final (taille connue + NAF disponible)
ScoreFinal = (0.40 * ScoreTaille) + (0.40 * ScoreVectoriel) + (0.20 * ScoreNAF)
3.3 Score final (taille inconnue + NAF disponible)
ScoreFinal = ((0.40 * ScoreVectoriel) + (0.20 * ScoreNAF)) / (0.40 + 0.20)
3.4 Score final (taille inconnue + NAF indisponible)
ScoreFinal = ScoreVectoriel
4) Regles hard-stop par track
Track A (list_display)
- reject si
vector_score < MIN_SEMANTIC_MATCH - pas de hard-stop taille (l'objectif est la coherence metier pour l'affichage)
- priorisation par
display_score(95% semantique, 5% taille)
Track B (list_valuation)
Une transaction entre dans list_valuation si:
vector_score >= VALUATION_MIN_SEMANTIC- ET
multiple_caoumultiple_ebitdaest present et positif - ET respecte la contrainte de taille stricte initiale (±100%) quand taille connue
- ET passe le filtre
naf_scoresi NAF cible disponible - si quota insuffisant: relaxation elastique (taille puis semantique)
5) Logique de calcul des multiples
Pour chaque axe (CA, EBITDA):
- on prend les multiples valides de
list_display - si le count est
< VALUATION_MIN_COUNT, on complete avec les meilleurs delist_valuation(triweighted_final_score) - si count final
< VALUATION_MIN_COUNT:is_calculable = falsereason = "Données insuffisantes même après élargissement"
- toute transaction ajoutee via paliers elastiques est taggee:
quality_label = "Match Élargi (Quota Forcé)"
Sinon, calcul mediane/moyenne.
6) Contrat de sortie (zero-null)
Dans results.multiples:
- montants toujours numeriques (
0par defaut) - objet normalise:
valuation_ca = { value, is_calculable, reason }valuation_ebitda = { value, is_calculable, reason }
- scope de valorisation:
valuation_scope = "listing stricte"ou"listing élargie"
7) Audit CSV
Pour chaque execution:
- fichier:
debug_logs/audit_matching_[timestamp].csv - toutes les transactions scannees (retenues + rejetees)
- colonnes de provenance:
in_display_trackin_valuation_tracklist_origin(display,valuation,display+valuation,rejected)
- statuts typiques:
RETAINED_DISPLAYRETAINED_VALUATION_POOLRETAINED_DISPLAY+VALUATION_POOLREJECTED
Rajout ed06 (a améliorer):
Actuellement, la formule ressemble probablement à ceci : Score Final = (Poids_Sémantique * Similarité) + (Poids_CA * Proximité_CA)
Si la métallurgie a un score CA de 1.0 (CA identique) et un score sémantique de 0.6 (faible mais passe le seuil), elle peut battre une boutique de vêtements qui aurait un score sémantique de 0.9 mais un score CA de 0.4 (boutique plus petite). C'est ce qu'on appelle un faux positif financier. Si la métallurgie sort dans le top 3 d'une boutique de vêtements, c'est que ton algorithme actuel est additif (on additionne les scores) au lieu d'être éliminatoire (on filtre d'abord, on score ensuite).