Spaces:
Running
Running
File size: 3,174 Bytes
9c84f9d | 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 | from abc import ABC, abstractmethod
from typing import Any
from solar_eval.models.sample import EvalSample
from solar_eval.providers.base import BaseProvider
class BaseEvaluator(ABC):
"""Abstract base for all evaluators.
`required_fields` λ `evaluate()` κ° νμλ‘ νλ `EvalSample` νλ μ΄λ¦μ
μ§ν©μ΄λ€. μ§νλ§λ€ μꡬ νλκ° μ λ§λ‘ λ€λ₯΄λ€ -- κ΅μ΄μ `lcs_diff` λ μλ¬ΈΒ·μ λ΅Β·
μΆλ ₯ μ
λ€ νμνμ§λ§(3-way), RAG μ `faithfulness` λ μλ¬Έμ΄ νμ μλ μ
(`.agents/01-plans/harness/2026-08-09-chosun-proofread-evalsample-migration.md` Β§3).
μλΈν΄λμ€λ μ΄ κ°μ ν΄λμ€ μμ±μΌλ‘ μ μΈνλ€. ꡬμ±μ λ°λΌ μꡬ νλκ° λ¬λΌμ§λ
κ²½μ°(μ: νμ νκ°κΈ°λ₯Ό μ‘°ν©νλ `CompositeEvaluator`)λ `@property` λ‘ μ€λ²λΌμ΄λ
ν΄λ λλ€ -- `validate_required_fields` λ `self.required_fields` λ‘λ§ μ κ·Όνλ€.
"""
required_fields: frozenset[str] = frozenset()
@abstractmethod
async def evaluate(
self,
sample: EvalSample,
provider: BaseProvider | None = None,
judge_model: str = "gpt-4o",
) -> dict[str, Any]:
"""`sample` ν 건μ μ±μ νλ€. `{score, details}` λ₯Ό λ°ννλ€.
μ±μ μ μ€ν¨νλ©΄(judge νΈμΆ μμΈ, μλͺ»λ μλ΅ λ±) κ·Έ μ€ν¨λ **μμΈλ‘ μ ννλ€** --
μ μ(0.0 μ΄λ 1.0 μ΄λ )λ‘ μΉνν΄ λ°ννμ§ μλλ€. fail-open(μ₯μ λ₯Ό λ§μ μΌλ‘
λκ°μν€λ κ²)μ λ§λ€μ§ μλ κ²μ΄ μ΄ κ³μ½μ ν΅μ¬μ΄λ€. μ΄ μμΈλ₯Ό μ‘μ μ€ν¨
μνμ μ§κ³μμ λΆλ¦¬νλ κ²μ νΈμΆμ(runner.py/CLI)μ μ±
μμ΄λ€ -- μλΈν΄λμ€λ
κ·Έλ₯ λμ§κΈ°λ§ νλ©΄ λλ€.
"""
...
@abstractmethod
def aggregate(self, results: list[dict[str, Any]]) -> dict[str, Any]:
"""`evaluate()` κ° μ±κ³΅ν κ²°κ³Όλ€λ§ λͺ¨μ μ 체 μ μλ‘ μ§κ³νλ€.
`results` μλ μ€ν¨ν μνμ΄ μμ¬ λ€μ΄μ€μ§ μλλ€(νΈμΆμκ° μ΄λ―Έ κ±Έλ¬λΈλ€) --
μ¬κΈ°μ μ€ν¨λ₯Ό λ³λλ‘ μ²λ¦¬ν νμκ° μλ€.
"""
...
def validate_required_fields(self, sample: EvalSample) -> None:
"""`required_fields` κ° `sample` μ μ±μμ Έ μλμ§ νμΈνλ€.
μ±μ μ μμνκΈ° μ μ νΈμΆνλ€(λ¬λ/CLI μ evaluate νΈμΆλΆ). κ°μ΄ `None`
μ΄λ©΄ "μ±μμ§μ§ μμ"μΌλ‘ λ³Έλ€ -- λΉ λ¬Έμμ΄/λΉ λ¦¬μ€νΈλ μ ν¨ν κ°(μ: κ΅μ ν
λ΄μ©μ΄ μλ μλ¬Έ)μ΄λΌ ν΅κ³Όμν¨λ€. μ‘°μ©ν λκΈ°μ§ μκ³ μ¦μ μ€ν¨μμΌ, μ΄λ
νλκ° μ μλμ§κ° λ‘κ·Έμ λ°λ‘ λλ¬λκ² νλ€.
Raises:
ValueError: `required_fields` μ€ νλ μ΄μμ΄ `sample` μμ `None` μΈ κ²½μ°.
"""
missing = sorted(f for f in self.required_fields if getattr(sample, f, None) is None)
if missing:
raise ValueError(
f"{type(self).__name__} requires sample field(s) {missing} to be filled "
f"(required_fields={sorted(self.required_fields)})"
)
|