File size: 3,481 Bytes
0341212
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
from typing import Any

from pydantic import BaseModel, Field


# Определение моделей Pydantic
class EvaluationParams(BaseModel):
    similarity_threshold: float = Field(
        ...,
        ge=0.0,
        le=1.0,
        description="Порог схожести для fuzzy сравнения (от 0.0 до 1.0)",
        examples=[0.7]
    )
    top_n_values: list[int] = Field(
        ...,
        min_items=1,
        description="Список значений Top-N для оценки",
        examples=[[10, 20, 50]]
    )
    use_query_expansion: bool = Field(
        default=False,
        description="Использовать ли Query Expansion перед поиском для каждого вопроса",
        examples=[True]
    )
    top_worst_k: int = Field(
        default=5,
        ge=1,
        description="Количество худших вопросов для вывода",
        examples=[5]
    )

class Metrics(BaseModel):
    macro_precision: float | None
    macro_recall: float | None
    macro_f1: float | None
    weighted_precision: float | None
    weighted_recall: float | None
    weighted_f1: float | None
    micro_precision: float | None
    micro_recall: float | None
    micro_f1: float | None
    assembly_punct_recall_macro: float | None = Field(
        None, description="Macro-усредненный Recall найденных пунктов в собранном контексте"
    )
    doc_recall_macro: float | None = Field(
        None, description="Macro-усредненный Recall найденных эталонных документов в собранном контексте"
    )
    avg_spurious_docs: float | None = Field(
        None, description="Среднее количество 'лишних' документов (найденных, но не ожидаемых) на вопрос"
    )

class EvaluationResponse(BaseModel):
    total_found_puncts_overall: int | None = Field(
        None, alias="Найдено пунктов (всего)"
    )
    total_ground_truth_puncts_overall: int | None = Field(
        None, alias="Всего пунктов (эталон)"
    )
    human_readable_chunk_micro_recall: float | None = Field(
        None, alias="% найденных пунктов (чанк присутствует в пункте)"
    )
    human_readable_assembly_micro_recall: float | None = Field(
        None, alias="% пунктов были найдены в собранной версии"
    )
    human_readable_chunk_macro_recall: float | None = Field(
        None, alias="В среднем для каждого вопроса найден такой % пунктов"
    )
    human_readable_doc_macro_recall: float | None = Field(
        None, alias="В среднем для каждого вопроса найден такой % документов"
    )
    human_readable_avg_spurious_docs: float | None = Field(
        None, alias="В среднем для каждого вопроса найдено N лишних документов, N"
    )
    results: dict[int, Metrics] = Field(
        ...,
        description="Словарь с метриками для каждого значения top_n"
    )
    worst_performing_questions: list[dict[str, Any]] | None = Field(
        None, description="Список вопросов с наихудшими показателями (по Assembly Recall)"
    )