import re import os from pprint import pprint # Chemin vers le fichier de log du juge log_file = "lighteval_judge.log" # Fonction pour extraire les évaluations du juge def extract_judge_evaluations(log_content): # Pattern pour trouver les réponses du juge pattern = r"Judge response: (.*?)(?=Judge response:|$)" # Extraire toutes les réponses responses = re.findall(pattern, log_content, re.DOTALL) # Analyser chaque réponse pour extraire la décision finale evaluations = [] for i, response in enumerate(responses): # Chercher la décision finale dans les balises XML final_answer_match = re.search(r"(.*?)", response, re.DOTALL) if final_answer_match: final_answer = final_answer_match.group(1).strip() evaluations.append({ "id": i+1, "final_answer": final_answer, "full_response": response[:500] + "..." if len(response) > 500 else response }) else: # Si pas de balise XML, chercher des mots-clés if re.search(r"\b(correct|vrai|true|yes|1)\b", response, re.IGNORECASE): final_answer = "1 (déduit sans balise XML)" elif re.search(r"\b(incorrect|faux|false|no|0)\b", response, re.IGNORECASE): final_answer = "0 (déduit sans balise XML)" else: final_answer = "Non détecté" evaluations.append({ "id": i+1, "final_answer": final_answer, "full_response": response[:500] + "..." if len(response) > 500 else response }) return evaluations # Fonction pour extraire les requêtes envoyées au juge def extract_judge_prompts(log_content): # Pattern pour trouver les requêtes pattern = r"Prompt sent to judge: (.*?)(?=Prompt sent to judge:|Judge response:|$)" # Extraire toutes les requêtes prompts = re.findall(pattern, log_content, re.DOTALL) # Analyser chaque requête analyzed_prompts = [] for i, prompt in enumerate(prompts): # Extraire les questions, réponses et réponses de référence question_match = re.search(r"(.*?)", prompt, re.DOTALL) model_answer_match = re.search(r"(.*?)", prompt, re.DOTALL) gold_answer_match = re.search(r"(.*?)", prompt, re.DOTALL) question = question_match.group(1).strip() if question_match else "Non détecté" model_answer = model_answer_match.group(1).strip() if model_answer_match else "Non détecté" gold_answer = gold_answer_match.group(1).strip() if gold_answer_match else "Non détecté" analyzed_prompts.append({ "id": i+1, "question": question, "model_answer": model_answer[:200] + "..." if len(model_answer) > 200 else model_answer, "gold_answer": gold_answer[:200] + "..." if len(gold_answer) > 200 else gold_answer }) return analyzed_prompts # Lire le fichier de log if os.path.exists(log_file): with open(log_file, 'r', encoding='utf-8') as f: log_content = f.read() # Extraire les évaluations evaluations = extract_judge_evaluations(log_content) # Extraire les prompts prompts = extract_judge_prompts(log_content) # Afficher le résumé des évaluations print(f"Nombre total d'évaluations: {len(evaluations)}") print("\nRésumé des décisions:") decisions = {} for eval in evaluations: decision = eval["final_answer"] decisions[decision] = decisions.get(decision, 0) + 1 for decision, count in decisions.items(): print(f" {decision}: {count} fois ({count/len(evaluations)*100:.1f}%)") # Afficher les détails des évaluations print("\n" + "="*80) print("DÉTAIL DES COMPARAISONS QUESTION/RÉPONSE/RÉFÉRENCE/DÉCISION") print("="*80 + "\n") for i in range(min(len(prompts), len(evaluations))): prompt = prompts[i] eval = evaluations[i] print(f"EXEMPLE {i+1}:") print(f"Question: {prompt['question']}") print(f"\nRéponse du modèle: {prompt['model_answer']}") print(f"\nRéponse de référence: {prompt['gold_answer']}") print(f"\nDécision du juge: {eval['final_answer']}") print(f"\nExtrait de la réponse complète du juge:") print(eval['full_response'][:300] + "..." if len(eval['full_response']) > 300 else eval['full_response']) print("\n" + "-"*80 + "\n") else: print(f"Fichier de log {log_file} non trouvé.")