Spaces:
Running
Running
Download solar_eval/evaluators/composite.py from dev-strender/proofread-demo: direct link, hf CLI and curl.
- Browser
- Download file 2.37 kB
-
https://huggingface.co/spaces/dev-strender/proofread-demo/resolve/dd41633552f36d3c639676ca2e005abe50eb72af/solar_eval/evaluators/composite.py
- Command line
-
hf download hf://spaces/dev-strender/proofread-demo@dd41633552f36d3c639676ca2e005abe50eb72af/solar_eval/evaluators/composite.py
-
curl -L -o composite.py https://huggingface.co/spaces/dev-strender/proofread-demo/resolve/dd41633552f36d3c639676ca2e005abe50eb72af/solar_eval/evaluators/composite.py
2.37 kB
| from typing import Any | |
| from solar_eval.evaluators.base import BaseEvaluator | |
| from solar_eval.models.sample import EvalSample | |
| from solar_eval.providers.base import BaseProvider | |
| class CompositeEvaluator(BaseEvaluator): | |
| """Combines multiple evaluators with weights. | |
| Example: 50% LLM Judge + 50% Rule-based for title evaluation. | |
| """ | |
| def __init__(self, components: list[dict[str, Any]]) -> None: | |
| """Components: [{evaluator: BaseEvaluator, weight: float}]""" | |
| self.components = components | |
| def required_fields(self) -> frozenset[str]: | |
| """ꡬμ±λ νμ νκ°κΈ° μꡬ νλμ ν©μ§ν©. | |
| `components` λ μΈμ€ν΄μ€λ§λ€ λ€λ₯΄κ² ꡬμ±λλ―λ‘(μμ±μ μΈμ) κ³ μ λ | |
| ν΄λμ€ μμ±μΌλ‘λ ννν μ μλ€ -- `BaseEvaluator.required_fields` | |
| λ₯Ό `@property` λ‘ μ€λ²λΌμ΄λν΄ λ§€λ² νμ νκ°κΈ°μμ ν©μ³λΈλ€. | |
| """ | |
| fields: frozenset[str] = frozenset() | |
| for comp in self.components: | |
| fields |= comp["evaluator"].required_fields | |
| return fields | |
| async def evaluate( | |
| self, | |
| sample: EvalSample, | |
| provider: BaseProvider | None = None, | |
| judge_model: str = "gpt-4o", | |
| ) -> dict[str, Any]: | |
| component_results = [] | |
| weighted_score = 0.0 | |
| for comp in self.components: | |
| evaluator = comp["evaluator"] | |
| weight = comp["weight"] | |
| result = await evaluator.evaluate( | |
| sample=sample, | |
| provider=provider, | |
| judge_model=judge_model, | |
| ) | |
| weighted_score += result["score"] * weight | |
| component_results.append( | |
| { | |
| "weight": weight, | |
| "score": result["score"], | |
| "details": result.get("details", {}), | |
| } | |
| ) | |
| return { | |
| "score": weighted_score, | |
| "components": component_results, | |
| "details": {"components": component_results}, | |
| } | |
| def aggregate(self, results: list[dict[str, Any]]) -> dict[str, Any]: | |
| if not results: | |
| return {"overall_score": 0.0, "scores": {}} | |
| overall = sum(r["score"] for r in results) / len(results) | |
| return {"overall_score": overall, "num_samples": len(results)} | |