| app | ||
| scripts | ||
| .dockerignore | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
| requirements.txt | ||
dp-zp-agent
Agent pre manažment záverečných prác nad repozitárom zpwiki.
Projekt rieši základnú službu pre indexovanie a vyhľadávanie v Markdown súboroch zo školského repozitára záverečných prác. Cieľom je vytvoriť samostatné API, ktoré vie načítať obsah zpwiki, spracovať metadata, rozdeliť dokumenty na chunky, vyhľadávať v nich a neskôr sa napojiť na OpenWebUI, RAG, znalostný graf a Gitea webhook.
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é 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 s endpointmi:
/health,/search,/sync,
- automatická Swagger dokumentácia API,
- Dockerfile pre zostavenie API kontajnera,
docker-compose.ymlpre spustenie služby,- mount repozitára
zpwikido kontajnera, - environment premenná
ZPWIKI_ROOT, - reindexovanie dát cez endpoint
/sync.
Štruktúra projektu
dp-zp-agent/
├── app/
│ ├── __init__.py
│ └── main.py
├── scripts/
│ ├── scan_zpwiki.py
│ ├── build_chunks.py
│ ├── build_sqlite_index.py
│ ├── rebuild_index.py
│ ├── search_chunks.py
│ └── search_db.py
├── data/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── .dockerignore
├── .gitignore
└── README.md
Príprava prostredia
Projekt očakáva, že vedľa neho existuje naklonovaný repozitár zpwiki.
Odporúčaná štruktúra:
~/DP/
├── zpwiki
└── zp-agent
Vytvorenie a aktivácia Python prostredia:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Vygenerovanie dát a indexu
Najprv sa načítajú dokumenty a metadata:
python scripts/scan_zpwiki.py
Potom sa dokumenty rozdelia na chunky:
python scripts/build_chunks.py
Nakoniec sa vytvorí SQLite index:
python scripts/build_sqlite_index.py
Alebo sa dá celý index obnoviť jedným príkazom:
python scripts/rebuild_index.py
S voliteľným git pull pred reindexovaním:
python scripts/rebuild_index.py --pull
Testovanie vyhľadávania v termináli
Vyhľadávanie podľa osoby:
python scripts/search_db.py "jan ptak"
Vyhľadávanie podľa témy:
python scripts/search_db.py "rag agent"
Vyhľadávanie podľa znalostného grafu:
python scripts/search_db.py "knowledge graph"
Spustenie API lokálne
FastAPI server sa spustí príkazom:
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}'
Reindexovanie cez API:
curl -X POST http://127.0.0.1:8000/sync \
-H "Content-Type: application/json" \
-d '{"pull_git":false}'
Reindexovanie aj s git pull:
curl -X POST http://127.0.0.1:8000/sync \
-H "Content-Type: application/json" \
-d '{"pull_git":true}'
Poznámka: pri Docker verzii môže pull_git:true vyžadovať vyriešenie SSH prístupu ku Gitu. Zatiaľ je bezpečné používať hlavne 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 a /sync priamo z prehliadača.
Spustenie cez Docker
Služba sa dá spustiť cez Docker Compose:
docker compose up --build
Po spustení je API dostupné na:
http://127.0.0.1:8000
Swagger UI:
http://127.0.0.1:8000/docs
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":"knowledge graph","limit":5}'
Reindexovanie:
curl -X POST http://127.0.0.1:8000/sync \
-H "Content-Type: application/json" \
-d '{"pull_git":false}'
V docker-compose.yml je repozitár zpwiki pripojený ako volume:
volumes:
- ./data:/app/data
- ../zpwiki:/zpwiki
A cesta k nemu je nastavená cez environment premennú:
environment:
- ZPWIKI_ROOT=/zpwiki
Čo ešte treba dorobiť
1. Upratanie kódu do modulov
Aktuálne je veľká časť logiky priamo v app/main.py. Neskôr treba kód rozdeliť napríklad takto:
app/
├── main.py
├── search.py
├── database.py
├── schemas.py
├── sync.py
└── webhook.py
Cieľ je, aby API, vyhľadávanie, databáza a synchronizácia neboli v jednom veľkom súbore.
2. Vylepšenie synchronizácie so zpwiki
Aktuálne endpoint /sync vie obnoviť celý index. Neskôr treba pridať efektívnejšiu synchronizáciu.
Treba dorobiť:
- zistenie aktuálneho commitu,
- uloženie posledného spracovaného commitu,
- detekciu zmenených Markdown súborov,
- reindexovanie iba zmenených dokumentov,
- uloženie stavu synchronizácie do databázy,
- logovanie výsledkov synchronizácie.
3. Webhook endpoint pre Gitea
Treba vytvoriť endpoint napríklad:
POST /webhook/gitea
Tento endpoint má:
- prijať webhook z Gitea,
- overiť secret alebo podpis webhooku,
- spracovať push event,
- spustiť synchronizáciu repozitára,
- spustiť reindexovanie,
- vrátiť výsledok synchronizácie.
4. 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.
5. 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 alebo nástroje:
- PostgreSQL plus pgvector,
- Qdrant,
- ChromaDB,
- FAISS ako jednoduchý lokálny prototyp.
6. 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.
7. 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.
8. 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.
9. 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.
10. 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 synchronizácie,
- návrh webhook integrácie,
- návrh integrácie s OpenWebUI,
- popis experimentov a vyhodnotenia.
Najbližší praktický krok
Najbližšie treba spraviť Gitea webhook endpoint.
Poradie najbližších krokov:
- commitnúť aktuálne zmeny,
- pushnúť projekt na KEMT Git,
- vytvoriť endpoint
POST /webhook/gitea, - pridať overenie secretu alebo podpisu webhooku,
- napojiť webhook na
/sync, - otestovať webhook lokálne alebo cez verejne dostupný tunel.