Модели забирают документ в момент вопроса и скрипты при этом не выполняют. Сайт, который собирает текст в браузере, отдает ChatGPT пустую оболочку: заголовки, цены и отзывы в ответ не попадут. Диагностика занимает две минуты - найти фразу с экрана в исходном коде страницы. Нет фразы в исходном коде - нет ее и для модели. Вторая частая причина - закрытый для краулеров robots.txt.
Сайт бывает открыт для краулеров и все равно недоступен моделям. Причин три: текст собирается скриптами уже в браузере, сервер отвечает слишком долго, часть содержимого спрятана за нажатием. Проверяется это просмотром исходного кода за две минуты, без разработчика и без платных сервисов.
По обычным метрикам ничего не заметно. Позиции в Google держатся, органика идет, Search Console показывает зеленые графики. Робот Google научился выполнять скрипты много лет назад и забирает собранный документ целиком. Краулер ChatGPT приходит на тот же адрес и получает пустую оболочку. Разрыв между двумя картинами и есть та зона, где пропадают упоминания в ответах моделей. О том, чем оптимизация под генеративную выдачу отличается от классического поиска, есть отдельный разбор.
Оба обходят сайты по ссылкам, и на этом сходство заканчивается.
Краулер модели не прокручивает экран, не наводит указатель и не нажимает кнопки. Оформление для него не существует вообще: цвета, анимация, всплывающие подсказки остаются за пределами того, что он забирает. Читает он разметку страницы, структурированные данные и карту сайта. По ссылкам уходит вглубь примерно до пятого уровня вложенности, поэтому глубокие деревья каталогов частично остаются вне досягаемости.
Главное расхождение - в моменте обращения. Поисковый робот обходит сайт заранее и складывает копию в индекс. Пользователь задает вопрос, ответ достают из готового хранилища. Модель поступает иначе: она запрашивает адрес в тот момент, когда человек спросил, разбирает полученный документ и делит его на фрагменты сразу же. Каждое следующее цитирование - новый запрос к серверу, а не обращение к сохраненной копии. Отсюда требования к скорости, которых у классического поиска не было.
Ведут себя модели по-разному. Gemini и Copilot скрипты выполняют. У ChatGPT такой способности нет: он забирает то, что сервер отдал в первом ответе, и на этом останавливается. Ориентироваться приходится на самого требовательного участника, иначе сайт будет доступен одной платформе и невидим для другой.
Способность моделей читать собранные в браузере страницы постепенно растет - в том числе за счет того, что часть данных они получают из поисковых систем, где рендеринг уже отлажен. Направление есть. Строить на нем планы рано: то, что сегодня разбирается через раз, завтра может снова выпасть.
Отдельное условие, без которого остальное не имеет смысла. Если краулер закрыт директивой в robots.txt или отбивается защитой от нагрузки, диагностика содержимого бесполезна - до содержимого дело не доходит. Начинать стоит с проверки доступа: какие AI-боты существуют и как открыть им сайт, разобрано отдельно. Файл llms.txt тут тоже не спасает: он описывает структуру, но не заменяет собой текст, которого на странице нет.
Одностраничное приложение на распространенных библиотеках вроде React или Angular собирает содержимое в браузере пользователя. Сервер отдает каркас, дальше работает код. Человек видит наполненный экран, краулер ChatGPT получает оболочку с шапкой и меню, где на месте текста пусто.
Пропадает при этом почти всегда одно и то же:
Чаще встречается половинчатый случай, а он опаснее полного. Сайт собран на обычной системе управления, текст статей и описания услуг приходят с сервера, но каталог, калькулятор и блок с ценами дорисовываются скриптом. Владелец проверяет главную, видит текст в коде и успокаивается. Модель при этом отвечает по общим страницам и молчит по товарам - то есть по тем адресам, которые и должны приводить заявки. Отсюда правило: проверять надо не сайт целиком, а каждый шаблон по отдельности.
Требование к устройству документа простое: важное содержимое лежит в разметке текстом. Не появляется после действия пользователя, не спрятано внутри изображения и не существует только в ролике. Отсюда же требования к подписям картинок и расшифровкам видео - для модели это части текста, а без них смысл кадра пропадает.
Правильная схема выглядит так: критичный текст сервер собирает у себя и отдает готовым, второстепенные скрипты подгружаются после. Обработчики форм, чаты поддержки, счетчики аналитики могут ждать. Описание услуги, цена и контакты ждать не могут.
Формулировка задачи для разработчика в одно предложение: «Нужен серверный рендеринг или предварительная генерация страниц, чтобы текст, заголовки и цены приходили в HTML первым ответом сервера, без выполнения JavaScript». Этого достаточно, чтобы человек с доступом к коду понял объем работ. Если сайт на Next.js или Nuxt, режим уже встроен и включается настройкой. Если фронтенд писали с нуля на чистом клиентском рендеринге, речь пойдет о переработке, и сроки будут другими.
Переделка доступна не всем и не сразу. Промежуточный вариант: вынести главные сведения на статичные страницы, которые сервер отдает целиком. Описание услуг, ответы на частые вопросы, условия доставки, прайс - десяток адресов, собранных как обычные HTML-документы, дадут моделям то, что они смогут процитировать, пока каталог остается недоступным. Это костыль, но он работает и стоит недорого.
Когда текст стал доступен, начинается второй вопрос: как он написан и почему одни абзацы берут в ответ, а другие нет. Про это - разбор структуры текста под цитирование.
Способов три, любой доступен без разработчика.
Исходный код. Откройте страницу, вызовите просмотр исходного кода браузера и поищите в нем предложение, которое видно на экране - например, первую строку описания услуги. Нашли - текст приходит с сервера. Не нашли - краулер тоже не найдет, потому что он смотрит ровно в этот документ.
Отключение скриптов. В настройках браузера запретите выполнение JavaScript для своего домена и обновите вкладку. Исчезнувшее и есть та часть, которую модели не получают. Способ нагляднее первого: результат виден сразу и его можно показать заказчику или коллеге без объяснений.
Запрос от имени бота. Через консоль вызывается загрузка адреса с подстановкой имени краулера: `curl -A GPTBot https://example.com/`. В ответ приходит документ, с которым работает модель. Если ответ пустой или в нем нет текста со страницы - вопрос закрыт. Эта же команда стоит в общей процедуре аудита AI-видимости среди других шагов.
Проверять весь сайт не нужно. Хватит трех адресов разного типа: главная, страница услуги или карточка товара, статья блога. Они собраны по разным шаблонам, и результат по ним покрывает основную часть сайта.
Смотреть стоит не только на абзацы текста. В исходном коде должны быть видны заголовки разделов, подписи изображений, цена и условия, контакты и адрес, структурированные данные в конце документа. Если заголовки на месте, а цены нет - значит цена подгружается отдельным запросом, и в ответе модели ее не будет.
Два способа ошибиться при этой диагностике. Первый - смотреть страницу из кэша браузера: вкладка покажет старую версию, а не то, что сервер отдает сейчас, поэтому обновлять надо с очисткой кэша. Второй - забыть про расширения, которые подменяют содержимое на лету и рисуют текст поверх пустого места. Чистое окно в режиме инкогнито снимает оба вопроса.
Итог укладывается в два варианта. Первый: содержимое лежит в разметке, тогда причину невидимости надо искать дальше - в доступе для OAI-SearchBot, внешнем обнаружении, скорости или структуре. Второй: содержимое собирается скриптами, и тогда все остальное подождет, потому что до него дело не дойдет.
Официальная документация OpenAI не называет Bing единственным обязательным индексом. Для включения содержимого в summaries и snippets критично не блокировать OAI-SearchBot. При этом OpenAI может обнаруживать адреса через сторонних поисковых провайдеров, поэтому присутствие в Bing остается полезным дополнительным каналом, а не условием допуска.
Частные замеры показывали заметное пересечение между ссылками в ответах ChatGPT и результатами Bing, но корреляция не доказывает техническую зависимость. Проверять Bing Webmaster Tools полезно вместе с доступом OAI-SearchBot, качеством содержимого и упоминаниями на других площадках.
Порядок действий короткий:
Молодой сайт попадает в индекс Bing медленнее, чем в индекс Google, и это нормальная картина первых недель. Ускоряет дело подтвержденный домен, отправленная карта сайта и внешние ссылки с уже проиндексированных ресурсов - хотя бы с профилей компании в справочниках. Проверять состояние удобно поисковым оператором site: по своему домену прямо в Bing: если в выдаче три адреса из сорока, работать надо с индексацией, а не с текстами.
У остальных платформ свои источники. Алиса опирается на индекс Яндекса, Gemini - на индекс Google. Вывод из этого следует неудобный, но честный: работать приходится с тремя вебмастерскими панелями вместо одной, и запись в каждой стоит примерно пятнадцати минут.
Поисковый робот, встретив медленный сервер, вернется позже - индекс от этого не пострадает. У модели такой возможности нет: страница нужна ей в момент разговора с пользователем. Не дождавшись ответа, она уходит к другому источнику и берет фрагмент оттуда. Идеально написанный текст в ответ не попадет, потому что его не успели забрать.
В логах сервера это видно как код 499. Формально его нет в спецификации HTTP, его пишет NGINX, когда клиент оборвал соединение до получения ответа. Всплеск таких записей от краулеров - сигнал, что сайт отсекают по времени. Стоит попросить разработчика или администратора выгрузить обращения GPTBot, ClaudeBot и Google-Extended за месяц с кодами ответов: там же видны отказы 403 и ограничения 429.
Ориентиры берутся из показателей загрузки, которые публикует Google. Отрисовка основного содержимого - меньше 2,5 секунды. Смещение верстки при загрузке - ниже 0,1. Отклик на действие пользователя - меньше 200 миллисекунд. Пороги задавались для поиска и удобства людей, но модели работают с тем же сервером и тем же ответом, поэтому цифры годятся как рабочая планка. Страница, которая открывается пять-шесть секунд, теряет и посетителей, и краулеров.
Что дает результат быстрее прочего:
Формулировка для разработчика: «Нужно уложить отрисовку основного содержимого на главной, странице услуги и в статье блога в 2,5 секунды на мобильном соединении, сжать изображения и отложить сторонние скрипты».
Мерить стоит по двум источникам сразу. Лабораторный замер в PageSpeed Insights показывает, как страница ведет себя на эталонном соединении, и годится для поиска узких мест. Полевые данные в Search Console собираются с посетителей и показывают картину на их устройствах - на рынках вроде Узбекистана или Кыргызстана, где велика доля мобильного интернета, разрыв между двумя цифрами доходит до нескольких секунд. Ориентироваться надо на полевые: краулер приходит по тем же каналам связи.
Важная оговорка. Скорость работает как условие допуска, а не как фактор ранжирования. Сайт с пустой оболочкой в ответы не попадет при любых показателях загрузки: отдавать ему нечего.
Модель делит полученный документ на фрагменты и дальше работает с ними по отдельности. Границы фрагментов она проводит по структуре: заголовкам и разделам. Когда структуры нет, деление получается случайным, и в отбор попадает обрывок без начала и конца. Такой обрывок не выбирают в ответ, даже если текст написан хорошо.
Разбору помогает такое устройство документа:
Структурированные данные читаются из исходного кода и добавляют определенности: они прямо сообщают, что перед моделью статья, товар или организация. Как их собирать под генеративную выдачу - в разборе разметки сущностей.
Здесь речь о технической стороне: теги, уровни, границы. Что писать внутри этих границ, чтобы фрагмент годился в ответ целиком, разобрано в материале про структуру текста.
Скрипты, скорость и структура разобраны выше. Осталось устройство самого сайта, и оно держится на трех требованиях.
Предсказуемая навигация. У каждой значимой части постоянный адрес. Без временных меток сессии, без подгрузки по кнопке и без бесконечной прокрутки как единственного способа добраться до товара. До чего нельзя дойти по ссылке, того для модели не существует.
Честные служебные данные. Канонические адреса, дата изменения в разметке, указания по сниппетам. Без них краулер достраивает картину сам и ошибается.
Уважение к нагрузке. Задержку между обращениями объявляют в robots.txt. Отбитый защитой бот уходит молча и возвращается нескоро.
Дальше - типовые конструкции, которые эти требования нарушают.
Каталог с подгрузкой по прокрутке. Товары ниже первой партии не существуют для модели: она не прокручивает экран. Решение - постраничная навигация со ссылками на каждую страницу. Виды такой навигации различаются последствиями: нумерация страниц дает краулеру набор адресов, кнопка «показать еще» дает один адрес, бесконечная прокрутка не дает ничего. Отдельный вариант - страница со всем каталогом сразу, но она проигрывает по скорости.
Содержимое за формой входа и за подпиской. Закрытые области краулер не пройдет. Хуже того, скрытые части и несогласованные даты изменения складываются в отрицательные сигналы: система видит, что на странице обещано больше, чем отдано.
Разное содержимое для бота и человека. Прием рискованный и нарушает базовое ожидание: краулер должен получать то же самое, что посетитель. Расхождение рано или поздно замечают, и цена ошибки выше выигрыша.
Языковые версии. Языки и регионы разносятся по подкаталогам вида `/uz/`, `/kz/`, `/en/`. Поддомен для такой задачи хуже: он набирает вес самостоятельно, и усилия расходятся по разным адресам. Служебные указания на языковые варианты страницы обязательны, иначе система выберет наугад. На практике это два действия: языковой атрибут в разметке документа для каждой версии и перекрестные указания между ними. Переводы нужны человеческие - машинный текст модели читают, но в ответ берут неохотно. И главное: язык материала должен совпадать с языком вопроса. Человек, спросивший по-узбекски, получит подборку из источников на своем языке, и русская версия той же страницы в нее не войдет. Что писать на каждом языке и как это работает на локальных рынках - отдельная тема, ей занимается HITZ Agency, GEO-агентство в Центральной Азии.
Переадресации. Проверяются четыре варианта адреса: с префиксом www и без, защищенный протокол и обычный, со слешем на конце и без. Работать должен один, остальные три - переадресовывать на него. Иначе получаются дубли, которые перетягивают сигналы друг у друга.
Сайты на конструкторах вроде Tilda или Wix ведут себя лучше одностраничных приложений: текст они отдают сервером. Ограничения там другие - служебные файлы, разметка, скорость шаблонов. Как обходить эти ограничения, разобрано отдельно. Проверить доступ ботам к сайту на конструкторе стоит через настройки robots.txt, они есть не во всех тарифах.
Список для одного прохода по сайту. Слева - что смотрим, справа - что считать провалом.
Чинить стоит по порядку, а не по удобству. Сначала то, что делает содержимое недоступным целиком: запреты для ботов и сборку текста скриптами. Затем скорость - без нее содержимое не успевают забрать. Затем структуру и разметку, которые определяют, каким куском сайт попадет в ответ. Порядок важен, потому что первый пункт обесценивает все остальные: вылизанная иерархия заголовков на странице с пустой оболочкой не даст ничего.
Самый короткий срок до результата в моей работе выглядел так. Сайт переделали под серверную отдачу текста, дописали служебные страницы - «О компании», контакты, условия работы, - привели в порядок структурированные данные. Через месяц модели начали приводить его в ответах. Такая скорость получается, когда закрывают все части сразу: доступ, содержимое, разметку. Когда пункты чинят по одному за квартал, счет идет на полгода и больше.
Если проблема начинается с поискового обхода, проверьте по шагам, почему страниц нет в индексе.
Открытый доступ означает, что краулеру разрешено прийти. Дальше в дело идет ответ сервера в том виде, в каком он пришел. Если текст собирается скриптами в браузере, бот получает пустую оболочку. Вторая частая причина — сайт трудно обнаружить: OAI-SearchBot закрыт, внутренние ссылки слабы или страница отсутствует у сторонних поисковых провайдеров, включая Bing. Эти причины проверяются по отдельности.
Зависит от платформы. У Gemini и Copilot краулеры со скриптами справляются, у ChatGPT - нет, поэтому одностраничное приложение без серверной сборки для него пустое. Ориентироваться нужно на самого требовательного. Проблема решается серверным рендерингом или предварительной генерацией страниц: в Next.js и Nuxt это встроенный режим, для самописного фронтенда - отдельная задача.
Способов три, все доступны без разработчика. Открыть исходный код и поискать в нем фразу с экрана: нет фразы - нет содержимого для бота. Отключить выполнение JavaScript в браузере и обновить вкладку: исчезнувшее и есть невидимая часть. Запросить документ под именем краулера командой `curl -A GPTBot`: пустой ответ означает, что забирать нечего.
Влияет как условие допуска. Модель запрашивает страницу в момент разговора и разбирает ее на лету, поэтому долгий ответ сервера приводит к отказу в пользу другого источника. В логах это видно как код 499. Рабочая планка - отрисовка основного содержимого до 2,5 секунды. Быстрый сайт без текста в ответы все равно не попадет.
Нужен, если содержимое сейчас собирается в браузере. Проверяется отключением скриптов: текст остался - переделка не требуется. Если бюджета на переработку нет, работает промежуточный вариант: собрать описания услуг, цены и ответы на частые вопросы как обычные HTML-документы, которые уходят к боту без единого скрипта.
Это разные системы поиска источников. Робот Google и OAI-SearchBot обходят страницы по-разному. Хорошие позиции в Google не гарантируют включение в ChatGPT: проверьте доступ OAI-SearchBot, наличие важного текста в исходном HTML и обнаружение страницы через внутренние ссылки и сторонние поисковые системы, включая Bing.