Урок 5: Entity Resolution та зв’язки — від сутностей до графа
Попередній: Урок-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):
| Якір | Унікальність | Постійність | Примітка |
|---|---|---|---|
| Висока | Висока | Ключ до більшості сервісів | |
| Телефон | Висока | Середня | Змінюється рідше, ніж здається |
| Нікнейм | Середня | Висока | Люди дуже послідовні |
| Фото профілю | Висока | Середня | Зворотний пошук зображень |
| Крипто-гаманець | Дуже висока | Висока | Незмінна публічна адреса |
Слабкі якорі (потребують підтвердження):
- Ім’я та прізвище — збігається у тисячах осіб
- Посада — змінюється, не унікальна
- Локація — може бути 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
Ключові компоненти:
- NER (Named Entity Recognition) — автоматичне виявлення сутностей у тексті
- Нормалізація — єдиний формат для порівняння
- Дедублікація — злиття дублікатів
- Linking — встановлення зв’язків між сутностями
- Граф — фінальна структура для аналізу та візуалізації
Слайд 9 — Огляд інструментів: Flowsint та OpenPlanter
Сьогодні вивчаємо два сучасних open-source інструменти (2025–2026):
| Характеристика | Flowsint | OpenPlanter |
|---|---|---|
| Тип | Граф-based OSINT платформа | AI-агент розслідувань |
| Фокус | Технічна розвідка (домени, IP, email) | Корпоративна розвідка (реєстри, фінанси) |
| Граф | Neo4j (вбудований) | Cytoscape.js (інтерактивний) |
| AI | Збагачувачі (enrichers) | LLM-агент з 19 інструментами |
| Інтерфейс | Веб-застосунок | Десктоп-застосунок + CLI |
| Мова | TypeScript + Python | Python + 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 | Резолвить домен в IP | techUA.com → 185.x.x.x |
| Reverse DNS | Знаходить домени на IP | 185.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 → Webtrackers | Google 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-сповіщення з результатами
Сценарії автоматизації:
- Моніторинг: щодня перевіряти нові домени за патерном → сповіщати
- Batch processing: завантажити 100 IP з Shodan → збагатити всі
- 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 провайдерів:
| Провайдер | Модель за замовчуванням | Змінна середовища |
|---|---|---|
| OpenAI | gpt-5.2 | OPENAI_API_KEY |
| Anthropic | claude-opus-4-6 | ANTHROPIC_API_KEY |
| OpenRouter | anthropic/claude-sonnet-4-5 | OPENROUTER_API_KEY |
| Cerebras | qwen-3-235b-a22b-instruct-2507 | CEREBRAS_API_KEY |
| Ollama | llama3.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 ./проект --demoSession 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
Коли використовувати кожен інструмент:
| Сценарій | Flowsint | OpenPlanter |
|---|---|---|
| Розслідування домену / 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 — Підсумок уроку
Що ви вивчили сьогодні:
-
Entity Resolution = процес встановлення тотожності різних записів
- 3 методи: детерміністичний, ймовірнісний, AI-підхід
-
Ідентифікаційні якорі — email, телефон, нікнейм як відправна точка
-
Collision Detection — правило 2+ і завжди перевіряти альтернативу
-
Flowsint — граф-платформа для технічного OSINT
- 30+ збагачувачів, Neo4j, Docker, N8n-інтеграція
-
OpenPlanter — AI-агент для корпоративних розслідувань
- 19 інструментів, рекурсивні суб-агенти, Cytoscape.js граф
-
Інтеграція: Flowsint (технічна розвідка) → OpenPlanter (корпоративна розвідка)
-
Якість: кожен зв’язок потребує оцінки впевненості 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 або іншого публічного медіа).
- Додайте домен як сутність у Flowsint
- Запустіть усі доступні збагачувачі для домену
- Слідуйте мінімум за 2 знайденими сутностями (наприклад, IP → ASN або email → gravatar)
- Зробіть скріншот отриманого графу
- Опишіть: що нового ви дізналися про об’єкт розслідування? Чи є несподівані зв’язки?
Здача: скріншот графу + текстовий аналіз (250–400 слів) + оцінка впевненості для кожного зв’язку (1–10).
Завдання 2 — OpenPlanter: Entity Resolution на датасеті (обов’язкове)
Завантажте відкриті дані ProZorro або будь-який публічний реєстр.
- Встановіть OpenPlanter CLI (
pip install -e .) - Завантажте CSV/JSON з мінімум 50 записами компаній або осіб у workspace
- Запустіть агента з завданням: “Знайди дублікати та пов’язані компанії в цьому датасеті”
- Проаналізуйте виявлені зв’язки у Cytoscape-графі
Здача: знімок екрану графу + текстовий опис знахідок + список виявлених дублікатів або зв’язків (мінімум 3).
Завдання 3 — Інтеграція: Flowsint → OpenPlanter (бажане)
Виконайте двохфазний пайплайн:
Фаза 1 (Flowsint): Знайдіть email-адреси та назви компаній через email/domain enrichers.
Фаза 2 (OpenPlanter): Використайте знайдені компанії як вхідні дані. Попросіть агента знайти їх у публічних реєстрах та перевірити, чи є зв’язки між ними.
Здача: опис кожної фази + підсумковий граф (або опис зв’язків) + висновок: чи знайдені нові зв’язки, яких не було б без двохфазного підходу?
Матеріали для студентів
Офіційні репозиторії
- Flowsint: github.com/reconurge/flowsint — ⭐ 3 328 · TypeScript + Python · Apache 2.0
- OpenPlanter: github.com/ShinMegamiBoson/OpenPlanter — ⭐ 1 583 · Python + Rust · Open source
- Maigret (інтегровано у Flowsint): github.com/soxoj/maigret — пошук нікнейму на 3000+ сайтах
- Sherlock (альтернатива Maigret): github.com/sherlock-project/sherlock
Бази даних та реєстри для OpenPlanter
- ProZorro (Україна): prozorro.gov.ua/api — держзакупівлі (API + CSV export)
- ЄДРПОУ: data.gov.ua/dataset/edrpou — реєстр юридичних осіб
- НАЗК (декларації): public.nazk.gov.ua — декларації чиновників
- OFAC SDN List: ofac.treasury.gov — санкційний список США
- EU Consolidated Sanctions: eur-lex.europa.eu — санкційний список ЄС
- OpenSecrets: opensecrets.org — фінансування виборчих кампаній США
Інструменти побудови та візуалізації графів
- 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
- Senzing: Entity Resolution для Knowledge Graphs — ключові принципи
- Linkurious: Graph-Based Intelligence Analysis — огляд методів
- Bellingcat Toolkit — практичні інструменти розслідувань
Шаблон таблиці ідентифікаторів (роздаток)
СУБ'ЄКТ: _______________________________________________
Дата початку дослідження: ______________________________
Аналітик: ______________________________________________
ІДЕНТИФІКАТОРИ
════════════════════════════════════════════════════════
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-Теорія-графів →