Недавно в отраслевой рассылке 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. Я не утверждаю, что это одно и то же число (метрики разной природы), но форма совпала: устойчивое ядро примерно в треть и длинный волатильный остаток. Гипотеза о том, что видимость в нейросетях расслаивается, а не шумит равномерно, на этих данных держится.
У 23.1% брендов при голом имени модель вообще не понимала, что речь про футбольный клуб, — уводила в топоним или другую сущность. То есть часть пропущенных — это не забыл, а спутал. Для видимости разница принципиальная: с забыванием борются частотой и свежестью, с путаницей — устранением коллизии имени.
Что из этого следует
Один прогон нейросети почти ничего не значит для середины и хвоста. Если бренд живёт в зоне presence 0.3–0.5, то единичный ответ ChatGPT о нём — это подброшенная монета, а не диагноз. Мерить видимость нужно распределением по многим прогонам, иначе вы принимаете шум за сигнал. Я по этой причине никогда не делаю выводов по одному ответу.
Стратегия зависит от того, в каком слое вы сейчас. Ядру важно удержание: свежесть, регулярный рефреш, чтобы не выпасть из привычного маршрута. Середине важно набрать частоту попаданий в те самые повторяющиеся под-запросы. Хвосту сначала нужно решить проблему узнаваемости и коллизий, а уже потом бороться за ранг.
Повторяемость fan-out работает на вас, когда вы в ядре, и против вас, когда нет. Стабильный маршрут системы означает, что попадание по ключевым под-запросам окупается многократно: вас цитируют при разных исходных вопросах. Но тот же стабильный маршрут делает хвост липким — выбраться из него разовыми действиями не выходит.
Ограничения замера
-
Одна ниша и один срез времени. 16 брендов одного сегмента — это иллюстрация формы, а не универсальная константа. На другой нише пропорции поедут.
-
Presence_rate — не прямой замер fan-out. Я мерю следствие (частоту цитирования), а не сами под-запросы. Совпадение доли ~37% с «34% повтора» — любопытное, но не доказательство тождества.
-
Модели меняются. Любой такой замер — фотография на дату. Через квартал распределение стоит переснять: составы под-запросов и индексы обновляются.
-
Небрендовые промпты я собирал вручную — набор влияет на абсолютные числа. Поэтому важны не сами значения, а форма распределения и разрыв между слоями.
Вывод
Цифра про 34% повторяющихся fan-out — намёк на то, как устроена видимость в нейросетях. На моих данных она подтвердилась косвенно: цитируемость брендов расслаивается на стабильное ядро (~треть), зыбкую середину и почти невидимый хвост.
Практический смысл простой — перестать мерить видимость одним прогоном и начать смотреть на распределение. Тогда становится видно, в каком вы слое и что с этим делать. Код выше воспроизводится на любом наборе прогонов; если будете повторять — берите замкнутую нишу и не меньше нескольких сотен ответов, иначе хвост будет врать.
ссылка на оригинал статьи https://habr.com/ru/articles/1060008/