dp-zp-agent/README.md

215 lines
4.6 KiB
Markdown

# ZP Agent
Backend pre indexovanie a vyhľadávanie v repozitári záverečných prác `zpwiki`.
Projekt načítava Markdown dokumenty, spracuje YAML metadata, rozdelí obsah na tokenové chunky a vytvorí SQLite index kombinujúci FTS5 fulltextové vyhľadávanie a embeddingy. Vyhľadávanie je dostupné cez FastAPI a systém podporuje manuálnu aj webhookovú synchronizáciu.
## Implementované
- načítanie Markdown súborov a YAML front matter,
- normalizácia názvov, autorov, tagov, kategórií a `published`,
- tokenové chunkovanie pomocou `tiktoken`,
- zachovanie názvu dokumentu a hierarchie nadpisov v chunku,
- SQLite databáza a FTS5 fulltextový index,
- BM25 vyhľadávanie s podporou diakritiky a prefixových výrazov,
- embeddingy pre každý chunk pomocou modelu `intfloat/multilingual-e5-small`,
- uloženie embeddingov priamo v SQLite,
- vektorové vyhľadávanie pomocou cosine similarity,
- hybridné vyhľadávanie FTS5 + embeddings pomocou RRF,
- nižšia váha pre slabú `any_term` FTS stratégiu,
- zachovanie presných `all_terms` a `prefix_terms` výsledkov bez vektorového šumu,
- filtrovanie publikovaných dokumentov,
- FastAPI endpointy `/health`, `/search`, `/sync` a `/webhook/gitea`,
- autorizácia `/search` a `/sync` pomocou API kľúča,
- Gitea webhook s HMAC-SHA256 podpisom a kontrolou udalosti a repozitára,
- zámok proti súbežnému reindexovaniu,
- atomická výmena databázy po úspešnom reindexovaní,
- automatizované a integračné testy.
## Štruktúra
```text
zp-agent/
├── app/
│ └── main.py
├── scripts/
│ ├── common.py
│ ├── scan_zpwiki.py
│ ├── build_chunks.py
│ ├── build_sqlite_index.py
│ ├── embedding_utils.py
│ ├── rebuild_index.py
│ ├── search_db.py
│ └── search_utils.py
├── test/
├── data/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── requirements-dev.txt
└── README.md
```
Projekt očakáva repozitáre v tejto štruktúre:
```text
~/DP/
├── zpwiki/
└── zp-agent/
```
## Konfigurácia
V koreňovom priečinku vytvor `.env`:
```dotenv
WEBHOOK_SECRET=<náhodná hodnota s minimálne 32 znakmi>
SYNC_API_KEY=<iná náhodná hodnota s minimálne 32 znakmi>
SEARCH_API_KEY=<ďalšia náhodná hodnota s minimálne 32 znakmi>
EXPECTED_GITEA_REPOSITORY=KEMT/zpwiki
WEBHOOK_PULL_GIT=false
# Voliteľné
EMBEDDING_MODEL=intfloat/multilingual-e5-small
EMBEDDING_BATCH_SIZE=32
```
Tajomstvá je možné vygenerovať príkazom:
```bash
openssl rand -hex 32
```
Súbor `.env` sa nesmie commitovať.
## Spustenie cez Docker
```bash
docker compose build
docker compose up -d
```
Kontrola služby:
```bash
curl http://127.0.0.1:8000/health
```
Swagger UI:
```text
http://127.0.0.1:8000/docs
```
Zastavenie:
```bash
docker compose down
```
## Reindexovanie
Celý proces načíta dokumenty, vytvorí chunky, obnoví FTS5 index a vytvorí embedding pre každý chunk:
```bash
docker compose run --rm zp-agent-api python scripts/rebuild_index.py
```
Vzniknú súbory:
```text
data/documents.json
data/chunks.json
data/zp_index.sqlite
```
Databáza obsahuje dokumenty, chunky, FTS5 index, metadata a embeddingy.
## Vyhľadávanie
Vyhľadávanie kombinuje:
```text
dotaz
├── FTS5 / BM25
└── embeddingové vyhľadávanie
RRF fusion
výsledky
```
Test z terminálu:
```bash
docker compose run --rm zp-agent-api \
python scripts/search_db.py "rag agent" --limit 5
```
Pred volaním API načítaj premenné z `.env`:
```bash
set -a
source .env
set +a
```
Vyhľadávanie cez zabezpečené API:
```bash
curl -X POST http://127.0.0.1:8000/search \
-H "Content-Type: application/json" \
-H "X-API-Key: $SEARCH_API_KEY" \
-d '{
"query": "rag agent",
"limit": 5,
"published_only": false,
"max_per_document": 3
}'
```
API vracia hybridný engine:
```text
hybrid_fts5_embeddings
```
Manuálne reindexovanie cez zabezpečený endpoint:
```bash
curl -X POST http://127.0.0.1:8000/sync \
-H "Content-Type: application/json" \
-H "X-API-Key: $SYNC_API_KEY" \
-d '{"pull_git": false}'
```
## Testy
Inštalácia testovacích závislostí:
```bash
pip install -r requirements-dev.txt
```
Bežné automatizované testy:
```bash
pytest -q test
```
Aktuálna testovacia sada:
```text
65 passed, 2 skipped
```
Testy vrátane kontroly reálne vygenerovaných dát a databázy:
```bash
RUN_LIVE_TESTS=1 pytest -q test
```
## Ďalší krok
Najbližšia etapa je integrácia s OpenWebUI a vytvorenie agentového rozhrania. Následne sa doplnia RAG odpovede so zdrojmi a citáciami.