template.py 2.46 KB
Newer Older
Baber's avatar
Baber committed
1
2
from __future__ import annotations

Baber's avatar
Baber committed
3
from dataclasses import dataclass, field
Baber's avatar
Baber committed
4
from typing import TYPE_CHECKING, Callable
Baber's avatar
Baber committed
5
6
7
8
9
10
11
12
13
14
15


if TYPE_CHECKING:
    from lm_eval.config.metric import MetricConfig


@dataclass
class TemplateConfig:
    """Encapsulates information about a template."""

    template: str
Baber's avatar
Baber committed
16
17
18
    doc_to_text: str | Callable[[dict], str]
    doc_to_choice: str | list | Callable[[dict], list]
    doc_to_target: int | Callable[[dict], int]
Baber's avatar
Baber committed
19
20
21
22
23
24
    description: str
    context_prefix: str
    prefix_delimiter: str
    context_delimiter: str
    answer_suffix: str
    target_delimiter: str
Baber's avatar
Baber committed
25
26
    choice_format: str | None
    choice_delimiter: str | None
Baber's avatar
Baber committed
27
    fewshot_delimiter: str
Baber's avatar
Baber committed
28
    metric_list: list[str] | list[MetricConfig] | None = field(
Baber's avatar
Baber committed
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
        default_factory=lambda: ["acc", "acc_norm"]
    )


@dataclass
class MCQTemplateConfig:
    """Encapsulates information about a template.
    Would return a sample with the following format:
    Question: <doc_to_text(doc)>
    A. <doc_to_choice(doc)[0]>
    B. <doc_to_choice(doc)[1]>
    C. <doc_to_choice(doc)[2]>
    D. <doc_to_choice(doc)[3]>
    Answer:` doc_to_choice(doc)` for each choice.
    """

Baber's avatar
Baber committed
45
46
47
    doc_to_text: str | Callable[[dict], str]
    doc_to_choice: str | list | Callable[[dict], list]
    doc_to_target: int | Callable[[dict], int]
Baber's avatar
Baber committed
48
49
50
51
52
53
    template = "mcq"
    context_prefix: str = "Question:"
    prefix_delimiter: str = " "
    context_delimiter: str = "\n"
    answer_suffix: str = "Answer:"
    target_delimiter: str = "\n"
Baber's avatar
Baber committed
54
55
    choice_format: str | None = "letters"
    choice_delimiter: str | None = "\n"
Baber's avatar
Baber committed
56
    fewshot_delimiter: str = "\n\n"
Baber's avatar
Baber committed
57
    metric_list: list[MetricConfig] | None = field(default_factory=lambda: ["acc"])
Baber's avatar
Baber committed
58
59
60
61
62
63
64
65
66
67


@dataclass
class ClozeTemplateConfig:
    """Encapsulates information about a template.
    Would return a sample with the following format:
    Question:  <doc_to_text(doc)>
    Answer:` <doc_to_target(doc)>`
    """

Baber's avatar
Baber committed
68
69
70
    doc_to_text: str | Callable[[dict], str]
    doc_to_choice: str | list | Callable[[dict], list]
    doc_to_target: int | Callable[[dict], int]
Baber's avatar
Baber committed
71
72
73
74
75
76
77
    template: str = "cloze"
    description: str = ""
    context_prefix: str = "Question:"
    prefix_delimiter: str = " "
    context_delimiter: str = "\n"
    answer_suffix: str = "Answer:"
    target_delimiter: str = " "
Baber's avatar
Baber committed
78
79
    choice_format: str | None = None
    choice_delimiter: str | None = None
Baber's avatar
Baber committed
80
    fewshot_delimiter: str = "\n\n"
Baber's avatar
Baber committed
81
    metric_list: list[MetricConfig] | None = field(
Baber's avatar
Baber committed
82
83
        default_factory=lambda: ["acc", "acc_norm"]
    )