Треть запросов ChatGPT к поиску — повторы. Разобрал 591 ответ: почему одних цитируют всегда, а других — через раз

от автора

Недавно в отраслевой рассылке SEOFOMO мелькнула цифра — ChatGPT в режиме поиска повторяет около 34% своих query fan-out. То есть когда вы задаёте разные вопросы, модель под капотом раскладывает их на под-запросы к поиску — и примерно треть этих под-запросов повторяется от промпта к промпту. Есть устойчивое ядро, которое крутится постоянно.

Я работаю с видимостью брендов в нейросетях и сразу подумал: если ядро под-запросов стабильно, то и цитируемость источников не может быть равномерным шумом. Она должна расслаиваться — стабильное ядро сайтов, которые попадают в ответ почти всегда, и длинный хвост тех, кого система вспоминает через раз. Гипотезу можно проверить руками. Ниже — как я это сделал: замкнутый список из 16 брендов, шесть нейросетей, 591 обезличенный ответ и немного Python.

Что такое query fan-out и почему повтор под-запросов важен

Fan-out — это внутреннее разветвление вашего запроса. Вы спрашиваете нейропоиск что-то одно, а он, чтобы собрать ответ, генерирует несколько уточняющих под-запросов к поисковому индексу, стягивает документы и уже по ним формулирует ответ. Это стандартная механика RAG-систем, на которой построены и ChatGPT-поиск, и Perplexity, и нейропоиск Алисы.

Если 34% под-запросов повторяются, значит, у системы есть привычный маршрут: одни и те же уточнения, одни и те же зоны индекса. Практический смысл для того, кого нейросеть должна находить, такой. Есть под-запросы, которые модель гоняет постоянно, — попал в выдачу по ним, и тебя цитируют стабильно, при любом исходном вопросе. А есть редкие, «однодневные» под-запросы: попал туда — сегодня процитировали, завтра нет. Видимость в первом слое надёжная, во втором — лотерея.

Проверить fan-out ChatGPT напрямую я не могу — под-запросы наружу не отдаются. Но у гипотезы есть наблюдаемое следствие: если ядро есть, распределение частоты цитирования брендов будет расслоённым, а не плоским. Вот это следствие и померил.

Метод: замкнутая ниша, шесть моделей, обезличенные ответы

Чтобы измерять честно, нужен закрытый список сущностей, где заранее известны все правильные ответы. Я взял нишу с жёстко замкнутым составом — 16 брендов одного сегмента (клубы российской премьер-лиги — удобный публичный список, где ничего нельзя пропустить или досочинить).

Для каждого бренда я собрал набор небрендовых промптов (вопросы, где бренд должен всплыть по смыслу, но его имя в запросе не называется) и прогнал их через шесть систем: ChatGPT, Claude, Perplexity, Gemini, Алису и GigaChat. Получил 591 небрендовый ответ. По каждому ответу я фиксировал две вещи: упомянут ли бренд вообще (presence) и на каком он месте, если упомянут (rank).

Ключевая метрика для проверки гипотезы — presence_rate: доля ответов, где бренд всплыл хотя бы раз. И обратная ей miss_rate — как часто бренда в ответе нет. Если гипотеза про ядро верна, presence_rate разложится на явные группы, а не размажется вокруг среднего.

Логика подсчёта — вот такая (упрощённый вырез из пайплайна, без обвязки с хранилищем):

from collections import defaultdictdef presence_stats(runs, brands):    """runs: список ответов вида {'brand': str, 'mentioned': bool, 'rank': int|None}       brands: замкнутый список брендов ниши"""    seen = defaultdict(int)   # сколько раз бренд всплыл    total = defaultdict(int)  # сколько всего ответов по бренду    ranks = defaultdict(list)    for r in runs:        total[r['brand']] += 1        if r['mentioned']:            seen[r['brand']] += 1            if r['rank'] is not None:                ranks[r['brand']].append(r['rank'])    stats = {}    for b in brands:        n = total[b]        presence = seen[b] / n if n else 0.0        avg_rank = sum(ranks[b]) / len(ranks[b]) if ranks[b] else None        stats[b] = {            'presence_rate': round(presence, 3),            'miss_rate': round(1 - presence, 3),            'avg_rank': round(avg_rank, 2) if avg_rank else None,            'n': n,        }    return stats

Считаем, как часто каждый бренд реально доходит до ответа. Дальше сортируем по presence_rate и смотрим на форму распределения.

Результат: стабильное ядро, зыбкая середина и почти невидимый хвост

Средняя узнаваемость по нише — 49.5 из 100, но за этим средним прячутся три совершенно разных режима.

Ядро (presence_rate 0.68–0.84). Верхние шесть брендов всплывают в двух ответах из трёх и чаще. Лидер — presence 0.836 при miss всего 16.4%: его почти невозможно не заметить, в каком бы виде ни пришёл под-запрос. Это и есть тот самый устойчивый слой: система держит их в привычном маршруте.

Середина (presence_rate 0.29–0.45). Здесь начинается лотерея. Бренд с presence 0.425 выпадает из ответа в 57% случаев. Один прогон о нём не говорит ничего: сегодня процитировали, завтра — тишина, и оба исхода нормальны.

Хвост (presence_rate 0.15–0.26). Нижние бренды система вспоминает в одном ответе из шести-семи. Аутсайдер — presence 0.149, miss 85.1%. Формально он в индексе есть, но до ответа доходит редко.

Шесть брендов ядра из шестнадцати — это 37.5% списка. Почти та же треть, что и в цифре про повтор fan-out. Я не утверждаю, что это одно и то же число (метрики разной природы), но форма совпала: устойчивое ядро примерно в треть и длинный волатильный остаток. Гипотеза о том, что видимость в нейросетях расслаивается, а не шумит равномерно, на этих данных держится.

Источник: собственный замер, 591 небрендовый ответ, 6 нейросетей, июнь 2026

Источник: собственный замер, 591 небрендовый ответ, 6 нейросетей, июнь 2026

У 23.1% брендов при голом имени модель вообще не понимала, что речь про футбольный клуб, — уводила в топоним или другую сущность. То есть часть пропущенных — это не забыл, а спутал. Для видимости разница принципиальная: с забыванием борются частотой и свежестью, с путаницей — устранением коллизии имени.

Источник: собственный замер, июнь 2026

Источник: собственный замер, июнь 2026

Что из этого следует

Один прогон нейросети почти ничего не значит для середины и хвоста. Если бренд живёт в зоне presence 0.3–0.5, то единичный ответ ChatGPT о нём — это подброшенная монета, а не диагноз. Мерить видимость нужно распределением по многим прогонам, иначе вы принимаете шум за сигнал. Я по этой причине никогда не делаю выводов по одному ответу.

Стратегия зависит от того, в каком слое вы сейчас. Ядру важно удержание: свежесть, регулярный рефреш, чтобы не выпасть из привычного маршрута. Середине важно набрать частоту попаданий в те самые повторяющиеся под-запросы. Хвосту сначала нужно решить проблему узнаваемости и коллизий, а уже потом бороться за ранг.

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

Ограничения замера

  • Одна ниша и один срез времени. 16 брендов одного сегмента — это иллюстрация формы, а не универсальная константа. На другой нише пропорции поедут.

  • Presence_rate — не прямой замер fan-out. Я мерю следствие (частоту цитирования), а не сами под-запросы. Совпадение доли ~37% с «34% повтора» — любопытное, но не доказательство тождества.

  • Модели меняются. Любой такой замер — фотография на дату. Через квартал распределение стоит переснять: составы под-запросов и индексы обновляются.

  • Небрендовые промпты я собирал вручную — набор влияет на абсолютные числа. Поэтому важны не сами значения, а форма распределения и разрыв между слоями.

Вывод

Цифра про 34% повторяющихся fan-out — намёк на то, как устроена видимость в нейросетях. На моих данных она подтвердилась косвенно: цитируемость брендов расслаивается на стабильное ядро (~треть), зыбкую середину и почти невидимый хвост.

Практический смысл простой — перестать мерить видимость одним прогоном и начать смотреть на распределение. Тогда становится видно, в каком вы слое и что с этим делать. Код выше воспроизводится на любом наборе прогонов; если будете повторять — берите замкнутую нишу и не меньше нескольких сотен ответов, иначе хвост будет врать.

ссылка на оригинал статьи https://habr.com/ru/articles/1060008/