DébutantCas Pratiques
25 min de lecture20 vues

Benchmark : Trouver le Meilleur Rapport Qualité/Prix

Analysez les scores de benchmark et les prix API de dizaines de LLMs pour trouver le modèle au meilleur rapport qualité/prix avec Python.

Objectif du TP

Quel modèle d''IA offre le meilleur rapport qualité/prix ? Dans ce cas pratique, vous allez analyser un dataset contenant les scores de benchmark et les prix API de dizaines de LLMs pour répondre à cette question avec des données.

Prérequis

  • Python 3.8+, Pandas, Matplotlib
  • Un compte Kaggle (gratuit)

Datasets

Exercice 1 : Explorer le Dataset

import pandas as pd

# Charger le dataset
df = pd.read_csv("llm_comparison.csv")

# Aperçu
print(f"Nombre de modèles : {len(df)}")
print(f"Colonnes : {df.columns.tolist()}")
print(df.head())

# Statistiques descriptives
print(df.describe())

Questions :

  • Combien de modèles sont référencés ?
  • Quelles métriques de benchmark sont disponibles ?
  • Y a-t-il des valeurs manquantes dans les prix ?

Exercice 2 : Visualiser Qualité vs Coût

Créez un graphique scatter pour voir d''un coup d''œil quels modèles offrent le meilleur compromis.

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(12, 7))

# Scatter plot
scatter = ax.scatter(
    df["price_per_1m_tokens"],
    df["mmlu_score"],
    s=60,
    c="#6366f1",
    alpha=0.7,
    edgecolors="white",
    linewidth=0.5
)

# Annoter chaque point
for _, row in df.iterrows():
    ax.annotate(
        row["model_name"],
        (row["price_per_1m_tokens"], row["mmlu_score"]),
        fontsize=6,
        alpha=0.8,
        xytext=(5, 5),
        textcoords="offset points"
    )

ax.set_xlabel("Prix par million de tokens ($)", fontsize=12)
ax.set_ylabel("Score MMLU (%)", fontsize=12)
ax.set_title("Qualité vs Coût des LLMs", fontsize=14)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("qualite_vs_cout.png", dpi=150)
plt.show()

Ce qu''il faut chercher : Les modèles en haut à gauche (haute qualité, bas prix) sont les meilleurs deals. Ceux en bas à droite (basse qualité, haut prix) sont à éviter.

Exercice 3 : Calculer le Rapport Qualité/Prix

# Score de rapport qualité/prix
# On ajoute 0.01 pour éviter la division par zéro (modèles gratuits)
df["rapport_qp"] = df["mmlu_score"] / (df["price_per_1m_tokens"] + 0.01)

# Top 10 meilleur rapport
top10 = df.nlargest(10, "rapport_qp")[["model_name", "mmlu_score", "price_per_1m_tokens", "rapport_qp"]]
print("=== Top 10 Meilleur Rapport Qualité/Prix ===")
print(top10.to_string(index=False))

# Top 10 pire rapport
worst10 = df.nsmallest(10, "rapport_qp")[["model_name", "mmlu_score", "price_per_1m_tokens", "rapport_qp"]]
print("\n=== Top 10 Pire Rapport Qualité/Prix ===")
print(worst10.to_string(index=False))

Exercice 4 : Simulation de Budget

Vous êtes CTO d''une startup. Vous devez choisir un modèle pour un chatbot qui traite 1 000 conversations par jour (200 tokens input + 400 tokens output chacune).

# Calcul du coût mensuel pour chaque modèle
tokens_input_jour = 1000 * 200    # 200k tokens/jour
tokens_output_jour = 1000 * 400   # 400k tokens/jour

# Supposons que price_per_1m_tokens est le prix moyen (input+output)
df["cout_jour"] = (tokens_input_jour + tokens_output_jour) / 1_000_000 * df["price_per_1m_tokens"]
df["cout_mois"] = df["cout_jour"] * 30

# Trier par coût mensuel
budget = df[["model_name", "mmlu_score", "cout_mois"]].sort_values("cout_mois")
print("=== Coût Mensuel Estimé ===")
print(budget.to_string(index=False))

# Modèles avec MMLU > 80% triés par coût
good_and_cheap = budget[df["mmlu_score"] > 80].head(10)
print("\n=== Modèles MMLU > 80% les Moins Chers ===")
print(good_and_cheap.to_string(index=False))

Résultat attendu : Vous verrez que certains modèles open-source coûtent moins de 5€/mois pour ce volume, tandis que les modèles premium dépassent 100€/mois.

Exercice 5 : Graphique Radar Multi-Critères

Comparez 3 modèles sur plusieurs dimensions à la fois.

import numpy as np

# Choisir 3 modèles à comparer (adaptez les noms selon votre dataset)
models_to_compare = ["gpt-4o", "claude-3-sonnet", "llama-3-70b"]
subset = df[df["model_name"].isin(models_to_compare)]

# Normaliser les métriques entre 0 et 1 (inversé pour le prix : moins = mieux)
metrics = ["mmlu_score", "humaneval_score", "price_per_1m_tokens"]
labels = ["MMLU", "HumanEval", "Coût (inversé)"]

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist()
angles += angles[:1]  # Fermer le polygone

colors = ["#6366f1", "#f59e0b", "#10b981"]

for i, (_, row) in enumerate(subset.iterrows()):
    values = [
        row["mmlu_score"] / 100,
        row.get("humaneval_score", 50) / 100,
        1 - min(row["price_per_1m_tokens"] / 50, 1),  # Inversé et normalisé
    ]
    values += values[:1]
    ax.plot(angles, values, "o-", linewidth=2, label=row["model_name"], color=colors[i])
    ax.fill(angles, values, alpha=0.1, color=colors[i])

ax.set_thetagrids(np.degrees(angles[:-1]), labels)
ax.set_ylim(0, 1)
ax.legend(loc="upper right", bbox_to_anchor=(1.3, 1.1))
ax.set_title("Comparaison Multi-Critères", fontsize=14)
plt.tight_layout()
plt.savefig("radar_comparison.png", dpi=150)
plt.show()

Pour Aller Plus Loin

  • Ajoutez la vitesse (tokens/seconde) comme critère en récupérant les données sur Artificial Analysis
  • Comparez les résultats avec les prix actuels sur OpenRouter (les prix changent régulièrement)
  • Créez un score composite personnalisé en pondérant les critères selon vos priorités

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.