# Plan rozwoju bazy wiedzy ZOPK **Data utworzenia:** 2026-01-17 **Status:** ✅ UKOŃCZONE (2026-02-09) — wszystkie 5 priorytetów zrealizowanych ## 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:** ✅ Zrealizowane **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/`) - 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:** ✅ Zrealizowane **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:** ✅ Zrealizowane **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:** ✅ Zrealizowane **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:** ✅ Zrealizowane **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 | ✅ Zrealizowane | | 2 | Poprawa jakości odpowiedzi | 1 dzień | ✅ Zrealizowane | | 3 | Timeline ZOPK | 2-3 dni | ✅ Zrealizowane | | 4 | Łączenie duplikatów encji | 1 dzień | ✅ Zrealizowane | | 5 | Graf relacji encji | 2-3 dni | ✅ Zrealizowane | **Łą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`