tfrere commited on
Commit
1728789
·
1 Parent(s): 9afe01c

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 = 70.0 # 1 minute par défaut
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 = 70000; // 20 secondes
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 = {