Епоха машинного читання
1. Knowledge Graph та детермінованість даних
Спеціалізовані краулери пошукових рушіїв і LLM-систем здатні витягувати інформацію безпосередньо з HTML. Семантичний HTML — зокрема заголовки, таблиці, посилання та інші стандартні елементи — вже дає машинам чимало інформації про структуру сторінки. Але для складних предметних областей цього може бути недостатньо: з самого HTML не завжди очевидно, що саме є набором даних, хто його створив, до якого архівного фонду він належить або який часовий та географічний діапазон він охоплює.
Тут на допомогу приходить JSON-LD зі словником Schema.org. Він дозволяє додати до HTML окремий машинно-читаний опис сторінки та її сутностей (див. Google: Introduction to structured data). Зокрема, сторінку каталогу можна описати як WebPage, її основний вміст — як Dataset, а сам набір даних доповнити інформацією про автора, джерело, поширення, географію та часові межі (див. Google: Dataset structured data).
Для систем, що будують пошукові RAG-конвеєри (Retrieval-Augmented Generation), такий опис може стати окремим джерелом метаданих. Наприклад, ingestion pipeline може прочитати application/ld+json, витягнути з нього spatialCoverage, temporalCoverage, identifier або інші поля та зберегти їх разом із текстовим представленням документа.
Після цього пошукова система може використовувати ці атрибути як metadata filters. Наприклад, запит про метричні книги конкретного району та періоду можна спочатку обмежити за географічними й хронологічними параметрами, а вже потім виконувати семантичний пошук усередині відібраних документів.
Важливо, що JSON-LD сам по собі не є протоколом для RAG і не гарантує зменшення галюцинацій. Він створює стандартизований машинний канал, з якого конкретний ingestion pipeline може отримати структуровані метадані. Якщо ці метадані використовуються для попередньої фільтрації, це може зменшити кількість нерелевантного контексту, а разом із ним — вартість пошуку та ризик retrieval-помилок.
Для класичних пошукових систем JSON-LD виконує іншу роль. Структуровані дані допомагають пошуковику краще зрозуміти зміст сторінки. Для Dataset це також відкриває можливість представлення наборів даних у Google Dataset Search. Водночас Dataset не слід плутати з типами структурованих даних, які Google використовує для rich results у звичайній видачі пошуку: Dataset structured data призначене насамперед для Dataset Search (див. Google: How structured data works).
Мета Коренів тут не в тому, щоб «змусити» пошуковик включити наші дані у власний Knowledge Graph. Мета простіша й фундаментальніша: дати машинам точний, стандартизований опис того, що саме містить наш каталог і звідки походять його дані.
2. Крім HTML — граф семантичних даних
Як структурний опис сторінки таблиці в неї вшивається JSON-LD наступної структури:
{
"@context": "https://schema.org",
"@graph": [
{
"@id": "https://koreni.org.ua/DAKhmO-315-1-8330-Holiaky/1/#webpage",
"@type": "WebPage",
"datePublished": "2026-08-24T00:00:00.000Z",
"description": "Голяки (Грушківці Іванівські) 1855 – сповідний розпис (повний), ДАХмО-315-1-8330 (1855). Індексовано 503 записів.",
"inLanguage": "uk",
"isPartOf": { "@id": "https://koreni.org.ua/#website" },
"mainEntity": { "@id": "https://koreni.org.ua/DAKhmO-315-1-8330-Holiaky/#dataset" },
"name": "Голяки (Грушківці Іванівські) 1855 – сповідний розпис (повний), ДАХмО-315-1-8330",
"url": "https://koreni.org.ua/DAKhmO-315-1-8330-Holiaky/1/"
},
{
"@id": "https://koreni.org.ua/DAKhmO-315-1-8330-Holiaky/#dataset",
"@type": "Dataset",
"creator": { "@type": "Person", "name": "Василь Дідик" },
"datePublished": "2026-08-24T00:00:00.000Z",
"description": "Голяки (Грушківці Іванівські) 1855 – сповідний розпис (повний), ДАХмО-315-1-8330 (1855). Індексовано 503 записів. Таблиця сформована на основі справ: ДАХмО-315-1-8330.",
"distribution": [
{
"@type": "DataDownload",
"contentUrl": "https://raw.githubusercontent.com/undead404/koreni/refs/heads/main/data/csv/DAKhmO--315-1-8330-Holiaky.csv",
"encodingFormat": "text/csv",
"name": "DAKhmO--315-1-8330-Holiaky.csv"
}
],
"includedInDataCatalog": {
"@type": "DataCatalog",
"name": "Корені – пошук у народних генеалогічних індексах",
"url": "https://koreni.org.ua"
},
"identifier": ["ДАХмО-315-1-8330"],
"inLanguage": "uk",
"keywords": ["ДАХмО"],
"license": "https://koreni.org.ua/license/",
"name": "Голяки (Грушківці Іванівські) 1855 – сповідний розпис (повний), ДАХмО-315-1-8330",
"isAccessibleForFree": true,
"isBasedOn": {
"@type": ["CreativeWork", "ArchiveComponent"],,
"identifier": "ДАХмО-315-1-8330",
"name": "Фонд 315, опис 1, справа 8330",
"holdingArchive": {
"@type": "ArchiveOrganization",
"name": "Державний архів Хмельницької області (ДАХмО)",
"sameAs": [
"https://dahmo.gov.ua/",
"https://www.wikidata.org/wiki/Q4146784"
]
}
},
"spatialCoverage": {
"@type": "Place",
"geo": {
"@type": "GeoCoordinates",
"latitude": 49.511261,
"longitude": 28.42712
}
},
"temporalCoverage": "1855"
}
]
}
Ця структура вирішує кілька практичних інженерних завдань.
-
Зв'язність (Graph Connectivity).
WebPageпов'язана зі своїм основнимDatasetчерезmainEntity, а самDatasetмістить посилання на каталог черезincludedInDataCatalog. ВузолholdingArchiveдодатково описує архівну установу, аsameAsдозволяє вказати на зовнішні ідентифікатори тієї самої сутності. Це створює формальний зв'язок між даними Коренів, архівом та зовнішніми джерелами ідентифікації. -
Прямий доступ до сирих даних. Властивість
distributionвказує на конкретне машинно-доступне представлення набору даних — у нашому випадку CSV-файл. Системі, яка підтримує Dataset structured data, не потрібно відновлювати таблицю з фрагментів HTML, якщо їй достатньо самого набору даних. -
Архівне походження.
isBasedOnописує джерело, на якому побудований набір даних. Тип ArchiveComponent дозволяє явно позначити архівний компонент як джерело, аholdingArchive— установу, яка його зберігає. -
Просторово-часовий контекст.
spatialCoverageтаtemporalCoverageдозволяють машинно описати, де і коли відбувалися події або до якого географічного та хронологічного діапазону належать дані. -
Стабільна ідентичність. Коли візуальна HTML-таблиця розбита на сторінки, усі сторінки можуть посилатися на один і той самий
Datasetчерез стабільний@id. Це не змушує пошукові системи автоматично об'єднувати сторінки, але дає їм однозначний ідентифікатор сутності та зменшує неоднозначність під час обробки структурованих даних.
У результаті HTML і JSON-LD виконують різні функції. HTML призначений передусім для людини та звичайної навігації, тоді як JSON-LD дає окремий шар машинного опису: що це за дані, хто їх створив, на чому вони ґрунтуються, де й коли вони стосуються та де отримати їхнє машинне представлення.
Архітектурна оптимізація
Статична (SSG) або серверна (SSR) генерація HTML особливо зручна для такого підходу, хоча не є обов'язковою вимогою.
Пошукові системи здатні виконувати JavaScript і обробляти структуровані дані, створені під час рендерингу (див. Google: Generate structured data with JavaScript). Проте для JSON-LD, який є частиною початкового HTML, немає потреби чекати на окремий етап виконання JavaScript. Це спрощує роботу простих краулерів і ingestion-систем, які не мають повноцінного браузерного середовища.
Для Коренів це ще й природний архітектурний вибір: сторінки каталогів генеруються з уже наявних структурованих даних, тому JSON-LD можна сформувати одночасно з HTML без додаткового клієнтського виконання.
3. Інфраструктурна безпека та серіалізація
Використання dangerouslySetInnerHTML для інтеграції JSON-LD у HTML вимагає обережності (див. React: Dangerously setting the inner HTML). Сам по собі JSON-LD не виконується як JavaScript, але <script>-елемент має особливу поведінку під час розбору HTML: якщо неекрановані дані містять послідовність на кшталт </script>, вона може завершити елемент незалежно від того, що його тип — application/ld+json (див. OWASP: DOM-based XSS Prevention, MDN: <script> element).
Тому дані для JSON-LD не варто конструювати вручну або вставляти як довільний рядок. Спочатку об'єкт потрібно серіалізувати стандартним JSON-серіалізатором, а потім додатково екранувати <:
JSON.stringify(schema).replace(/</g, '\\u003c');
Таке кодування не змінює значення JSON, але не дозволяє послідовності < утворити HTML-тег усередині <script>.
Це закриває конкретний XSS-вектор, пов'язаний із виходом даних із JSON-контексту в HTML-контекст. Звісно, загальна безпека застосунку все одно залежить від способу формування даних та інших місць, де вони потрапляють у HTML.
У випадку Коренів це особливо важливо, оскільки JSON-LD формується на основі даних, отриманих із зовнішніх джерел. Машинна серіалізація має бути частиною інфраструктури платформи, а не ручною відповідальністю автора конкретної сторінки.
4. Власна експансія доменної моделі
Копіювати структуру графа Коренів для інших застосунків беззмістовно. Застосування цього підходу вимагає проєктування власної моделі на базі словника Schema.org.
База даних репресованих вимагатиме іншого набору сутностей та атрибутів, ніж каталог метричних книг; реєстр поховань — іще іншого. Але сам принцип залишається незмінним.
Машина повинна мати можливість відрізнити людину від документа, документ від набору даних, набір даних від архівного джерела, а також отримати базовий просторовий і часовий контекст без необхідності виводити його лише з природної мови.
Для генеалогічних даних це особливо важливо. Людина бачить:
«Голяки, 1855, сповідний розпис, ДАХмО-315-1-8330»
і без особливих труднощів розуміє значення цього рядка. Машині ж набагато корисніше отримати окремі поля:
- це
Dataset; - його ідентифікатор —
ДАХмО-315-1-8330; - джерело — архівний компонент;
- установа — ДАХмО;
- часовий діапазон — 1855;
- географія — конкретне місце;
- доступне машинне представлення — CSV;
- каталог — Корені.
Саме в цьому полягає наступний етап розвитку цифрових генеалогічних ресурсів.
Спочатку ми створювали індекси, щоб людина могла знайти потрібний запис.
Тепер ми можемо описувати ці індекси так, щоб машина могла зрозуміти, що саме вона знайшла.
А це відкриває Корені не лише для звичайного веб-пошуку, а й для нової інфраструктури машинного читання: пошукових систем, каталогів даних, RAG-систем, дослідницьких інструментів та автономних агентів.
Національна пам'ять стає не просто доступною в Інтернеті. Вона стає машинно-читаною.