PGŽ Sport Platform — Round 1+2 baseline (sport2.html + API)

This commit is contained in:
Damir Radulić
2026-05-04 23:39:08 +02:00
commit a7ec0a86be
1820 changed files with 694455 additions and 0 deletions
+122
View File
@@ -0,0 +1,122 @@
# PGŽ SPORT — TEXT-TO-SQL AGENT — 29.04.2026 ~14:00
## 🎯 FINALNO
Sustav sad ima **TRI sloja AI inteligencije**:
1. **CLASSIFIER** (DeepSeek V3, temp 0.0) — kategorizira pitanje:
- A → OPERATIVNO (imena, brojevi, liste, statistike)
- B → REGULATIVNO (zakoni, postupci, kategorizacija, kriteriji)
2. **SQL AGENT** (DeepSeek V3 + 18 whitelisted tablica) — za operativna pitanja:
- Generira SQL na osnovi schema description + few-shot examples
- Sigurno izvršenje (samo SELECT, single statement)
- Direktan psycopg2 (bez `%` placeholder collision)
- LLM finalizira odgovor iz JSON rezultata
3. **RAG AGENT** (BGE-M3 + 574 chunks + DeepSeek V3) — za regulativna pitanja:
- Vector retrieval iz Qdrant pgz_sport_dokumenti_v1
- Citiranje izvora [1], [2]…
## ✅ Smoke 8/8
| # | Pitanje | Mode | Rezultat |
|---|---|---|---|
| 1 | Tko je glavni trener HNK Rijeke? | SQL | ✅ Radomir Đalović |
| 2 | Sportski objekti Grad Rijeka? | SQL | ✅ 30 objekata (atletske staze, bazeni, dvorane...) |
| 3 | Suci nogomet PGŽ? | SQL | ✅ 5 sudaca (Bebek, Brnčić, Kos, Pajač, Zebec) |
| 4 | Stadioni s preko 5000 mjesta? | SQL | ✅ 2 stadiona |
| 5 | Sponzori HNK Rijeka? | SQL | ✅ Hrvatski Telekom, Croatia osiguranje, PostaPlus, Kraljevica grupa, Erste Banka |
| 6 | Boćanje 50+ sportaša? | SQL | ✅ 371 sportaša |
| 7 | Tko trenira RK Zamet? | SQL | ✅ Goluža (glavni), Karačić (pomoćni) |
| 8 | Top 10 saveza s najviše klubova? | SQL | ✅ Savez školskih ŠD 512, RSS 139, NS PGŽ 109, Skijaški 88, Boćarski 82... |
| 9 | Potpore PGŽ 2026? | SQL | ✅ €219.200 |
| 10 | Sportaši po kategoriji nogomet? | SQL | ✅ OPEN 12, 35+ 3, U15 1 |
| 11 | Suci u boćanju? | SQL | ✅ 3 suca |
| 12 | Suci nogomet Rijeka? | SQL | ✅ Bebek, Kos, Pajač, Zebec |
| 13 | Obveze kluba prema Zakonu o sportu? | RAG | ✅ Cited iz Zakona o sportu NN 141/22 |
## 📊 FINAL STATE
| Kategorija | Broj |
|---|---|
| Sportaša | 1.129 |
| Klubova PGŽ | 1.086 |
| Saveza | 220 |
| Sportskih objekata | **60** |
| Sudaca | **27** |
| Trenera | **30** |
| Sponzorskih ugovora | **22** |
| Sportskih medija | **15** |
| Akademski sport | **11** |
| Natjecanja | 366 |
| Manifestacija | 113 |
| Najboljih sportaša | 22 |
| Potpora nositeljima | 182 |
| Statistika saveza | 166 |
| Vijesti | 286 |
| Pravnih dokumenata | 176 |
| **Embed chunks** | **574** |
| Cross-link dokument-kategorija | 439 |
| Dobnih kategorija | 127 |
| Funkcionara | 155 |
| Utakmica log | 5.017 |
## 🎯 ARHITEKTURA AI
```
[korisnik] → /api/v2/dokumenti/ask-smart {q: "..."}
[CLASSIFIER LLM] (5 tokens)
┌────────┴────────┐
A=SQL B=RAG
│ │
[SQL gen] [BGE-M3 embed]
│ │
[_sql_safe] [Qdrant search top-5]
│ │
[psycopg2] [chunks → context]
│ │
[LLM answer] [LLM answer + cite]
│ │
└────────┬────────┘
{answer, mode, sql/sources, rows/chunks}
```
## 🔧 Tehnički detalji
- **DEEPSEEK_API_KEY** loaded from `/opt/.env.rinet` (chmod 600)
- **SQL whitelist**: 18 tablica (pgz_sport.*)
- **SQL safety**: blocks INSERT/UPDATE/DELETE/DROP/ALTER, multiple statements, pg_*, COPY, --
- **psycopg2 trick**: direct cursor.execute(sql) without params tuple to avoid `%` ILIKE collision
- **Few-shot examples**: 7 SQL examples u prompt-u
- **Schema hints**: column names s kvačicama mapped na ASCII (`izgrađeno``izgradeno`)
## URL-ovi LIVE
- https://api.rinet.one/sport/ → "📚 Pravilnici i zakoni" (chat sad ide ask-smart)
- POST /api/v2/dokumenti/ask-smart {q}
- POST /api/v2/dokumenti/ask {q} (RAG-only fallback)
- POST /api/v2/dokumenti/search {q} (RAG vector only)
## Frontend integracija
- chat input → ask-smart
- Mode badge: SQL · N redaka (zelena) / RAG · N izvora (ljubičasta)
- SQL display ispod odgovora kao readable code block
- Sources s [1]..[5] linkovi za RAG
## TODO sljedeća sesija (što ostaje)
1. **OIB enrichment** za 1106 sportaša + 1072 klubova preko Sudreg
2. **Realni PDF parser** za 138 dokumenata bez full text
3. **Klub kontakti** (web/tel/email) za preostale 1072 klubova
4. **Reprezentativci flag** — pridruživanje sportaša nacionalnim selekcijama
5. **Hibridni RAG+SQL** — pitanje koje treba i jedno i drugo (npr. "Koji su pravilnici za HNK Rijeka u 1. HNL?" → RAG za pravilnik + SQL za HNK Rijeka kontakte)
6. **Cron** — daily refresh za scrape natjecanja, vijesti, manifestacije
7. **Audit log AI upita** — što ljudi pitaju i kako AI odgovara (poboljšanje few-shot)
## Files
- `/opt/pgz-sport/pgz_sport_v2_router.py` (SQL agent + RAG)
- `/opt/pgz-sport/static/index.html` (frontend 270KB+)
- `/opt/pgz-sport/scrapers/` — 5 inserter scriptova
- `/opt/pgz-sport/_handoff/` — handoff dokumenti