"sgl-router/src/routers/pd_router.rs" did not exist on "09ae5b20f3123487f36097d284a1f535cd267e7b"
utils.py 6.44 KB
Newer Older
Baber's avatar
nit  
Baber committed
1
import string
Baber's avatar
Baber committed
2
from functools import partial
Baber's avatar
Baber committed
3
from typing import TYPE_CHECKING, Dict, List
Baber's avatar
Baber committed
4

Baber's avatar
Baber committed
5
6
7

if TYPE_CHECKING:
    import datasets
Baber's avatar
Baber committed
8
9
10
11

from lm_eval.api.metrics import exact_match_fn


Baber's avatar
nit  
Baber committed
12
13
14
15
TRANSLATE_TABLE = str.maketrans(
    "", "", string.punctuation.replace(".", "")
)  # decimals are handled by the number_variations function
# extracted from https://huggingface.co/datasets/meta-llama/Llama-3.2-3B-Instruct-evals/viewer/Llama-3.2-3B-Instruct-evals__mgsm__details
Baber's avatar
Baber committed
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
PROMPTS = [
    {
        "rep": 'Solve this math problem. Give the reasoning steps before giving the final answer on the last line by itself in the format of "Answer:". Do not add anything other than the integer answer after "Answer:".',
        "subtask_name": "en",
    },
    {
        "rep": 'Решите эту математическую задачу. Объясните шаги рассуждения перед тем, как дать окончательный ответ в последней строке сам по себе в формате "Ответ:". Не добавляйте ничего, кроме целочисленного ответа после "Ответ:".',
        "subtask_name": "ru",
    },
    {
        "rep": 'Suluhisha tatizo hili la hesabu. Toa hatua za mantiki kabla ya kutoa jibu la mwisho kwenye mstari wa mwisho peke yake katika muundo wa "Jibu:". Usiongeze chochote kingine isipokuwa jibu la integer baada ya "Jibu:".',
        "subtask_name": "sw",
    },
    {
        "rep": 'Résolvez ce problème de mathématiques. Donnez les étapes de raisonnement avant de fournir la réponse finale sur la dernière ligne elle-même dans le format de "Réponse:". N\'ajoutez rien d\'autre que la réponse entière après "Réponse:".',
        "subtask_name": "fr",
    },
    {
        "rep": "ఈ గణిత సమస్యను పరిష్కరించండి. చివరి సమాధానాన్ని ఇవ్వదానికి ముందు తర్కాత్మక అదుగులను ఇవ్వండి. చివరి పంక్తిలో మాత్రమే 'సమాధానం:' అనే ఆకారంలో చివరి సమాధానాద్ని ఇవ్వండి సమాధానం: తర్వాత పూర్ణాంక సమాధానానికి తప్పించి ఎదేనా చేర్చవద్దు.",
        "subtask_name": "te",
    },
    {
        "rep": 'แก้ปัญหาคณิตศาสตร์นี้ ให้ให้ขั้นตอนการใช้เหตุผลก่อนที่จะให้คำตอบสุดท้ายในบรรทัดสุดท้ายโดยอยู่ในรูปแบบ "คำตอบ:" ไม่ควรเพิ่มอะไรนอกจากคำตอบที่เป็นจำนวนเต็มหลังจาก "คำตอบ:',
        "subtask_name": "th",
    },
    {
        "rep": 'の数学の問題を解いてください。最終的な答えを出す前に、解答の推論過程を記述してください。そして最後の行には "答え:" の形式で答えを記述し、その後には整数の答え以外何も追加しないでください。',
        "subtask_name": "ja",
    },
    {
        "rep": 'Löse dieses Mathematikproblem. Gib die Schritte zur Begründung an, bevor du die endgültige Antwort in der letzten Zeile alleine im Format "Antwort:" gibst. Füge nichts anderes als die ganzzahlige Antwort nach "Antwort:" hinzu.',
        "subtask_name": "de",
    },
    {
        "rep": 'এই গণিতের সমস্যাটি সমাধান করুন। চূড়ান্ত উত্তর দেওয়ার আগে যুক্তিসম্পন্ন পদক্ষেপ প্রদান করুন। চূড়ান্ত উত্তরটি একক সংখ্যা হিসাবে "উত্তর:" এর পরে শেষ লাইনে দিন। "উত্তর:" এর পরে অন্য কিছু যুক্ত করবেন না।.',
        "subtask_name": "bn",
    },
    {
        "rep": '解决这个数学问题。在最后一行给出答案前,请提供推理步骤。最后一行应该以 "答案: " 的形式独立给出答案。在 "答案:" 后不要添加除整数答案之外的任何内容。',
        "subtask_name": "zh",
    },
    {
        "rep": 'Resuelve este problema matemático. Proporciona los pasos de razonamiento antes de dar la respuesta final en la última línea por sí misma en el formato de "Respuesta:". No añadas nada más que la respuesta entera después de "Respuesta:".',
        "subtask_name": "es",
    },
]


Baber's avatar
Baber committed
64
def number_variations(n: int) -> List[str]:
Baber's avatar
Baber committed
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
    formats = []
    # Generate each pattern twice
    for _ in range(2):
        # Basic string representation
        formats.append(str(n))
        formats.append(f"{n}.")

        # With one decimal place
        formats.append(f"{n}.0")
        formats.append(f"{n}.0.")

        # With two decimal places
        formats.append(f"{n}.00")
        formats.append(f"{n}.00.")

    return formats


Baber's avatar
Baber committed
83
def process_docs(lang: str, df: "datasets.Dataset") -> "datasets.Dataset":
Baber's avatar
Baber committed
84
85
    def map_(doc: dict):
        suffix = [x for x in PROMPTS if x["subtask_name"] == lang][0]["rep"]
Baber's avatar
Baber committed
86
        doc["question"] = suffix + "\n\n" + doc["question"].split(":", 1)[-1]
Baber's avatar
Baber committed
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
        doc["answers"] = number_variations(doc["answer_number"])
        return doc

    return df.map(map_)


process_docs_bn = partial(process_docs, "bn")
process_docs_de = partial(process_docs, "de")
process_docs_en = partial(process_docs, "en")
process_docs_es = partial(process_docs, "es")
process_docs_fr = partial(process_docs, "fr")
process_docs_ja = partial(process_docs, "ja")
process_docs_ru = partial(process_docs, "ru")
process_docs_sw = partial(process_docs, "sw")
process_docs_te = partial(process_docs, "te")
process_docs_th = partial(process_docs, "th")
process_docs_zh = partial(process_docs, "zh")


Baber's avatar
Baber committed
106
def process_results(doc: dict, prediction: List[str]) -> Dict[str, int]:
Baber's avatar
Baber committed
107
    gold: List = doc["answers"]
Baber's avatar
Baber committed
108
109
110
    return {
        "exact_match": int(
            exact_match_fn(
Baber's avatar
nit  
Baber committed
111
112
                predictions=[x.strip().translate(TRANSLATE_TABLE) for x in prediction]
                * len(gold),
Baber's avatar
Baber committed
113
114
                references=gold,
                ignore_case=True,
Baber's avatar
Baber committed
115
                ignore_punctuation=True,
Baber's avatar
Baber committed
116
117
118
119
            )["exact_match"]
            > 0
        )
    }