Files
zk-data-agent/benchmarks/suites/mmmlu.py
T
Abdelrahman Abdallah 90489e7bfc Add 7 new benchmark suites for Gemma 4 comparison
New suites:
- MMLU-Pro: Professional-level 10-choice QA (14 subjects)
- GPQA-Diamond: Graduate-level science QA
- BigBench Extra Hard: Challenging reasoning tasks
- MMMLU: Multilingual MMLU across 10 languages
- HLE: Humanity's Last Exam (extremely hard)
- Tau2: Tool-augmented reasoning (retail/airline/finance)
- Codeforces: Competitive programming with ELO scoring

Updates:
- AIME now supports aime_2026.jsonl for 2026 problems
- Registry expanded to 17 suites in 5 categories
- download_datasets.py supports HF downloads for new suites
- README.md updated with full documentation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-07 04:55:31 +02:00

192 lines
6.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
MMMLU (Multilingual Massive Multitask Language Understanding) benchmark suite.
MMMLU extends MMLU to multiple languages, testing language understanding
across diverse cultural and linguistic contexts.
Reference: https://huggingface.co/datasets/openai/MMMLU
"""
from __future__ import annotations
import json
import os
import re
from pathlib import Path
from typing import Any
from .base import BenchmarkResult, BenchmarkSuite
# ---------------------------------------------------------------------------
# Built-in mini dataset (10 representative MMMLU problems — multilingual)
# ---------------------------------------------------------------------------
_BUILTIN_PROBLEMS: list[dict[str, Any]] = [
{
"id": "mmmlu-001",
"language": "en",
"subject": "abstract_algebra",
"question": "Find the degree of the extension Q(sqrt(2), sqrt(3), sqrt(18)) over Q.",
"choices": ["0", "4", "2", "6"],
"answer": "B",
},
{
"id": "mmmlu-002",
"language": "es",
"subject": "anatomy",
"question": "¿Cuál de los siguientes músculos es el principal responsable de la abducción del brazo?",
"choices": ["Deltoides", "Trapecio", "Pectoral mayor", "Dorsal ancho"],
"answer": "A",
},
{
"id": "mmmlu-003",
"language": "fr",
"subject": "astronomy",
"question": "Quelle est la planète la plus proche du Soleil?",
"choices": ["Vénus", "Terre", "Mercure", "Mars"],
"answer": "C",
},
{
"id": "mmmlu-004",
"language": "de",
"subject": "business_ethics",
"question": "Welcher der folgenden Begriffe beschreibt die Verantwortung eines Unternehmens gegenüber der Gesellschaft am besten?",
"choices": ["Corporate Social Responsibility", "Shareholder Theory", "Laissez-faire", "Monopol"],
"answer": "A",
},
{
"id": "mmmlu-005",
"language": "zh",
"subject": "computer_science",
"question": "在计算机科学中,二叉搜索树的平均时间复杂度是多少?",
"choices": ["O(n)", "O(log n)", "O(n²)", "O(1)"],
"answer": "B",
},
{
"id": "mmmlu-006",
"language": "ja",
"subject": "world_history",
"question": "フランス革命が始まったのは何年ですか?",
"choices": ["1776年", "1789年", "1804年", "1815年"],
"answer": "B",
},
{
"id": "mmmlu-007",
"language": "pt",
"subject": "geography",
"question": "Qual é o rio mais longo do mundo?",
"choices": ["Amazonas", "Nilo", "Mississipi", "Yangtzé"],
"answer": "B",
},
{
"id": "mmmlu-008",
"language": "it",
"subject": "philosophy",
"question": "Chi ha scritto 'La Repubblica'?",
"choices": ["Aristotele", "Platone", "Socrate", "Epicuro"],
"answer": "B",
},
{
"id": "mmmlu-009",
"language": "ko",
"subject": "physics",
"question": "뉴턴의 제2법칙에서 힘의 공식은?",
"choices": ["F = mv", "F = ma", "F = mg", "F = mc²"],
"answer": "B",
},
{
"id": "mmmlu-010",
"language": "ar",
"subject": "chemistry",
"question": "ما هو العنصر الأكثر وفرة في القشرة الأرضية؟",
"choices": ["الحديد", "الأكسجين", "السيليكون", "الألمنيوم"],
"answer": "B",
},
]
class MMMMLUBenchmark(BenchmarkSuite):
"""MMMLU: Multilingual MMLU across diverse languages."""
name = "MMMLU"
description = "Multilingual multiple-choice QA across languages and subjects"
category = "knowledge"
def load_dataset(self) -> list[dict[str, Any]]:
jsonl_path = Path(self.data_dir) / "mmmlu.jsonl"
if jsonl_path.exists():
problems: list[dict[str, Any]] = []
with open(jsonl_path) as fh:
for line in fh:
line = line.strip()
if line:
problems.append(json.loads(line))
if self.verbose:
print(f" Loaded {len(problems)} problems from {jsonl_path}")
return problems
if self.verbose:
print(f" {jsonl_path} not found — using built-in 10-problem subset")
return list(_BUILTIN_PROBLEMS)
def build_prompt(self, problem: dict[str, Any]) -> str:
question = problem["question"]
choices = problem.get("choices", [])
language = problem.get("language", "en")
letters = "ABCD"
choices_text = "\n".join(
f" {letters[i]}. {c}" for i, c in enumerate(choices)
)
lang_instruction = ""
if language != "en":
lang_instruction = f"The question is in {language}. "
return (
f"Answer the following multiple-choice question. {lang_instruction}\n\n"
f"Question: {question}\n\n"
f"Choices:\n{choices_text}\n\n"
f"Write ONLY the letter of the correct answer (AD) to a file called answer.txt — "
f"no explanation, just the single letter."
)
def recover_output_files(
self,
problem: dict[str, Any],
workspace: str,
agent_output: str,
metadata: dict[str, Any],
) -> None:
del problem
answer_path = Path(workspace) / "answer.txt"
if answer_path.exists():
return
match = re.search(r"\b([A-D])\b", agent_output)
if match:
answer_path.write_text(match.group(1) + "\n", encoding="utf-8")
metadata["recovered_answer_from_output"] = True
def evaluate(self, problem: dict[str, Any], workspace: str) -> BenchmarkResult:
pid = problem.get("id", "unknown")
expected = str(problem["answer"]).strip().upper()
answer_file = os.path.join(workspace, "answer.txt")
if not os.path.exists(answer_file):
return BenchmarkResult(
problem_id=pid, passed=False, expected=expected,
error="answer.txt not found",
)
with open(answer_file) as fh:
actual_raw = fh.read().strip()
match = re.search(r"\b([A-D])\b", actual_raw.upper())
actual = match.group(1) if match else actual_raw.strip().upper()
passed = actual == expected
return BenchmarkResult(
problem_id=pid, passed=passed,
expected=expected, actual=actual_raw,
error="" if passed else f"expected={expected}, got={actual_raw}",
)