Evaluarea calității răspunsurilor complexe (redactare de eseuri, rezumate de contracte sau explicații tehnice) nu poate fi realizată prin formule matematice simple de tip BLEU sau ROUGE, care penalizează sinonimele corecte. Tehnica G-Eval (introdusă de cercetătorii Microsoft) a devenit standardul industrial pentru evaluarea de tip LLM-as-a-Judge.
Spre deosebire de un simplu prompt de tip ‘Dă o notă de la 1 la 10’, G-Eval utilizează o rubrică formală de criterii bine definite (cum ar fi Coerență, Factualitate sau Relevanță) și forțează modelul evaluator să parcurgă trei pași distincți: generează mai întâi o serie de pași de raționament intern (Chain-of-Thought), analizează punct cu punct textul în raport cu fiecare criteriu și abia la final calculează scorul ponderat.
Studiile au demonstrat că scorurile produse de G-Eval au o corelație de peste 85% cu judecățile experților umani, permițând echipelor de inginerie să automatizeze complet testele de regresie calitativă în pipeline-urile de CI/CD.
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
Evaluation Criteria |
Definiția calitativă a aspectului inspectat (ex: ‘Coerență: cât de logic curg ideile între paragrafe’). |
Evaluation Steps (CoT) |
Pașii deductivi obligatorii pe care evaluatorul trebuie să îi scrie înainte de nota finală. |
Score Range |
Scara numerică standardizată (uzual 1-5 sau 0-1) cu descrierea clară a fiecărui nivel. |
Probability-weighted Scoring |
Tehnică avansată ce calculează speranța matematică pe baza probabilităților logaritmice (logprobs) ale tokenilor numerici. |
Exemple practice și configurații
Exemplul 1: Implementarea unui test automat de factualitate cu G-Eval în Python
Cod folosind biblioteca de referință DeepEval.
from deepeval.metrics import GEval
from deepeval.test_case import LLMTestCase, LLMTestCaseParams
# Definim metrica de factualitate ghidată prin G-Eval:
metrica_factualitate = GEval(
name="Factualitate Tehnica",
criteria="Verifică dacă răspunsul conține erori sau contradicții față de contextul tehnic furnizat.",
evaluation_params=[LLMTestCaseParams.INPUT, LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.RETRIEVAL_CONTEXT],
evaluation_steps=[
"1. Citește contextul de recuperare și identifică faptele cheie.",
"2. Compară fiecare afirmație din răspunsul generat cu faptele din context.",
"3. Penalizează sever orice halucinație sau afirmație nesusținută de date.",
"4. Acordă un scor între 0 (complet fals) și 1 (impecabil factual)."
]
)
caz_test = LLMTestCase(
input="Care este portul implicit pentru Redis?",
actual_output="Portul implicit folosit de serverul Redis este 6379.",
retrieval_context=["Redis ascultă implicit pe portul TCP 6379."]
)
metrica_factualitate.measure(caz_test)
print("Scor:", metrica_factualitate.score) # 1.0
print("Raționament evaluator:", metrica_factualitate.reason)
Rezultat & Impact
Notare obiectivă însoțită de justificarea detaliată a fiecărei deducții logice.
Greșeli frecvente și bune practici
- Formularea unor criterii vagi de evaluare (ex: ‘Spune dacă răspunsul e bun’), ceea ce duce la scoruri aleatorii cu variație mare între rulări.
- Evaluarea răspunsurilor fără a furniza contextul de referință, forțând modelul evaluator să se bazeze pe propria memorie și să halucineze fapte.