Harness ewaluacyjny projektu Slayer (otwarty polski LLM, baza Qwen3.5-27B). Jedno miejsce prawdy o tym, czym i jak mierzymy model: skrypty, karty benchmarków i zasady czystości. Karty służą do debugowania wyników i podejmowania decyzji treningowych (SFT / CPT / GRPO / nic).
Wyniki (JSON-y) żyją w głównym repo Slayera w results/; tu trzymamy kod i dokumentację.
| Benchmark | Karta | Skrypt | Metryka decyzyjna | Train policy |
|---|---|---|---|---|
| LLMzSzŁ | cards/llmzszl.md | bench_llmzszl_likelihood.py, bench_llmzszl_generate.py, bench_mcq.py |
accuracy | eval_only |
| PES | cards/pes.md | bench_mcq.py pes |
accuracy | eval_only |
| Belebele PL/EN | cards/belebele.md | bench_mcq.py belebele / belebele_en |
accuracy | eval_only |
| PoQuAD | cards/poquad.md | bench_poquad.py |
judged accuracy (+ SQuAD-F1) | eval_only |
| FLORES-200 PL↔EN | cards/flores.md | bench_flores.py |
chrF | eval_only |
| KLEJ (10 zadań) | cards/klej.md | klej_eval.py |
macro accuracy (per-task!) | train split: tak, test: eval_only |
| PolKnowledge | cards/polknowledge.md | polknowledge.py |
accuracy per domena | eval_only (własny held-out) |
| Styl PL | cards/style.md | eval_style.py + pl_quality.py + rejudge_style_openjudge.py |
win-rate vs base, naturalność 1-5 | eval_only (held-out prompts) |
| Regresja EN (MMLU, ARC, GSM8K) | cards/en-regression.md | bench_mcq.py, bench_gsm8k.py |
accuracy (czytamy Δ vs base) | eval_only |
| HumanEval | cards/humaneval.md | humaneval_hf.py |
pass@1 (tylko Δ, nie absolut) | eval_only |
Pełna mapa kompetencja → benchmark → metoda (gate'y v2): docs/GATES.md. Taksonomia i plan zadań ewaluacyjnych: docs/TASKS_BENCHMARKS.md.
- Tylko agregaty. Patrzymy na accuracy per kategoria / domena / rok. Nie oglądamy pojedynczych itemów benchmarku i nie piszemy na ich podstawie danych treningowych.
- Eval-only znaczy eval-only. Itemy benchmarków nie wchodzą do SFT/CPT nawet jako "seed".
Pliki benchmarków są wejściem deduplikacji (
--decon-files) w pipeline danych. - Stały n i seed. Porównania między modelami tylko przy identycznej próbce, seedzie i backendzie. Skrypty są idempotentne (skip, jeśli wynik dla (bench, seed) istnieje).
- Matched decoding. Klasyfikacja/MCQ: greedy albo likelihood, ta sama temperatura dla wszystkich modeli. Mismatch temperatur unieważnia porównanie (lekcja: baseline KLEJ Bielik@0.2 vs Qwen@0.7).
- Likelihood ≠ generacja litery. To dwie różne metryki tego samego datasetu; nigdy nie porównujemy wyniku likelihood jednego modelu z wynikiem generatywnym drugiego.
- Δ vs base, nie tylko absolut. Główny odczyt po treningu to zmiana względem bazy (sygnał zapominania); Bielik-11B-v3 to zewnętrzny punkt odniesienia.
"Zwycięstwo" v2 na KLEJ okazało się artefaktem trenowania na train splitach tych samych zadań (belebele +0 pp tam, gdzie nie było train splitu, vs psc +26.5 tam, gdzie był). Wniosek wpisany w karty: chwalimy się wyłącznie wynikami held-out (linia v3, claim 5-shot), a każdy wynik na zadaniu, którego train split był w miksie, oznaczamy jako trenowany.
Większość skryptów: python3 scripts/<skrypt> --help albo docstring na górze pliku.
Dwa backendy:
- ollama (lokalnie, GGUF):
bench_mcq.py,bench_poquad.py,bench_flores.py,bench_gsm8k.py - HF transformers (pod/GPU, opcjonalnie
--adapterLoRA):bench_llmzszl_likelihood.py,bench_llmzszl_generate.py,klej_eval.py,humaneval_hf.py,eval_hf_mcq.py,eval_style.py
Przykład pełnego gate'u po treningu:
# LLMzSzŁ likelihood, apples-to-apples z baseline n=400 seed=42
python3 scripts/bench_llmzszl_likelihood.py --model Qwen/Qwen3.5-27B --adapter <ckpt> --n 400 --seed 42
# KLEJ 10 zadań, test split, greedy
python3 scripts/klej_eval.py --adapter <ckpt> --n 300 --seed 42
# regresja EN + kod
python3 scripts/bench_gsm8k.py 600 42
python3 scripts/humaneval_hf.py --model Qwen/Qwen3.5-27B --adapter <ckpt>- Open PL słabe, MCQ/EN mocne: SFT na zadaniach w stylu Open PL (train splity, nigdy test).
- LLMzSzŁ słabe w kategoriach liczbowych/jednostkach/zawodowych: syntetyczne MCQ z weryfikatorem + GRPO/RLVR.
- PoQuAD słabe na pytaniach bez odpowiedzi: SFT na answerability.
- FLORES słabe: SFT tłumaczeniowy tylko, jeśli tłumaczenie jest priorytetem.
- Regresja EN spada po tuningu: zmniejszyć wagę zadań PL albo dodać replay.
- CPT tylko, gdy perplexity i szeroki zestaw zadań pokazują ogólną słabość językową PL.
Żaden dataset nie jest uzasadniony przez "więcej polskich danych" samo w sobie; każdy musi linkować do konkretnego failure mode z benchmarku.