Vyhledávač vracel přípravu místo výsledku
- Sekcí v korpusu
- 1 883
- Velikost
- 1,55 MB
- Souborů
- 283
- Index se staví
- 0,05 s
Teze: Fulltext nad vlastními dokumenty vracel na dotaz „jak to dopadlo“ přípravné materiály, ne výsledky. Oprava nebyla v algoritmu, ale ve struktuře dokumentů — a jeden zlepšovák to cestou zhoršil.
Problém
Na dotaz „shrň mi reklamace za poslední dobu s výsledky“ vracel vyhledávač přípravné dokumenty pojmenované po tématu. Závěry byly na konci dlouhých souborů, kam ořezávání nedosáhlo.
Co jsem zkusil a co z toho vyšlo
| Zásah | Výsledek |
|---|---|
| Substring matching | nemá pojem relevance — vracelo, co bylo v souboru první |
| BM25 přes SQLite FTS5 | správný směr: zvýhodní vzácné termíny (jméno, číslo, kód) |
| Váha na shodu v nadpisu | zhoršilo to — přípravné dokumenty jsou pojmenované po tématu, takže vyhrávaly |
| Poziční prior (pořadí sekce v souboru) | zabralo |
Závěry nahoru + --stav jako vstupní bod |
zabralo nejvíc |
Detaily, které rozhodly
- Jednotkou je sekce markdownu, ne soubor a ne odstavec — s cestou nadpisů, aby bylo vidět, odkud úryvek je.
- Diakritika se ignoruje (
unicode61 remove_diacritics 2), jinak „Zaneta“ nenajde „Žanetu“. - Poziční prior je schválně malý. U vágního dotazu, kde jsou skóre namačkaná na sobě, rozhodne pozice; u konkrétního („752“) rozptyl BM25 pozici přebije.
- Strop na soubor je adaptivní. Pevná hodnota škrtila domény s jedním velkým dokumentem.
- Obří tabulkové sekce (timeline, jeden řádek i několik kB) se redukují na shodné řádky.
- Strop výstupu 8 000 znaků. Při 13 kB slabý 27B model přehlédne klíčový řádek uprostřed.
Týž dotaz před a po
Dotaz: „jak dopadla reklamace, výsledek", táž doména, tytéž dokumenty.
Před — substring přes soubory. Vrátí seznam souborů, ve kterých se slovo někde vyskytuje. Bez pořadí podle relevance a bez informace, kde v souboru to je:
pipeline.md
archiv/[firma A]/Podklad - vzor 2.md
firmy/[firma B].md
firmy/[firma C].md
firmy/[firma D].md
firmy/[firma E].md
00-prehled.md
… 7 souborů
Čtenář — v tomhle případě model s omezeným kontextem — dostane sedm dokumentů, z nichž některé mají tisíce řádků, a závěr bývá na konci.
Po — BM25 nad sekcemi. Vrátí konkrétní sekce i s cestou nadpisů:
[firmy/[firma B].md] › Výsledek reklamace (31. 7. 2026) — ZAMÍTNUTO
[firmy/[firma D].md] › Průběh a výsledek (1/2026)
[firmy/[firma C].md] › Průběh jednání a výsledek (1–2/2026)
[firmy/[firma E].md] › Průběh jednání a výsledek (5/2026) › Dvě otázky…
Rozdíl není v tom, že by se našlo víc. Najde se totéž, ale rovnou to místo, kde odpověď je — a název sekce dopoví zbytek dřív, než se text vůbec načte. První výsledek nese odpověď přímo v nadpisu.
Rozměry (změřeno 2. 8. 2026)
| doména | sekcí | velikost |
|---|---|---|
| work | 650 | 402 kB |
| znalosti | 476 | 490 kB |
| health | 409 | 361 kB |
| cestování | 345 | 324 kB |
| deník | 3 | 2 kB |
| celkem | 1 883 | 1,55 MB ve 283 souborech |
Index se nikde neukládá. Staví se v paměti při každém spuštění — a trvá to 0,04 až 0,08 s i s vyřízením dotazu. Při téhle velikosti korpusu je jakákoliv cache jen další věc, která může být neaktuální: zdroj se mění ručně editací souborů a stará cache by tiše vracela smazaný text. Perzistentní index dává smysl až tam, kde stavba trvá déle než dotaz.
Poznámka k publikaci
Názvy firem v ukázce jsou nahrazené; struktura výstupu, počty i názvy sekcí jsou původní.
- vlastníreference/ref-search.py — fulltext BM25 nad dokumenty
- FTS5unicode61 remove_diacritics 2