# Plan rozwoju bazy wiedzy ZOPK

**Data utworzenia:** 2026-01-17
**Status:** W trakcie realizacji

## Stan obecny (przed rozpoczęciem)

| Komponent | Status | Wartość |
|-----------|--------|---------|
| Artykuły scraped | ✅ | 132/163 (81%) |
| Artykuły extracted | ✅ | 120/132 (91%) |
| Chunks | ✅ | 412 |
| Fakty | ✅ | 3,414 |
| Encje | ✅ | 1,309 |
| Embeddings | ✅ | 412/412 (100%) |
| Integracja NordaGPT | ✅ | Semantic search działa |
| Automatyczny pipeline | ✅ | Cron co 1h |

---

## Priorytet 1: Panel admina bazy wiedzy

**Status:** 🔄 W trakcie
**Szacowany czas:** 1-2 dni

### Cel
Dashboard w `/admin/zopk/knowledge` z podglądem i zarządzaniem bazą wiedzy.

### Wymagane funkcje

1. **Dashboard główny** (`/admin/zopk/knowledge`)
   - Statystyki: chunks, fakty, encje, embeddings
   - Wykresy: ekstrakcje w czasie, top encje
   - Przyciski szybkich akcji (scraping, ekstrakcja, embeddings)

2. **Lista chunks** (`/admin/zopk/knowledge/chunks`)
   - Tabela z paginacją
   - Filtrowanie po artykule źródłowym
   - Podgląd treści chunk
   - Edycja/usunięcie chunk
   - Status embeddingu (✓/✗)

3. **Lista faktów** (`/admin/zopk/knowledge/facts`)
   - Tabela z paginacją
   - Filtrowanie po typie faktu (financial, date, decision, etc.)
   - Weryfikacja faktu (✓ zweryfikowany / ✗ błędny)
   - Edycja faktu
   - Link do źródłowego artykułu

4. **Lista encji** (`/admin/zopk/knowledge/entities`)
   - Tabela z paginacją
   - Filtrowanie po typie (company, person, place, project)
   - Liczba wzmianek
   - Możliwość łączenia duplikatów (Priorytet 4)
   - Edycja opisu encji

5. **Szczegóły artykułu** (`/admin/zopk/knowledge/article/<id>`)
   - Pełna treść scraped
   - Lista wyekstraktowanych chunks
   - Lista wyekstraktowanych faktów
   - Lista encji
   - Możliwość re-ekstrakcji

### Pliki do utworzenia
- `templates/admin/zopk_knowledge_dashboard.html`
- `templates/admin/zopk_knowledge_chunks.html`
- `templates/admin/zopk_knowledge_facts.html`
- `templates/admin/zopk_knowledge_entities.html`

### Pliki do modyfikacji
- `app.py` - nowe endpointy
- `zopk_knowledge_service.py` - metody CRUD

---

## Priorytet 2: Poprawa jakości odpowiedzi

**Status:** ⏳ Oczekuje
**Szacowany czas:** 1 dzień

### Cel
Lepsze formatowanie odpowiedzi NordaGPT z linkami do źródeł.

### Wymagane zmiany

1. **Linki do źródeł**
   - Zamiast: "Według Google News z 31 grudnia 2025..."
   - Ma być: "Według [trojmiasto.pl](https://trojmiasto.pl/...) z 31 grudnia 2025..."

2. **Formatowanie odpowiedzi**
   - Nagłówki dla sekcji
   - Listy wypunktowane dla wielu faktów
   - Wyróżnienie kluczowych danych (pogrubienie)

3. **Pewność odpowiedzi**
   - Gdy brak danych w bazie: "Nie mam informacji na ten temat w bazie wiedzy ZOPK"
   - Gdy dane niepewne: "Według dostępnych informacji (pewność: średnia)..."

4. **Źródła na końcu odpowiedzi**
   ```
   📚 Źródła:
   - [trojmiasto.pl] Kongsberg zainwestuje na Pomorzu (2025-11-23)
   - [defence24.pl] Norweska fabryka w Rumi (2025-11-25)
   ```

### Pliki do modyfikacji
- `nordabiz_chat.py` - metoda `_get_zopk_knowledge_context()`
- `nordabiz_chat.py` - system prompt dla ZOPK

---

## Priorytet 3: Timeline ZOPK na stronie /zopk

**Status:** ⏳ Oczekuje
**Szacowany czas:** 2-3 dni

### Cel
Wizualna oś czasu projektu ZOPK pokazująca kamienie milowe.

### Wymagane funkcje

1. **Tabela `zopk_milestones`**
   ```sql
   CREATE TABLE zopk_milestones (
       id SERIAL PRIMARY KEY,
       title VARCHAR(255) NOT NULL,
       description TEXT,
       milestone_type VARCHAR(50),  -- announcement, decision, construction, completion
       target_date DATE,
       actual_date DATE,
       status VARCHAR(20),  -- planned, in_progress, completed, delayed
       source_news_id INTEGER REFERENCES zopk_news(id),
       source_fact_id INTEGER REFERENCES zopk_knowledge_facts(id),
       icon VARCHAR(50),
       color VARCHAR(7),
       is_featured BOOLEAN DEFAULT FALSE,
       display_order INTEGER,
       created_at TIMESTAMP DEFAULT NOW()
   );
   ```

2. **Automatyczne tworzenie milestones**
   - Ekstrakcja dat z faktów (np. "budowa rozpocznie się w 2027")
   - Kategoryzacja: announcement, decision, construction_start, completion
   - Przypisanie do projektów (Kongsberg, PEJ, Baltic Power, Via Pomerania)

3. **UI Timeline na /zopk**
   - Pionowa oś czasu (scrollowalna)
   - Kamienie milowe z ikonami
   - Kolory: zielony (completed), niebieski (in_progress), szary (planned)
   - Kliknięcie → szczegóły z linkiem do źródła

4. **Panel admina dla milestones**
   - `/admin/zopk/milestones`
   - Dodawanie/edycja/usuwanie
   - Zmiana kolejności (drag & drop)

### Pliki do utworzenia
- `database/migrations/016_zopk_milestones.sql`
- `templates/admin/zopk_milestones.html`

### Pliki do modyfikacji
- `database.py` - model ZOPKMilestone
- `app.py` - endpointy
- `templates/zopk.html` - sekcja timeline

---

## Priorytet 4: Łączenie duplikatów encji

**Status:** ⏳ Oczekuje
**Szacowany czas:** 1 dzień

### Cel
Automatyczne i ręczne łączenie zduplikowanych encji.

### Znane duplikaty do połączenia

| Encja główna | Duplikaty | Łączna liczba wzmianek |
|--------------|-----------|------------------------|
| Morze Bałtyckie | Bałtyk | 58 + 53 = 111 |
| Polskie Elektrownie Jądrowe | PEJ | ? |
| Władysław Kosiniak-Kamysz | Kosiniak-Kamysz, Wicepremier | ? |
| Kongsberg Defence & Aerospace | Kongsberg | ? |

### Wymagane funkcje

1. **Automatyczne wykrywanie duplikatów**
   - Fuzzy matching nazw (pg_trgm similarity > 0.7)
   - Porównanie typów encji
   - Sugestie do zatwierdzenia przez admina

2. **Panel łączenia** (`/admin/zopk/knowledge/entities/merge`)
   - Lista sugerowanych duplikatów
   - Wybór encji głównej
   - Przycisk "Połącz" → aktualizacja wszystkich referencji

3. **Aliasy encji**
   - Tabela `zopk_entity_aliases`
   - Encja "Polskie Elektrownie Jądrowe" ma alias "PEJ"
   - Wyszukiwanie uwzględnia aliasy

### Pliki do utworzenia
- `database/migrations/017_zopk_entity_aliases.sql`

### Pliki do modyfikacji
- `database.py` - model ZOPKEntityAlias
- `zopk_knowledge_service.py` - metody merge_entities(), get_entity_duplicates()
- `app.py` - endpointy

---

## Priorytet 5: Graf relacji encji

**Status:** ⏳ Oczekuje
**Szacowany czas:** 2-3 dni

### Cel
Wizualizacja powiązań między encjami (podobna do Mapy Powiązań firm).

### Typy relacji do ekstrakcji

| Relacja | Przykład |
|---------|----------|
| `invests_in` | Kongsberg → Rumia Invest Park |
| `manages` | MON → ZOPK |
| `builds` | PEJ → Elektrownia Lubiatowo |
| `located_in` | Baltic Power → Morze Bałtyckie |
| `partners_with` | Westinghouse → Bechtel |
| `employs` | Kongsberg → 500 osób |

### Wymagane funkcje

1. **Ekstrakcja relacji z faktów**
   - Analiza AI faktów typu: "Kongsberg zainwestuje w Rumi"
   - Prompt: "Wyodrębnij relacje: subject → predicate → object"

2. **Wypełnienie tabeli `zopk_knowledge_relations`**
   - Tabela już istnieje (obecnie pusta)
   - Kolumny: source_entity_id, target_entity_id, relation_type, confidence_score

3. **Wizualizacja grafu** (`/zopk/graph` lub modal na /zopk)
   - Użycie D3.js lub vis.js (jak Mapa Powiązań)
   - Węzły = encje (kolorowane po typie)
   - Krawędzie = relacje (etykiety)
   - Filtrowanie po typie relacji

4. **Panel admina** (`/admin/zopk/knowledge/relations`)
   - Lista relacji z paginacją
   - Dodawanie/edycja/usuwanie
   - Weryfikacja (✓/✗)

### Pliki do modyfikacji
- `zopk_knowledge_service.py` - metoda extract_relations()
- `app.py` - endpointy
- `templates/zopk.html` - sekcja graf lub modal

---

## Harmonogram realizacji

| Priorytet | Zadanie | Szacowany czas | Status |
|-----------|---------|----------------|--------|
| 1 | Panel admina bazy wiedzy | 1-2 dni | 🔄 W trakcie |
| 2 | Poprawa jakości odpowiedzi | 1 dzień | ⏳ Oczekuje |
| 3 | Timeline ZOPK | 2-3 dni | ⏳ Oczekuje |
| 4 | Łączenie duplikatów encji | 1 dzień | ⏳ Oczekuje |
| 5 | Graf relacji encji | 2-3 dni | ⏳ Oczekuje |

**Łączny szacowany czas:** 7-10 dni

---

## Notatki techniczne

### Istniejące tabele bazy wiedzy
- `zopk_knowledge_chunks` - fragmenty tekstu z embeddingami
- `zopk_knowledge_facts` - wyekstraktowane fakty
- `zopk_knowledge_entities` - rozpoznane encje
- `zopk_knowledge_relations` - relacje między encjami (pusta)

### Istniejące serwisy
- `zopk_knowledge_service.py` - ekstrakcja i wyszukiwanie
- `zopk_content_scraper.py` - scraping treści artykułów

### Istniejący pipeline (cron)
- `scripts/zopk_knowledge_pipeline.py` - uruchamiany co godzinę
- Logi: `/var/log/nordabiznes/knowledge_pipeline.log`
