Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
update light eval task
Browse files
backend/lighteval_task/lighteval_task.py
CHANGED
@@ -38,7 +38,7 @@ from lighteval.tasks.lighteval_task import LightevalTaskConfig
|
|
38 |
from lighteval.tasks.requests import Doc
|
39 |
|
40 |
|
41 |
-
logger = logging.getLogger(__name__)
|
42 |
|
43 |
JUDGE_ANSWER_SYSTEM_PROMPT = """You will be provided with the summary of a document, a piece of text, a question generated from that text, and the correct or "gold" answer to the question. Additionally, you will receive a model answer. Your task is to determine wether the model answer is correct using the provided "gold" answer as a reference.
|
44 |
# Steps
|
@@ -144,38 +144,38 @@ def get_judge_prompt(question: str, answer: str, gold: str, **kwargs):
|
|
144 |
|
145 |
def process_judge_response_yourbench(response):
|
146 |
# Ajouter des logs détaillés pour comprendre la structure des réponses
|
147 |
-
logger.info(f"Type de réponse: {type(response)}")
|
148 |
|
149 |
# Si la réponse est un dictionnaire, extraire le contenu
|
150 |
if isinstance(response, dict):
|
151 |
-
logger.info(f"Clés du dictionnaire: {response.keys()}")
|
152 |
if "content" in response:
|
153 |
response = response["content"]
|
154 |
-
logger.info(f"Contenu de la clé 'content': {response[:100]}...")
|
155 |
elif "text" in response:
|
156 |
response = response["text"]
|
157 |
-
logger.info(f"Contenu de la clé 'text': {response[:100]}...")
|
158 |
elif "response" in response:
|
159 |
response = response["response"]
|
160 |
-
logger.info(f"Contenu de la clé 'response': {response[:100]}...")
|
161 |
else:
|
162 |
# Si on ne trouve pas de champ texte, on prend la première valeur
|
163 |
response = str(list(response.values())[0])
|
164 |
-
logger.info(f"Utilisation de la première valeur: {response[:100]}...")
|
165 |
|
166 |
# Si la réponse est une liste, prendre le premier élément
|
167 |
if isinstance(response, list):
|
168 |
-
logger.info(f"Réponse est une liste de longueur {len(response)}")
|
169 |
if len(response) > 0:
|
170 |
if isinstance(response[0], dict) and "content" in response[0]:
|
171 |
response = response[0]["content"]
|
172 |
-
logger.info(f"Utilisation du contenu du premier élément: {response[:100]}...")
|
173 |
else:
|
174 |
response = str(response[0])
|
175 |
-
logger.info(f"Utilisation du premier élément (converti en string): {response[:100]}...")
|
176 |
|
177 |
# Pour le débogage, logguer la réponse actuelle
|
178 |
-
logger.info(f"Réponse après traitement initial: {str(response)[:200]}...")
|
179 |
|
180 |
# Approche simplifiée : si nous avons une réponse, nous allons l'analyser pour déterminer 0 ou 1
|
181 |
try:
|
@@ -201,17 +201,17 @@ def process_judge_response_yourbench(response):
|
|
201 |
# Vérifier s'il y a des patterns négatifs
|
202 |
for pattern in negative_patterns:
|
203 |
if re.search(pattern, response_str):
|
204 |
-
logger.info(f"Pattern négatif trouvé: {pattern} dans la réponse")
|
205 |
return 0
|
206 |
|
207 |
# Si nous n'avons pas trouvé de pattern négatif, considérer la réponse comme correcte
|
208 |
-
logger.info("Aucun pattern négatif trouvé, réponse considérée comme correcte")
|
209 |
return 1
|
210 |
|
211 |
except Exception as e:
|
212 |
-
logger.error(f"Error processing judge response: {e}")
|
213 |
-
logger.error(f"Response type: {type(response)}")
|
214 |
-
logger.error(f"Response content (truncated): {str(response)[:500]}")
|
215 |
return 0 # Par défaut, retourner 0 en cas d'erreur
|
216 |
|
217 |
|
@@ -227,9 +227,9 @@ class JudgeLLMYourBench(JudgeLLM):
|
|
227 |
|
228 |
def compute(self, sample_ids: list[str], responses: list, formatted_docs: list[Doc]) -> list[dict[str, float]]:
|
229 |
# Ajout de debugging pour voir la structure complète des données
|
230 |
-
logger.info(f"Nombre de sample_ids: {len(sample_ids)}")
|
231 |
-
logger.info(f"Nombre de responses: {len(responses)}")
|
232 |
-
logger.info(f"Nombre de formatted_docs: {len(formatted_docs)}")
|
233 |
|
234 |
try:
|
235 |
# If we are evaluating a multiturn task, we need to have specific field in the formatted doc
|
@@ -237,15 +237,7 @@ class JudgeLLMYourBench(JudgeLLM):
|
|
237 |
golds = [formatted_doc.get_golds()[0] for formatted_doc in formatted_docs]
|
238 |
predictions = [response[0].result[0] for response in responses]
|
239 |
options = [None] * len(questions)
|
240 |
-
|
241 |
-
# Ajout de logs détaillés avant l'accès problématique
|
242 |
-
for i, doc in enumerate(formatted_docs):
|
243 |
-
logger.info(f"Document {i} - Clés: {doc.specific.keys()}")
|
244 |
-
if "chunks" in doc.specific:
|
245 |
-
logger.info(f"Document {i} - Chunks: {doc.specific['chunks']} (type: {type(doc.specific['chunks'])}, longueur: {len(doc.specific['chunks'])})")
|
246 |
-
else:
|
247 |
-
logger.info(f"Document {i} - Pas de chunks trouvés!")
|
248 |
-
|
249 |
# Protection contre les listes vides
|
250 |
chunks = []
|
251 |
for doc in formatted_docs:
|
@@ -258,9 +250,9 @@ class JudgeLLMYourBench(JudgeLLM):
|
|
258 |
documents = [formatted_doc.specific["document"] for formatted_doc in formatted_docs]
|
259 |
|
260 |
# Ajout de logs pour déboguer
|
261 |
-
logger.info(f"Questions: {questions}")
|
262 |
-
logger.info(f"Predictions: {predictions}")
|
263 |
-
logger.info(f"Golds: {golds}")
|
264 |
|
265 |
# Au lieu d'utiliser le juge, qui semble avoir des problèmes,
|
266 |
# Utilisons une approche simplifiée basée sur la présence des éléments clés
|
@@ -281,12 +273,12 @@ class JudgeLLMYourBench(JudgeLLM):
|
|
281 |
# C'est moins strict que les 60% initiaux, mais plus strict que 0%
|
282 |
score = 1.0 if coverage >= 0.4 else 0.0
|
283 |
|
284 |
-
logger.info(f"Couverture des mots clés pour la question {i+1}: {coverage:.2f} ({matches}/{len(key_terms)})")
|
285 |
-
logger.info(f"Score attribué: {score}")
|
286 |
|
287 |
scores.append(score)
|
288 |
|
289 |
-
logger.info(f"Scores bruts: {scores}")
|
290 |
|
291 |
metrics = []
|
292 |
for i in range(len(sample_ids)):
|
@@ -299,8 +291,8 @@ class JudgeLLMYourBench(JudgeLLM):
|
|
299 |
return metrics
|
300 |
|
301 |
except Exception as e:
|
302 |
-
logger.error(f"Erreur dans la fonction compute: {str(e)}")
|
303 |
-
logger.exception("Détails de l'erreur:")
|
304 |
|
305 |
# Retourner un résultat par défaut en cas d'erreur
|
306 |
return [{"accuracy": 0.0} for _ in sample_ids]
|
|
|
38 |
from lighteval.tasks.requests import Doc
|
39 |
|
40 |
|
41 |
+
# logger = logging.getLogger(__name__)
|
42 |
|
43 |
JUDGE_ANSWER_SYSTEM_PROMPT = """You will be provided with the summary of a document, a piece of text, a question generated from that text, and the correct or "gold" answer to the question. Additionally, you will receive a model answer. Your task is to determine wether the model answer is correct using the provided "gold" answer as a reference.
|
44 |
# Steps
|
|
|
144 |
|
145 |
def process_judge_response_yourbench(response):
|
146 |
# Ajouter des logs détaillés pour comprendre la structure des réponses
|
147 |
+
# logger.info(f"Type de réponse: {type(response)}")
|
148 |
|
149 |
# Si la réponse est un dictionnaire, extraire le contenu
|
150 |
if isinstance(response, dict):
|
151 |
+
# logger.info(f"Clés du dictionnaire: {response.keys()}")
|
152 |
if "content" in response:
|
153 |
response = response["content"]
|
154 |
+
# logger.info(f"Contenu de la clé 'content': {response[:100]}...")
|
155 |
elif "text" in response:
|
156 |
response = response["text"]
|
157 |
+
# logger.info(f"Contenu de la clé 'text': {response[:100]}...")
|
158 |
elif "response" in response:
|
159 |
response = response["response"]
|
160 |
+
# logger.info(f"Contenu de la clé 'response': {response[:100]}...")
|
161 |
else:
|
162 |
# Si on ne trouve pas de champ texte, on prend la première valeur
|
163 |
response = str(list(response.values())[0])
|
164 |
+
# logger.info(f"Utilisation de la première valeur: {response[:100]}...")
|
165 |
|
166 |
# Si la réponse est une liste, prendre le premier élément
|
167 |
if isinstance(response, list):
|
168 |
+
# logger.info(f"Réponse est une liste de longueur {len(response)}")
|
169 |
if len(response) > 0:
|
170 |
if isinstance(response[0], dict) and "content" in response[0]:
|
171 |
response = response[0]["content"]
|
172 |
+
# logger.info(f"Utilisation du contenu du premier élément: {response[:100]}...")
|
173 |
else:
|
174 |
response = str(response[0])
|
175 |
+
# logger.info(f"Utilisation du premier élément (converti en string): {response[:100]}...")
|
176 |
|
177 |
# Pour le débogage, logguer la réponse actuelle
|
178 |
+
# logger.info(f"Réponse après traitement initial: {str(response)[:200]}...")
|
179 |
|
180 |
# Approche simplifiée : si nous avons une réponse, nous allons l'analyser pour déterminer 0 ou 1
|
181 |
try:
|
|
|
201 |
# Vérifier s'il y a des patterns négatifs
|
202 |
for pattern in negative_patterns:
|
203 |
if re.search(pattern, response_str):
|
204 |
+
# logger.info(f"Pattern négatif trouvé: {pattern} dans la réponse")
|
205 |
return 0
|
206 |
|
207 |
# Si nous n'avons pas trouvé de pattern négatif, considérer la réponse comme correcte
|
208 |
+
# logger.info("Aucun pattern négatif trouvé, réponse considérée comme correcte")
|
209 |
return 1
|
210 |
|
211 |
except Exception as e:
|
212 |
+
# logger.error(f"Error processing judge response: {e}")
|
213 |
+
# logger.error(f"Response type: {type(response)}")
|
214 |
+
# logger.error(f"Response content (truncated): {str(response)[:500]}")
|
215 |
return 0 # Par défaut, retourner 0 en cas d'erreur
|
216 |
|
217 |
|
|
|
227 |
|
228 |
def compute(self, sample_ids: list[str], responses: list, formatted_docs: list[Doc]) -> list[dict[str, float]]:
|
229 |
# Ajout de debugging pour voir la structure complète des données
|
230 |
+
# logger.info(f"Nombre de sample_ids: {len(sample_ids)}")
|
231 |
+
# logger.info(f"Nombre de responses: {len(responses)}")
|
232 |
+
# logger.info(f"Nombre de formatted_docs: {len(formatted_docs)}")
|
233 |
|
234 |
try:
|
235 |
# If we are evaluating a multiturn task, we need to have specific field in the formatted doc
|
|
|
237 |
golds = [formatted_doc.get_golds()[0] for formatted_doc in formatted_docs]
|
238 |
predictions = [response[0].result[0] for response in responses]
|
239 |
options = [None] * len(questions)
|
240 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
241 |
# Protection contre les listes vides
|
242 |
chunks = []
|
243 |
for doc in formatted_docs:
|
|
|
250 |
documents = [formatted_doc.specific["document"] for formatted_doc in formatted_docs]
|
251 |
|
252 |
# Ajout de logs pour déboguer
|
253 |
+
# logger.info(f"Questions: {questions}")
|
254 |
+
# logger.info(f"Predictions: {predictions}")
|
255 |
+
# logger.info(f"Golds: {golds}")
|
256 |
|
257 |
# Au lieu d'utiliser le juge, qui semble avoir des problèmes,
|
258 |
# Utilisons une approche simplifiée basée sur la présence des éléments clés
|
|
|
273 |
# C'est moins strict que les 60% initiaux, mais plus strict que 0%
|
274 |
score = 1.0 if coverage >= 0.4 else 0.0
|
275 |
|
276 |
+
# logger.info(f"Couverture des mots clés pour la question {i+1}: {coverage:.2f} ({matches}/{len(key_terms)})")
|
277 |
+
# logger.info(f"Score attribué: {score}")
|
278 |
|
279 |
scores.append(score)
|
280 |
|
281 |
+
# logger.info(f"Scores bruts: {scores}")
|
282 |
|
283 |
metrics = []
|
284 |
for i in range(len(sample_ids)):
|
|
|
291 |
return metrics
|
292 |
|
293 |
except Exception as e:
|
294 |
+
# logger.error(f"Erreur dans la fonction compute: {str(e)}")
|
295 |
+
# logger.exception("Détails de l'erreur:")
|
296 |
|
297 |
# Retourner un résultat par défaut en cas d'erreur
|
298 |
return [{"accuracy": 0.0} for _ in sample_ids]
|
backend/tasks/evaluation_task.py
CHANGED
@@ -17,7 +17,7 @@ from huggingface_hub import HfApi
|
|
17 |
import asyncio
|
18 |
|
19 |
# Valeur par défaut du timeout
|
20 |
-
DEFAULT_EVALUATION_TIMEOUT =
|
21 |
|
22 |
class EvaluationTask:
|
23 |
"""
|
@@ -319,6 +319,7 @@ TASKS_TABLE = [yourbench]
|
|
319 |
models = [
|
320 |
"Qwen/QwQ-32B",
|
321 |
"Qwen/Qwen2.5-72B-Instruct",
|
|
|
322 |
"meta-llama/Llama-3.3-70B-Instruct",
|
323 |
"deepseek-ai/DeepSeek-R1-Distill-Llama-70B",
|
324 |
"mistralai/Mistral-Small-24B-Instruct-2501",
|
|
|
17 |
import asyncio
|
18 |
|
19 |
# Valeur par défaut du timeout
|
20 |
+
DEFAULT_EVALUATION_TIMEOUT = 120.0 # 1 minute par défaut
|
21 |
|
22 |
class EvaluationTask:
|
23 |
"""
|
|
|
319 |
models = [
|
320 |
"Qwen/QwQ-32B",
|
321 |
"Qwen/Qwen2.5-72B-Instruct",
|
322 |
+
"google/gemma-3-27b-it",
|
323 |
"meta-llama/Llama-3.3-70B-Instruct",
|
324 |
"deepseek-ai/DeepSeek-R1-Distill-Llama-70B",
|
325 |
"mistralai/Mistral-Small-24B-Instruct-2501",
|
frontend/src/components/BenchmarkEvaluation.jsx
CHANGED
@@ -4,7 +4,7 @@ import { useNavigate, useSearchParams } from "react-router-dom";
|
|
4 |
import API_CONFIG from "../config/api";
|
5 |
|
6 |
// Temps de simulation en millisecondes pour les documents précalculés
|
7 |
-
const SIMULATION_DURATION =
|
8 |
|
9 |
// Intervalle de changement des messages pour les documents standards vs précalculés
|
10 |
const MESSAGE_CHANGE_INTERVAL = {
|
|
|
4 |
import API_CONFIG from "../config/api";
|
5 |
|
6 |
// Temps de simulation en millisecondes pour les documents précalculés
|
7 |
+
const SIMULATION_DURATION = 120000; // 20 secondes
|
8 |
|
9 |
// Intervalle de changement des messages pour les documents standards vs précalculés
|
10 |
const MESSAGE_CHANGE_INTERVAL = {
|