Odstránenie dokumentačných záznamov

This commit is contained in:
Ján Pták 2026-10-26 12:47:06 +01:00
parent 427bbc3222
commit 3fe25382e6
13 changed files with 1 additions and 1307 deletions

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
.env .env
data/ data/
docs/
.venv/ .venv/
__pycache__/ __pycache__/
*.py[cod] *.py[cod]

View File

@ -1,153 +0,0 @@
{
"date": "2026-10-24",
"backup": "/tmp/zp-agent-graphrag-v2-backup-20261024T193749Z/project-before.tar.gz",
"removed": [
{
"path": "tools/rag/evaluation/results/retrieval_results_test.json",
"reason": "byte-identical duplicate",
"kept": "tools/rag/evaluation/results/retrieval_results_test_final.json",
"bytes": 1084326,
"sha256": "96b953285f0b2f249edb1ca500adc926df8211c732643e953539863930aac89f"
},
{
"path": "tools/rag/evaluation/results/retrieval_results_test.csv",
"reason": "byte-identical duplicate",
"kept": "tools/rag/evaluation/results/retrieval_results_test_final.csv",
"bytes": 659640,
"sha256": "61d718a664892784756666315f54c05b5bd80232508b2e22ba7b6c5e8fb7f282"
},
{
"path": "tools/rag/evaluation/results/retrieval_results.json",
"reason": "byte-identical duplicate",
"kept": "tools/rag/evaluation/results/retrieval_results_baseline.json",
"bytes": 88796,
"sha256": "46d6314e47868bc308fa96d572d163a1a3c70ed13c98cab2f26fbdd3c7583ebb"
},
{
"path": "tools/rag/evaluation/results/retrieval_results.csv",
"reason": "byte-identical duplicate",
"kept": "tools/rag/evaluation/results/retrieval_results_baseline.csv",
"bytes": 52000,
"sha256": "cc91e2daee386279f0bd4c3a85d3c6ff1dcdd0dec2e8d64e153f97e5e76ba74f"
},
{
"path": "tools/rag/evaluation/results/retrieval_results_dev.csv",
"reason": "byte-identical duplicate",
"kept": "tools/rag/evaluation/results/retrieval_results_dev_final.csv",
"bytes": 787621,
"sha256": "2d9f53942d3df67f1190b14e04e241fe57e3cfebdc70b6d2d2efc12a6b2d62b1"
},
{
"path": "graphrag_3_1_audit.txt",
"reason": "obsolete terminal transcript; preserved in pre-cleanup backup",
"bytes": 29495,
"sha256": "f5d588f1a31e6a85f9b6a5e782cd31cd6566e07102bd4940c5fcdfa95a3941f8"
},
{
"path": "graphrag_3_3_current_search.txt",
"reason": "obsolete terminal transcript; preserved in pre-cleanup backup",
"bytes": 85802,
"sha256": "e0a58a9c2f7896ed3527f6ff4e82d658674dfd27f340a1afaf47ba4bf702e0d3"
},
{
"path": "graphrag_3_3_dev.txt",
"reason": "obsolete terminal transcript; preserved in pre-cleanup backup",
"bytes": 52639,
"sha256": "94cf8bdd18fa6582ab1d7192c5787672679345201de1edef01b981ce8ec2b058"
},
{
"path": "tools/graphrag/evaluation/results/graphrag_dev_first10.json",
"reason": "intermediate smoke/selected run; v1 full results retained",
"bytes": 28564,
"sha256": "507e814b155115b44ae191ce5ae5316ec50855dad4c2a03cd8417da31a9a8afc"
},
{
"path": "tools/graphrag/evaluation/results/graphrag_dev_first10.csv",
"reason": "intermediate smoke/selected run; v1 full results retained",
"bytes": 7535,
"sha256": "86d364650f8292cf87ecb20a21da8d744009ecdd04d8d900042e7899a83ea5db"
},
{
"path": "tools/graphrag/evaluation/results/graphrag_dev_selected.json",
"reason": "intermediate smoke/selected run; v1 full results retained",
"bytes": 43599,
"sha256": "40b506ebf1cf0a3ee3d5567ad4d0486a4e9790ea0b9bb98a32e177cfd163e570"
},
{
"path": "tools/graphrag/evaluation/results/graphrag_dev_selected.csv",
"reason": "intermediate smoke/selected run; v1 full results retained",
"bytes": 9623,
"sha256": "eb0285025f5124f0c598ac3f91eae24bc115b1b9531a02cb9be20d9ade0d4eae"
},
{
"path": "scripts/",
"reason": "orphan bytecode only; source moved to tools/"
},
{
"path": "tools/graphrag/evaluation/graphrag_questions_before_schema_v2.json",
"reason": "exact historical copy already preserved in Git",
"kept_git_object": "9f3483d:tools/graphrag/evaluation/graphrag_questions.json",
"bytes": 747071,
"sha256": "0e9d4175b766c1af0e0af474bc56b260ba35d864f90fbd30339a9ffed03b6dab"
}
],
"retained": "All nonduplicate research runs, RAG DEV/TEST freeze, retrieval final/baseline, GraphRAG v1 artifacts, source-history archives and historical benchmark versions.",
"archived": [
{
"from": "tools/graphrag/evaluation/results/graphrag_dev.json",
"to": "tools/graphrag/evaluation/results/archive_pre_v1/graphrag_dev.json",
"reason": "retain historical full DEV run without confusing it with final results"
},
{
"from": "tools/graphrag/evaluation/results/graphrag_dev.csv",
"to": "tools/graphrag/evaluation/results/archive_pre_v1/graphrag_dev.csv",
"reason": "retain historical full DEV run without confusing it with final results"
}
],
"cache_cleanup": [
{
"path": ".pytest_cache",
"files": 5
},
{
"path": "test/__pycache__",
"files": 38
},
{
"path": "app/__pycache__",
"files": 4
},
{
"path": "app/.pytest_cache",
"files": 4
},
{
"path": "tools/__pycache__",
"files": 1
},
{
"path": "tools/rag/__pycache__",
"files": 14
},
{
"path": "tools/rag/evaluation/__pycache__",
"files": 9
},
{
"path": "tools/rag/tests/__pycache__",
"files": 41
},
{
"path": "tools/graphrag/__pycache__",
"files": 6
},
{
"path": "tools/graphrag/evaluation/__pycache__",
"files": 10
},
{
"path": "tools/graphrag/tests/__pycache__",
"files": 17
}
]
}

View File

@ -1,58 +0,0 @@
# Úpravy GraphRAG a upratanie projektu — 25. 10. 2026
Výsledky: [finálna správa v3](../tools/graphrag/evaluation/results/final_v3_2026-10-25/REPORT.md).
Upravené je grafové vyhľadávanie a jeho vyhodnotenie. Klasický RAG kód ani index sa funkčne nemenili.
## Zálohy a upratanie
Pred úpravami vznikla záloha `/tmp/zp-agent-graphrag-v2-backup-20261024T193749Z/project-before.tar.gz`, stav Gitu a neskôr export Neo4j `neo4j_before_v2.json`. Git tagy uchovávajú presné publikované implementácie.
[Cleanup manifest](cleanup_2026-10-24.json) zaznamenáva odstránené súbory a ponechané protikusy s SHA-256. Odstránených bolo päť presných kópií retrieval výsledkov, tri dočasné terminálové výpisy, štyri smoke/selected výstupy, historická kópia benchmarku už prítomná v Gite a osirelá cache pôvodného `scripts/`. Plný starý GraphRAG DEV sa presunul do označeného archívu. Final JSON/CSV, baseline, zmrazený RAG DEV/TEST a neidentické historické experimenty zostali zachované. CSV a JSON sa nepovažujú za duplicity rôznych formátov.
## Implementácia
- Celé mená, presná zhoda, kontrolované skloňovanie a bezpečné neznáme/nejednoznačné osoby; neznámy kandidát nezmení vyhľadávanie na globálne.
- Autor dokumentu vs. opisovaná osoba; celá fráza požadovaného tagu a oddelenie následnej vety/osôb.
- Typované prepojené dôkazy: osoba, konkrétna práca, jej názov/rok a správny dokument. Konfliktné údaje toho istého uzla sa odmietajú.
- Rozlíšenie roku štúdia a práce, nulového počtu a no-answer, presného počtu/množiny, platných alternatív zdrojov a URL.
- Nezávislý oracle pôvodných Markdown súborov; opravených 128 tagových predpokladov a 9 množín kategórií. Neskôr zdrojovo rozlíšený bakalársky projekt a záverečná práca.
- Doplnené vedecké a bakalárske projekty, akademické rozsahy rokov a regresné/negatívne/integritné testy.
- Freeze viaže kód, benchmark, raw Markdown, JSON vstupy, graf, audit, parametre a rozdelenie profilov; chráni pred prepísaním archívov.
## Podstatné vykonané príkazy
Použitý bol `.venv/bin/python`; pri pripojení sa načítala lokálna `.env` bez výpisu tajomstiev.
```bash
python -m tools.graphrag.evaluation.benchmark_v2
python -m tools.graphrag.evaluation.benchmark_v3
python -m tools.graphrag.build_graphrag
RUN_NEO4J_TESTS=1 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 pytest -q -p no:cacheprovider
python -m tools.graphrag.evaluation.evaluate_graphrag \
--split dev \
--audit tools/graphrag/evaluation/results/v3_preparation/source_audit.json \
--output-dir tools/graphrag/evaluation/results/final_v3_2026-10-25
python -m tools.graphrag.evaluation.freeze_graphrag \
--dev-results tools/graphrag/evaluation/results/final_v3_2026-10-25/graphrag_dev.json \
--audit tools/graphrag/evaluation/results/v3_preparation/source_audit.json \
--output tools/graphrag/evaluation/frozen_v3.json
python -m tools.graphrag.evaluation.evaluate_graphrag \
--split test \
--audit tools/graphrag/evaluation/results/v3_preparation/source_audit.json \
--freeze-manifest tools/graphrag/evaluation/frozen_v3.json \
--output-dir tools/graphrag/evaluation/results/final_v3_2026-10-25
docker compose build zp-agent-api
docker compose up -d --no-deps zp-agent-api
```
Príkazy na tvorbu datasetu a freeze boli použité pred archivovaním; existujúce zmrazené súbory neregeneruj na rovnaké miesto. Reprodukcia používa nový výstupný adresár.
## Výsledok
430 automatizovaných testov prešlo, 4 boli preskočené. Finálny DEV v3 589/589 a posledný doplnkový TEST 13/13 majú 0 runtime chýb. V2 malo prvý širší nezávislý TEST 67/80; tieto výsledky ani neskôr odhalené anotačné nedostatky nie sú skryté. V3 už obsahuje vystavených 80 otázok ako DEV. Nový malý TEST je profilovo oddelený, ale nie je reprezentatívnym dôkazom všeobecnej 100 % presnosti. Kvalita finálnej LLM odpovede a kompletný OpenWebUI GraphRAG agent patria do ďalších blokov projektu.
Docker overenie po zostavení finálneho obrazu: obsahové odtlačky Python kódu a datasetu v kontajneri sa zhodujú s manifestom v3, grafový DEV dotaz prešiel a `/health` má `ready=true`. Po testoch sa odstránila regenerovateľná Python/pytest cache mimo `.venv`; zoznam je v cleanup manifeste.

View File

@ -1,71 +0,0 @@
# Dokončenie širšej GraphRAG evaluácie v4
Zdrojové meranie a obmedzenia: [správa v4](../tools/graphrag/evaluation/results/final_v4_2026-10-25/REPORT.md).
## Rozsah a záloha
Pracovalo sa na grafovej vrstve a jej evaluácii. Stabilný klasický RAG, indexové JSON, baseline aj historické merania v1–v3 ostali zachované. Aktuálny default `jp170na/zpwiki:master` bol porovnaný s lokálnym checkoutom. Archív projektu a samostatný snapshot spravovaného Neo4j grafu sú v `/tmp/zp-agent-graphrag-v4-backup-20261025T013116Z/`. Konfiguračné kľúče sa do výsledkov ani Gitu nekopírujú.
## Zmeny
1. `benchmark_v4.py`: 320 nových zdrojových TEST otázok v 10 kategóriách; 722 DEV otázok zvlášť. Kvóty a seed sú určené bez výsledkov vyhľadávania. Žiadna otázka sa nevyraďuje podľa neúspechu.
2. Normalizované logické skupiny bránia tomu, aby sa parafráza rovnakého zadania tvárila ako nezávislý TEST. Freeze deklaruje, že 72 známych profilov sa prekrýva; nezamieňa to za profilovo nezávislé v2/v3 meranie.
3. Zdrojový oracle a grafový builder rozlišujú názvy, návrhy názvov, témy, organizačné poznámky, súvisiace práce a odkazy. Explicitný názov má prednosť. Linkovaný názov tímového projektu sa extrahuje ako názov, nie URL. Vyhľadávanie na názov nevracia bezmenný akademický záznam ako pozitívnu odpoveď.
4. Explicitný akademický rozsah `2022/23` sa nesmie prepísať nesúvisiacou kategóriou `vp2021`. Graf bol bezpečne znovu zostavený z rovnakých JSON vstupov.
5. Audit overuje všetky očakávania oproti raw Markdownu. Priama kontrola má 616 dôkazových záznamov, bez chyby. Doplnené sú zdrojové adjudikácie, mapovanie ID a vzorka kontroly pôvodných riadkov.
6. Osobitný `tools/answer_evaluation/` hodnotí skutočné odpovede školského modelu cez OpenWebUI API po dodaní grafového kontextu. Nejde o prehliadač ani nainštalovaný nástroj. Prvých 20 externých otázok je DEV; zostávajúcich 300 je TEST generovania. Kód a prompt majú vlastné odtlačky a presné ID. Pôvodný slabší diagnostický výsledok zostal uložený.
7. Nové regresné testy cielia neplatné zdrojové názvy, rok, únik logických skupín, chybné tvrdenia, null hodnoty a zámenu diplomovej/dizertačnej práce. Kompletná sada: 448 passed, 4 skipped.
## Použité príkazy
```bash
# Kontrola stavu a aktuálneho zdroja:
git status --short
git -C ../zpwiki ls-remote --symref origin HEAD
# Benchmark sa vytvára len do nových ciest:
.venv/bin/python -m tools.graphrag.evaluation.benchmark_v4
# Po načítaní .env, bez vypísania jeho hodnôt:
.venv/bin/python -m tools.graphrag.build_graphrag
RUN_NEO4J_TESTS=1 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
.venv/bin/python -m pytest -q -p no:cacheprovider
.venv/bin/python -m tools.graphrag.evaluation.evaluate_graphrag \
--split dev --audit tools/graphrag/evaluation/results/v4_preparation/source_audit.json \
--output-dir tools/graphrag/evaluation/results/final_v4_2026-10-25
.venv/bin/python -m tools.graphrag.evaluation.freeze_graphrag \
--dev-results tools/graphrag/evaluation/results/final_v4_2026-10-25/graphrag_dev.json \
--audit tools/graphrag/evaluation/results/v4_preparation/source_audit.json \
--output tools/graphrag/evaluation/frozen_v4.json
.venv/bin/python -m tools.graphrag.evaluation.evaluate_graphrag \
--split test --audit tools/graphrag/evaluation/results/v4_preparation/source_audit.json \
--freeze-manifest tools/graphrag/evaluation/frozen_v4.json \
--output-dir tools/graphrag/evaluation/results/final_v4_2026-10-25
# Pôvodná diagnostika, potom nový prompt na DEV a nový TEST generovania:
.venv/bin/python -m tools.graphrag.evaluation.check_openwebui \
--freeze-manifest tools/graphrag/evaluation/frozen_v4.json \
--audit tools/graphrag/evaluation/results/v4_preparation/source_audit.json \
--output tools/graphrag/evaluation/results/final_v4_2026-10-25/openwebui_sample.json
.venv/bin/python -m tools.answer_evaluation.evaluate_graph_answers \
--split dev --output-dir tools/graphrag/evaluation/results/answers_v4_dev_2026-10-25
.venv/bin/python -m tools.answer_evaluation.evaluate_graph_answers \
--split test --output-dir tools/graphrag/evaluation/results/answers_v4_test_2026-10-25
```
Medzi DEV behmi sa opravovali zdrojové anotácie a kód. Po finálnom grafovom TESTe sa grafový kód ani dataset nemenili. Po spustení 300-otázkového LLM TESTu sa nemenil prompt, kontextový adaptér ani hodnotenie. Reprodukcia vyžaduje nové výstupné adresáre a pôvodné odtlačky; nie je novým nezávislým meraním.
## Finálny výsledok
Grafový strict TEST 320/320 (100 %); zdrojový audit všetkých kontextových faktov 319/320 (99,69 %). Externý TEST odpovedí 281/300 (93,67 %), vrátane 19 zlyhaní, z toho 7 chýb spracovania JSON. Cieľ ≥92 % splnený v prvom finálnom behu oboch experimentov. Úplné JSON/CSV, zdrojové audity, súhrn a rozpis chýb sú uložené. Natívny výber nástrojov hlavným agentom zostáva bodom 4.
Docker obraz bol znovu zostavený a existujúci API kontajner obnovený bez reštartu Neo4j. Obsahové odtlačky grafového kódu, otázok, JSON vstupov a raw wiki v kontajneri zodpovedajú frozen_v4. Overený bol grafový dotaz aj `/health`.
```bash
docker compose build zp-agent-api
docker compose up -d --no-deps zp-agent-api
git diff --check
git commit -m "Dokončenie GraphRAG evaluácie"
git push --atomic origin graphrag-v1 graphrag-v4-frozen
```

View File

@ -1,100 +0,0 @@
# GraphRAG v5.1 — dokončenie bodu 3 a história iterácie v5
## Rozsah a protokol
Ide o nové meranie opravenej implementácie na historicky odhalených otázkach.
Výsledky v1–v4, otázky ani pôvodné očakávania sa neprepisujú. Používa sa
722 DEV otázok a 320 historických grafových TEST otázok. Druhý split je vo v5
regresia, nie nový nezávislý holdout. Nezavádzajú sa nové otázky iba kvôli skóre.
Generovanie sa ladí na 39 vopred deklarovaných prípadoch: 20 pôvodných DEV
výstupov a 19 zlyhaní historického LLM TESTu. Finálna regresia generovania má
všetkých 320 historických otázok vrátane týchto 39 DEV; tento prekryv je
výslovne uložený v protokole a vo výsledkoch. Žiadna otázka sa nevynecháva
podľa úspechu vyhľadávania alebo modelu.
Záloha kódu, dát a spravovaného grafu je v
`/tmp/zp-bod3-v5-backup-20261025T155423Z/`. Konfiguračné tajomstvá sa nearchivujú.
## Opravy
- Príprava na akademický projekt je organizačná poznámka. Sama nevytvára
akademický záznam ani jeho rok. Tým sa rieši historický prípad `wide-080`.
- Označenie „Návrh na zadanie BP“ samo nedokazuje názov práce. Pri doplnkovej
kontrole DEV sa odhalili tri výstupy Martina Šarišského s takto odhadnutým
názvom. Parser teraz používa explicitné názvy/témy alebo dovolený úvodný
názvový odsek. Očakávania benchmarku sa kvôli predikciám nemenili.
- Prvá zmrazená v5 mala regresiu 319/320. `wide-275` odhalil konzultačnú
poznámku nesprávne použitú ako názov projektu na hranici chunku. V5.1
vylučuje tieto organizačné vety; prvá iterácia a overený zdrojový patch ostávajú uložené.
- Evaluator odmieta `complete=false` aj bez príznaku `truncated` a kontroluje
všetky vrátené typované fakty proti nezávislému čítaniu raw Markdownov:
osobu, dokument, URL, akademický názov/rok/typ, metadata na tom istom
dokumente, zdieľané vlastnosti a porovnania rokov. Chybné nadbytočné fakty
znižujú strict skóre. Nejde o všeobecný sémantický súd ľubovoľných viet.
- Zmrazenie zahŕňa spoločné moduly, publikačnú politiku a pravidlo prípravy;
finálna generácia kontroluje identitu kódu/promptu/dát voči dokončenému DEV.
- Pokyny pre LLM vysvetľujú väzbu názvu a tagu pri tej istej osobe aj cez
dcérsky dokument. Kategória a autor dokumentu musia mať spoločný dokument.
- JSON sa kontroluje typovanou schémou. Jeden úplný JSON blok sa môže vybrať
z Markdown ohraničenia bez prepisovania hodnôt. Skutočne neplatný JSON môže
vyvolať najviac jeden opravný požiadavok s pôvodnou otázkou a kontextom.
Gold odpovede sa neposielajú modelu; všetky pokusy aj prvotná úspešnosť sa ukladajú.
## Overenie a príkazy
Kompletná regresná sada finálnej v5.1: **525 passed, 4 skipped**. Prvý prísny
DEV mal 719/722; tri nesúlady názvu viedli k oprave parsera uvedenej vyššie.
V5 mala DEV 722/722, regresiu 319/320 a DEV generovania 38/39. V5.1 má
DEV 722/722 a regresiu 320/320 vrátane všetkých typovaných faktov; DEV
generovania zostal 38/39. Tieto priebežné výsledky sa nezatajujú.
Použité hlavné príkazy po načítaní lokálnej konfigurácie:
```bash
RUN_NEO4J_TESTS=1 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 .venv/bin/python -m pytest -q
docker compose build zp-agent-api
docker compose up -d --no-deps zp-agent-api
```
Koordinovaná obnova indexov používa autentifikovaný `POST /sync` s
`{"pull_git":false}`. Korpus zostáva 114 dokumentov/887 chunkov, aktualizovaný
graf má 446 uzlov a 877 vzťahov. Presné indexové verzie a finálne výsledky
sú identifikované vo finálnej správe v5.1 a v zázname overenia nasadenia.
Grafový protokol:
```bash
python -m tools.graphrag.evaluation.evaluate_graphrag \
--split dev --audit tools/graphrag/evaluation/results/v5_1_preparation/source_audit.json \
--output-dir tools/graphrag/evaluation/results/final_v5_1_2026-10-25
python -m tools.graphrag.evaluation.freeze_graphrag \
--dev-results tools/graphrag/evaluation/results/final_v5_1_2026-10-25/graphrag_dev.json \
--audit tools/graphrag/evaluation/results/v5_1_preparation/source_audit.json \
--purpose historical_regression --output tools/graphrag/evaluation/frozen_v5_1.json
python -m tools.graphrag.evaluation.evaluate_graphrag \
--split test --audit tools/graphrag/evaluation/results/v5_1_preparation/source_audit.json \
--freeze-manifest tools/graphrag/evaluation/frozen_v5_1.json \
--output-dir tools/graphrag/evaluation/results/final_v5_1_2026-10-25
```
Generovanie nad rovnakým zmrazeným grafom:
```bash
python -m tools.answer_evaluation.evaluate_graph_answers \
--split dev --dev-ids tools/graphrag/evaluation/results/v5_1_preparation/generation_dev_ids.json \
--audit tools/graphrag/evaluation/results/v5_1_preparation/source_audit.json \
--freeze-manifest tools/graphrag/evaluation/frozen_v5_1.json \
--output-dir tools/graphrag/evaluation/results/answers_v5_1_dev_2026-10-25
python -m tools.answer_evaluation.evaluate_graph_answers \
--split regression --dev-ids tools/graphrag/evaluation/results/v5_1_preparation/generation_dev_ids.json \
--dev-results tools/graphrag/evaluation/results/answers_v5_1_dev_2026-10-25/answers_dev.json \
--audit tools/graphrag/evaluation/results/v5_1_preparation/source_audit.json \
--freeze-manifest tools/graphrag/evaluation/frozen_v5_1.json \
--output-dir tools/graphrag/evaluation/results/answers_v5_1_regression_2026-10-25
```
Príkazy vyššie dokumentujú pôvodný beh. Pri reprodukcii použite nové výstupné
adresáre a zachovajte zodpovedajúci zmrazený manifest. Nový manifest vytvárajte
pre novú verziu; existujúce finálne súbory sú nemenné. Reprodukcia nie je nový
nezávislý TEST. Aktuálny release označuje Git tag `graphrag-v5.1-frozen`.

View File

@ -1,165 +0,0 @@
# GraphRAG v6 — kontext, citácie a kontrola zdrojov
Práce z 25. 10. 2026 nadväzujú na historickú v5.1. Výsledky a otázky v1–v5.1
sa neprepisujú. Záloha vstupného projektu je v
`/tmp/zp-v6-backup-20261025T170922Z/before.tar.gz`, dodatočný snapshot grafu
v `/tmp/zp-v6-graph-before.json`. Sú to lokálne zálohy, nie verzované artefakty.
## Osem úloh
1. RAG vkladá `complete`, `truncated`, `truncation_reasons`, `index_version`
aj do textového kontextu. Grafový adaptér tieto hodnoty prenáša bez
domýšľania; starý výsledok bez verzie ostáva s `index_version=null`.
2. Oba prompty rozlišujú úplné, neúplné a neznáme pokrytie. Kontrola generovania
vyžaduje upozornenie na neúplnosť. Presný agregovaný počet môže byť úplný,
aj keď sú orezané zobrazené dôkazy. Z neúplnej agregácie sa celkový počet
nesmie odvodzovať.
3. Spoločný modul `context_policy.py` kontroluje `source_urls` aj odkazy priamo
v texte vrátane Markdownu, relatívnych cieľov a adries s `www.`. Povolené
sú presné URL zdrojov konkrétneho dotazu, nie ľubovoľné známe wiki URL.
Úvodzovky a bežná interpunkcia nie sú súčasťou citovanej URL.
4. Nové testy obsahujú správnu povinnú citáciu s ďalším chybným odkazom,
správnu URL iného dotazu, relatívny a ne-HTTP odkaz aj korektné citácie.
Archivované odpovede sa znovu skontrolovali bez volania modelu a bez
prepisovania ich pôvodných skóre. Nový prepočet je v
`results/v6_preparation/citation_regrade.json`.
Kontrola zahŕňa 56 archivovaných súborov a 6 044 odpovedí (opakované
experimenty sa prekrývajú), s piatimi porušeniami prísneho kontraktu URL.
5. Typ práce sa nesmie vydávať za `keyword`. `answer_candidates` spája
doložený názov/rok a doslovný tag cez tú istú osobu aj cez jej dcérske
dokumenty. Nespája ľudí navzájom; názov s rokom musí patriť jednému
akademickému záznamu a kategória s autorom rovnakému dokumentu.
6. Vzorka 34 otázok zahŕňa všetkých desať kategórií a známe rizikové prípady.
Priame čítanie pôvodných Markdownov je oddelené od grafového retrievera;
vykonala ho AI. Výber, výňatky, SHA-256, závery a hárok pre človeka sú
v `results/v6_preparation/`. **Ľudské posúdenie neprebehlo.**
7. Celý grafový DEV, regresia a generované odpovede sa merajú samostatne.
Zmrazenie zahŕňa spoločné moduly, schému odpovede, kontroly kontextu,
publikačnú politiku a kód RAG evaluátora; generovanie navyše fixuje prompt,
model, jeho parametre a vybrané ID. Finálne opakovanie známych otázok je
historická regresia, nie nový nezávislý TEST.
8. Nasadený Docker sa overuje voči zmrazeniu, `/health`, reálnemu `/rag`,
grafovým dotazom v kontajneri a spoločnej generácii JSON/SQLite/Neo4j.
Synchronizácia sa vykonala cez `/sync` s `pull_git=false`, bez zmeny wiki.
## Kontroly a opravný pokus
`generate_checked_answer()` nedostáva benchmark, očakávanú odpoveď ani oracle.
Používa iba otázku, skutočný kontext, prompt a klienta modelu. Najviac jeden
spoločný opravný požiadavok rieši neplatný JSON alebo porušenie pravidiel
kontextu. Gold sa používa až po ukončení generovania. Chybná odpoveď, prípadný
opravný pokus aj konečné odmietnutie sú uložené; odmietnutá odpoveď sa počíta
ako zlyhanie, nevynecháva sa z menovateľa.
`accepted_for_delivery=false` znamená, že konzument odpoveď nesmie zobraziť
ako overenú. Nejde o záruku pravdivosti každého voľného súvetia. Kontroly
overujú citácie, štruktúrované fakty a vybrané rozpory; formálna evaluácia
navyše kontroluje požadované väzby, hodnoty v texte a zdrojové dôkazy.
Budúci OpenWebUI agent musí tieto kontroly volať a rešpektovať ich výsledok;
natívne rozhodovanie a smerovanie nástrojov ostáva bodom 4.
Klasický RAG má samostatnú prezentačnú funkciu `finalize_rag_answer()`.
Ak model uviedol správne podložené údaje, ale vynechal povinné upozornenie,
pridá iba vetu „Výpis je neúplný.“ a uchová presný pôvodný `model_answer`,
pôvodné kontrolné dôvody aj príznak `display_notice_added`. Nepridáva fakty
ani ďalší požiadavok na model. Neznáme citácie a nepodložené tvrdenie o úplnom
zozname týmto spôsobom neobchádza. RAG evaluátor používa túto funkciu pred
hodnotením a budúci nástroj ju musí použiť pred doručením odpovede.
Päť vopred vybraných živých RAG prípadov malo správne fakty a zdroje 5/5,
ale chýbajúce upozornenie 5/5. Pôvodné výstupy ostávajú v `rag_live_smoke.json`.
Prehratie tých istých odpovedí cez prezentačnú funkciu má 5/5 prijateľných
výstupov v `rag_delivery_replay.json`. Nie je to nové meranie modelu ani
odhad presnosti klasického RAG z piatich prípadov. Zmena tejto čisto RAG
vrstvy nezasahuje do zmrazeného grafového generovania; celkový release
navyše fixuje všetky runtime moduly v `frozen_release_v6.json`.
## Zistenia zo zdrojovej kontroly
Generický odkaz `Písomná práca: [rešerš](...)` nie je doložený názov projektu.
V Dáriusovom profile je v sekcii TP 2019, zatiaľ čo cieľový dokument má vlastný
názov a kategóriu `tp2020`. Názov ani rok dcérskeho dokumentu sa neprenášajú
do nadradeného akademického záznamu. To isté pravidlo platí pre všetkých ľudí,
nie iba pre dve známe zlyhania modelu. Konkrétny názov typu „Rešerš na tému
prekladu“ ostáva platným kandidátom.
Nový benchmark v6 zachováva všetkých 1 042 ID, texty, kategórie a rozdelenie
722 DEV / 320 regresia. Opravených je 15 očakávaní vrátane štyroch
`wide-116`, `wide-142`, `wide-145`, `wide-165`; tieto štyri otázky ostávajú
v pôvodných kategóriách a očakávajú `no_answer`. Regresia má preto 284
kladných a 36 záporných očakávaní. Úplné pred/po je v
`source_adjudications.json`. Vyššie skóre oproti v5.1 nemožno pripísať iba
zlepšeniu modelu, keďže sa opravil aj gold a zmenili kontroly.
Zo vzorky: 31 očakávaní podporených, dve opravené a jedno podmienené zavedenou
konvenciou. Pri `wide-112` Tomáš Kuchárik nemá výslovnú vetu o začiatku
štúdia; rok 2016 sa odvodzuje z ročníka adresára `students/2016`. Tento
fallback používa aj existujúci systém. Nie je nezávislým dôkazom skutočného
dátumu nástupu a vyžaduje potvrdenie človekom pred interpretáciou ako
administratívny fakt.
Pri prísnej politike „všetky URL len zo sources“ historický RAG prípad
`q0892` neprejde, lebo v texte navyše uvádza `http://skner.tukekemt.xyz`.
Táto adresa v súčasnom Markdowne reálne existuje; nie je to dôkaz halucinácie.
Nie je však v archivovanom zozname nástrojových `source_url`. Nové skóre je
skóre dodržania prísneho kontraktu, nie nový úsudok o pravdivosti tej adresy.
## Protokol generovania
DEV má vopred vybraných 42 známych otázok: predchádzajúcich 39, historickú
chybu `wide-129` a opravené title otázky. Prvý DEV kandidát mal 41/42;
`wide-283` nesprávne odmietol spojenie tagu a roku cez profil a dcérsky dokument.
Nasledovala oprava všeobecného spojenia osoby a nový DEV pred finálnym behom.
Pôvodný kandidátsky DEV je zachovaný v `answers_v6_dev_2026-10-25`.
`frozen_candidate.json` a overený `candidate_to_final.patch` zachovávajú
prvú kandidátsku implementáciu; spätné aplikovanie patchu ju obnoví.
Kandidátske retrieval výpisy sú iba v lokálnej zálohe
`/tmp/zp-v6-candidate-before-year-join/retrieval`; pre finálne grafové čísla
sa používajú výhradne plné uložené v6 výsledky. Kandidát nie je release.
Finálna regresia vždy obsahuje všetkých 320 otázok vrátane DEV prekryvu.
## Príkazy a reprodukcia
Prostredie načítavajte bez vypisovania `.env`. Existujúce výstupné adresáre
ani zmrazené súbory neprepisujte; pri reprodukcii zvoľte nové cesty.
```bash
python -m tools.graphrag.evaluation.benchmark_v6
RUN_NEO4J_TESTS=1 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 python -m pytest -q
python -m tools.graphrag.evaluation.evaluate_graphrag \
--questions tools/graphrag/evaluation/graphrag_questions_v6.json --split dev \
--audit tools/graphrag/evaluation/results/v6_preparation/source_audit.json \
--output-dir NOVY_RETRIEVAL_ADRESAR
python -m tools.graphrag.evaluation.freeze_graphrag \
--dev-results NOVY_RETRIEVAL_ADRESAR/graphrag_dev.json \
--questions tools/graphrag/evaluation/graphrag_questions_v6.json \
--audit tools/graphrag/evaluation/results/v6_preparation/source_audit.json \
--purpose historical_regression --output NOVY_MANIFEST.json
python -m tools.graphrag.evaluation.evaluate_graphrag \
--questions tools/graphrag/evaluation/graphrag_questions_v6.json --split test \
--audit tools/graphrag/evaluation/results/v6_preparation/source_audit.json \
--freeze-manifest NOVY_MANIFEST.json --output-dir NOVY_RETRIEVAL_ADRESAR
python -m tools.answer_evaluation.evaluate_graph_answers \
--questions tools/graphrag/evaluation/graphrag_questions_v6.json \
--audit tools/graphrag/evaluation/results/v6_preparation/source_audit.json \
--freeze-manifest NOVY_MANIFEST.json \
--dev-ids tools/graphrag/evaluation/results/v6_preparation/generation_dev_ids.json \
--split dev --output-dir NOVY_LLM_DEV
python -m tools.answer_evaluation.evaluate_graph_answers \
--questions tools/graphrag/evaluation/graphrag_questions_v6.json \
--audit tools/graphrag/evaluation/results/v6_preparation/source_audit.json \
--freeze-manifest NOVY_MANIFEST.json \
--dev-ids tools/graphrag/evaluation/results/v6_preparation/generation_dev_ids.json \
--dev-results NOVY_LLM_DEV/answers_dev.json \
--split regression --output-dir NOVY_LLM_REGRESSION
docker compose build zp-agent-api
docker compose up -d zp-agent-api
```
`benchmark_v6` slúži na jednorazovú migráciu a odmietne prepísať hotový dataset.
Pri obyčajnej reprodukcii používajte uložené v6 otázky. Živé syntetické
funkčné scenáre sa spúšťajú cez `tools.answer_evaluation.check_context_scenarios`;
nepripočítavajú sa k 320 otázkam ani k meraniu presnosti na wiki.
Finálne čísla, zlyhania a stav nasadenia:
[správa v6](../tools/graphrag/evaluation/results/final_v6_2026-10-25/REPORT.md).

View File

@ -1,133 +0,0 @@
# Uzavretie bodu 3 — GraphRAG v7, 26. 10. 2026
V7 opravuje konkrétne chyby z posledného auditu. Historické otázky,
manifesty, tagy a výsledky v1–v6 zostávajú zachované. Záloha projektu,
indexových súborov a grafu je v `/tmp/zp-v7-backup-20261026/`.
## Opravy
1. Dotaz rešpektuje ľubovoľný štvormiestny rok vrátane 1899, 1999, 2100
a 9999. Nepodporovaný zápis po „roku“, napríklad 10000 alebo 20xx,
sa odmieta cez `unsupported_year_constraint`. Podmienka sa nepremení
na vyhľadávanie bez časového obmedzenia.
2. Upozornenie na neúplnosť už nepovoľuje kladné tvrdenie o úplnom zozname
v inej vete. Kontrola rozlišuje aj pravdivé popretie „Nie je to úplný
zoznam“. Testy obsahujú obe možnosti aj skloňované „všetkých študentov“.
3. Model vyberá štruktúrované `claims`, `source_urls`, `status`, `count`;
`answer` ponecháva prázdne. Text pre používateľa zostaví
`render_graph_answer()` z overených hodnôt, bez gold a bez nových faktov.
Pôvodná HTTP odpoveď, parsované tvrdenia a vykreslená odpoveď ostávajú
osobitne uložené. Voľná próza modelu sa nepoužíva ako doručený text.
4. Pri kontrole starého alebo neočakávaného voľného textu sa odmietajú
nepodložené číselné údaje. URL a doslovné hodnoty overených titulov sa
pred týmto porovnaním odlíšia od nových tvrdení. Prípad s dopísaným
rokom 2099 tak neprejde. Samotné porovnávanie čísel nie je úplný
sémantický analyzátor slovenčiny; doručený grafový text je preto
deterministický a obsahuje iba overené polia.
5. `count` musí mať podklad v úplnej agregácii. Pozitívna faktová odpoveď
musí obsahovať tvrdenia a citácie; kontrolujú sa zdroje jednotlivých
uvedených atribútov. Prázdna úplná agregácia s počtom 0 je platná.
6. Citácie sa kontrolujú v bežnom texte, inline a referenčnom Markdowne
aj HTML `href`/`src`, vrátane relatívnych URL, HTML entít a vnorených
zátvoriek v platnej URL. Povolené sú iba URL dodané pre konkrétny dotaz.
7. Ročník adresára sa prestal používať ako začiatok štúdia. Builder aj
nezávislý oracle vyžadujú explicitnú vetu v texte. Graf uvádza
`start_year_basis=explicit_text|missing` a
`start_year_confidence=documented|unknown`. Oracle vedie `cohort_year`
oddelene; táto hodnota sa nevydáva za začiatok štúdia. Pri chýbajúcom
údaji nástroj vráti `missing_documented_start_year`.
8. Hodnotenie mena povoľuje obmedzené gramatické prípony v prirodzenom
texte, ale štruktúrovanú identitu naďalej porovnáva presne. „Martina
NaN1“ sa nezamieňa za iného Martina. Pri deterministickom texte sú
mená aj tak v pôvodnom tvare. Parser JSON neprepisuje neplatné hodnoty;
jeden spoločný opravný požiadavok pre formát/kontext ostáva limitom.
9. Evaluačné CLI vyžadujú explicitný dataset, audit a manifest. Odpovedný
runner vyžaduje aj zoznam DEV; historická regresia navyše vlastné ID.
Už nevyberajú v4 ako tichý predvolený benchmark. Hashované cesty kódu
generovania sú relatívne voči projektu, aby sa dali overiť aj inde.
## Benchmark a oddelenie meraní
Všetkých 1 042 odhalených v6 otázok prešlo do DEV. Pridali sa štyri
potrebné regresné otázky na roky mimo 20xx. DEV má **1 046 otázok**.
Odstránenie odhadu štúdia opravilo 10 očakávaní; údaje, ktoré dokument
neuvádza, sa očakávajú ako nenájdené. ID ani text pôvodných otázok sa
nevymazali. Zmeny sú v `v7_preparation/source_corrections.json`.
Nový **TEST má 80 otázok**, 72 kladných a 8 záporných, vo všetkých
desiatich kategóriách. Seed, kvóty a výber boli uložené pred vyhľadávaním.
Žiadna logická query skupina sa neprekrýva s odhalenými otázkami ani DEV.
Ide o nové kombinácie nad známou wiki, osobami a šablónami. Nie je to
experiment s neznámymi osobami, novým korpusom alebo ľudskou anotáciou.
Počet otázok v kategóriách je obmedzený dostupnými novými skupinami:
spojenie autor–kategória má dve nové skupiny, výpis kategórií sedem.
Kvóty sa neurčovali podľa úspechu retrievera. Reprezentatívnu vzorku
20 otázok (dve z každej kategórie) skontrolovala AI priamo oproti
Markdownom pred meraním. `source_review_packet.json` obsahuje pôvodné
výňatky a dôkazy; `source_review.csv` závery. **Človek ju neanotoval.**
Odstránenie odhadu z adresára teda rieši neistotu z auditu; nenahrádza
nezávislú ľudskú anotáciu celého korpusu.
Graf sa zmrazí po kompletnom DEV. Generovanie má vopred deklarovaných
46 DEV otázok: predchádzajúcich 42 a štyri nové rokové regresie.
Finálny nový TEST sa spustí raz po úspešnom DEV. Výsledky sa nepoužijú
na ladenie tejto verzie. Všetkých 320 pôvodných historických otázok sa
meria oddelene ako regresia; jej prekryv s modelovým DEV je priznaný.
## Zmrazenie a nasadenie
`frozen_v7.json` viaže implementáciu, raw Markdown, dataset, JSON vstupy,
graf, publikačnú politiku a parametre. Deklarácia `frozen_answers.json`
navyše fixuje model, prompt, renderer a presné ID merania. Kompletný
`frozen_release_v7.json` pokrýva všetky runtime moduly a merané artefakty.
Docker sa overuje cez `/health`, reálne `/rag`, grafové pozitívne aj
negatívne dotazy, novú rokovú regresiu a chýbajúci začiatok štúdia.
JSON, SQLite a Neo4j majú spoločnú generáciu po `/sync` s `pull_git=false`.
Publikačná politika ostáva: iba explicitné `published=false` sa vylúči.
## Príkazy
Konfiguráciu načítajte z prostredia bez jej vypisovania. Pri reprodukcii
vždy používajte nové výstupné cesty; existujúce otázky a merania neprepisujte.
```bash
# Jednorazové vyhlásenie benchmarku; hotový dataset neregenerovať.
python -m tools.graphrag.evaluation.benchmark_v7
RUN_NEO4J_TESTS=1 RUN_LIVE_TESTS=1 RUN_LIVE_RAG_E2E=1 \
HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 python -m pytest -q
python -m tools.graphrag.evaluation.evaluate_graphrag \
--questions tools/graphrag/evaluation/graphrag_questions_v7.json --split dev \
--audit tools/graphrag/evaluation/results/v7_preparation/source_audit.json \
--output-dir NOVY_GRAF_DEV
python -m tools.graphrag.evaluation.freeze_graphrag \
--questions tools/graphrag/evaluation/graphrag_questions_v7.json \
--dev-results NOVY_GRAF_DEV/graphrag_dev.json \
--audit tools/graphrag/evaluation/results/v7_preparation/source_audit.json \
--purpose independent_holdout --output NOVY_MANIFEST.json
python -m tools.graphrag.evaluation.evaluate_graphrag \
--questions tools/graphrag/evaluation/graphrag_questions_v7.json --split test \
--audit tools/graphrag/evaluation/results/v7_preparation/source_audit.json \
--freeze-manifest NOVY_MANIFEST.json --output-dir NOVY_GRAF_DEV
python -m tools.answer_evaluation.evaluate_graph_answers \
--questions tools/graphrag/evaluation/graphrag_questions_v7.json \
--audit tools/graphrag/evaluation/results/v7_preparation/source_audit.json \
--freeze-manifest NOVY_MANIFEST.json \
--dev-ids tools/graphrag/evaluation/results/v7_preparation/generation_dev_ids.json \
--split dev --output-dir NOVY_LLM_DEV
```
Pre nový TEST použite tie isté parametre, `--split test`,
`--dev-results NOVY_LLM_DEV/answers_dev.json` a nový výstupný adresár.
Pri historickej regresii použite `--split regression` a navyše
`--regression-ids tools/graphrag/evaluation/results/v7_preparation/regression_ids.json`.
Opakovaný beh už odhaleného TESTu je reprodukcia/regresia, nie ďalší
nezávislý experiment. Po ladení podľa TESTu treba nový vopred deklarovaný TEST.
Kompletné výsledky a zostávajúce metodické obmedzenia sú v
[správe v7](../tools/graphrag/evaluation/results/final_v7_2026-10-26/REPORT.md).
Ďalší blok je natívna integrácia nástrojov a hlavného agenta v OpenWebUI.

View File

@ -1,102 +0,0 @@
# Publikovanie dokumentov a dostupnosť nástrojov
## Jednotná politika
Používateľ zvolil zahrnutie dokumentov bez `published`. RAG aj GraphRAG preto
predvolene používajú `published_only=true` s týmto významom:
| Hodnota zdroja | Predvolené vyhľadávanie |
|---|---|
| `published: true` | Zahrnúť |
| Chýbajúce `published` alebo normalizované `null` | Zahrnúť |
| `published: false` | Vylúčiť |
Chýbajúca hodnota zodpovedá predvolenému významu príznaku v
[Grav](https://learn.getgrav.org/2/content/headers). Táto politika určuje
výber podľa `published`; API naďalej používa svoju existujúcu autentifikáciu.
V aktuálnom korpuse nie sú nastavené `publish_date` ani `unpublish_date`.
SQL používa `COALESCE(published, 1) = 1`, graf efektívnu publikačnú hodnotu.
Zdrojový JSON a SQLite zachovávajú pôvodné `null`; grafový builder ho
normalizuje na efektívne `true`. Všetkých 16 pôvodne neoznačených dokumentov
je teda dostupných v oboch vetvách. Jeden explicitne nepublikovaný dokument
sa predvolene vylúči.
Pri RAG sa filter aplikuje na FTS, embeddingy aj všetky rozšírenia kontextu.
Pri grafe platí pre katalóg entít, fakty, spoločné vlastnosti, počítanie,
prechádzanie grafu a zoznam zdrojov. Entity doložené iba skrytými dokumentmi
sa nezaradia do verejného katalógu. Pôvod názvu témy a canonical profilu
osoby sa kontroluje podľa príslušného zdrojového dokumentu.
Výslovné zahrnutie nepublikovaných dokumentov pre autorizované volanie:
```json
{"query": "vyhľadávací dotaz", "published_only": false}
```
Python funkcie používajú rovnaký parameter `published_only=False`.
Oba vyhľadávacie CLI podporujú `--include-unpublished`. Pred pripojením
nástrojov do OpenWebUI sa používa aktuálna OpenAPI schéma s novým defaultom.
## Migrácia uloženého grafu
Po nasadení sa vykoná spoločná synchronizácia. Tá opraví staré zamenenie
chýbajúcej hodnoty s `false` a doplní pôvod názvu témy. Verzia indexov obsahuje
`publication_policy: explicit-false-hidden-v1`. Pred migráciou predvolené
grafové vyhľadávanie vyžaduje synchronizáciu a health uvádza
`publication_sync_required`. Existujúce historické merania sa neprepisujú;
časť klasického baseline používala aj nepublikované dokumenty.
## `/health`
HTTP 200 a `status=ok` označujú živý API proces. `ready` znamená pripravenosť
oboch vyhľadávacích nástrojov. Klient/agenta pri výbere konkrétneho nástroja
zaujímajú samostatné položky `tools`:
- `tools.rag`: čitateľný SQLite/FTS5/embedding index, zhoda verzie a známa
úspešná inicializácia embeddingového modelu. Úspešné vyhľadanie alebo sync
obnoví stav modelu po prípadnom zlyhaní inicializácie.
- `tools.neo4j`: dostupné spojenie a vykonanie read-only sondy v databáze.
Sonda používa krátke časové limity a nevykonáva automatické opakovania transakcií.
- `tools.graphrag`: dostupné Neo4j, neprázdny graf, zhodná generácia dát
a migrovaná publikačná politika.
Výpadok Neo4j nespôsobí nedostupnosť RAG. Neplatný SQLite index môže vyradiť
RAG, pričom graf ostane dostupný. Počas nejasného prepnutia generácie sa
vyhľadávacie nástroje označia ako nedostupné; stav samotného Neo4j sa uvádza
samostatne. Odpovede neobsahujú prihlasovacie údaje ani surové chyby drivera.
Príklad výpadku Neo4j, skrátený na rozhodujúce polia:
```json
{
"status": "ok",
"ready": false,
"tools": {
"rag": {"ready": true, "status": "ready", "reason": null},
"neo4j": {"ready": false, "status": "unavailable", "reason": "unreachable"},
"graphrag": {"ready": false, "status": "unavailable", "reason": "neo4j_unavailable"}
}
}
```
Ide o dostupnosť retrieval nástrojov. Health neposiela otázky školskému LLM
a nemeria dostupnosť externého generatívneho modelu ani presnosť odpovedí.
## Overenie nasadenia 25. 10. 2026
- Kompletná regresná sada: **485 úspešných testov, 4 preskočené**. Zahŕňa
skutočné Cypher testy filtrovania, agregácie a grafových prechodov nad
izolovaným Neo4j grafom s rollbackom.
- Docker image bol znovu zostavený a API nasadené. Autentifikovaný `/sync`
bez Git pullu obnovil 114 dokumentov, 887 chunkov a graf 447 uzlov/879 vzťahov.
- Reálne `/search`, `/rag` a `search_graph()` overili predvolené vylúčenie
skrytého dokumentu aj jeho zahrnutie pri `published_only=false`.
- HTTP `/health` hlási všetky tri stavy pripravené; SQLite, súborová verzia
a Neo4j používajú rovnakú novú generáciu dát.
- Sonda s nefunkčnou adresou Neo4j potvrdila dostupnosť RAG pri nedostupnom
grafe. Sonda s chýbajúcim SQLite indexom potvrdila dostupnosť grafu pri
nedostupnom RAG. Produkčné služby sa pri týchto sondách nevypínali.
Strojovo čitateľný výsledok a identifikácia dát:
[publikovanie_a_dostupnost_overenie.json](publikovanie_a_dostupnost_overenie.json).

View File

@ -1,162 +0,0 @@
{
"status": "ok",
"index_version": {
"version": "ff682d98134d406081040902f234c44f",
"git_revision": "3e892a1d49e9bce118cd03478ce15e01c2bebb4e",
"created_at_utc": "2026-10-25T15:06:03.279424+00:00",
"source_sha256": "007792c12f3467dd3203bb4951ccc197fdc0eef669580f1b1f893baf609ca363",
"documents_sha256": "0542af2a373771cf7c4a95f93d14f4f687f6a0187846892c959aa6efc4bade52",
"chunks_sha256": "437dde589be46e0c30842dd330de22d96a0173d2dbaff9c5f129568cb2bca4c9",
"embedding_model": "intfloat/multilingual-e5-small",
"publication_policy": "explicit-false-hidden-v1"
},
"health": {
"status": "ok",
"ready": true,
"database_exists": true,
"search_engine": "hybrid_fts5_embeddings",
"rag_enabled": true,
"zpwiki_exists": true,
"security_configured": true,
"index_version": {
"version": "ff682d98134d406081040902f234c44f",
"git_revision": "3e892a1d49e9bce118cd03478ce15e01c2bebb4e",
"created_at_utc": "2026-10-25T15:06:03.279424+00:00",
"source_sha256": "007792c12f3467dd3203bb4951ccc197fdc0eef669580f1b1f893baf609ca363",
"documents_sha256": "0542af2a373771cf7c4a95f93d14f4f687f6a0187846892c959aa6efc4bade52",
"chunks_sha256": "437dde589be46e0c30842dd330de22d96a0173d2dbaff9c5f129568cb2bca4c9",
"embedding_model": "intfloat/multilingual-e5-small",
"publication_policy": "explicit-false-hidden-v1"
},
"tools": {
"rag": {
"ready": true,
"status": "ready",
"reason": null,
"embedding_model": "intfloat/multilingual-e5-small",
"dimensions": 384,
"index_version": {
"version": "ff682d98134d406081040902f234c44f",
"git_revision": "3e892a1d49e9bce118cd03478ce15e01c2bebb4e",
"created_at_utc": "2026-10-25T15:06:03.279424+00:00",
"source_sha256": "007792c12f3467dd3203bb4951ccc197fdc0eef669580f1b1f893baf609ca363",
"documents_sha256": "0542af2a373771cf7c4a95f93d14f4f687f6a0187846892c959aa6efc4bade52",
"chunks_sha256": "437dde589be46e0c30842dd330de22d96a0173d2dbaff9c5f129568cb2bca4c9",
"embedding_model": "intfloat/multilingual-e5-small",
"publication_policy": "explicit-false-hidden-v1"
}
},
"neo4j": {
"ready": true,
"status": "ready",
"reason": null
},
"graphrag": {
"ready": true,
"status": "ready",
"reason": null,
"index_version": {
"chunks_sha256": "437dde589be46e0c30842dd330de22d96a0173d2dbaff9c5f129568cb2bca4c9",
"created_at_utc": "2026-10-25T15:06:03.279424+00:00",
"documents_sha256": "0542af2a373771cf7c4a95f93d14f4f687f6a0187846892c959aa6efc4bade52",
"embedding_model": "intfloat/multilingual-e5-small",
"git_revision": "3e892a1d49e9bce118cd03478ce15e01c2bebb4e",
"publication_policy": "explicit-false-hidden-v1",
"source_sha256": "007792c12f3467dd3203bb4951ccc197fdc0eef669580f1b1f893baf609ca363",
"version": "ff682d98134d406081040902f234c44f"
},
"nodes": 447
}
}
},
"publication_counts": {
"published_true": 97,
"missing": 16,
"published_false": 1,
"default_visible": 113
},
"graph_document_counts": {
"True": 113,
"False": 1
},
"live_search_checks": {
"/search": {
"default_hides_unpublished": true,
"explicit_opt_out_includes_it": true
},
"/rag": {
"default_hides_unpublished": true,
"explicit_opt_out_includes_it": true
},
"graphrag": {
"default_hides_unpublished": true,
"explicit_opt_out_includes_it": true,
"default_status": "ok"
}
},
"neo4j_outage_probe": {
"rag": {
"ready": true,
"status": "ready",
"reason": null,
"embedding_model": "intfloat/multilingual-e5-small",
"dimensions": 384,
"index_version": {
"version": "ff682d98134d406081040902f234c44f",
"git_revision": "3e892a1d49e9bce118cd03478ce15e01c2bebb4e",
"created_at_utc": "2026-10-25T15:06:03.279424+00:00",
"source_sha256": "007792c12f3467dd3203bb4951ccc197fdc0eef669580f1b1f893baf609ca363",
"documents_sha256": "0542af2a373771cf7c4a95f93d14f4f687f6a0187846892c959aa6efc4bade52",
"chunks_sha256": "437dde589be46e0c30842dd330de22d96a0173d2dbaff9c5f129568cb2bca4c9",
"embedding_model": "intfloat/multilingual-e5-small",
"publication_policy": "explicit-false-hidden-v1"
}
},
"neo4j": {
"ready": false,
"status": "unavailable",
"reason": "unreachable"
},
"graphrag": {
"ready": false,
"status": "unavailable",
"reason": "neo4j_unavailable"
}
},
"rag_index_outage_probe": {
"rag": {
"ready": false,
"status": "unavailable",
"reason": "index_missing"
},
"neo4j": {
"ready": true,
"status": "ready",
"reason": null
},
"graphrag": {
"ready": true,
"status": "ready",
"reason": null,
"index_version": {
"chunks_sha256": "437dde589be46e0c30842dd330de22d96a0173d2dbaff9c5f129568cb2bca4c9",
"created_at_utc": "2026-10-25T15:06:03.279424+00:00",
"documents_sha256": "0542af2a373771cf7c4a95f93d14f4f687f6a0187846892c959aa6efc4bade52",
"embedding_model": "intfloat/multilingual-e5-small",
"git_revision": "3e892a1d49e9bce118cd03478ce15e01c2bebb4e",
"publication_policy": "explicit-false-hidden-v1",
"source_sha256": "007792c12f3467dd3203bb4951ccc197fdc0eef669580f1b1f893baf609ca363",
"version": "ff682d98134d406081040902f234c44f"
},
"nodes": 447
}
},
"checked_at_utc": "2026-10-25T15:09:42.459584+00:00",
"regression": {
"passed": 485,
"skipped": 4,
"failed": 0,
"includes_real_neo4j_publication_tests": true
},
"scope": "Publikačný filter a dostupnosť retrieval nástrojov; nejde o nové meranie presnosti LLM."
}

View File

@ -1,93 +0,0 @@
# Spoločná synchronizácia RAG a GraphRAG
`POST /sync`, overený push webhook aj `python -m tools.rag.rebuild_index`
používajú spoločnú pipeline v `tools/sync_indexes.py`. Obnova vyžaduje dostupné
Neo4j a jeho konfiguráciu v prostredí. Pôvodné evaluačné výsledky sa nemenia.
## Priebeh
1. Procesový `.reindex.lock` pripustí iba jednu synchronizáciu nad data volume.
2. Voliteľný `git pull --ff-only` zachováva pôvodné nastavenie synchronizácie.
3. V `data/.sync-stage-*` vznikne kópia pôvodných README súborov. Dokumenty,
chunky, SQLite/FTS5 a embeddingy sa pripravujú z tejto jednej kópie. Aktívne
súbory sa počas prípravy nemenia a existujúce vyhľadávanie môže pokračovať.
4. Overí sa, že sa zdrojové súbory ani Git revízia počas prípravy nezmenili.
5. Pred aktiváciou vzniknú zálohy pôvodných súborov a trvalý marker
`.sync-pending.json`. Exkluzívny publikačný zámok počká na rozbehnutých
čitateľov. Nové požiadavky počas aktivácie dostanú dočasnú nedostupnosť.
6. Jedna explicitná Neo4j transakcia odstráni starý spravovaný graf, zapíše
nový graf a skontroluje počty uzlov/vzťahov oproti pripravenému payloadu.
Verzia grafu sa zapisuje v tej istej transakcii.
7. Pod publikačným zámkom sa aktivujú pripravené lokálne súbory a potvrdí sa
grafová transakcia. Po úspechu sa odstráni marker a sprístupní nová verzia.
SQLite a Neo4j netvoria distribuovanú ACID transakciu. Konzistenciu pri tejto
implementácii zaisťujú spoločný zámok pre podporované vyhľadávacie vstupy,
verzie, zálohy a marker nedokončeného prepnutia. Používanie samotného nízkoúrovňového
`search_graph_with_session` mimo publikačnej ochrany je určené pre kontrolované
interné evaluácie/testy; produkčný volajúci používa chránené `search_graph`.
## Verzia a dohľadateľnosť
Každá generácia má identifikátor `version`, Git revíziu zdrojovej wiki,
UTC čas prípravy, hash pôvodných README súborov, hashe dokumentov/chunkov
a názov embeddingového modelu. Hash zdrojov zachytáva aj necommitnuté zmeny;
samotný Git HEAD preto nie je jediným identifikátorom obsahu.
Rovnaký objekt `index_version` je uložený v:
- `data/index_version.json`,
- SQLite tabuľke `index_state`,
- operatívnom uzle Neo4j `IndexState` s ID `zpwiki`.
Operatívny uzol nie je súčasťou znalostného grafu označeného `graph_scope=zpwiki`.
Verziu vracajú `/sync`, webhook, `/health`, RAG vyhľadávanie a verejná Python
funkcia grafového vyhľadávania. Synchronizácia vracia aj `graph_counts`.
## Chyby a zotavenie
- Chyba prípravy, embeddingov alebo nedostupné Neo4j pred aktiváciou:
pôvodné indexy ostávajú aktívne.
- Chyba pri zápise grafu: celá grafová transakcia sa zruší.
- Chyba pri aktivácii lokálneho súboru: obnovia sa pôvodné súbory a grafová
transakcia sa zruší. Pri neúspešnej obnove marker zostáva.
- Stratené potvrdenie COMMIT: najprv sa kontroluje skutočná verzia v Neo4j.
Ak bola nová verzia potvrdená, staré lokálne dáta sa naslepo neobnovujú.
- Pád procesu alebo neoveriteľný výsledok transakcie: marker a obnovovacie
súbory ostávajú na disku. Vyhľadávanie odmietne nejasný snapshot; RAG API
vracia 503 a `/health` má `ready=false`.
Po odstránení príčiny spusti znova autorizovaný `/sync` alebo:
```bash
docker compose exec zp-agent-api python -m tools.rag.rebuild_index
```
Úspešná synchronizácia vytvorí kompletnú novú generáciu oboch indexov a marker
odstráni. Marker sa nemá ručne mazať ako náhrada opravy. Staršie adresáre
prerušených behov môžu zostať ako podklady na obnovu; bežný úspešný staging
sa automaticky odstraňuje.
## Samostatná obnova Neo4j
`python -m tools.graphrag.build_graphrag` používa rovnaký transakčný zápis.
Zmena grafu sa potvrdí celá alebo sa zruší celá. Ak JSON vstupy zodpovedajú
aktívnej generácii, jej proveniencia sa zachová. Iné vstupy alebo režim
`--no-replace` nemôžu predstierať synchronizovanú verziu; verejný grafový
vstup potom pri aktívnom manifeste vyžaduje spoločnú synchronizáciu.
## Overenie
Regresie pokrývajú chybu uprostred grafového zápisu, chybu po čiastočnej
aktivácii súborov, stratenú odpoveď COMMIT, neznámy výsledok COMMIT, následné
zotavenie, zámok pre čitateľov, nesúlad verzií, zmenu zdroja počas prípravy,
odpovede `/sync` aj podpísaného webhooku a API 503 pri nejasnej generácii.
Skutočné Neo4j testy overujú rollback po odstránení pôvodných uzlov a zápise
časti náhrady v izolovanom scope. Pozitívny prípad overuje aj opakovateľnosť.
Záverečná sada po dokončení opravy: **464 passed, 4 skipped**. Reálny `/sync`
v Docker API obnovil 114 dokumentov, 887 chunkov a 447 grafových uzlov /
879 vzťahov za 87,72 s. Overené sú rovnaké verzie v manifeste, SQLite, Neo4j,
health, skutočnej RAG odpovedi aj grafovom vyhľadávaní. Obsah znalostného
grafu zodpovedá pôvodnej v4; nové meranie presnosti LLM sa nevykonávalo.
Podrobné overenie: [záznam](synchronizacia_indexov_overenie.json).

View File

@ -1,52 +0,0 @@
{
"date": "2026-10-25",
"changes": [
"Coordinated RAG/Neo4j snapshot publication for /sync, push webhook and CLI.",
"Atomic Neo4j replacement with rollback, count validation and data-version metadata."
],
"backup_directory": "/tmp/zp-agent-sync-backup-20261025T023515Z",
"automated_tests": {
"passed": 464,
"skipped": 4
},
"live_sync": {
"status": "ok",
"pull_git": false,
"duration_seconds": 87.72,
"counts": {
"documents": 114,
"chunks": 887,
"fts_chunks": 887,
"embedding_chunks": 887,
"tags": 2189,
"categories": 1193
},
"index_version": {
"version": "d4a6fbaa03b44a0a8aabb3cba2ddff36",
"git_revision": "3e892a1d49e9bce118cd03478ce15e01c2bebb4e",
"created_at_utc": "2026-10-25T02:50:27.976522+00:00",
"source_sha256": "007792c12f3467dd3203bb4951ccc197fdc0eef669580f1b1f893baf609ca363",
"documents_sha256": "0542af2a373771cf7c4a95f93d14f4f687f6a0187846892c959aa6efc4bade52",
"chunks_sha256": "437dde589be46e0c30842dd330de22d96a0173d2dbaff9c5f129568cb2bca4c9",
"embedding_model": "intfloat/multilingual-e5-small"
},
"graph_counts": {
"nodes": 447,
"relationships": 879
}
},
"live_verification": {
"ready": true,
"rag_sources": 3,
"graph_status": "ok",
"versions_equal_in_sqlite_neo4j_manifest_and_responses": true,
"knowledge_graph_unchanged_against_frozen_v4": true
},
"verification_scope": [
"Full existing and new regression suite, including real isolated Neo4j rollback.",
"Signed webhook and manual sync response tests.",
"Actual /sync on deployed Docker API without Git pull.",
"Actual authenticated /rag and public graph lookup on the same data generation."
],
"new_llm_accuracy_measurement": false
}

View File

@ -1,137 +0,0 @@
# Spoločný výstupný kontrakt RAG a GraphRAG
V7 rozširuje kontrolu formátov citácií a rozporov v úplnosti. Grafové
generovanie má validované štruktúrované tvrdenia a deterministický renderer.
[Aktuálny protokol](graphrag_v7_2026-10-26_worklog.md).
V6 prenáša polia úplnosti a verzie aj do kontextu LLM a kontroluje ich pri
generovaní. Kontrola citácií sa vzťahuje na zoznam aj odkazy v texte odpovede.
[Implementácia, meranie a obmedzenia](graphrag_v6_2026-10-25_worklog.md).
Kontrakt v1 zjednocuje polia pre hlavného agenta a budúce OpenWebUI nástroje.
Vyhľadávanie naďalej vracia svoje pôvodné dáta. Klasický RAG zachováva
`context`, `instructions`, `answer_format` a rozšírené zdroje; GraphRAG
zachováva `facts`, `paths`, `documents`, `aggregation` a rozpoznané entity.
Historické evaluačné súbory ani zmrazené manifesty sa neprepisujú.
## Spoločné polia
| Pole | Význam |
|---|---|
| `status` | `ok`, `no_answer`, `ambiguous` alebo `error` |
| `reason` | Stabilný strojový dôvod; pri úspechu `null` |
| `sources` | Zoznam zdrojov s `source_id`, `document_path`, `source_url`, `title` |
| `index_version` | Spoločná generácia indexov vrátane Git revízie; `null`, ak nie je známa |
| `complete` | `true`: úplné vyhľadanie v rozsahu nástroja; `false`: neúplné; `null`: úplnosť nemožno zaručiť |
| `truncated` | Nástroj preukázateľne narazil na limit výberu alebo výstupu |
| `truncation_reasons` | Konkrétne limity; prázdne pole, ak žiadny nebol zistený |
`source_id` má tvar `S1`, `S2`, … v rámci jednej odpovede. URL a názov
môžu byť `null`, ak ich zdroj neposkytuje; nesmú sa domýšľať. RAG si v každom
zdroji ponecháva aj text, sekcie a retrieval metadáta. GraphRAG pridáva
`sources` popri pôvodnom `documents`, takže existujúci evaluator môže
ďalej používať pôvodné polia. Zdrojový dokument je identifikovaný cestou.
`ok` znamená úspešné získanie dôkazov alebo výsledku agregácie. Neznamená,
že LLM už odpovedal ani že vie zo zdrojov zodpovedať každú časť otázky.
Nulová, korektne vykonaná agregácia môže mať `status=ok`, `count=0` a žiadne
zdroje. `no_answer` označuje nenájdenie požadovaných faktov alebo entity;
`ambiguous` označuje nejednoznačné rozpoznanie; `error` zlyhanie nástroja.
## Význam úplnosti
Úplnosť **nevyjadruje percento presnosti ani pravdivosť odpovede**.
RAG je radený výber kandidátov. Ak sa preukáže orezanie, uvádza
`complete=false`; inak `null`, pretože nemôže zaručiť vyčerpávajúci zoznam
všetkých významovo relevantných informácií. Hlási `candidate_limit`,
`per_document_limit` a `result_limit`. Dodatočný kandidát slúži na detekciu
orezania a nezaraďuje sa do pôvodného radeného výberu. Rozšírenia kontextu
ďalej používajú svoje existujúce limity; `truncated=false` preto nie je
zárukou úplnosti kontextu ani pokrytia celej wiki.
GraphRAG vyjadruje úplnosť v rámci podporovaných štruktúrovaných dotazov
a nakonfigurovaných grafových prechodov. Hlási `entity_limit`,
`evidence_limit`, `fact_limit` a `path_limit`. Pri prechádzaní grafu overí
aj jeden výsledok nad limitom, aby rozpoznal orezanie už na úrovni Cypher.
`complete=true` neznamená neobmedzený prechod celým grafom: všeobecné
prechody naďalej používajú pôvodnú povolenú dĺžku ciest. Pri nejednoznačnosti
alebo chybe je `complete=false`, aj keď `truncated=false`.
`aggregation.complete` ostáva osobitným príznakom úplnosti **výpočtu**.
Príklad: presne napočítané 2 osoby, ale `limit=1` pre zobrazené dôkazy:
```json
{
"status": "ok",
"reason": null,
"aggregation": {"count": 2, "complete": true},
"complete": false,
"truncated": true,
"truncation_reasons": ["fact_limit", "path_limit"]
}
```
Príklad je skrátený. Agent môže uviesť presný počet podľa agregácie,
ale nesmie tvrdiť, že zobrazený výpis obsahuje všetky dôkazy.
## Nenájdenie a chyby
Nenájdenie používa napríklad `no_matching_sources`, `no_matching_facts`,
`unknown_person`, `unknown_keyword` alebo `unknown_title`. Nejednoznačnosť
používa napríklad `ambiguous_person`. Zostávajú zachované aj podrobnejšie
grafové `reasons` a dôkazy zamietnutých kandidátov.
API `/rag` a `/search` vracia pri chybách rovnakú obálku; pôvodné HTTP kódy
a `detail` zostávajú zachované. Dôvody zahŕňajú `invalid_query` (400),
`unauthorized` (401), `invalid_request` (422), `retrieval_unavailable` (503)
a `internal_error` (500). Validačné chyby nevracajú hodnoty zaslaných polí.
```json
{
"status": "error",
"reason": "retrieval_unavailable",
"sources": [],
"index_version": null,
"complete": false,
"truncated": false,
"truncation_reasons": [],
"detail": "Vyhľadávací index alebo embeddingový model momentálne nie je dostupný."
}
```
Po chybe sa neuvádza verzia dát, ktorú nástroj úspešne neprečítal. Chybová
obálka neobsahuje text interných výnimiek, heslá ani interné cesty.
Python knižničné funkcie naďalej vyhadzujú výnimky, aby existujúci kód mohol
riešiť chyby pomocou `try/except`. Transportné rozhrania ich prevádzajú na
obálku cez spoločné `error_result()`: HTTP API, grafový CLI a RAG CLI v režime
`--json`. Chybový CLI skončí návratovým kódom 1. Pre budúci MCP/HTTP adaptér
grafu sa použije ten istý prevod; nový grafový HTTP endpoint tento krok nepridáva.
## Použitie
```bash
python -m tools.rag.search_db 'strojový preklad' --json --limit 5
python -m tools.graphrag.graph_search 'Aký názov práce má Ján Holp?' --limit 5
```
Spoločné Pydantic modely aj tvorba obálky sú v `tools/retrieval_contract.py`.
OpenAPI pre `/rag` používa spoločné polia aj model chybovej odpovede.
## Overenie 25. 10. 2026
Kompletná sada projektu: **506 úspešných testov, 4 preskočené**. Nové testy
overujú spoločné polia, zachovanie rozšírených zdrojov RAG, detekciu limitov,
nejednoznačnosť, nenájdenie a chyby vrátane neplatného výstupu backendu.
Grafové testy používajú skutočný Neo4j v izolovanej transakcii s rollbackom.
Na nasadenom API sa overili `/rag`, `/search`, chyby autentifikácie a validácie
aj OpenAPI schéma. Skutočný GraphRAG napočítal 15 osôb s prácou v roku 2024;
počet bol rovnaký pri limite 1 a 100. Pri limite 1 správne označil dôkazy
za orezané, pričom samotný počet zostal úplný. Overilo sa tiež nenájdenie
neexistujúcej osoby a JSON chybové výstupy oboch CLI s návratovým kódom 1.
Nasadenie nevyžadovalo reindexáciu: verzia dát zostala nezmenená. Toto
overenie kontraktu nepredstavuje nové meranie presnosti LLM odpovedí.
Strojový záznam je v [vystupny_kontrakt_overenie.json](vystupny_kontrakt_overenie.json).

View File

@ -1,81 +0,0 @@
{
"checked_at_utc": "2026-10-25T15:26:47.218274+00:00",
"index_version": {
"version": "ff682d98134d406081040902f234c44f",
"git_revision": "3e892a1d49e9bce118cd03478ce15e01c2bebb4e",
"created_at_utc": "2026-10-25T15:06:03.279424+00:00",
"source_sha256": "007792c12f3467dd3203bb4951ccc197fdc0eef669580f1b1f893baf609ca363",
"documents_sha256": "0542af2a373771cf7c4a95f93d14f4f687f6a0187846892c959aa6efc4bade52",
"chunks_sha256": "437dde589be46e0c30842dd330de22d96a0173d2dbaff9c5f129568cb2bca4c9",
"embedding_model": "intfloat/multilingual-e5-small",
"publication_policy": "explicit-false-hidden-v1"
},
"shared_fields": [
"complete",
"index_version",
"reason",
"sources",
"status",
"truncated",
"truncation_reasons"
],
"api": {
"/rag": {
"status": "ok",
"source_count": 1,
"complete": false,
"truncated": true,
"truncation_reasons": [
"per_document_limit",
"result_limit"
],
"unauthorized_contract": true,
"validation_error_contract": true
},
"/search": {
"status": "ok",
"source_count": 2,
"complete": false,
"truncated": true,
"truncation_reasons": [
"per_document_limit",
"result_limit"
],
"unauthorized_contract": true,
"validation_error_contract": true
}
},
"regression": {
"passed": 506,
"skipped": 4,
"failed": 0
},
"openapi_common_fields_and_errors": true,
"graphrag": {
"status": "ok",
"complete": false,
"truncated": true,
"truncation_reasons": [
"fact_limit",
"path_limit"
],
"exact_count": 15,
"count_complete": true,
"same_count_at_limit_1_and_100": true,
"no_answer_reason": "unknown_person"
},
"cli_error_checks": {
"rag": {
"exit_code": 1,
"reason": "invalid_query",
"valid_contract": true
},
"graphrag": {
"exit_code": 1,
"reason": "retrieval_unavailable",
"valid_contract": true
}
},
"index_version_unchanged": true,
"scope": "Overenie výstupného kontraktu retrieval nástrojov; nejde o meranie presnosti LLM."
}