- BrainTools - https://www.braintools.ru -

Наш любимый доходяга Яндекс частенько показывает вверху выдачи готовый ответ и ссылается в нём на три‑четыре сайта. При этом по такому же запросу в обычной выдаче сотни, а то и тысячи страниц. Позвольте спросить, по какому такому принципу нейроответ отбирает из этих сотен именно те самые избранные, которые собирают весь куш? Я решил проверить свои (бестолковые) гипотезы на реальных данных.
Гипотез, к слову, у меня хватало, проверенных цифр не было ни одной. Поэтому я собрал небольшой стенд, прогнал через него запросы по одной нише и посмотрел, что реально попадает в цитаты. Конкретная ниша тут вторична, методика повторяется на любой другой. Ниже разберу код, цифры и пару мест, где споткнулся, упал и разбил коленку.
Сразу про масштаб. Это одна ниша и всего 60 обращений, так что на вселенскую истину я не претендую, хотя очень хотелось бы. Но даже на таком объёме картинка получилась на удивление устойчивой, пусть и не такой, как мнение Греты Тунберг обо всём на свете.
Сгенерированный ответ, который пользователь видит сверху выдачи, программно доступен через Yandex Search API [1] в режиме generative. Работает он иначе, чем «голая» языковая модель в чате: сначала ищет по вебу, потом синтезирует ответ из найденного и возвращает список источников, на которые опирался. Именно этот список меня и интересовал.
Аналитики «Ашманова и сами знаете кого» описывают механику так: нейроответ попеременно задействует большую языковую модель и обычный органический поиск. Модель делает несколько запросов в поиск, отбирает страницы и синтезирует из них ответ. Значит, ссылки в ответе указывают на конкретные страницы из поиска, модель их не выдумывает.
Технически запрос уходит на эндпоинт /v2/gen/search. В ответ приходит текст и массив ссылок, на которые модель оперлась. Отвечает сервис долго, до пары минут, и это чувствуется: под капотом действительно идёт поиск и синтез. Первый прогон я поставил с таймаутом 30 и потерял половину запросов по этому самому таймауту, пришлось поднимать до 200 секунд.
Логика [2] стенда простая. Берём один и тот же набор запросов, прогоняем несколько раз, сохраняем сырые ответы вместе со списком источников, потом считаем частоты. Прогонять один раз смысла никакого, потому что ответ немного плавает от запуска к запуску. Я гонял каждый запрос по три итерации.
import requests
def yandex_gen_search(query: str, folder_id: str, api_key: str) -> dict:
url = "https://searchapi.api.cloud.yandex.net/v2/gen/search"
payload = {
"messages": [{"content": query, "role": "ROLE_USER"}],
"folderId": folder_id,
"search_type": "SEARCH_TYPE_RU",
}
headers = {"Authorization": f"Api-Key {api_key}"}
r = requests.post(url, json=payload, headers=headers, timeout=200)
r.raise_for_status()
return r.json()
Дальше из ответа надо вытащить домены источников. Тут вылезли две мелочи, на которые я убил больше времени, чем на сам запрос. Первая: один и тот же сайт приходит то с www., то без него, и без нормализации эти штуки считаются двумя разными доменами. Вторая: на паре запросов массив источников оказывался пустым, потому что модель отвечала общими словами, без ссылок. Такие ответы я просто пропускал, чтобы не занижать частоты.
from collections import Counter
from urllib.parse import urlparse
domains = Counter()
for resp in all_responses: # сохранённые JSON-ответы
for src in resp.get("sources", []):
host = urlparse(src["url"]).netloc.replace("www.", "")
if host: # пустые/битые ссылки пропускаем
domains[host] += 1
for host, n in domains.most_common(10):
print(f"{host:24} {n}")
Двадцать запросов по нише на три итерации дают 60 обращений. Всё сырьё я складывал в JSON на диск, чтобы пересчитывать метрики без новых обращений к API. Он платный, и дёргать его лишний раз ради опечатки в скрипте не хочется.
Картина получилась устойчивее, чем я ожидал. В топ цитируемых доменов по нише стабильно попадали площадки одного класса: крупные тематические блоги, агрегаторы и медиа.

Отдельно бросилось в глаза вот что. Сайты самих компаний из ниши в цитаты почти не попадали. Зато попадали площадки, где про эти компании написано. Чтобы тебя процитировали, свой сайт помогает мало, а внятная статья про тебя на крупной площадке работает хорошо.
Самое интересное обнаружилось в связке с обычной выдачей. Я сверил процитированные URL с органическим топом по тем же запросам, и пересечение оказалось высоким: подавляющее большинство цитат приходит из верхней части обычной выдачи Яндекса по запросу.
То есть нейроответ не строит свой рейтинг с нуля, а берёт то, что уже считается релевантным в классическом поиске, и собирает из этого пула синтез. Чтобы попасть в нейроответ, сначала нужно попасть в топ органики. Дальше решает, насколько страница удобна для пересказа: есть ли там конкретика, структура, факты, которые модель может выдернуть и сжать.
Это сходится с замером «Ашманова и Ко»: за полгода доля сайтов не из топ‑10 Яндекса в ответах нейропоиска упала с 40% до 10%. Со временем нейроответ всё сильнее опирается именно на органический топ.

Если коротко, наблюдений три. На самом деле было семь, но четыре выкипели, пока я писал этот текст.
Первое. «Попасть в нейроответ» — никакая не отдельная магия. Это следствие нормального попадания в топ органики плюс структурности текста. Топ работает как необходимое условие, дальше решает пересказуемость.
Второе. Для большинства тем в цитаты чаще выходят площадки‑доноры: медиа, блоги, агрегаторы. Собственный лендинг проигрывает им вчистую. Если про вас написано на такой площадке, шанс попасть в цитату выше.
Третье. Список доноров устойчив. Один и тот же набор площадок всплывает из раза в раз, значит, его можно замерить и работать прицельно.
Теперь честно про дыры в методике, потому что их хватает. Ниша всего одна, и на другой тематике расклад доноров наверняка будет свой. Выборка маленькая: 60 обращений сглаживают шум, но доверительный интервал я на них не построю. Мерил я через API, а не парсил живую выдачу браузером, поэтому нет гарантии, что gen/search на 100% совпадает с тем, что видит пользователь в вебе. Так что это гипотеза с цифрами, которую ещё предстоит проверять на большем объёме.
Дальше интересно масштабировать: прогнать несколько разных ниш одним стендом и посмотреть, пересекаются ли списки доноров между тематиками или у каждой ниши свой замкнутый пул площадок. Если у вас есть свои наблюдения по отбору источников в нейроответах, поделитесь в комментариях, любопытно сверить картинку на других данных.
Автор: sburyi
Источник [3]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/32682
URLs in this post:
[1] Yandex Search API: https://yandex.cloud/ru/docs/search-api/concepts/generative-response
[2] Логика: http://www.braintools.ru/article/7640
[3] Источник: https://habr.com/ru/articles/1055922/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1055922
Нажмите здесь для печати.