ThePredictors / evaluate.py
YBDIXIT
commit
0033bf8
Raw
History Blame Contribute Delete
3.79 kB
import json
import requests
import time
from pathlib import Path
# Configuration de l'endpoint local de ton app.py
API_URL = "http://localhost:7860/query"
JSON_TEST_PATH = Path(__file__).parent / "test_qcm.json"
def load_test_dataset():
if not JSON_TEST_PATH.exists():
raise FileNotFoundError(f"Impossible de trouver le fichier {JSON_TEST_PATH}")
with open(JSON_TEST_PATH, "r", encoding="utf-8") as f:
return json.load(f)
def run_evaluation():
try:
dataset = load_test_dataset()
except Exception as e:
print(f"❌ Erreur de chargement du dataset : {e}")
return
print("=" * 60)
print(f"🚀 LANCEMENT DE L'ÉVALUATION AUTOMATIQUE ({len(dataset)} QCM)")
print("=" * 60)
metrics = {
"correct": 0,
"total": len(dataset),
"total_tokens": 0,
"prompt_tokens": 0,
"completion_tokens": 0,
"total_co2_grams": 0.0,
"total_time_ms": 0.0
}
for idx, item in enumerate(dataset, start=1):
# Formatage de la question et des options pour l'envoi au RAG
options_text = "\n".join([f"{k}) {v}" for k, v in item["options"].items()])
query_text = f"{item['question']}\n\nOptions :\n{options_text}"
payload = {
"query": query_text,
"top_k": 3 # Configurable selon tes tests d'optimisation
}
try:
start_perf = time.perf_counter()
response = requests.post(API_URL, json=payload, timeout=60)
response.raise_for_status()
res_data = response.json()
elapsed_ms = round((time.perf_counter() - start_perf) * 1000, 2)
# Extraction de l'option prédite par le LLM
answer_llm = res_data.get("answer", "").strip().upper()
expected_answer = item["correct_answer"].upper()
# Vérification de la lettre (ex: si "B - Le modèle..." commence par "B")
is_correct = answer_llm.startswith(expected_answer)
if is_correct:
metrics["correct"] += 1
status = "✅ CORRECT"
else:
status = f"❌ FAUX (Attendu: {expected_answer} | Reçu: {answer_llm[:5]})"
# Accumulation des métriques de performance et de sobriété
metrics["total_tokens"] += res_data.get("total_token", 0)
metrics["prompt_tokens"] += res_data.get("prompt_tokens", 0)
metrics["completion_tokens"] += res_data.get("completion_tokens", 0)
metrics["total_time_ms"] += res_data.get("run_time_in_ms", elapsed_ms)
co2 = res_data.get("co2_grams")
if isinstance(co2, (int, float)):
metrics["total_co2_grams"] += co2
print(f"[{idx}/{len(dataset)}] Q{item['id']} : {status} | Temps: {elapsed_ms}ms | Tokens: {res_data.get('total_token', 0)}")
except Exception as e:
print(f"[{idx}/{len(dataset)}] Q{item['id']} : 💥 ERREUR API : {e}")
# Calcul des scores finaux
accuracy = (metrics["correct"] / metrics["total"]) * 100 if metrics["total"] > 0 else 0
avg_time = metrics["total_time_ms"] / metrics["total"] if metrics["total"] > 0 else 0
print("\n" + "=" * 60)
print("📊 BILAN GLOBAL DE PERFORMANCE DU RAG")
print("=" * 60)
print(f"🎯 ACCURACY GLOBALE : {accuracy:.2f}% ({metrics['correct']}/{metrics['total']})")
print(f"🪙 TOTAL TOKENS CONSOMMÉS : {metrics['total_tokens']} (Prompt: {metrics['prompt_tokens']} | Gen: {metrics['completion_tokens']})")
print(f"🍃 EMPREINTE CARBONE : {metrics['total_co2_grams']:.4f} g CO2")
print(f"⚡ TEMPS MOYEN PAR REQUÊTE : {avg_time:.2f} ms")
print("=" * 60)
if __name__ == "__main__":
run_evaluation()