Содержание ↓
Почему ответ пишут по памяти
Когда страница просела, SEO-специалист открывает пять окон: запросы и показы в Вебмастере, позиции, спрос в Вордстате, саму страницу и выдачу в том городе, о котором спросили. На частых запросах выдача Яндекса ещё и закрывается капчей. Пока всё собрано, вопрос успевает остыть, и ответ пишут по памяти: «добавьте текста, поправьте title».
Я строю SEO-агента для своей команды. Он живёт в рабочем чате в Telegram, ему пишут словами, как коллеге. Первая версия отвечала бойко и мимо: предлагала переписать нормальный title, придумала поддомен, которого у сайта нет, и советовала поставить ссылку, которая на странице уже стояла. После того прогона я перестал латать промт и занялся устройством хода.
Как проходит один ход
- Маршрут. Модель выбирает сценарий из каталога: просадка страницы, региональная аномалия, точки роста, разрыв с конкурентом. Нужен ли сбор, решает код. Пока эта развилка жила в промте, модель раз за разом отвечала тем, что лежало под рукой.
- Данные. Агент сам читает недельные выгрузки Вебмастера, позиции, спрос из Вордстата и открывает нашу страницу. Ответ любого инструмента упакован в конверт, где написано, сколько строк в источнике и сколько из них показано; обрезанная выборка там тоже помечена. Правило появилось после случая, когда агент увидел первые сто запросов и написал, что разбивки по запросам нет. Теперь фразу «данных нет» можно написать только при нуле строк. На ход — не больше 8 вызовов и 24 000 знаков результата.
- Выдача. Капчу я оставил человеку. Бот присылает код задачи из восьми знаков, без пар, которые легко спутать, вроде O и 0: код должен выдерживать диктовку. Сотрудник вводит его в расширении Chrome, и оно по очереди открывает выдачу, нашу страницу и страницы конкурентов, снимает факты и закрывает вкладки.
- Регион. Название города в параметре региона Яндекс молча игнорирует и отдаёт выдачу по месту того, кто спросил. Коды берутся из справочника на 1 098 регионов, который собирает скрипт из API. Регион готового снимка сверяется с запрошенным, и при расхождении снимок идёт в брак.
- Спрос. До разбора агент проверяет, есть ли что выигрывать. Бывает, три числа из Вордстата показывают, что спроса почти нет и трогать страницу незачем. Если спрос снять не удалось, это отдельный исход: агент так и пишет «спрос не снят» и советов не раздаёт.
Шесть слоёв и гейт причинности
В базе агента 39 факторов Яндекса и Google. Они разложены по шести слоям в порядке отбора: пороги (индексация, canonical, мобильная версия), релевантность, клик в выдаче, ответ на странице, доверие к сайту, гигиена. Сравнивать факторы имеет смысл только внутри одного слоя. Индексация — порог: пока страницы нет в индексе, остальные слои просто не считаются. Часть факторов с одной страницы не измерить, ссылочные например, и код отдельным списком пишет, что не мерил. Если про ссылки промолчать, это прочитают как «со ссылками порядок».
Измеритель пишет число без оценочных слов и ставит рядом ориентир с происхождением: шкала CrUX, видимая ширина сниппета или медиана топа из того же сбора. Если ориентира нет, в ячейке прочерк — выдумывать его нельзя. Две строки отчёта, пример условный:
| Фактор | Значение | Ориентир |
|---|---|---|
| Длина title | 72 знака | в выдаче видно около 65, зависит от ширины букв |
| Ответ сервера | 950 мс | по шкале CrUX до 800 мс хорошо; одна попытка замера |
Вердикта «в порядке» код не ставит вообще. Хватит одной заметной нестыковки между таблицей и текстом, чтобы человек перестал верить тем тридцати строкам, которые сам проверить не может.
Разбор модель отдаёт объектом: блоки по разделам, в блоках утверждения со ссылками на доказательства вида E-001. Сами доказательства код собирает из замеров и журнала вызовов, рассуждения модели туда не попадают. Статус утверждению тоже ставит код. Нет ссылки — утверждение уезжает в раздел «не доказано данными».
Назвать что-то причиной агент может только после гейта из шести условий. Нужны подтверждающие данные и названные другие объяснения. Надо сказать, чем проверить, и показать, что опровержения искали. Причина должна идти по времени раньше следствия, а затронутый сегмент — быть назван. Если хоть одного условия нет, в отчёте стоит «Причина не установлена. Предположение: …» и список недостающего.
Перед отправкой ответ проходит 10 сенсоров. Они ловят внутренние имена инструментов в тексте для человека, «плохой CTR» без сверки с ожидаемым для этой позиции, отговорку «нужно посмотреть страницу», когда факты уже подняты. Смысловую верность регуляркой не проверишь, и этого я от сенсоров не жду.
Что получает маркетолог
В чат приходит короткий ответ и HTML-документ. В документе таблица замеров по слоям, правки в формате «что сейчас → почему мешает → что изменить → что это даст», раздел недоказанного и список того, что не проверялось. Порядок правок считается в кликах: агент строит свою кривую «позиция → CTR» по типам страниц и поднимает отставание, только если оно больше случайного разброса. Задание на новый текст одной кнопкой уходит в контент-завод.
Популярные SEO-правила я в пороги не зашивал: минимум 300 слов, плотность ключа 3–5%, title ровно в 60 знаков. Title обрезается по ширине в пикселях, поэтому длинный заголовок не страшен, если ключ стоит в первых тридцати знаках: выдача срежет хвост, а ключ останется.
Грабли
Зелёные тесты. 667 тестов проходили, и ни один не смотрел на сам ответ. В журнал писались первые 600 знаков, трасса вызовов не сохранялась. Сейчас каждый ход пишется целиком, сенсоры отдельным скриптом прогоняются по боевым ходам, а сценарии из реальных ходов стоят гейтом перед выкатом.
Сочинённый отказ. Модель ответила «инструменты не подключены». В трассе того хода был один вызов и ноль ошибок: отказ она придумала. Я просил вернуть вызов JSON-текстом, и иногда модель рассказывала о вызове вместо того, чтобы его сделать. Цикл переехал на нативный вызов функций, а отдельный сенсор сверяет такие заявления с трассой.
Молчаливый дефолт. Расширение однажды не пометило страницы конкурентов, и все собранные страницы ушли в разбор как наши. Модель попыталась свести концы с концами и выдумала ярлык, которого во входе не было. Теперь роль страницы решает домен.
Правило, которое затёрли. Правило «вопрос о причине — всегда сбор» вписали в каталог сценариев, а переопределение в том же коммите его затирало. Тест был зелёным, потому что проверял текст каталога. Итоговый маршрут он не видел.
Код агента я отдаю на ревью моделям другого семейства, DeepSeek и Gemini. За одну волну приняли 12 их находок, среди них ответы 401 и 403 со страниц за авторизацией, которые агент записывал в битые ссылки, и robots.txt, прочитанный для YandexBot наоборот.
Порядок, который я бы повторил
Сначала один вопрос, который команда задаёт чаще других, например «почему упала страница». Под него инструменты поверх полных выгрузок с честным «показано N из M». Дальше замеры кодом и гейт причинности. Красивый отчёт я бы делал последним.
В каких SEO-задачах модель начинает сочинять, я разбирал в заметке ИИ для SEO. Агента под ваш сайт можно прикинуть на консультации, а если задача шире одного агента, про это страница внедрение ИИ в маркетинг.
- Next.js 15
- TypeScript
- Supabase
- API Яндекс Вебмастера
- API Вордстата
- расширение Chrome
- Telegram
- Claude
- Gemini
