Analyser les Préférences Humaines du Chatbot Arena
Explorez le dataset officiel du Chatbot Arena (33 000 conversations) pour comprendre quels modèles d'IA gagnent le plus souvent et pourquoi.
Objectif du TP
Dans ce cas pratique, vous allez explorer le dataset officiel du Chatbot Arena, la plateforme qui produit le classement Elo de référence pour les LLMs. Ce dataset contient 33 000 conversations réelles entre des utilisateurs et des modèles d''IA, avec le vote de préférence humaine.
Vous apprendrez à manipuler des données réelles avec Pandas et à en tirer des insights concrets sur les performances des modèles.
Prérequis
- Python 3.8+
- Connaissances basiques de Pandas
- Un compte Kaggle (gratuit) pour télécharger le dataset
Dataset
Chatbot Arena Conversations – Kaggle
Ce dataset contient pour chaque conversation :
- Les noms des deux modèles comparés (
model_a,model_b) - Le contenu complet de la conversation
- Le vote du juge humain (
winner: model_a, model_b ou tie) - La langue détectée
C''est le même dataset que celui utilisé par LMSYS pour calculer le classement Elo que vous voyez sur lmarena.ai.
Exercice 1 : Chargement et Exploration
Commencez par charger le dataset et comprendre sa structure.
import pandas as pd
# Charger le dataset (téléchargez-le depuis Kaggle)
df = pd.read_json("chatbot_arena_conversations.json")
# 1. Dimensions
print(f"Nombre de conversations : {len(df)}")
print(f"Colonnes : {df.columns.tolist()}")
# 2. Aperçu
print(df.head())
# 3. Types de données
print(df.dtypes)
# 4. Valeurs manquantes
print(df.isnull().sum())
Questions à vous poser :
- Combien de conversations y a-t-il ?
- Quelles colonnes sont disponibles ?
- Y a-t-il des données manquantes ?
Exercice 2 : Quels Modèles sont les Plus Testés ?
Identifiez les modèles qui apparaissent le plus souvent dans les comparaisons.
# Combiner les deux colonnes de modèles
all_models = pd.concat([df["model_a"], df["model_b"]])
# Top 15 des modèles les plus testés
top15 = all_models.value_counts().head(15)
print("Top 15 des modèles les plus testés :")
print(top15)
# Visualisation
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 6))
top15.plot(kind="barh", ax=ax, color="#6366f1")
ax.set_xlabel("Nombre de matchs")
ax.set_title("Modèles les plus testés dans le Chatbot Arena")
ax.invert_yaxis()
plt.tight_layout()
plt.savefig("modeles_populaires.png", dpi=150)
plt.show()
Observation : Les modèles les plus récents et les plus médiatisés sont testés beaucoup plus souvent. Cela peut créer un biais dans les scores Elo.
Exercice 3 : Taux de Victoire par Modèle
Calculez le pourcentage de victoires de chaque modèle.
# Victoires en tant que model_a
wins_a = df[df["winner"] == "model_a"]["model_a"].value_counts()
# Victoires en tant que model_b
wins_b = df[df["winner"] == "model_b"]["model_b"].value_counts()
# Total des victoires
wins = wins_a.add(wins_b, fill_value=0)
# Total des matchs joués
total_a = df["model_a"].value_counts()
total_b = df["model_b"].value_counts()
total = total_a.add(total_b, fill_value=0)
# Taux de victoire (%)
winrate = (wins / total * 100).sort_values(ascending=False)
# Filtrer les modèles avec au moins 100 matchs (pour la fiabilité)
reliable = total[total >= 100].index
winrate_reliable = winrate[winrate.index.isin(reliable)]
print("Taux de victoire (modèles avec 100+ matchs) :")
print(winrate_reliable.head(20).round(1))
Question : Le classement que vous obtenez correspond-il au leaderboard officiel de LM Arena ? Pourquoi pourrait-il y avoir des différences ?
Exercice 4 : Analyse des Égalités
Les matchs nuls sont révélateurs : quand les humains ne savent pas choisir, cela signifie que les modèles sont proches en qualité.
# Taux global d''égalité
tie_rate = (df["winner"] == "tie").mean() * 100
print(f"Taux d''égalité global : {tie_rate:.1f}%")
# Taux d''égalité par paire de modèles (top 10 paires)
df["pair"] = df.apply(lambda r: tuple(sorted([r["model_a"], r["model_b"]])), axis=1)
pair_stats = df.groupby("pair").agg(
total=("winner", "count"),
ties=("winner", lambda x: (x == "tie").sum())
)
pair_stats["tie_rate"] = (pair_stats["ties"] / pair_stats["total"] * 100).round(1)
# Paires avec le plus d''égalités (minimum 20 matchs)
close_pairs = pair_stats[pair_stats["total"] >= 20].nlargest(10, "tie_rate")
print("\nPaires les plus serrées :")
print(close_pairs[["total", "tie_rate"]])
Ce que vous découvrirez : Certaines paires de modèles sont quasi-indistinguables pour les humains. Cela signifie que pour votre usage, le prix ou la vitesse devrait départager.
Exercice 5 : Analyse par Langue
Les modèles performent-ils différemment selon la langue ?
# Distribution des langues
if "language" in df.columns:
print("Top 10 langues :")
print(df["language"].value_counts().head(10))
# Taux de victoire pour les conversations en français vs anglais
for lang in ["English", "French"]:
subset = df[df["language"] == lang]
if len(subset) > 0:
print(f"\n--- {lang} ({len(subset)} conversations) ---")
wins_lang = subset[subset["winner"] == "model_a"]["model_a"].value_counts()
wins_lang = wins_lang.add(
subset[subset["winner"] == "model_b"]["model_b"].value_counts(),
fill_value=0
)
total_lang = subset["model_a"].value_counts().add(
subset["model_b"].value_counts(), fill_value=0
)
wr = (wins_lang / total_lang * 100).sort_values(ascending=False)
reliable_lang = total_lang[total_lang >= 10].index
print(wr[wr.index.isin(reliable_lang)].head(10).round(1))
Attention : Le nombre de conversations en français est beaucoup plus faible qu''en anglais. Les résultats sont donc moins fiables statistiquement.
Pour Aller Plus Loin
- Essayez de recalculer un score Elo simplifié à partir des résultats des matchs
- Analysez si certains modèles sont meilleurs sur des types de tâches spécifiques (code, créativité, raisonnement)
- Comparez vos résultats avec le leaderboard officiel de LM Arena
Specialiste IA — Master Intelligence Artificielle
Diplome d'un Master en Intelligence Artificielle, je travaille au quotidien sur des projets IA en entreprise. J'ai cree IwanttolearnAI pour rendre l'apprentissage de l'IA accessible a tous, gratuitement.
Continuer a apprendre
TP : Créer un Chatbot RAG de A à Z
Construisez un chatbot intelligent qui répond en se basant sur vos documents : chunking, embeddings, vector store, prompt engineering et interface web.
TP : Fine-tuner un LLM sur vos Données
Apprenez à fine-tuner un LLM (Llama, Mistral) avec LoRA/QLoRA sur vos données métier : préparation du dataset, entraînement, évaluation et déploiement avec Ollama.
Token Trainer
Prédisez comment un tokenizer découpe les phrases en tokens ! Cliquez entre les caractères pour placer vos séparations et découvrez les règles de tokenization.