demo / backend /examine_results.py
tfrere's picture
update lighteval results
39acd70
raw
history blame
3.27 kB
import pandas as pd
import sys
import re
import difflib
from pprint import pprint
# Chemin vers le fichier parquet
parquet_file = "data/lighteval_results/details/Qwen/Qwen2.5-72B-Instruct/2025-04-01T13-30-41.628107/details_custom|yourbench|0_2025-04-01T13-30-41.628107.parquet"
# Fonction pour nettoyer les réponses (enlever balises XML, espaces, etc.)
def clean_response(response):
# Enlever les balises XML
response = re.sub(r'<answer>(.*?)</answer>', r'\1', response, flags=re.DOTALL)
# Normaliser les espaces
response = ' '.join(response.split())
return response.lower().strip()
# Charger le fichier parquet
df = pd.read_parquet(parquet_file)
# Afficher des informations de base
print(f"Nombre total d'exemples: {len(df)}")
print(f"Tous les scores: {[metric.get('accuracy', 'N/A') for metric in df['metrics']]}")
print("\n" + "="*80 + "\n")
# Analyser la similarité entre les réponses du modèle et les réponses de référence
print("ANALYSE DE SIMILARITÉ ENTRE RÉPONSES MODÈLE ET RÉPONSES DE RÉFÉRENCE\n")
total_correct_content = 0
for i in range(len(df)):
# Extraire les réponses
model_answer = df.iloc[i].predictions[0] if len(df.iloc[i].predictions) > 0 else "N/A"
reference_answer = df.iloc[i].choices[0] if len(df.iloc[i].choices) > 0 else "N/A"
question = df.iloc[i].specifics.get('question', 'N/A')
# Nettoyer les réponses pour comparaison
clean_model = clean_response(model_answer)
clean_reference = clean_response(reference_answer)
# Calculer la similarité
similarity = difflib.SequenceMatcher(None, clean_model, clean_reference).ratio()
# Vérifier si les éléments clés de la réponse de référence sont dans la réponse du modèle
key_terms = clean_reference.split()
important_terms = [term for term in key_terms if len(term) > 4] # Mots de plus de 4 lettres
terms_found = sum(1 for term in important_terms if term in clean_model)
term_coverage = terms_found / len(important_terms) if important_terms else 0
# Définir si le contenu de la réponse est correct (utiliser un seuil)
is_content_correct = term_coverage > 0.5 or similarity > 0.4
if is_content_correct:
total_correct_content += 1
# Afficher les résultats
print(f"EXEMPLE {i+1}:")
print(f"Question: {question}")
print(f"Réponse du modèle (nettoyée): {clean_model[:150]}..." if len(clean_model) > 150 else f"Réponse du modèle (nettoyée): {clean_model}")
print(f"Réponse de référence (nettoyée): {clean_reference}")
print(f"Ratio de similarité: {similarity:.2f}")
print(f"Couverture des termes importants: {term_coverage:.2f} ({terms_found}/{len(important_terms)})")
print(f"Contenu de la réponse jugé correct? {'OUI' if is_content_correct else 'NON'}")
# Quelques informations supplémentaires
print(f"Métrique LightEval: {df.iloc[i].metrics.get('accuracy', 'N/A')}")
print("-"*80 + "\n")
print(f"RÉSUMÉ: {total_correct_content}/{len(df)} réponses ({total_correct_content/len(df)*100:.1f}%) ont un contenu jugé correct selon notre analyse simple.")
print(f"Comparé à LightEval: {sum(metric.get('accuracy', 0) for metric in df['metrics'])}/{len(df)} réponses correctes.")