Структуровані дані, що роблять блог цитованим для ШІ

JSON-LD, який перетворює статичний блог на сутність, що її ШІ-пошук здатен розпізнати: один граф Person + WebSite, байт-у-байт однаковий в обох мовах, і BlogPosting на кожен допис із FAQPage, speakable та посиланням на код, який він описує.

ШІ-пошуковик не так читає блог, як сканує його на машиночитані твердження: хто це опублікував і чим є кожна сторінка. Там, де розмітка мовчить, він вгадує. Цей сайт заявляє все прямо в JSON-LD.

Один граф ідентичності, спільний для обох мов

Уся ідентичність сайту — це один @graph: Person, чий масив sameAs є набором профілів, що закріплюють сутність, плюс WebSite. Він постачається байт-у-байт ідентичним на кожній сторінці, як англійською, так і українською:

{ "@context": "https://schema.org", "@graph": [
  { "@type": "Person", "name": "Roman Kocherezhchenko",
    "jobTitle": "AI-Enabled Engineer",
    "url": "https://roman-kocherezhchenko.com",
    "sameAs": ["https://t.me/roman_kocherezhchenko",
               "https://github.com/kissishka",
               "https://www.linkedin.com/in/..."] },
  { "@type": "WebSite", "inLanguage": ["en", "uk"], "...": "..." } ] }

Посилання sameAs — несуча частина: вони кажуть моделі, що акаунти в Telegram, GitHub і LinkedIn — це та сама сутність, що й автор кожного допису. А оскільки граф усюди ідентичний, один хеш Content-Security-Policy покриває його на всіх сторінках — схема тут є контентом, а не елементом оформлення сторінки.

Кожен допис — це BlogPosting, що вказує на свої докази

Кожна стаття віддає власний BlogPosting, і два поля роблять специфічну для ШІ роботу:

speakable: { "@type": "SpeakableSpecification",
             cssSelector: ["h1", ".post__lede", ".faq"] },
isBasedOn: { "@type": "SoftwareSourceCode", name: "risp",
             codeRepository: input.repo, programmingLanguage: "Rust" },

speakable віддає відповідному рушію точні селектори, що містять цитовану суть. isBasedOn прив’язує твердження допису до коду, який можна перевірити, — дописи про продуктивність risp посилаються на свій репозиторій саме так, тож модель може простежити число з бенчмарка до коду, що його породив. (Цей допис пропускає isBasedOn, аби не позначити власний код хибно як risp.)

FAQPage, бо відповідні рушії вилучають питання-відповіді

Короткий блок faq: у frontmatter допису рендериться як видимий FAQ і серіалізується у вузол FAQPage — кожна пара стає Question з acceptedAnswer. Відповіді тримаються звичайним текстом, аби вони неушкодженими долали шлях у структуровані дані.

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

Часті запитання

Які структуровані дані має використовувати блог для ШІ-пошуку?
Щонайменше вузол Person або Organization із посиланнями sameAs на ваші підтверджені профілі, вузол WebSite і BlogPosting на кожній статті. Цей сайт також віддає FAQPage для вилучення відповідей, speakable для позначення цитованих фрагментів та isBasedOn, щоб прив'язати допис до коду, який він описує.
Чи має JSON-LD бути ідентичним на кожній сторінці?
Ні, але граф ідентичності — може. Цей сайт вбудовує байт-у-байт однаковий граф Person + WebSite на кожній сторінці обома мовами, що дозволяє одному хешу Content-Security-Policy покрити його повністю. Блок BlogPosting на кожен допис динамічний і, як блок даних application/ld+json, узагалі не керується CSP script-src.
Що таке властивість speakable у schema.org?
speakable перелічує CSS-селектори, чий текст найкраще підходить для зачитування вголос або цитування голосовими й відповідними рушіями. Цей блог спрямовує її на h1, абзац-лід і секцію FAQ, тож асистент вилучає самодостатню суть сторінки, а не її навігацію чи шаблонний текст.

← Усі дописи