Conception d'un Moteur d'Évaluation Psychométrique Multi-Dimensionnel avec Claude Code

Architecture du Framework d'Évaluation

Le système SBTI (Super-Big Personality Test) repose sur une architecture d'évaluation comportementale structurée autour de 15 dimensions psychologiques distinctes. Contrairement aux modèles dichotomiques traditionnels, ce framework segmente l'analyse en cinq sous-modèles interconnectés :

  • Modèle Identitaire : Estime de soi (S1), Clarté du concept de soi (S2), Valeurs fondamentales (S3).
  • Modèle Affectif : Sécurité d'attachement (E1), Engagement émotionnel (E2), Gestion des limites (E3).
  • Modèle Cognitif : Orientation cosmologique (A1), Rapport aux normes (A2), Téléologie personnelle (A3).
  • Modèle Volitif : Typologie motivationnelle (Ac1), Heuristique de décision (Ac2), Modalités d'exécution (Ac3).
  • Modèle Relationnel : Proactivité sociale (So1), Perméabilité interpersonnelle (So2), Authenticité expressive (So3).

Chaque axe est quantifié selon une échelle ternaire (L, M, H), produisant un vecteur d'état de 15 caractères. Ce vecteur est ensuite traité par un algorithme de correspondance pour identifier l'archétype prédominant parmi une base de 25 profils cibles.

Algorithme de Correspondance par Distance de Manhattan

Le moteur de classification utilise la distance de Manhattan pour calculer la proximité entre le vecteur utilisateur et les vecteurs de référence. La métrique évalue la somme des écarts absolus entre chaque dimension. Des règles conditionnelles (intercepteurs) et des profils de secours sont intégrés pour gérer les cas atypiques ou les déclencheurs spécifiques.

Voici une implémentation refactorisée du moteur d'inférence en Python, fonctionnant sans dépendances tierces :


import sys
import json

REGISTRE_ARCHETYPES = {
    "MAITRE": {"sequence": "HHHMHMMHHHHHMHM", "designation": "Contrôleur systémique"},
    "NOCTAMBULE": {"sequence": "DECLERCHEUR_SPECIFIQUE", "designation": "Profil conditionnel"},
    "ATYPIQUE": {"sequence": "HHHH", "designation": "Profil de secours par défaut"}
}

def calculer_proximite(vecteur_source, vecteur_cible):
    """Évalue l'écart absolu entre deux séquences dimensionnelles."""
    return sum(abs(ord(dim_s) - ord(dim_c)) for dim_s, dim_c in zip(vecteur_source, vecteur_cible))

def analyser_profil(donnees_brutes):
    vecteur_evalue = generer_vecteur_15d(donnees_brutes)
    
    # Intercepteur de conditions spécifiques
    if donnees_brutes.get("metrique_consommation", 0) > 8:
        return {"identifiant": "NOCTAMBULE", "ecart": 0}
        
    profil_optimal = "ATYPIQUE"
    ecart_minimal = float('inf')
    
    for nom, attributs in REGISTRE_ARCHETYPES.items():
        if nom == "NOCTAMBULE": 
            continue
            
        ecart_actuel = calculer_proximite(vecteur_evalue, attributs["sequence"])
        if ecart_actuel < ecart_minimal:
            ecart_minimal = ecart_actuel
            profil_optimal = nom
            
    return {"identifiant": profil_optimal, "ecart": ecart_minimal}

def generer_vecteur_15d(donnees):
    # Logique de conversion des réponses brutes en format L/M/H
    return "HHHMHMMHHHHHMHM" 

if __name__ == "__main__":
    if len(sys.argv) > 1 and sys.argv[1] == "evaluer":
        payload = json.loads(sys.stdin.read())
        resultat = analyser_profil(payload)
        print(json.dumps(resultat))

Intégration via Claude Code Extensions

Le déploiement de ce moteur s'effectue sous la forme d'un "Skill", un module d'extension natif pour l'interface CLI de Claude. Un Skill encapsule les instructions comportementales (SKILL.md) et les binaires d'exécution. L'orchestration se fait via une commande slash personnalisée (ex: /sbti), permettant au LLM de gérer le flux de questions, de sérialiser les réponses au format JSON, et d'invoquer le script d'analyse en arrière-plan.

Pour assurer la portabilité de l'exécution, le script d'interface (wrapper) détecte dynamiquement l'environnement et configure le répertoire de sortie :


#!/bin/bash

# Détection du runtime Python optimal
MOTEUR_PYTHON="python3"
if hash uv 2>/dev/null; then
    MOTEUR_PYTHON="uv run python3"
fi

# Résolution multi-plateforme du répertoire de destination
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" || "$OSTYPE" == "win32" ]]; then
    REPERTOIRE_EXPORT="${USERPROFILE}/Downloads"
else
    REPERTOIRE_EXPORT="${HOME}/Downloads"
fi

# Exécution du pipeline d'analyse
IDENTIFIANT_TROUVE=$($MOTEUR_PYTHON moteur.py evaluer < reponses_utilisateur.json | jq -r '.identifiant')

# Exportation du rendu visuel associé
if [[ -f "./ressources/${IDENTIFIANT_TROUVE}.png" ]]; then
    cp "./ressources/${IDENTIFIANT_TROUVE}.png" "$REPERTOIRE_EXPORT/profil_sbti_${IDENTIFIANT_TROUVE}.png"
    echo "Rendu généré avec succès dans $REPERTOIRE_EXPORT"
else
    echo "Erreur: Ressource visuelle introuvable pour le profil $IDENTIFIANT_TROUVE"
fi

Flux d'Exécution et Format de Sortie

Lors de l'invocation, le système procède en quatre phases : initialisation de la session, collecte séquentielle des métriques, sérialisation et traitement algorithmique, puis restitution formatée.

Le moteur retourne un objet JSON contenant les métadonnées du profil identifié. L'interface CLI enrichit ensuite cette réponse avec les descriptifs textuels et le chemin d'accès au fichier graphique généré.

Extensibilité du Système

L'architecture a été conçue pour faciliter l'ajout de nouveaux profils. L'intégration d'un archétype supplémentaire nécessite uniquement la mise à jour du dictionnaire REGISTRE_ARCHETYPES dans le script principal, accompagnée du dépôt de la matrice visuelle correspondante dans le répertoire /ressources. Aucune modification de la logique de calcul de distance ou du wrapper Bash n'est requise.

Étiquettes: Claude Code Python Distance de Manhattan CLI JSON

Publié le 3 juillet à 21h40