dp-zp-agent/docs/synchronizacia_indexov.md

5.0 KiB

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:

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.