From a0cdb166176f3d2c85ad17244b4e724984c9dabd Mon Sep 17 00:00:00 2001 From: ThearchyHelios Date: Fri, 16 Oct 2026 17:11:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E8=AF=84=E6=97=B6=E6=8A=8A=E8=AF=84?= =?UTF-8?q?=E5=88=86=E8=A7=84=E5=88=99=E7=89=88=E6=9C=AC=E8=AE=B0=E8=BF=9B?= =?UTF-8?q?=E6=8C=87=E7=BA=B9=EF=BC=9B=E5=8E=BB=E6=8E=89=E5=87=A0=E5=A4=84?= =?UTF-8?q?=E6=B2=A1=E7=94=A8=E7=9A=84=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为什么:按新规则重评之后,和别的评测比时「评分规则」那一项要照实标出变了;总表上另记重评的时间。 --- backend/app/eval/rescore.py | 7 +++++-- backend/app/eval/runner.py | 5 +---- backend/tests/test_eval_schedule.py | 4 ++-- backend/tests/test_eval_score.py | 6 ++++-- backend/tests/test_eval_stats.py | 2 -- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/backend/app/eval/rescore.py b/backend/app/eval/rescore.py index f1fda1f3..355609da 100644 --- a/backend/app/eval/rescore.py +++ b/backend/app/eval/rescore.py @@ -13,7 +13,7 @@ from typing import Any from sqlalchemy import select -from app.db.base import SessionLocal +from app.db.base import SessionLocal, utcnow from app.db.models_eval import EvalCase, EvalResult, EvalRun logger = logging.getLogger(__name__) @@ -66,7 +66,10 @@ async def rescore(eval_run_id: str) -> int: setattr(row, key, value) await session.flush() run = await session.get(EvalRun, eval_run_id) - await runner.refresh_summary(session, run) + # 指纹里的评分规则版本跟着换:和别的评测比时照实标出「评分规则」一项变没变 + run.fingerprint = {**dict(run.fingerprint or {}), "scorer_version": score.SCORER_VERSION} + summary = await runner.refresh_summary(session, run) + run.summary = {**summary, "rescored_at": utcnow().isoformat()} await session.commit() return changed diff --git a/backend/app/eval/runner.py b/backend/app/eval/runner.py index c4c89be5..ca05f81b 100644 --- a/backend/app/eval/runner.py +++ b/backend/app/eval/runner.py @@ -33,9 +33,8 @@ from __future__ import annotations import asyncio import copy import logging -import time from collections.abc import Mapping, Sequence -from dataclasses import dataclass, field +from dataclasses import dataclass from datetime import datetime from typing import Any @@ -236,8 +235,6 @@ class _Arm: view: dict[str, Any] | None = None #: 这一臂的名字(A/B 时) name: str | None = None - #: 这一臂各项:{(题目 id, 第几次): 结果 id} - items: dict[tuple[str, int], str] = field(default_factory=dict) @dataclass diff --git a/backend/tests/test_eval_schedule.py b/backend/tests/test_eval_schedule.py index cab8b309..d3ad8bbb 100644 --- a/backend/tests/test_eval_schedule.py +++ b/backend/tests/test_eval_schedule.py @@ -13,7 +13,7 @@ from __future__ import annotations import asyncio import json import uuid -from datetime import datetime, timedelta, timezone +from datetime import timedelta, timezone import httpx import pytest @@ -22,7 +22,7 @@ from sqlalchemy import delete, select from app.core.crypto import encrypt from app.db.base import SessionLocal, utcnow -from app.db.models import NotifyChannel, Schedule, ScheduleFire +from app.db.models import NotifyChannel, Schedule from app.db.models_eval import EvalResult, EvalRun from app.engine.runner import run_manager from app.eval import answer as answer_mod diff --git a/backend/tests/test_eval_score.py b/backend/tests/test_eval_score.py index 645f92b4..b9578a20 100644 --- a/backend/tests/test_eval_score.py +++ b/backend/tests/test_eval_score.py @@ -198,7 +198,7 @@ async def test_reading_the_sealed_answer_and_the_per_case_sql_match(engine_on, m async def test_rescoring_reads_the_seal_and_never_calls_a_model(engine_on, monkeypatch, tmp_path): from app.db.base import SessionLocal from app.db.models_eval import EvalResult, EvalRun - from app.eval import rescore + from app.eval import rescore, score from app.providers import mock_model from tests import eval_samples as es from tests import ledger_samples as ls @@ -229,5 +229,7 @@ async def test_rescoring_reads_the_seal_and_never_calls_a_model(engine_on, monke async with SessionLocal() as session: row = (await session.execute(select(EvalResult).where(EvalResult.eval_run_id == er_id))).scalar_one() assert row.verdict == "pass" and row.scores[0]["outcome"] == "traced" - assert (await session.get(EvalRun, er_id)).summary["accuracy"]["passed"] == 1 + rescored = await session.get(EvalRun, er_id) + assert rescored.summary["accuracy"]["passed"] == 1 and rescored.summary["rescored_at"] + assert rescored.fingerprint["scorer_version"] == score.SCORER_VERSION await es.drop_suites() diff --git a/backend/tests/test_eval_stats.py b/backend/tests/test_eval_stats.py index 7b4ecfe2..1b809646 100644 --- a/backend/tests/test_eval_stats.py +++ b/backend/tests/test_eval_stats.py @@ -7,8 +7,6 @@ """ from __future__ import annotations -from datetime import timedelta - import pytest import app.db.models # noqa: F401 - conftest 按已导入的模型建表