Odstránenie dokumentačných záznamov
This commit is contained in:
parent
427bbc3222
commit
3fe25382e6
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,5 +1,6 @@
|
||||
.env
|
||||
data/
|
||||
docs/
|
||||
.venv/
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
||||
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -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.
|
||||
@ -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
|
||||
```
|
||||
@ -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`.
|
||||
@ -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).
|
||||
@ -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.
|
||||
@ -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).
|
||||
@ -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."
|
||||
}
|
||||
@ -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).
|
||||
@ -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
|
||||
}
|
||||
@ -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).
|
||||
@ -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."
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user