bakalarka_praca/website/README.md

205 lines
7.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Hate Speech Detector
## 1. Opis čo robí aplikácia
Aplikácia **Hate Speech Detector** slúži na analýzu zadaného textu s cieľom určiť, či ide o nenávistný alebo neutrálny obsah. Využíva trénovaný model umelej inteligencie na klasifikáciu textov. Používateľ môže cez webové rozhranie zadať ľubovoľný text a aplikácia okamžite vráti klasifikáciu spolu s možnosťou zobrazenia histórie.
Všetky predikcie sa ukladajú do databázy PostgreSQL a zároveň sa synchronizujú do súboru `history.json`, ktorý frontend využíva ako zdroj na zobrazenie histórie. Okrem predikcie aplikácia poskytuje aj REST API na správu histórie a jej vymazanie. Webové rozhranie aj API sú zabezpečené cez HTTPS.
Model bol trénovaný na slovenskom datasete s využitím metódy LoRA (PEFT), čo umožnilo efektívne doladenie modelu s minimálnym počtom trénovateľných parametrov.
---
## 2. Slovný opis použitého verejného klaudu a objektov
- **Cloud**: Google Cloud Platform (GCP)
- **Služby GCP**:
- **Google Cloud Run**: hostovanie kontajnera s Flask backendom a React frontendom
- **Artifact Registry**: uložisko pre Docker image
- **Cloud SQL (PostgreSQL)**: relačná databáza na uchovanie predikcií
- **Docker objekty**:
- Multistage `Dockerfile`:
- `node:18` na build React aplikácie
- `python:3.10-slim` pre backend (Flask + transformers)
- Frontend sa kopíruje do `/app/static/`
- **Trvalý zväzok**:
- Cloud SQL PostgreSQL a `history.json`
### Štruktúra tabuľky `history`:
```sql
CREATE TABLE IF NOT EXISTS history (
id SERIAL PRIMARY KEY,
text TEXT NOT NULL,
prediction TEXT NOT NULL,
timestamp TIMESTAMP NOT NULL
);
```
Popis polí:
- `id`: automatický primárny kľúč (číselný identifikátor)
- `text`: vstupný text, ktorý užívateľ zadal
- `prediction`: výstup modelu (napr. "Neutrálny text")
- `timestamp`: dátum a čas, kedy bol text spracovaný
---
## 3. Štruktúra projektu
Projekt má nasledovnú štruktúru:
```
skuska/
├── Dockerfile # multistage Dockerfile (frontend + backend)
├── prepare-app-cloud.sh # skript na nasadenie aplikácie do GCP
├── remove-app-cloud.sh # skript na odstránenie služby
├── history.json # synchronizovaný záznam histórie (čítaný frontend)
├── frontend/ # React frontend projekt (vite)
│ └── ... # komponenty, assets, App.jsx atď.
├── backend/ # Flask backend
│ ├── app.py # hlavný backend súbor (Flask API)
│ └── requirements.txt # python balíčky (model sa sťahuje dynamicky z Hugging Face)
```
---
## 4. Opis odovzdaných súborov a konfigurácie:
### `backend/app.py`: hlavný backend aplikácie vo Flasku.
Obsahuje:
- endpoint `/api/predict` na AI predikciu
- `/api/history`, `/api/history/db` a `/api/history/reset` - slúžia na prácu s históriou. /api/history číta zo súboru history.json, ktorý je automaticky synchronizovaný s databázou. /api/history/db číta priamo z PostgreSQL databázy a zobrazí zoznam záznamov zoradených podľa času. /api/history/reset vymaže všetky záznamy z tabuľky history v databáze a zároveň prepíše history.json na prázdny zoznam.
- prepojenie na PostgreSQL (cez psycopg2 a DATABASE_URL)
- uloženie a synchronizáciu histórie
- automatické stiahnutie modelu z Hugging Face pri štarte aplikácie
### `frontend/`: React projekt vytvorený cez Vite.
- Obsahuje komponenty pre UI, API volania, zobrazovanie výsledkov a histórie.
### `backend/`: obsahuje `app.py`, `requirements.txt`
### Dockerfile: kombinácia frontend + backend do jedineho obrazu
Výrez Dockerfile:
```dockerfile
FROM node:18 AS frontend
WORKDIR /frontend
COPY frontend/ .
RUN npm install && npm run build
FROM python:3.10-slim
WORKDIR /app
COPY backend/ .
RUN apt-get update && apt-get install -y gcc libpq-dev && pip install -r requirements.txt
COPY --from=frontend /frontend/dist /app/static
CMD ["python", "app.py"]
```
### `prepare-app-cloud.sh`:
Bash skript, ktorý:
- definuje všetky dôležité premenne (názov projektu, región, názov obrazu a databázy)
- zostaví Docker image pomocou gcloud builds submit
- nasadí image do Google Cloud Run cez gcloud run deploy
- nastaví environmentálnu premennú DATABASE_URL
- prepojí službu so zvolenou databázou cez --add-cloudsql-instances
- vyžaduje spustený gcloud CLI a prihláseného používateľa
### `remove-app-cloud.sh`:
Bash skript, ktorý:
- pomocou gcloud run services delete zmaže existujúcu službu z Google Cloud Run
- využíva parameter --quiet na potlačenie výzvy na potvrdenie
- vyžaduje rovnaké prostredie ako skript `prepare-app-cloud.sh`
### `history.json`:
- vygenerovaný automaticky zo stavu databázy (synchronizuje sa pri každom uložení nového záznamu pomocou funkcie `sync_history_file()`)
### Pripojenie k databáze:
Premenná:
```
DATABASE_URL=postgresql://user:password@/mydb?host=/cloudsql/hatespeechsite:europe-central2:hate-db
```
---
## 5. Návod na použitie aplikácie v prehliadači:
1. Otvorte v prehliadači URL:
```
https://hate-detektor-19732600168.europe-central2.run.app/
```
2. Zadajte text do formulára
3. Kliknite na "Skontrolovať"
4. Zobrazí sa výsledok klasifikácie
5. Pod formulárom sa nachádza sekcia histórie
Pozamka: môžete resetovat' historiu priamo cez terminál príkazom:
```
curl -X POST https://hate-detektor-19732600168.europe-central2.run.app/api/history/reset | jq
```
---
## 6. Podmienky pre spustenie skriptov:
### `prepare-app-cloud.sh`:
vyžaduje:
- GCP projekt s povolenými službami: Artifact Registry, Cloud Build, Cloud Run, Cloud SQL
- `gcloud` CLI s aktívnym prihlásením a nastaveným projektom
vykonáva:
- build Docker image
- push do Artifact Registry
- deploy do Cloud Run + pripojenie k Cloud SQL + nastavenie DATABASE_URL
- používa premenné prostredia pre názvy služby a databázy
- skript je opakovateľný a nevyžaduje manuálnu interakciu
### `remove-app-cloud.sh`:
- odstráni službu z Cloud Run
- spustenie je okamžité bez potreby interakcie
- tichý režim (bez potvrdenia) pomocou parametra --quiet
---
## 7. Externé zdroje:
Trénovaný model:
- Použitý model: `slovak-t5-base`, finetunovaný osobne
- Model bol trénovaný na slovenskom datasete pozostávajúcom z anotovaných viet so zameraním na identifikáciu nenávistného prejavu
- Tréning prebehol s využitím metódy PEFT (Parameter-Efficient Fine-Tuning) konkrétne cez technológiu LoRA (Low-Rank Adaptation), čo umožnilo efektívne doladiť model s minimálnym počtom trénovateľných parametrov
- Model dosiahol presnosť 74 % pri testovaní na slovenskom dátovom korpuse
Model: `tetianamohorian/hate_speech_model` z HuggingFace (transformers model BERT)
Knižnice a frameworky:
- `transformers`, `torch` pre modelovanie
- `Flask`, `psycopg2`, `pytz` pre backend
- `React`, `Vite`, `fetch` pre frontend
---
## 8. Zhrnutie a vykonané kroky:
- ✅ Vytvorený frontend v Reacte s použitím Vite
- ✅ Vytvorený backend vo Flasku s REST API
- ✅ Nasadený AI model trénovaný na slovenskom datasete (slovak-t5-base, LoRA, 74% presnosť)
- ✅ Prepojenie aplikácie s databázou Cloud SQL (PostgreSQL)
- ✅ Vytvorená databázová tabuľka history s políčkami: id, text, prediction, timestamp
- ✅ Implementovaná synchronizácia databázy s `history.json`
- ✅ Nasadenie aplikácie pomocou Dockeru a Google Cloud Run
- ✅ Vytvorené shellové skripty na deploy (prepare-app-cloud.sh) a odstránenie (remove-app-cloud.sh)
- ✅ Zabezpečený verejný prístup cez HTTPS
- ✅ Otestované API: `/api/predict`, `/api/history`, `/api/history/reset`, `/api/history/db`