Урок 5: Entity Resolution та зв’язки — від сутностей до графа

Навігація курсу: Хаб: Уроки · ДЗ: ДЗ-05

Попередній: Урок-04-Соцмережі-та-медіапростір | Наступний: Урок-06-Теорія-графів

Інструменти уроку: Flowsint · OpenPlanter


Слайди (Презентаційний текст)


Слайд 1 — Заголовок

Entity Resolution та зв’язки

Від сутностей до графа

Урок 5 | AI для OSINT 2026

“Дані — це острови. Граф — це архіпелаг.”


Слайд 2 — Проблема: один і той самий, але різний

Реальна ситуація розслідування:

Ви зібрали дані з 8 джерел. Маєте:

  • «Іван Петренко, CEO TechUA» — LinkedIn
  • «I. Petrenko, head of TechUA Ltd» — реєстр компаній
  • «ivanp_kyiv» — GitHub
  • «ivan.petrenko90@gmail.com» — витік бази даних
  • «@ivan_tech_ua» — Telegram
  • «+38050-xxx-xxxx» — WhatsApp
  • «Іван П., директор» — судовий реєстр
  • «IvanUA» — форум криптовалют

Питання: це одна людина чи 8 різних записів?

Entity Resolution (Розпізнавання сутностей) — процес визначення того, що різні записи з різних джерел стосуються одного реального об’єкта.


Слайд 3 — Що таке «сутність» в OSINT

Сутність (Entity) = будь-який реальний об’єкт, що можна ідентифікувати та описати атрибутами.

Тип сутностіПрикладиКлючові атрибути
Особа (Person)Людина, псевдонімІм’я, дата народження, фото, нікнейм
Організація (Organization)Компанія, ГО, держорганНазва, ідентифікаційний код, юрисдикція
Локація (Location)Адреса, координатиGPS, країна, індекс
Артефакт (Artifact)Email, IP, домен, телефонЗначення, протокол, реєстратор
Подія (Event)Зустріч, транзакціяДата, учасники, місце
Крипто-активГаманець, NFTАдреса, мережа, баланс

Граф = Сутності (вузли) + Зв’язки (ребра) + Атрибути + Вага


Слайд 4 — Три методи Entity Resolution

1. Детерміністичний (точний збіг)

  • Однаковий email → одна особа (впевненість: 10/10)
  • Однаковий телефон → одна особа (впевненість: 9/10)
  • Однаковий хеш фото → одне зображення (впевненість: 10/10)

2. Ймовірнісний (нечіткий збіг)

  • «Іван Петренко» + «I. Petrenko» + спільна компанія → ймовірно та сама людина (впевненість: 7/10)
  • Транслітераційні варіанти + збігаюча посада → 6/10

3. AI-підхід (семантичний збіг, 2025–2026)

  • Векторні ембедінги (embeddings) порівнюють семантичну схожість записів
  • Великі мовні моделі (ВММ / LLM) розбирають контекстуальні підказки
  • Graph Neural Networks прогнозують приховані зв’язки

Статистика 2025: KnowCTI досягає 92.96% точності на витяжку сутностей (entity extraction) з CTI-текстів.


Слайд 5 — Ідентифікаційні якорі

Надійні якорі (deterministic identifiers):

ЯкірУнікальністьПостійністьПримітка
EmailВисокаВисокаКлюч до більшості сервісів
ТелефонВисокаСередняЗмінюється рідше, ніж здається
НікнеймСередняВисокаЛюди дуже послідовні
Фото профілюВисокаСередняЗворотний пошук зображень
Крипто-гаманецьДуже високаВисокаНезмінна публічна адреса

Слабкі якорі (потребують підтвердження):

  • Ім’я та прізвище — збігається у тисячах осіб
  • Посада — змінюється, не унікальна
  • Локація — може бути VPN або навмисно помилковою

Правило 2+: для однозначної ідентифікації потрібно мінімум 2 незалежні надійні якорі.


Слайд 6 — Каскад ідентифікаторів

Принцип: один ідентифікатор → кілька нових → ще більше зв’язків.

Email  ──→  BreachData  ──→  інші акаунти з тим самим email
  │                                    │
  └──→  Gravatar  ──→  фото  ──→  Google Lens  ──→  соцмережі
  
Нікнейм  ──→  Sherlock / Maigret  ──→  список 500+ платформ
              │
              └──→  GitHub  ──→  реальне ім'я + локація + репозиторії
              └──→  Reddit  ──→  пости + зацікавлення
              └──→  Steam  ──→  ігровий профіль + країна

Телефон  ──→  WhatsApp  ──→  ім'я + фото + «бачили нещодавно»
           └──→  Telegram  ──→  username + публічні групи

Мета: перетворити один відомий факт на повний профіль.


Слайд 7 — Collision Detection: Уникайте помилок атрибуції

Найнебезпечніша помилка OSINT: приписати факти однієї людини її однофамільцеві.

Перевірка при збігу імен — обов’язковий чеклист:

  • Збігається компанія / сфера діяльності?
  • Збігається географічна локація?
  • Збігається орієнтовний вік / фото?
  • Є хоча б 2 незалежні факти, що прив’язують до конкретної особи?
  • Чи перевірено альтернативну гіпотезу (це ІНША людина)?

Якщо сумніваєтесь → розбийте на дві окремі сутності:

  • ent_ivan_petrenko_techUA (CEO компанії)
  • ent_ivan_petrenko_kherson (судовий реєстр Херсон)

Краще мати дві окремі сутності, які потім виявляться однією, ніж одну злиту, яка насправді дві.


Слайд 8 — Від даних до графа: пайплайн (pipeline)

Збір даних          Entity Extraction       Нормалізація
(сирі джерела)  →   (NER, regex, LLM)   →  (стандартизація)
     │                                           │
     └── веб-сторінки                            └── «Іван» = «Ivan»
     └── PDF-документи                           └── «+380» = «38»
     └── соцмережі                               └── дата ISO 8601
     └── бази даних
         
Нормалізація    →   Deduplication     →    Linking         →    Граф
                    (злиття дублікатів)     (встановлення        (Neo4j /
                    Fuzzy match /           зв'язків)            Cytoscape)
                    Vector similarity

Ключові компоненти:

  1. NER (Named Entity Recognition) — автоматичне виявлення сутностей у тексті
  2. Нормалізація — єдиний формат для порівняння
  3. Дедублікація — злиття дублікатів
  4. Linking — встановлення зв’язків між сутностями
  5. Граф — фінальна структура для аналізу та візуалізації

Слайд 9 — Огляд інструментів: Flowsint та OpenPlanter

Сьогодні вивчаємо два сучасних open-source інструменти (2025–2026):

ХарактеристикаFlowsintOpenPlanter
ТипГраф-based OSINT платформаAI-агент розслідувань
ФокусТехнічна розвідка (домени, IP, email)Корпоративна розвідка (реєстри, фінанси)
ГрафNeo4j (вбудований)Cytoscape.js (інтерактивний)
AIЗбагачувачі (enrichers)LLM-агент з 19 інструментами
ІнтерфейсВеб-застосунокДесктоп-застосунок + CLI
МоваTypeScript + PythonPython + Rust + TypeScript
Зірки GitHub⭐ 3 328⭐ 1 583
ЛіцензіяApache 2.0Відкрите ПЗ
ВстановленняDocker + MakeБінарник / pip / Docker

Обидва зберігають дані локально — повна конфіденційність розслідування.


Слайд 10 — Flowsint: Архітектура

Flowsint — open-source платформа для графового OSINT-розслідування.

┌─────────────────────────────────────────────────────┐
│                  flowsint-app                        │
│           (TypeScript / React Frontend)              │
└──────────────────────┬──────────────────────────────┘
                       │ REST API
┌──────────────────────▼──────────────────────────────┐
│                  flowsint-api                        │
│              (FastAPI / Python)                      │
└──────────────┬───────────────────────────────────────┘
               │
┌──────────────▼──────────────────────────────────────┐
│              flowsint-core                           │
│   (Orchestrator · Celery tasks · Auth · Vault)       │
└──────────────┬──────────────────────────────────────┘
               │
┌──────────────▼──────────────────────────────────────┐
│            flowsint-enrichers                        │
│   (30+ модулів збагачення · Maigret · WHOIS · DNS)  │
└──────────────┬──────────────────────────────────────┘
               │
┌──────────────▼──────────────┐  ┌─────────────────────┐
│      PostgreSQL             │  │       Neo4j          │
│  (метадані · користувачі)   │  │  (граф зв'язків)     │
└─────────────────────────────┘  └─────────────────────┘

Neo4j — графова база даних, де кожен вузол = сутність, кожне ребро = зв’язок.


Слайд 11 — Flowsint: Встановлення

Передумови

  • Docker (обов’язково)
  • Make (обов’язково)

Встановлення (3 команди)

# 1. Клонуємо репозиторій
git clone https://github.com/reconurge/flowsint.git
 
# 2. Переходимо в директорію
cd flowsint
 
# 3. Запускаємо (Docker збере все автоматично)
make prod

Перший запуск

Застосунок доступний за адресою:
http://localhost:5173/register

→ Створіть обліковий запис (немає даних за замовчуванням)
→ Увійдіть і почніть перше розслідування

Конфіденційність: всі дані зберігаються лише на вашій машині. Жодних хмарних сховищ.


Слайд 12 — Flowsint: Типи сутностей

Flowsint підтримує 12 типів сутностей:

ТЕХНІЧНА ІНФРАСТРУКТУРА          ОСОБИСТІСТЬ / ОРГАНІЗАЦІЯ
─────────────────────────        ─────────────────────────
• Domain (домен)                 • Individual (особа)
• IP (IP-адреса)                 • Organization (організація)
• ASN (автономна система)        • Email (поштова адреса)
• CIDR (діапазон IP)             • Phone (телефон)
• Website (веб-сайт)

ФІНАНСИ / ІНШЕ
──────────────
• Crypto Wallet (крипто-гаманець)
• Transaction (транзакція)
• NFT (невзаємозамінний токен)
• Social Profile (профіль соцмереж)
• Credentials (облікові дані)

Workflow: починаєте з будь-якої сутності → збагачувач автоматично знаходить пов’язані сутності → граф будується сам.


Слайд 13 — Flowsint: Збагачувачі домену (Domain Enrichers)

Починаємо розслідування з домену — наприклад techUA.com:

ЗбагачувачЩо робитьРезультат
DNS ResolutionРезолвить домен в IPtechUA.com → 185.x.x.x
Reverse DNSЗнаходить домени на IP185.x.x.x → 12 доменів
Subdomain DiscoveryПеребирає піддомениmail.techUA.com, api.techUA.com
WHOIS LookupРеєстраційна інформаціяДата, реєстратор, контакт
Domain HistoryХто раніше володівМинулі реєстрації
Domain → ASNЗнаходить AS-провайдераAS12345 (Kyivstar)
Domain → WebsiteПеретворює на web-сутністьДля подальшого збагачення

Практика: з одного домену за 2-3 хвилини — повна карта технічної інфраструктури.


Слайд 14 — Flowsint: Збагачувачі IP та мережі

IP → ASN → CIDR → список IP-адрес:

Крок 1: IP Information
  → Геолокація (країна, місто, координати)
  → Провайдер (ISP)
  → Тип (хостинг, residential, Tor exit node)
  → Reputation (чи є в blocklist)

Крок 2: IP → ASN
  → Автономна система (ASN)
  → Власник AS (хто реально контролює)
  → Країна реєстрації

Крок 3: ASN → CIDRs
  → Всі IP-діапазони що належать AS
  → Масштаб: може бути тисячі IP

Крок 4: Organization → ASN
  → Якщо відома компанія → знайти всі її AS

Навіщо це потрібно в OSINT:

  • Кластеризація сервісів одного актора за інфраструктурою
  • Виявлення спільного хостингу для різних доменів
  • Attribution (атрибуція) кібератак за мережевими артефактами

Слайд 15 — Flowsint: Email та особа

Email — найпотужніший відправний якір:

ЗбагачувачЩо повертає
Email → BreachesСписок витоків (HaveIBeenPwned / Dehashed)
Email → DomainsДомени асоційовані з цим email
Email → GravatarФото профілю, ім’я, опис
Individual → OrganizationОрганізаційна приналежність
Individual → DomainsДомени зареєстровані на особу

Типовий ланцюг:

email@domain.com
  ├─ [Breaches] → 3 витоки → паролі, телефон, ім'я
  ├─ [Gravatar] → фото + username
  ├─ [→ Domains] → techUA.com, ivan-petrenko.ua
  └─ [→ Individual] → "Іван Петренко, CEO"
       └─ [Individual → Org] → TechUA Ltd

Один email може розкрити повний профіль особи за 5–10 хвилин.


Слайд 16 — Flowsint: Соцмережі через Maigret

Maigret — open-source інструмент пошуку нікнейму на 3000+ сайтах.

Інтеграція в Flowsint: вводите нікнейм → граф автоматично будується.

Input: "ivanp_kyiv"
         │
         ▼
   [Maigret Enricher]
         │
    ┌────┴────────────────────────────────────┐
    │  GitHub ✓     Reddit ✓    Steam ✓       │
    │  Twitter ✓    Habr ✓      Pinterest ✗   │
    │  Instagram ✓  DeviantArt ✗ LinkedIn ✓   │
    │  Telegram ✓   YouTube ✗   HackerNews ✓  │
    └─────────────────────────────────────────┘
         │
    Кожна знахідка → вузол Social Profile у графі
    Вузли з'єднані ребром "same_nickname" з Individual

Спостереження з практики 2025–2026: люди використовують один і той самий нікнейм на 20–40 платформах в середньому. Один нікнейм — це цифровий відбиток.


Слайд 17 — Flowsint: Організації та криптовалюта

Organization Enrichers:

  • Organization → ASN → вся мережева інфраструктура компанії
  • Organization → Domains → всі домени що належать організації
  • Organization Information → деталі компанії (юридичні дані, опис)

Cryptocurrency Enrichers — для відстеження фінансових потоків:

# Що повертає Wallet Enricher
{
  "address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7Divf",
  "network": "Bitcoin",
  "balance": "0.00000001 BTC",
  "transactions": [
    {
      "tx_hash": "4a5e1e4b...",
      "value": "50.0 BTC",
      "timestamp": "2009-01-03",
      "counterparty": "unknown"
    }
  ],
  "nfts": []
}

NFT-збагачувач: знаходить NFT у гаманці → може розкрити Discord-спільноту, Twitter-аккаунт, реальну особу.


Слайд 18 — Flowsint: Веб-сайт та телефон

Website Enrichers — аналіз веб-присутності:

ЗбагачувачЗастосування
Website CrawlerКарта всіх сторінок сайту
Website → LinksВсі зовнішні посилання (→ партнери?)
Website → DomainВитяг доменного імені
Website → WebtrackersGoogle Analytics ID, Facebook Pixel ID
Website → TextВесь текст для AI-аналізу

Тактика: два різних сайти з одним і тим самим Google Analytics ID (UA-XXXXXXXX) → належать одному власнику. Перевірте через BuiltWith або SpyOnWeb.

Phone Enrichers:

  • Phone → Breaches → перевірка в базах витоків даних
  • Повертає: ім’я, оператор, регіон, дата реєстрації (якщо є)

Слайд 19 — Flowsint: N8n Інтеграція та автоматизація

N8n — open-source платформа автоматизації (як Zapier, але self-hosted).

Flowsint → N8n Connector дозволяє:

Тригер в N8n (наприклад, новий домен у Shodan alert)
    │
    ▼
Flowsint API: create_entity(domain, "techUA2.com")
    │
    ▼
Автоматичний запуск всіх domain enrichers
    │
    ▼
Якщо знайдено новий email:
    ├─ Запустити email enrichers
    └─ Надіслати Telegram-сповіщення з результатами

Сценарії автоматизації:

  1. Моніторинг: щодня перевіряти нові домени за патерном → сповіщати
  2. Batch processing: завантажити 100 IP з Shodan → збагатити всі
  3. Alert pipeline: новий бренчний акаунт → автоматичний OSINT-профіль

Слайд 20 — Flowsint: Практичний workflow

Кейс: розслідування підозрілого домену

Крок 1: Додати сутність
  + New Entity → Domain → "suspicious-invest.ua"

Крок 2: Запустити збагачувачі
  → DNS Resolution     : 194.x.x.x (Hetzner, Німеччина)
  → WHOIS             : зареєстровано 14 днів тому, Privacy Guard
  → Subdomain Discovery: login.suspicious-invest.ua, admin.suspicious-invest.ua
  → Domain History    : до 2 місяців тому — парковий домен

Крок 3: Слідуємо за IP
  → IP Information    : shared hosting, 47 доменів на тому ж IP
  → Reverse DNS       : 3 схожих "invest" домени на тому ж IP

Крок 4: Аналіз сайту
  → Website Crawler   : сторінки login, dashboard, withdraw
  → Webtrackers       : той самий Google Analytics UA-xxxxxxx
                        → SpyOnWeb: ще 12 схожих "invest" сайтів

Крок 5: Граф показує кластер
  → 15 шахрайських сайтів → одна інфраструктура → можливо один актор

Весь процес у Flowsint: ~20-30 хвилин замість кількох днів вручну.


Слайд 21 — OpenPlanter: Архітектура

OpenPlanter — AI-агент для розслідувань з десктопним GUI та CLI.

┌─────────────────────────────────────────────────────────┐
│          openplanter-desktop (Tauri 2)                  │
│  ┌──────────┐  ┌─────────────────┐  ┌────────────────┐ │
│  │ Sidebar  │  │   Chat Pane     │  │ Knowledge Graph│ │
│  │          │  │                 │  │ (Cytoscape.js) │ │
│  │ Сесії   │  │ Цілі агента    │  │                │ │
│  │ Моделі  │  │ Кроки думки    │  │ Вузли за       │ │
│  │ API-ключі│  │ Tool calls     │  │ категоріями:   │ │
│  │         │  │ Знахідки       │  │ corporate      │ │
│  │         │  │                 │  │ sanctions      │ │
│  └──────────┘  └─────────────────┘  │ lobbying       │ │
│                                     └────────────────┘ │
└─────────────────────────────────────────────────────────┘
                          │
                    Tauri IPC (Rust)
                          │
┌─────────────────────────▼───────────────────────────────┐
│             Python CLI Agent (engine.py)                │
│  • Recursive LLM engine                                 │
│  • Session persistence                                  │
│  • 19 investigation tools                               │
│  • Multi-provider LLM abstraction                       │
└─────────────────────────────────────────────────────────┘

Слайд 22 — OpenPlanter: Встановлення

Варіант 1: Готовий бінарник (найпростіше)

Завантажте з Releases page:

  • Linux: .AppImage (запускається без встановлення)
  • macOS: .dmg
  • Windows: .msi

Варіант 2: CLI (тільки Python)

# Встановлення
pip install -e .
 
# Налаштування API-ключів (інтерактивно)
openplanter-agent --configure-keys
 
# Запуск TUI-інтерфейсу
openplanter-agent --workspace /шлях/до/проекту

Варіант 3: Docker

# Додайте ключі до .env, потім:
docker compose up
# → /workspace монтується як робочий каталог агента

Налаштування моделі

# Anthropic (рекомендовано для складних розслідувань)
export ANTHROPIC_API_KEY="your_key"
openplanter-agent --provider anthropic
 
# Локально (Ollama, безкоштовно)
openplanter-agent --provider ollama --model llama3.2

Слайд 23 — OpenPlanter: 19 інструментів агента

Агент має доступ до 19 інструментів, організованих у 5 груп:

Робочий простір та файли (8 інструментів)

list_files     — перелік файлів у workspace
search_files   — пошук по вмісту файлів
repo_map       — карта структури проекту
read_file      — читання файлу
write_file     — запис файлу зі знахідками
edit_file      — редагування файлу
hashline_edit  — точкове редагування за рядком
apply_patch    — застосування diff-патчу

Виконання команд (4 інструменти)

run_shell      — запуск shell-команди
run_shell_bg   — фонове виконання
check_shell_bg — перевірка фонового процесу
kill_shell_bg  — зупинка фонового процесу

Веб (2 інструменти)

web_search  — пошук через Exa AI (EXA_API_KEY)
fetch_url   — завантаження веб-сторінки

Планування та делегування (5 інструментів)

think          — внутрішнє міркування агента
subtask        — створення підзавдання для суб-агента
execute        — запуск суб-агента
list_artifacts — перелік результатів
read_artifact  — читання результату

Слайд 24 — OpenPlanter: Entity Resolution через LLM-агент

Головна відмінність від Flowsint: OpenPlanter не збагачує вузли збагачувачами — він думає, як детектив.

Як агент виконує entity resolution:

Завдання: "Перехрестити реєстри постачальників з лобістськими 
           розкриттями та відзначити збіги"

Агент:
  1. [think] Планую: завантажу реєстр → нормалізую назви компаній
             → завантажу лобістські дані → шукаю збіги

  2. [read_file] vendor_registry.csv (50,000 рядків)
  
  3. [run_shell] python normalize_names.py vendor_registry.csv
     → "TechUA Ltd" = "Tech UA Limited" = "ТЕХЮА ТОВ"
  
  4. [read_file] lobbying_disclosures_2025.json
  
  5. [run_shell] python crossref.py --fuzzy-match 0.85
     → Знайдено 47 збігів. 12 з підозрілими сумами.
  
  6. [write_file] findings/vendor_lobby_overlap.md
  
  7. [subtask] → Суб-агент аналізує кожен з 12 підозрілих збігів

Слайд 25 — OpenPlanter: Підтримувані LLM-провайдери

OpenPlanter підтримує 5 провайдерів:

ПровайдерМодель за замовчуваннямЗмінна середовища
OpenAIgpt-5.2OPENAI_API_KEY
Anthropicclaude-opus-4-6ANTHROPIC_API_KEY
OpenRouteranthropic/claude-sonnet-4-5OPENROUTER_API_KEY
Cerebrasqwen-3-235b-a22b-instruct-2507CEREBRAS_API_KEY
Ollamallama3.2(не потрібна — локально)

Рекомендації для OSINT-розслідувань (2026):

  • Складні розслідування: Claude Opus 4.6 (Anthropic) — найглибше міркування
  • Швидкий аналіз: Claude Sonnet 4.6 — баланс ціна/якість
  • Повна конфіденційність: Ollama + Llama 4 Scout (8B) або Gemma 4 (12B) — локально
  • Безкоштовно: OpenRouter (є безкоштовний tier)

Режим міркування (reasoning effort):

openplanter-agent --reasoning-effort high   # складні кейси
openplanter-agent --reasoning-effort medium # стандарт
openplanter-agent --reasoning-effort low    # швидкі перевірки

Слайд 26 — OpenPlanter: Граф знань (Knowledge Graph)

Інтерактивна візуалізація в реальному часі:

Кольорове кодування вузлів:
  🔵 corporate         — компанії, корпорації
  🟠 campaign-finance  — фінансування виборчих кампаній
  🟣 lobbying          — лобістська активність
  🟡 contracts         — державні контракти
  🔴 sanctions         — санкційні списки
  ⚪ others            — інші категорії

Взаємодія:
  • Клік на вузол → slide-out drawer з повним wiki-документом
  • Внутрішні wiki-посилання → навігація між документами
  • Пошук і фільтр за категорією
  
Макети:
  → Force-directed (за замовчуванням)
  → Hierarchical (ієрархічний)
  → Circular (кільцевий)

Wiki-куратор (Background wiki curator):
Легкий фоновий агент постійно перехресно перевіряє та оновлює wiki-документи. Якщо агент знайшов нову інформацію про сутність — куратор оновлює відповідний вузол у графі.


Слайд 27 — OpenPlanter: Типи даних та розслідування

OpenPlanter спеціалізується на структурованих публічних реєстрах:

┌──────────────────────────────────────────────────────┐
│              ВХІДНІ ДАНІ (workspace/)                │
│  • Реєстри компаній (CSV, JSON, XML)                 │
│  • Фінансування виборчих кампаній (FEC, OpenSecrets) │
│  • Лобістські розкриття (LDA, EU Transparency Reg.)  │
│  • Державні контракти (ProZorro, USASpending.gov)    │
│  • Санкційні списки (OFAC SDN, EU Consolidated)      │
│  • Будь-які власні датасети                          │
└──────────────────────────────────────────────────────┘
              │
              ▼ (агент обробляє)
┌──────────────────────────────────────────────────────┐
│              ВИЯВЛЕНІ ЗВ'ЯЗКИ                        │
│  • Компанія X отримала контракт від міністерства Y   │
│  • Компанія X лобіювала через фірму Z                │
│  • Директор компанії X — донор кандидата W           │
│  • Директор компанії X фігурує в санкційному списку  │
└──────────────────────────────────────────────────────┘

Практичне застосування для України:

  • ProZorro (prozorro.gov.ua) — державні закупівлі
  • ЄДРПОУ — реєстр юридичних осіб
  • Декларації чиновників (nazk.gov.ua)
  • Санкційні списки РНБО та OFAC

Слайд 28 — OpenPlanter: Рекурсивні суб-агенти

Ключова особливість OpenPlanter: агент може породжувати суб-агентів для паралельної роботи.

Головний агент: "Дослідити мережу контрагентів ТОВ TechUA"
  │
  ├─ [subtask] Суб-агент 1: "Перевірити всіх директорів TechUA"
  │     └─ Знаходить: 3 директори → перевіряє кожного в реєстрах
  │
  ├─ [subtask] Суб-агент 2: "Знайти пов'язані компанії за адресою"
  │     └─ Знаходить: 8 компаній на тій самій адресі
  │
  ├─ [subtask] Суб-агент 3: "Перевірити державні контракти 2023-2025"
  │     └─ Знаходить: 12 контрактів на 47 млн грн
  │
  └─ [execute] Агент-синтезатор: об'єднує всі результати
         └─ Генерує звіт: зв'язки, ризики, рекомендації

Параметри рекурсії:

--recursive          # увімкнути рекурсію (за замовчуванням)
--max-depth 4        # максимальна глибина рекурсії
--max-steps 100      # максимум кроків на виклик
--acceptance-criteria # перевірка результатів суб-агентів

Слайд 29 — OpenPlanter: CLI та Headless-режим

CLI для автоматизованих розслідувань:

# Один запит (headless — без інтерактивного інтерфейсу)
openplanter-agent \
  --task "Перехрестити платежі постачальників з лобістськими розкриттями та відзначити збіги" \
  --workspace ./дані-розслідування \
  --provider anthropic \
  --reasoning-effort high \
  --max-depth 3
 
# Продовжити перервану сесію
openplanter-agent --workspace ./проект --resume
 
# Список збережених сесій
openplanter-agent --list-sessions
 
# Демо-режим (цензурує імена та шляхи — для показу клієнту)
openplanter-agent --task "..." --workspace ./проект --demo

Session persistence (збереження сесій):

  • Всі сесії зберігаються автоматично в .openplanter/
  • Можна продовжити з будь-якої точки після збою або паузи
  • Кожна сесія має унікальний ID для відтворення

Слайд 30 — OpenPlanter: Практичний кейс

Кейс: Розслідування корупції в держзакупівлях

Workspace:
  data/
    prozorro_contracts_2024.csv    (15 000 контрактів)
    company_registry.json          (ЄДРПОУ витяг)
    declarations_officials.csv     (декларації чиновників НАЗК)
    ofac_sdn_list.xml              (санкційний список OFAC)

Завдання агенту:
"Знайди компанії що отримали контракти на суму >1 млн грн 
 та директори яких фігурують у деклараціях чиновників 
 Міністерства оборони. Перевір наявність у санкційних списках."

Агент виконав за 18 хвилин:
  ✓ Нормалізація назв компаній (ЄДРПОУ → ProZorro)
  ✓ Entity resolution: 847 компаній → 623 унікальні юридичні особи
  ✓ Cross-reference: 14 збігів директор ↔ чиновник
  ✓ Санкційна перевірка: 2 компанії знайдено в OFAC SDN
  ✓ Wiki-документ для кожного збігу з ланцюгом доказів

Слайд 31 — Порівняння Flowsint та OpenPlanter

Коли використовувати кожен інструмент:

СценарійFlowsintOpenPlanter
Розслідування домену / IP✅ Ідеально➖ Не спеціалізується
Email-розвідка✅ Ідеально➖ Обмежено
Соціальні мережі / нікнейми✅ Через Maigret➖ Через web_search
Криптовалютні гаманці✅ Вбудовано➖
Держзакупівлі / реєстри➖✅ Ідеально
Корпоративна структура➖✅ Ідеально
Фінансування кампаній / лобізм➖✅ Ідеально
Санкційні списки➖✅ Вбудовано
Автоматичне збагачення✅ Enrichers✅ Agent tools
Граф у реальному часі✅ Neo4j✅ Cytoscape.js
Локальні моделі➖✅ Ollama
Найкращий дляКіберрозвідка, технічний OSINTФінансові розслідування, антикорупція

Слайд 32 — Інтегрований workflow: Flowsint + OpenPlanter

Двохетапний підхід для складних розслідувань:

ФАЗА 1 — ТЕХНІЧНА РОЗВІДКА (Flowsint)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Input: підозрілий домен / email / IP
  ↓
  Flowsint збагачує: домени, IP, email, нікнейми, гаманці
  ↓
  Виводимо з Flowsint: список компаній, імен, email
  
                          ↓ ПЕРЕДАЧА ДАНИХ

ФАЗА 2 — КОРПОРАТИВНА РОЗВІДКА (OpenPlanter)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Input: знайдені компанії + імена + email
  ↓
  OpenPlanter cross-references: реєстри, декларації, контракти
  ↓
  Entity resolution: унікальні особи та організації
  ↓
  Виявлення схем: підозрілі зв'язки, санкційні перевірки
  ↓
  Фінальний граф + wiki-звіт

Слайд 33 — Якість та впевненість у графах

Кожен вузол і ребро графу повинні мати оцінку впевненості (1–10):

Вузол: Іван Петренко (Individual)
  впевненість: 9/10
  джерела: LinkedIn (верифіковано), реєстр компаній, судовий реєстр

Ребро: Іван Петренко → CEO → TechUA Ltd
  впевненість: 10/10
  джерела: LinkedIn (офіційний), ЄДРПОУ (підписант)
  
Ребро: TechUA Ltd → Пов'язана → CryptoInvest UA
  впевненість: 6/10
  джерела: спільна IP-адреса (Flowsint), спільний аналітик (LinkedIn)
  примітка: непрямий зв'язок — потрібне підтвердження

Шкала впевненості:

  • 9–10: Детерміністичний збіг (той самий ЄДРПОУ, email, телефон)
  • 7–8: 2+ незалежних джерела
  • 5–6: 1 надійне джерело
  • 3–4: Умовивід / непрямі ознаки
  • 1–2: Спекуляція — не включати до звіту

Слайд 34 — Collision Detection в інструментах

Як уникнути помилок при роботі з Flowsint та OpenPlanter:

У Flowsint:

  • Якщо підозрюєте collision — не зливайте вузли вручну без перевірки
  • Додайте ребро POSSIBLY_SAME_AS замість злиття
  • Приберіть атрибут verified: false — він видно у графі

У OpenPlanter:

# Агент сам попереджає про можливі collision:
"Знайдено 2 сутності з ім'ям 'Олексій Шевченко':
  - ent_shev_kyiv: CEO TechUA, Київ, 1985
  - ent_shev_kharkiv: директор MetalUA, Харків, 1971
  Рекомендація: НЕ зливати — різні особи. Впевненість: 8/10"

Правило практики: при будь-якому сумніві — окремі вузли. Аналітик може злити пізніше, але не може “розлити” злиту сутність без втрати контексту.


Слайд 35 — Етика та правовий контекст

Flowsint та OpenPlanter — інструменти для законних розслідувань.

Заборонено (порушення законодавства та умов використання):

  • Доксинг (doxing) — публікація особистих даних без згоди
  • Стеження за приватними особами без правових підстав
  • Несанкціонований доступ до даних (будь-яка авторизована система)
  • Використання даних для переслідування чи залякування
  • Продаж зібраних даних третім особам без дозволу

Дозволено та рекомендовано:

  • Розслідування публічних осіб (политики, посадовці) щодо їх публічної діяльності
  • Антикорупційна журналістика на основі публічних реєстрів
  • Кіберрозвідка загроз (CTI) у межах захисту власної інфраструктури
  • OSINT для верифікації контрагентів (due diligence)

Flowsint ETHICS.md: “Please use this tool only for lawful purposes. Do not use it for harassment, doxxing, or unauthorized surveillance.”


Слайд 36 — Підсумок уроку

Що ви вивчили сьогодні:

  1. Entity Resolution = процес встановлення тотожності різних записів

    • 3 методи: детерміністичний, ймовірнісний, AI-підхід
  2. Ідентифікаційні якорі — email, телефон, нікнейм як відправна точка

  3. Collision Detection — правило 2+ і завжди перевіряти альтернативу

  4. Flowsint — граф-платформа для технічного OSINT

    • 30+ збагачувачів, Neo4j, Docker, N8n-інтеграція
  5. OpenPlanter — AI-агент для корпоративних розслідувань

    • 19 інструментів, рекурсивні суб-агенти, Cytoscape.js граф
  6. Інтеграція: Flowsint (технічна розвідка) → OpenPlanter (корпоративна розвідка)

  7. Якість: кожен зв’язок потребує оцінки впевненості 1–10 та джерела

Наступний урок: Теорія графів та графи знань — застосування в AI та OSINT.


Нотатки доповідача

До слайду 2 — Проблема

Починайте з конкретного прикладу. Намалюйте на дошці або покажіть у слайді: 8 записів про одну людину з різних джерел. Запитайте аудиторію: “Скільки тут різних людей?” Зачекайте відповіді. Це найкращий вступ до поняття entity resolution — всі одразу розуміють практичну проблему.

До слайду 4 — Три методи

Наголосіть на різниці між детерміністичним і ймовірнісним. Приклад: якщо знайдені два записи з однаковим email — це той самий (детерміністично, 10/10). Але якщо ім’я + компанія + місто збігаються — це ймовірно та сама людина, але потрібна перевірка. Статистика KnowCTI (92.96%) — гарний аргумент для AI-підходу.

До слайду 6 — Каскад ідентифікаторів

Намалюйте каскад на дошці в реальному часі. Почніть з email → покажіть кілька кроків. Студенти мають зрозуміти, що один ідентифікатор — це лише початок. Ключова думка: OSINT — це не пошук одного факту, а побудова мережі пов’язаних фактів.

До слайду 7 — Collision Detection

Розкажіть реальну помилку з практики (можна анонімізовану): аналітик приписав пост у соцмережах публічній особі, але це був її однофамілець. Наслідки: неправильний висновок у звіті. Це підкреслює важливість перевірки collision.

До слайду 11 — Встановлення Flowsint

Демонстрація LIVE: якщо є підготовлений сервер з Flowsint — покажіть реєстрацію та перший запуск. Якщо ні — покажіть скріншоти з GitHub README. Зверніть увагу: 3 команди і все готово. Docker вирішує всі питання залежностей.

До слайду 13–18 — Збагачувачі Flowsint

Демонстрація LIVE обов’язкова. Запустіть реальний збагачувач на публічному домені (наприклад, домен НГО або медіа). Студенти мають побачити, як граф будується в реальному часі. Найефективніший момент уроку — коли на екрані з’являються нові вузли і ребра автоматично.

До слайду 16 — Maigret

LIVE демонстрація Maigret (або аналог Sherlock): оберіть нікнейм з аудиторії з дозволу студента. Запустіть Maigret/Sherlock. Результат — 20-40 платформ. Це завжди викликає реакцію аудиторії і добре закріплює тему ідентифікаційних якорів.

До слайду 22 — Встановлення OpenPlanter

Якщо є час — покажіть завантаження .AppImage на Linux або покажіть CLI. Найпростіший варіант для класу: pip install -e . + openplanter-agent --configure-keys. Зверніть увагу: OpenPlanter потребує API-ключів для хмарних моделей, але Ollama безкоштовний.

До слайду 28 — Рекурсивні суб-агенти

Це ключова концепція OpenPlanter. Поясніть аналогію: один детектив і команда детективів. Рекурсивний агент = керівник, що розподіляє завдання. Покажіть --max-depth 4 і поясніть: агент на глибині 4 вже не може породжувати нових агентів. Це захист від нескінченних петель.

До слайду 30 — Практичний кейс

Якщо можливо — запустіть OpenPlanter з реальним датасетом ProZorro (відкриті дані). Навіть демо з 100-200 контрактами демонструє принцип роботи. Зверніть увагу на час: 18 хвилин — це швидше, ніж будь-який ручний процес.

До слайду 31 — Порівняння

Наголосіть: ці інструменти доповнюють, а не замінюють один одного. Flowsint чудовий для технічного OSINT (домени, IP, email). OpenPlanter — для реєстрів і корпоративних зв’язків. Разом вони покривають весь спектр.

До слайду 33 — Якість та впевненість

Нагадайте шкалу 1–10 з Уроку 2. Підкресліть: навіть якщо Flowsint або OpenPlanter автоматично знайшли зв’язок — ви зобов’язані перевірити його самостійно. AI — це помічник, не вирок. Впевненість нижче 7 — у звіт не включати або позначати окремо.


Домашнє завдання

Завдання 1 — Flowsint: Граф за доменом (обов’язкове)

Встановіть Flowsint (git clone + make prod). Виберіть публічний домен будь-якої відомої NGO або медіа (наприклад, dom.rferl.org, bellingcat.com або іншого публічного медіа).

  1. Додайте домен як сутність у Flowsint
  2. Запустіть усі доступні збагачувачі для домену
  3. Слідуйте мінімум за 2 знайденими сутностями (наприклад, IP → ASN або email → gravatar)
  4. Зробіть скріншот отриманого графу
  5. Опишіть: що нового ви дізналися про об’єкт розслідування? Чи є несподівані зв’язки?

Здача: скріншот графу + текстовий аналіз (250–400 слів) + оцінка впевненості для кожного зв’язку (1–10).


Завдання 2 — OpenPlanter: Entity Resolution на датасеті (обов’язкове)

Завантажте відкриті дані ProZorro або будь-який публічний реєстр.

  1. Встановіть OpenPlanter CLI (pip install -e .)
  2. Завантажте CSV/JSON з мінімум 50 записами компаній або осіб у workspace
  3. Запустіть агента з завданням: “Знайди дублікати та пов’язані компанії в цьому датасеті”
  4. Проаналізуйте виявлені зв’язки у Cytoscape-графі

Здача: знімок екрану графу + текстовий опис знахідок + список виявлених дублікатів або зв’язків (мінімум 3).


Завдання 3 — Інтеграція: Flowsint → OpenPlanter (бажане)

Виконайте двохфазний пайплайн:

Фаза 1 (Flowsint): Знайдіть email-адреси та назви компаній через email/domain enrichers.

Фаза 2 (OpenPlanter): Використайте знайдені компанії як вхідні дані. Попросіть агента знайти їх у публічних реєстрах та перевірити, чи є зв’язки між ними.

Здача: опис кожної фази + підсумковий граф (або опис зв’язків) + висновок: чи знайдені нові зв’язки, яких не було б без двохфазного підходу?


Матеріали для студентів

Офіційні репозиторії

Бази даних та реєстри для OpenPlanter

Інструменти побудови та візуалізації графів

  • Neo4j Desktop: neo4j.com/download — вбудовано у Flowsint; окремо для ручного Cypher-запиту
  • Gephi: gephi.org — безкоштовна візуалізація для великих графів (до 100K вузлів)
  • Cytoscape: cytoscape.org — настільна платформа для аналізу мереж
  • draw.io: draw.io — безкоштовний web-редактор діаграм для ручних графів

Локальні моделі через Ollama (для OpenPlanter без API-ключів)

# Встановлення Ollama
curl -fsSL https://ollama.com/install.sh | sh
 
# Рекомендовані моделі для OSINT-розслідувань (2026)
ollama pull llama4-scout    # Llama 4 Scout 8B — швидкий, безкоштовний
ollama pull gemma4:12b      # Gemma 4 12B — хороший баланс
ollama pull qwen3.5:14b     # Qwen 3.5 14B — сильний у аналізі
 
# Запуск OpenPlanter з локальною моделлю
openplanter-agent --provider ollama --model gemma4:12b --workspace ./проект

Корисні ресурси Entity Resolution

Шаблон таблиці ідентифікаторів (роздаток)

СУБ'ЄКТ: _______________________________________________
Дата початку дослідження: ______________________________
Аналітик: ______________________________________________

ІДЕНТИФІКАТОРИ
════════════════════════════════════════════════════════
Email:            _____________ [Джерело: ___] [Впевн: _/10]
Телефон:          _____________ [Джерело: ___] [Впевн: _/10]
LinkedIn URL:     _____________ [Впевн: _/10]
Telegram username:_____________ [Впевн: _/10]
GitHub:           _____________ [Впевн: _/10]
Нікнейм(и):       _____________ [Перевірено на: ___]
Крипто-гаманець:  _____________ [Мережа: ___]

COLLISION CHECK
════════════════════════════════════════════════════════
Перевірено альтернативну гіпотезу: Так / Ні
Ризик collision: Низький / Середній / Високий
Причина: _____________________________________________

ПІДСУМОК
════════════════════════════════════════════════════════
Підтверджено як одна особа: Так / Ні / Невизначено
Загальна впевненість: __/10
Мінімум незалежних джерел підтвердження: ___

Команди Flowsint (швидкий довідник)

# Встановлення
git clone https://github.com/reconurge/flowsint.git && cd flowsint && make prod
 
# Зупинити
make stop
 
# Переглянути логи
docker compose logs -f
 
# Оновити до нової версії
git pull && make prod

Команди OpenPlanter (швидкий довідник)

# Встановлення CLI
pip install -e .
 
# Налаштування ключів
openplanter-agent --configure-keys
 
# Інтерактивний TUI
openplanter-agent --workspace ./проект
 
# Headless (одне завдання)
openplanter-agent --task "Опис завдання" --workspace ./проект --provider anthropic
 
# Список сесій
openplanter-agent --list-sessions
 
# Продовжити останню сесію
openplanter-agent --workspace ./проект --resume
 
# Налаштування за замовчуванням
openplanter-agent --default-model claude-opus-4-6 --default-provider anthropic
 
# Перегляд налаштувань
openplanter-agent --show-settings

← Урок-04-Соцмережі-та-медіапростір | Наступний урок: Урок-06-Теорія-графів →