Структуровані дані, що роблять блог цитованим для ШІ
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, тож асистент вилучає самодостатню суть сторінки, а не її навігацію чи шаблонний текст.