12 KiB
dp-zp-agent
Agent pre manažment záverečných prác nad repozitárom zpwiki.
Projekt rieši základnú časť systému pre vyhľadávanie v Markdown súboroch zo školského repozitára záverečných prác. Cieľom je vytvoriť samostatnú službu, ktorá vie indexovať obsah zpwiki, vyhľadávať v ňom a neskôr sa napojí na OpenWebUI, RAG, znalostný graf a GraphRAG.
Aktuálne je implementovaný prototyp, ktorý vie načítať Markdown dokumenty, spracovať ich metadata, rozdeliť ich na menšie časti, uložiť ich do SQLite databázy a sprístupniť vyhľadávanie cez FastAPI.
Aktuálny stav
Zatiaľ je implementované:
- načítanie Markdown súborov z repozitára
zpwiki, - extrakcia metadát z YAML front matter,
- spracovanie položiek
taxonomy, hlavne kategórie, tagy a autor, - rozdelenie dokumentov na menšie textové chunky,
- vytvorenie SQLite indexu,
- jednoduché skórovacie fulltextové vyhľadávanie nad chunkmi,
- rozlíšenie režimu vyhľadávania:
personpre mená osôb, napríkladjan ptak,topicpre tematické dopyty, napríkladrag agentaleboknowledge graph,
- FastAPI backend,
- endpoint
GET /health, - endpoint
POST /search, - endpoint
POST /syncpre manuálne spustenie reindexovania, - endpoint
POST /webhook/giteapre prijatie webhooku z Gitea, - overenie webhooku pomocou jednoduchého tokenu alebo HMAC podpisu,
- automatická Swagger dokumentácia API,
- Dockerfile a
docker-compose.yml, - spustenie celého riešenia cez Docker,
- volume mount pre priečinok
data, - volume mount pre repozitár
zpwiki.
Overený stav testovania
Pri testovaní cez Docker bolo overené:
- FastAPI kontajner sa spustí,
- endpoint
/healthvracia200 OK, - endpoint
/searchvracia200 OK, - endpoint
/syncspustí reindexovanie a vracia200 OK, - endpoint
/webhook/giteaprijme platný webhook a spustí reindexovanie, - Docker kontajner vidí repozitár
zpwikicez cestu/zpwiki, - systém načítal 114 dokumentov,
- systém vytvoril 955 chunkov,
- SQLite index bol vytvorený v
/app/data/zp_index.sqlite.
Štruktúra projektu
dp-zp-agent/
├── app/
│ ├── __init__.py
│ └── main.py
├── scripts/
│ ├── __init__.py
│ ├── common.py
│ ├── scan_zpwiki.py
│ ├── build_chunks.py
│ ├── build_sqlite_index.py
│ ├── rebuild_index.py
│ ├── search_db.py
│ └── search_utils.py
├── data/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── .gitignore
└── README.md
Súbor scripts/search_chunks.py bol odstránený, pretože jeho funkcionalita bola duplicitná voči súboru scripts/build_chunks.py.
Popis hlavných súborov
app/main.py
Obsahuje FastAPI aplikáciu a API endpointy:
GET /health,POST /search,POST /sync,POST /webhook/gitea.
scripts/common.py
Obsahuje spoločné konštanty a pomocné funkcie:
- cesty k projektu,
- cesta k
zpwiki, - cesta k dátovým súborom,
- čítanie a zápis JSON,
- spracovanie YAML metadát,
- normalizácia tagov a kategórií.
scripts/scan_zpwiki.py
Prejde Markdown súbory v zpwiki, načíta metadata a uloží základné informácie do súboru:
data/documents.json
scripts/build_chunks.py
Rozdelí obsah Markdown dokumentov na menšie textové chunky a uloží ich do súboru:
data/chunks.json
scripts/build_sqlite_index.py
Vytvorí SQLite databázu:
data/zp_index.sqlite
Do databázy uloží dokumenty, chunky, tagy a kategórie.
scripts/rebuild_index.py
Spustí celý proces naraz:
- načítanie dokumentov,
- vytvorenie chunkov,
- vytvorenie SQLite indexu.
Voliteľne vie pred reindexovaním spustiť aj git pull.
scripts/search_utils.py
Obsahuje spoločnú logiku vyhľadávania:
- normalizácia textu,
- tokenizácia,
- rozlíšenie režimu
personatopic, - skórovanie výsledkov,
- vyhľadávanie v SQLite databáze.
scripts/search_db.py
Slúži na testovanie vyhľadávania z terminálu.
Príprava prostredia
Projekt očakáva, že vedľa neho existuje naklonovaný repozitár zpwiki.
Odporúčaná štruktúra:
~/DP/
├── zpwiki/
└── zp-agent/
Lokálne spustenie bez Dockeru
Vytvorenie a aktivácia Python prostredia:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Vygenerovanie dát a indexu:
python scripts/rebuild_index.py
Alternatívne sa dá proces spustiť po krokoch:
python scripts/scan_zpwiki.py
python scripts/build_chunks.py
python scripts/build_sqlite_index.py
Testovanie vyhľadávania v termináli:
python scripts/search_db.py "jan ptak"
python scripts/search_db.py "rag agent"
python scripts/search_db.py "knowledge graph"
Spustenie API lokálne:
uvicorn app.main:app --reload
Health check:
curl http://127.0.0.1:8000/health
Vyhľadávanie cez API:
curl -X POST http://127.0.0.1:8000/search \
-H "Content-Type: application/json" \
-d '{"query":"jan ptak","limit":5}'
Spustenie cez Docker
Projekt je možné spustiť cez Docker Compose. Kontajner používa volume mount pre priečinok data a pre repozitár zpwiki.
Build Docker image:
docker compose build --no-cache
Spustenie kontajnera:
docker compose up -d
Zobrazenie logov:
docker compose logs -f zp-agent-api
Zastavenie kontajnera:
docker compose down
Reindexovanie cez Docker
Celý proces indexovania je možné spustiť priamo v Docker kontajneri:
docker compose run --rm zp-agent-api python scripts/rebuild_index.py
Tento príkaz vykoná:
- načítanie Markdown dokumentov,
- extrakciu metadát,
- rozdelenie dokumentov na chunky,
- vytvorenie SQLite indexu.
Po úspešnom behu vzniknú v priečinku data súbory:
documents.json
chunks.json
zp_index.sqlite
Kontrola dát:
ls -lh data
Testovanie vyhľadávania cez Docker
docker compose run --rm zp-agent-api python scripts/search_db.py "rag agent"
docker compose run --rm zp-agent-api python scripts/search_db.py "jan ptak"
Testovanie API cez Docker
Health check:
curl http://127.0.0.1:8000/health
Vyhľadávanie:
curl -X POST http://127.0.0.1:8000/search \
-H "Content-Type: application/json" \
-d '{"query":"rag agent","limit":5}'
Manuálne reindexovanie cez API:
curl -X POST http://127.0.0.1:8000/sync \
-H "Content-Type: application/json" \
-d '{"pull_git":false}'
Swagger UI
FastAPI automaticky generuje Swagger dokumentáciu API.
Po spustení servera je dostupná na adrese:
http://127.0.0.1:8000/docs
V Swagger UI je možné testovať endpointy:
/health,/search,/sync,/webhook/gitea.
Webhook pre Gitea
Aplikácia obsahuje endpoint:
POST /webhook/gitea
Webhook slúži na spustenie reindexovania po zmene v repozitári.
Endpoint podporuje dva spôsoby overenia:
- jednoduchý token cez header
X-Gitea-Token, - HMAC podpis cez header
X-Gitea-Signature.
Hodnota tajného kľúča sa nastavuje cez environment premennú:
WEBHOOK_SECRET
V docker-compose.yml je počas vývoja nastavené:
WEBHOOK_SECRET=dev-secret
Test webhooku cez token
curl -X POST http://127.0.0.1:8000/webhook/gitea \
-H "Content-Type: application/json" \
-H "X-Gitea-Event: push" \
-H "X-Gitea-Token: dev-secret" \
-d '{"repository":{"full_name":"KEMT/zpwiki"}}'
Test webhooku cez HMAC podpis
BODY='{"repository":{"full_name":"KEMT/zpwiki"}}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "dev-secret" -hex | sed 's/^.* //')
curl -X POST http://127.0.0.1:8000/webhook/gitea \
-H "Content-Type: application/json" \
-H "X-Gitea-Event: push" \
-H "X-Gitea-Signature: sha256=$SIG" \
--data-raw "$BODY"
Test neplatného tokenu
Pri neplatnom tokene má endpoint vrátiť 401 Unauthorized.
curl -i -X POST http://127.0.0.1:8000/webhook/gitea \
-H "Content-Type: application/json" \
-H "X-Gitea-Event: push" \
-H "X-Gitea-Token: zly-token" \
-d '{"repository":{"full_name":"KEMT/zpwiki"}}'
Kompletný test cez Docker
cd ~/DP/zp-agent
docker compose down
docker compose build --no-cache
docker compose run --rm zp-agent-api ls /zpwiki/pages | head
docker compose run --rm zp-agent-api python scripts/rebuild_index.py
ls -lh data
docker compose run --rm zp-agent-api python scripts/search_db.py "rag agent"
docker compose up -d
curl http://127.0.0.1:8000/health
curl -X POST http://127.0.0.1:8000/search \
-H "Content-Type: application/json" \
-d '{"query":"rag agent","limit":5}'
curl -X POST http://127.0.0.1:8000/sync \
-H "Content-Type: application/json" \
-d '{"pull_git":false}'
Čo ešte treba dorobiť
1. OpenWebUI integrácia
Treba napojiť API na OpenWebUI.
Možné riešenia:
- OpenAPI tool server,
- OpenWebUI tool,
- OpenWebUI pipeline,
- vlastný agent, ktorý bude volať endpoint
/search.
Cieľ je, aby používateľ mohol v OpenWebUI položiť otázku a agent použil vyhľadávanie nad zpwiki.
2. Embeddingy a vektorové vyhľadávanie
Aktuálne vyhľadávanie je fulltextové a skórovacie. Ďalší krok je pridať embeddingy.
Treba dorobiť:
- výber embedding modelu,
- generovanie embeddingov pre chunky,
- uloženie embeddingov,
- vektorové vyhľadávanie,
- porovnanie fulltextového a vektorového vyhľadávania.
Možné databázy:
- PostgreSQL plus pgvector,
- Qdrant,
- ChromaDB,
- FAISS ako jednoduchý lokálny prototyp.
3. RAG odpovede s citáciami
Treba doplniť generovanie odpovede pomocou jazykového modelu.
Postup:
- používateľ položí otázku,
- systém nájde relevantné chunky,
- chunkom priradí zdrojové URL,
- jazykový model vytvorí odpoveď iba z nájdeného kontextu,
- odpoveď obsahuje odkazy na zdrojové stránky.
Cieľ je, aby agent nehalucinoval a vedel ukázať, z ktorých dokumentov odpovedal.
4. Znalostný graf
Treba vytvoriť štruktúrovaný graf nad dátami zo zpwiki.
Základné entity:
Student,Thesis,Tag,Category,Author,Year.
Základné vzťahy:
- študent má prácu,
- práca má tag,
- práca patrí do kategórie,
- autor vedie alebo spravuje prácu,
- práca je podobná inej práci,
- práca patrí do roka alebo obdobia.
5. GraphRAG
Treba prepojiť RAG a znalostný graf.
GraphRAG časť má umožniť:
- vyhľadávanie podľa vzťahov,
- vysvetlenie, prečo sa našli konkrétne práce,
- odporúčanie podobných tém,
- analýzu tém podľa tagov, rokov a kategórií,
- kombináciu textového, vektorového a grafového vyhľadávania.
6. Čiastočné reindexovanie
Aktuálne endpoint /sync a webhook spúšťajú celé reindexovanie. Neskôr treba doplniť efektívnejší spôsob synchronizácie.
Plánované časti:
- zistenie aktuálneho commitu,
- detekcia zmenených Markdown súborov,
- reindexovanie iba zmenených dokumentov,
- uloženie stavu synchronizácie do databázy,
- logovanie výsledku synchronizácie.
7. Vyhodnotenie systému
Treba pripraviť testovaciu sadu otázok a porovnať viacero prístupov.
Porovnať treba minimálne:
- jednoduché fulltextové vyhľadávanie,
- vektorové vyhľadávanie,
- RAG,
- GraphRAG.
Príklady testovacích otázok:
Nájdi práce o RAG.Nájdi práce podobné téme Agent pre manažment záverečných prác.Ktoré práce používajú znalostný graf?Kto riešil chatbot alebo agenta?Aké témy patria do kategórie dp2027?Zhrň práce súvisiace s NLP.
Sledované vlastnosti:
- relevantnosť výsledkov,
- správnosť odpovede,
- správnosť citácií,
- počet halucinácií,
- čas odpovede,
- čas reindexovania po zmene v Gite.
8. Dokumentácia do diplomovej práce
Treba priebežne písať:
- čo je RAG,
- čo je generatívny model,
- čo je znalostný graf,
- čo je GraphRAG,
- ako funguje
zpwiki, - návrh architektúry systému,
- návrh databázy a indexu,
- návrh webhook synchronizácie,
- návrh integrácie s OpenWebUI,
- popis experimentov a vyhodnotenia.
Najbližší praktický krok
Najbližšie treba pokračovať integráciou s OpenWebUI a prípravou RAG odpovedí s citáciami. Potom bude možné porovnať jednoduché fulltextové vyhľadávanie s RAG a neskôr s GraphRAG.