Привязка к конституции: оценка (§56)¶
Состояние структурировано, поэтому оценка многоуровневая — не только
answer == expected:
Качество доказательств · Проверка утверждений · Калибровка уверенности · Корректность провенанса · Корректность вычислений · Покрытие ответа · Покрытие источников
reactifact.eval — детерминированный, без LLM харнесс, оценивающий итоговое
состояние прогона. Каждая метрика — чистая функция над итоговым Context
(+ опциональный грёд-трус), поэтому правдивость измеряется там, где она живёт —
в графе артефактов, — а не гладкость текста.
Запуск сюита¶
from reactifact.eval import EvalCase, calculation_correctness, core_metrics, run_suite
cases = [
EvalCase(
name="calc-question",
run=_run_knowledge_calc, # выполняет пайплайн → Context
expected={"sources": ["costs:", "pricing:", "guide:"]},
),
]
report = run_suite(cases, metrics={
**core_metrics, # answer/provenance/evidence/claim
"calc": calculation_correctness(values=(5480, 3580)),
"sources": source_coverage(),
})
print(report.render())
eval · multi-level report (§56)
[calc-question] overall 1.000
answer_present 1.000
provenance_grounded 1.000
evidence_quality 1.000
claim_verification 1.000
calc 1.000
sources 1.000
suite overall: 1.000
Метрики¶
Классы артефактов сопоставляются по имени (Answer, Evidence, …),
поэтому харнессу не нужны доменные импорты — домен остаётся вне фреймворка.
| Метрика | На что отвечает | Встроенная |
|---|---|---|
answer_present |
прогон вообще дал ответ? | функция |
provenance_grounded |
каждый ли ответ подкреплён существующей supported_by (§34)? |
функция |
evidence_quality(threshold=0.5) |
доля доказательств с оценкой не ниже порога | функция |
claim_verification(valid=("verified",)) |
доля утверждений, прошедших проверку (§35) | функция |
confidence_calibration() |
Brier-скор Claim.confidence против фактической правильности (§56) |
фабрика (нужен expected.claim_correctness) |
answer_coverage() |
покрытие ожидаемого текста ответа фактическим | фабрика (нужен expected.answer) |
calculation_correctness(values=…) |
доля вычислений, совпавших с грёд-трусом (§67) | фабрика |
source_coverage() |
доля источников ответа, покрытых маркерами | фабрика (нужен expected.sources) |
core_metrics объединяет четыре не генеративные. Метрика без грёд-труса
возвращает None и попадает в skipped (EvalResult.skipped), а не в тихий
ноль.
Типы¶
Metric— один измеренный 0..1 скор с весамиweight.EvalCase— имя +run() -> Context+ опциональныйexpected.EvalResult(на кейс) /EvalReport(сюит) —overall()(взвешенное среднее),to_dict(),render().
Куда смотреть¶
End-to-end тесты в tests/test_eval.py оценивают калькуляционный вопрос demo
knowledge офлайн (без LLM) и проверяют полностью обоснованный отчёт — ту же
форму можно направить на любой пример.