Školácheck · skolacheck.cz

Školácheck: chytrý harvesting dostupných informací

Hypotéza ověřená v Gemini chatu, která se v produkci rychle rozpadla — a co z ní nakonec vzniklo.

Prezentace je hodně zjednodušená. Projekt je podstatně komplexnější a pokrýt ho se všemi zajímavými detaily by zabralo několik hodin.

Školácheck Michal Řehout Tech Execs Meetup Prague
01

Co je Školácheck

Mapa kvality základních škol postavená na veřejně dostupných dokumentech.

Rodič zvolí své priority — od konstruktivistické matematiky po školního psychologa — a mapa ukáže školy, které je splňují.

4 369
základních škol
14
krajů
29
kritérií v 6 skupinách
skolacheck.cz — mapa kvality základních škol
Školácheck Tech Execs Meetup Prague 01 / 18
02

Web v kostce

Přehled krajů
Agregované souhrny kritérií napříč 14 kraji.
Kvalita škol napříč kraji
Výsledky podle priorit
Index kvality a shrnutí pro každou školu.
Školy v aktuálním výřezu
Profil školy
Souhrn hodnocení a poloha na mapě.
Profil školy — souhrn hodnocení
Detail školy
Hodnocení po jednotlivých kritériích.
Detail školy — Moderní výuka
Školácheck Tech Execs Meetup Prague 02 / 18
03

Motivace projektu

Výchozí potřeba: porovnat školy v okolí.

Neexistuje způsob, jak školy rozumně porovnat, ani jak o nich zjistit konkrétní informace.

Provizorní řešení: ručně dohledat ŠVP a vložit celé PDF do Gemini chatu.

škola
dokument
odpověď
Funkční, ale manuální a neopakovatelné.
Školácheck Tech Execs Meetup Prague 03 / 18
04

Původní hypotéza

Předpoklad: každá škola publikuje ŠVP v PDF.

1
najít PDF přes Google Search
2
poslat ho do Gemini přes Vertex API
3
dostat strukturovaný katalog
historická hypotéza Multimodální modely byly v té době velké téma a PDF na vstupu vypadalo jako ideální use case.
Školácheck Tech Execs Meetup Prague 04 / 18
05

První experimenty

Známé PDF v Gemini chatu: funkční.
Stejné PDF přes Vertex API: timeout.
Dražší model s vyššími limity: funkční.
Problém: token-based pricing × velikost PDF.
Google Search API bylo mezitím ukončeno a search grounding problém neřeší — PDF vzdělávacích programů jsou vyhledávači prakticky nedohledatelná.
co Gemini vidí a účtuje
užitečný text
balast
Hlavičky, patičky, loga, tabulky učebních plánů.
Poměr je ilustrativní, bez měření.
Školácheck Tech Execs Meetup Prague 05 / 18
06

Datové zdroje a jejich limity

MŠMT Rejstřík škol v opendatech neobsahuje URL adresy webů. chybí web
ČŠI Školní inspekce weby eviduje. Zjištěno bohužel až později. objeveno později
Places API Weby doplněny přes Google Places API na základě IČO a adresy. fallback
Crawler Vlastní crawler prochází weby škol a vyhledává dokumenty. redirecty, drive, JS
Crawler je jednoduchý LLM-aided systém: strukturovaný kód prochází stránky, odstraňuje nepotřebný obsah a extrahuje odkazy. LLM pak vyhodnocuje, kam pokračovat a zda některý odkaz vede na hledaný dokument.
Školácheck Tech Execs Meetup Prague 06 / 18
07

Heterogenní formáty dokumentů

PDF
Vizuální tokeny, skeny, sazba do sloupců.
DOCX
Struktura existuje, ale konverzí se ztrácí.
ODT
Podpora v nástrojích je nekonzistentní.
starý .doc
Starý binární formát, nejproblematičtější na zpracování.

První iterace: headless LibreOffice a konverze do PDF. Výsledná PDF ale přes Gemini zpracovat nejdou.

Druhá iterace: konverze do markdownu přes PyMuPDF4LLM. Funkční.

Řetězec DOCX → PDF → MD je ale zbytečně dlouhý a ztrácí kontext.

dnes · Kreuzberg + LibreOffice pro starý .doc historicky · PyMuPDF4LLM, Chonkie, Docling
Školácheck Tech Execs Meetup Prague 07 / 18
08

Cesta k RAG pipeline

01
dokument
02
Kreuzberg
03
chunky s kontextem
04
hybrid retrieval
05
reranker
06
evidence gate

Chunking dokumentů: Chonkie, několik iterací s různými algoritmy.

Docling: robustní, ale nevhodný pro větší objemy.

Finální volba: Kreuzberg — all-in-one document intelligence. Na vstupu libovolný dokument, na výstupu kvalitní chunky.

Evidence gate: výstup bez důkazu v textu se nepublikuje. Měřeno: u 28,7 % škol primární zdroj nestačil — fallback na inspekční zprávy, viditelně označený v datech (4 369 škol).
Školácheck Tech Execs Meetup Prague 08 / 18
09

Extrakce strukturovaných dat

První verze: výběr chunků přes cosine distance a jeden velký prompt pro extrakci strukturovaných dat.

Funkční, ale drahé a náročné na tokeny.

Řešení: více menších promptů podle tematických skupin kritérií — příbuzná témata se potkávají ve stejných chuncích.

1 megaprompt
12 skupin
retrievalschemaevidence slot
Dále aliasování query embeddingů a jemné ladění.
Aktuálně 12 skupin, každé tvrzení má svůj evidence slot.
Školácheck Tech Execs Meetup Prague 09 / 18
10
měřeno · recall@5

Retrieval: dense search nestačí

Recall@5: podíl testovacích dotazů, u kterých se relevantní chunk dostal do top 5 výsledků.

dense-only — embedding + cosine
21,1–21,6 %
hybrid retrieval — ts_rank + prefix + dense + RRF
53,1–54,9 %

Lemmatizace pro češtinu, ColBERT ani late interaction nepřinesly dostatečnou kvalitu za rozumnou cenu.

Hybrid retrieval ale vrací výrazně více kandidátů, než kolik jde poslat do promptu.

Scope: 2 467 chunků · 18–20 škol · 9 kritérií.
Osa 0–60 %. Benchmark na tomto korpusu, ne obecné tvrzení o češtině.
Školácheck Tech Execs Meetup Prague 10 / 18
11

Reranker a jeho cena

problém
Top-5 přes cosine distance nestačí. Důležité pasáže často až na pozici 10–15, občas retrieval mine úplně.
hybrid retrieval
U dotazů jako tripartita nebo parlament dá stem-based wildcard ilike lepší výsledky než vektory.
důsledek
Počet kandidátů výrazně naroste. Do promptu se všechny nevejdou.
řešení
Reranker bge-reranker-v2. Okamžité a výrazné zlepšení kvality.
nová cena: compute
Reranker je pomalý a náročný na compute. S aliasy query embeddingů ještě více.
Optimalizace: flooring, top-k, přechod z DirectML na ROCm / PyTorch / llama.cpp. Všechno pomohlo, ale problém neodstranilo.
skutečné řešení
Přestat optimalizovat vlastní hardware.
Pronajatá RTX 4090 na vast.ai za jednotky USD centů za hodinu.
Reranker jen řadí kandidáty — důkaz nevrací. Ten zajišťuje až evidence gate.
Školácheck Tech Execs Meetup Prague 11 / 18
12

Cost optimizations

Srovnání: Gemini Flash vs Flash Lite.

Flash Lite na první pohled neobstojí: spotřebuje tolik thinking tokenů, že smaže úsporu z nižší ceny za token.

Zjištění: pro extrakci strukturovaných dat velmi dobře použitelný — vyžaduje ale správně postavené prompty a prakticky vypnutý thinking.

pracovní číslo cíl: jednotky USD centů na školu
kvalita →
cena za školu →
thinking
model
prompt
retrieval
Ilustrační schéma, ne měřený graf. Osy bez jednotek.
Školácheck Tech Execs Meetup Prague 12 / 18
13

Od crawleru k harvesteru

Řada škol ŠVP nezveřejňuje nebo jen v nepoužitelném formátu.

Některá kritéria navíc v ŠVP nejsou — školy je ale prezentují na svém webu.

01
portál ČŠI
02
školní web
03
ŠVP
04
VYROCNI_ZPRAVA
05
inspekční data
Všechny zdroje procházejí společnou pipeline: Kreuzberg + RAG
41 % hodnocení by z jednoho PDF ŠVP nevzniklo. ŠVP 59,0 % · další dokumenty 29,1 % · portál ČŠI 12,0 % — z 86 131 hodnocení
Crawler se rozšiřuje na harvester: sbírá dokumenty i webový content. Inspekční data zveřejňují jen některé školy — dostupnost neznamená pokrytí.
Školácheck Tech Execs Meetup Prague 13 / 18
14

Agentic loop

01
dávka škol
Zpracování desítek škol v jednom běhu.
02
analýza běhů
Claude Code prochází jednotlivé běhy a hledá vzory v chybách.
03
návrh úpravy
Konkrétní změna zpracování, často ještě v průběhu dávky.
04
měření
Stejný eval harness. Zlepšení i regrese vidět okamžitě.
zpět na dávku několik iterací za hodinu

Pipeline nevznikla podle plánu na papíře — vyvíjela se iterativně podle toho, co ukázaly reálné dávky dat.

Eval harness zůstával stejný, takže každá úprava měla srovnání s předchozím stavem.

Bez měřitelného srovnání nelze odlišit zlepšení od náhody.
Školácheck Tech Execs Meetup Prague 14 / 18
15

Provozní architektura

Work DB — lokálně
raw dokumenty + chunky + vektory + zpracování
Velká a náročná na CPU při stavbě indexu. Běží lokálně, zálohy jdou do GCS.
export
jednosměrně
Client DB
strukturovaná data + reasoning
4 369 škol · 86 131 hodnocení
96,6 % s doloženým důkazem
Malá projekce, krátké texty. Zdroj dat pro klientský web.
GCS backup Vercel Neon konfigurace, ne ověřený billing
Veřejná část běží kompletně na free tierech Vercelu a Neonu. Zpracování dat zdarma není a nebude.
Školácheck Tech Execs Meetup Prague 15 / 18
16
měřeno · client DB · 2026-08-11

Index z části měří, kolik jsme našli

Průměrný index podle počtu hodnocených kritérií
< 10 kritérií
⌀ 38,3
10–14
⌀ 49,7
15–19
⌀ 56,9
20–24
⌀ 62,5
25+
⌀ 59,5

Rozdíl 24 bodů podle pokrytí. Nad ~20 kritérii se trend zastaví — index přestává sledovat pokrytí a začíná sledovat obsah.

Nejvyšší index — floor ≥ 20 kritérií
OPEN GATE — gymnázium a ZŠ, Babice 89 29 kritérií
ZŠ Zdiměřice, Jesenice 88 25 kritérií
ZŠ a MŠ Chraštice 88 26 kritérií
Distribuce Indexu kvality · 4 360 škol
1
3
84
582
1 620
1 524
493
53
80 % škol · 47–71
10–20 20–30 30–40 40–50 50–60 60–70 70–80 80–90
min 17medián 58,9max 89stupnice 0–100
Index měří doložené pokrytí žádoucích vlastností v dokumentech, ne kvalitu vzdělávání. Rozdíl podle pokrytí je asociace, ne kauzalita.
Školácheck Tech Execs Meetup Prague 16 / 18
17

Kontext: čas, náklady, nástroje

leden / únor
start vývoje, večery a víkendy
jaro
střídavě intenzivní období
červen
zpracovaná databáze všech českých ZŠ
náklady na Gemini tokeny
10–20 tis. Kč celkem
Zhruba 4–5× více, než kolik dnešní pipeline potřebuje na zpracování celého objemu. Rozdíl jde na vrub opakovanému ladění, testování, slepým uličkám a několika chybám.
vývojové nástroje
CopilotGemini modelyCodex
Za šest měsíců projektu se agentické schopnosti nástrojů zlepšily naprosto zásadně.
Částka je souhrnný odhad za celé období vývoje, ne měřená cena produkčního běhu.
Školácheck Tech Execs Meetup Prague 17 / 18
18

Lekce a otevřené otázky

Původní představa nevydržela kontakt s daty.V chatu to fungovalo, v produkci ne. Přepsat zadání vyšlo levněji než ho obhajovat.
Stav zdrojových dat se ukázal až v provozu.Každá dávka škol přinesla nový typ rozbitého vstupu. Zpracování se měnilo podle nálezů.
Bez měření není vidět rozdíl.Malé kroky proti stejnému harnessu. Zlepšení i regrese byly vidět hned.
Bez důkazu v textu se nepublikuje.Evidence gate platí jako pravidlo zpracování, ne jako dodatečná pojistka.
otevřená otázka
Komerční potenciál: spíše omezený.
Hlavní hodnota: tlak na kvalitu škol. Možný směr: neziskový sektor.
otevřená otázka
Jak řešit refresh dat?
Nové školy lze detekovat podle registru. Změny vedení nebo ŠVP: periodický sweep nebo reakce na feedback.
Infrastruktura pro agentické zpracování feedbacku je připravená (primitive.dev, Slack, skill pro ChatGPT). Aktivace je policy-gated.
Školácheck Tech Execs Meetup Prague 18 / 18
materiál pro Q&A · mimo časování

Technický appendix

A1 chronologie · A2 preprocessing · A3 benchmarky · A4 schemas · A5 harvester · A6 databáze · A7 feedback · A8 costs · A9–A10 stack

Školácheck Tech Execs Meetup Prague Appendix
A1 · appendix
historické

Chronologie architektonických změn

01
Whole-PDF do Vertexu
Timeout a cena → nutný preprocessing.
02
Crawler + konverze
DOCX → PDF → MD ztrácí kontext.
03
RAG a chunking
Chonkie, Docling → nakonec Kreuzberg.
04
Hybrid + reranker
Dense-only na tomto korpusu nestačil.
05
Crawler → harvester
Přidány VZ, webový text, inspekční data.
06
Work DB / Client DB
Oddělení provozu od zpracování.
Zdroj: docs/presentation/skolmat-story-audit.md — git-ověřená časová osa.
Školácheck Appendix — mimo časování A1
A2 · appendix

Chunking, preprocessing, Kreuzberg

vstupcestapoznámkastav
PDFKreuzbergskeny, sloupce, tabulky učebních plánůcurrent
DOCX / ODTKreuzbergzpracováno přímo, bez mezikroku přes PDFcurrent
starý .DOCheadless LibreOffice → Kreuzbergjediný formát, který Kreuzberg nezvládne sám — LibreOffice ho převede na použitelný vstupcurrent
DOCX / ODT přes PDFLibreOffice → PyMuPDF4LLMna tomhle se to lámalo: konverze přes PDF ztrácela hierarchii nadpisů a strukturuhistorical
chunkingChonkie, DoclingChonkie: hranice chunků nesedí. Docling: robustní, ale nepoužitelné pro větší objemyhistorical
Kreuzberg převádí libovolný vstupní dokument rovnou na chunkovaný markdown. Tím odpadá celý mezikrok přes PDF.
Čísla o markdown pollution jsou jen po paměti, bez měření — na slidu záměrně nejsou.
Školácheck Appendix — mimo časování A2
A3 · appendix
měřeno · recall@5

Retrieval benchmarky na českém korpusu

přístuprecall@5vs baseline
baseline — prefix hybrid53,1–55 %
Jina-ColBERT-v2 jako primární retriever44,4 %−6,7 pp
Hunspell cs_CZ — český stemmer31,5 %−21,6 pp
dense-only21,1–21,6 %−31,5 pp
Scope: 2 467 chunků · 18–20 škol · 9 kritérií. Jina-ColBERT měřen na menší podmnožině.
Jako reranker nad top-20 z hybridu dával ColBERT smysl. Jako primární retriever ne.
Zdroj: docs/presentation/skolmat-rag-retrieval-saga.md.
Školácheck Appendix — mimo časování A3
A4 · appendix

Prompt groups, schema, evidence

kontrakt
skupina kritérií → vlastní dotaz a alias query embeddingu
hybrid retrieval → kandidáti → reranker seřadí
extrakce vyplní schema, každé pole má svůj evidence slot
evidence gate: bez doložení se hodnota nevydá
tvar záznamu
{
value: …,
evidence_text: "…",
evidence_source: 3
}
evidence_source je číselný odkaz na konkrétní chunk, ne volný text.
Resolved document type je post-extraction attribution, ne pole extrakčního schématu.
Školácheck Appendix — mimo časování A4
A5 · appendix

Harvester a doc types

co harvester ukládá
SVP — školní vzdělávací program
VYROCNI_ZPRAVA — přidáno později
textový content přímo z webu školy
ČŠI inspection snapshot — semi-structured
rizika k ošetření
identita: přiřazení dokumentu ke správné škole
redirecty a umbrella domény zřizovatelů
off-host dokumenty — drive, cloudy, sdílené složky
hash a status — deduplikace zpracování
Webový text je signál, ne automaticky důkaz. Inspekční data zveřejňují jen některé školy.
Zdroj: packages/work-db/src/types.ts, specs/INSPECTION_IMPORT.md.
Školácheck Appendix — mimo časování A5
A6 · appendix

Data boundary a deployment

vrstvaco obsahujekde běží
Work DBraw dokumenty, chunky, embeddings, vektorový index, processing stavlokálně + GCS zálohy
exportjednosměrný job, target-aware (local / prod), inkrementální nebo fullCLI nebo admin UI
Client DBstrukturované výsledky a reasoning — krátké texty, žádné vektoryNeon
klientský webčte jen klientskou projekci, migrace se aplikují při prebuilduVercel
Před netriviálním prod exportem vždy dry-run.
Popis konfigurace, ne tvrzení o fakturaci, SLA nebo disaster recovery.
Školácheck Appendix — mimo časování A6
A7 · appendix
připraveno, policy-gated

Feedback: připravené vs. aktivní

01
feedback od uživatele
02
evaluation gate
03
outbound: primitive.dev, Slack
04
aktivace — explicitní policy
existuje
Infrastruktura pro agentické zpracování mailů. Slack webhooky. Skill pro ChatGPT. Manuální, policy-gated Primitive pull.
neexistuje
Napojený provider webhook. Automatický reprocessing. Reálné produkční nasazení.
Zdroj: specs/FEEDBACK_LOOP.md.
Školácheck Appendix — mimo časování A7
A8 · appendix

Co sledovat u nákladů

komponentarolecost driverguardrail
Flash Litestructured extractionthinking tokenythinking v podstatě vypnout
Flashnáročnější krokycena za tokenpoužít jen tam, kde lite nestačí
retrieval + rerankvýběr kontextuvelikost K, počet kandidátůměřit recall, ne dojmy
preprocessingKreuzbergCPU a paměťOCR vypnuto — snižovalo throughput bez přínosu
vektorový indexWork DBCPU při stavbě indexudržet mimo klientskou projekci
měřeno offline projekce pracovní číslo
Ceny a limity se v čase mění. Číslo bez data a scope nemá vypovídací hodnotu.
Školácheck Appendix — mimo časování A8
A9 · appendix

Zajímavé služby a infrastruktura

provoz a SaaS
vast.ai pronájem RTX 4090 pro reranking za jednotky USD centů za hodinu
Neon serverless Postgres pro klientskou projekci, free tier
Vercel klientský web, free tier
primitive.dev agentické zpracování feedbacku, policy-gated
PostHog produktová analytika
Google Cloud Storage zálohy Work DB
modely a API
Vertex AI / Gemini Flash a Flash Lite pro extrakci strukturovaných dat
embeddinggemma-300m embeddingy, 768 dim, kontext 2048 tokenů
bge-reranker-v2-m3 reranker nad kandidáty z hybrid retrievalu
llama.cpp lokální embed i rerank server, nativní /rerank
Google Places API dohledání webů škol podle IČO a adresy
Mapbox mapový podklad klientského webu
Vektorový index zůstává v lokální Work DB na pgvectoru — do Neonu se exportuje jen strukturovaná projekce.
Školácheck Appendix — mimo časování A9
A10 · appendix

Zajímavé knihovny a stack

zpracování dokumentů
Kreuzberg libovolný dokument → chunkovaný markdown, Rust core
trafilatura extrakce textu z webových stránek, sidecar harvesteru
semantic-text-splitter token-aware dělení chunků, Rust
loky izolace pádů nativního kódu, jeden segfault nesestřelí pool
pypdfium2 rychlé počítání stran a ořez rozsahu před parsováním
aplikační stack
DBOS durable workflow execution, pipeline přežije restart
Deno runtime backendu, JSR i npm
Drizzle ORM 1.0 beta jedno schéma, dvě databáze
H3 hexagonální geoindex pro mapu
fast-check property-based testování
Hono + TanStack Start API a frontend admin i klientského webu
vyzkoušeno a zamítnuto Jina-ColBERT-v2 Hunspell cs_CZ OpenSearch + Stempel Chonkie Docling PyMuPDF4LLM DirectML
Školácheck Appendix — mimo časování A10
A11 · appendix

Dataset a index: definice a provenance

Index kvality
index = round((score + 1) × 50)

score = průměr contribution ∈ [−1, +1]; boolean ±1, scale = value / 10, NULL (bez dat) do průměru nevstupuje.

percentil0–100raw
p1046,9−0,06
p2552,80,06
medián58,90,18
p7565,30,31
p9070,70,41
min17−0,66
max890,78

Kritérií na školu: min 1 · medián 20 · max 29 · floor n ≥ 20.

Kraje — ⌀ index
PHA314 škol66,1
JHM503 škol60,7
ULK291 škol59,2
STC598 škol59,2
MSK447 škol58,7
KVK110 škol58,5
PAK255 škol58,3
OLK311 škol57,8
JHC275 škol57,7
ZLK269 škol57,6
HKK275 škol57,3
LBK203 škol57,2
VYS277 škol56,1
PLK232 škol55,9

Rozptyl pokrytí, ne žebříček krajů. Kraj z adresy v registru škol.

Skupiny — ⌀ přes hodnocení
Družina a kroužky91,5
Klima a komunikace78,7
Pohyb a zdraví78,4
Inkluze a přístup69,9
Moderní výuka65,6
Jazyky62,3
Prevalence — vlastní denominátory
Školní psycholog44,2 %z 3 667
Konstruktivistická matematika38,2 %z 2 723
CLIL31,4 %z 2 052
Prvky Montessori/Waldorf30,8 %z 1 184
Přípravná třída16,9 %z 3 427
Vlastní bazén6,8 %z 3 126

Procenta z hodnocených škol kritéria, ne ze 4 369.

Školácheck SQL: docs/presentation/skolmat-dataset-slide-data-v1.md · snapshot 2026-08-11 A11