Ответ нейросети с включённым поиском обычно приходит со списком источников, и этот список выглядит как готовый ответ на вопрос «где про эту тему пишут». Я собрал такой список по семи запросам одной темы из логов собственного прогона — получилось 359 уникальных адресов. Раскрыть удалось 199. За остальными 160 стоит редирект, за которым реальный сайт не виден ни из кода, ни глазами.

Ниже — откуда берётся этот пробел, почему его нельзя закрыть локально, что из неё всё‑таки вытаскивается бесплатно и как из‑за неё врут метрики, если считать их наивно.

Что вообще отдают каналы вместе с ответом

Прогон — это набор вопросов, заданных нескольким сервисам с поиском, с записью ответа целиком. Для этого текста я привожу данные по прогону одного из клиентов, кому помогали увеличить видимость ответов ИИ‑моделях: 20 вопросов, шесть каналов, по три повтора на вопрос, 358 годных ответов.

Прямые адреса приходят от пяти каналов из шести
Прямые адреса приходят от пяти каналов из шести

160 адресов, за которыми ничего не видно

Я взял семь запросов одной темы — про выбор подрядчика — и собрал по ним все адреса источников из всех шести каналов. Вышло 359 уникальных. Из них 160 выглядят так:

https://vertexaisearch.cloud.google.com/grounding‑api‑redirect/AUZIYQF…s7Q

Это grounding‑редирект Google: канал отдаёт не адрес страницы, а собственную ссылку‑обёртку, внутри которой настоящий адрес зашифрован. Открывается она только переходом. urlparse даёт домен vertexaisearch.cloud.google.com — то есть на всех 160 адресах в моей таблице стоял бы один и тот же адрес — сервисный домен Google, к теме отношения не имеющий.

Пробел целиком приходится на один канал. По всему прогону из 253 ссылок Gemini таких обёрток 248 — 98%. У остальных пяти каналов адреса приходят прямыми.

Проверка простая и лезет в пять строк:

OPAQUE = ("vertexaisearch.cloud.google.com", "/grounding-api-redirect/", "/goto?url=")

def is_opaque(url: str) -> bool:

    """Ссылка-обёртка: домен из неё вычислить нельзя."""

    return any(marker in url for marker in OPAQUE)

Третий маркер в списке появился позже двух первых, и он важнее, чем кажется. С августа 2026 года Google начал отдавать часть ссылок и в обычной выдаче через /goto?url= — адрес внутри токена, ключ у Google. То есть непрозрачность источников не осталась особенностью одного API, а поехала в сторону поверхности, где мы снимаем обзоры.

Редирект нельзя раскрыть, не выходя в сеть

Первое, что приходит в голову, — раскрыть редирект запросом. Технически это работает: requests.head(url, allow_redirects=True) вернёт конечный адрес.

Дальше начинаются причины, по которым я это делать не стал.

Токен в ссылке зашифрован, и ключ есть только у выдающей стороны — вычислить адрес из строки, не выходя в сеть, нельзя в принципе. Значит, любой способ раскрытия — это сетевой запрос на каждый адрес. Путь /goto закрыт в robots.txt Google, а массовые переходы по редиректам с одного адреса быстро упираются в капчу. На 160 адресах одного прогона это ещё выглядит как задача, на нескольких прогонах в неделю — уже как отдельный краулер со своими прокси, ротацией и разбором капчи. Ради колонки в таблице.

Поэтому я оставил ссылки нераскрытыми, а взамен сделал две вещи: научился опознавать часть адресов бесплатно и стал явно считать, сколько источников осталось неопознанными.

Что из ссылок можно опознавать бесплатно

Два бесплатных способа опознания закрывают часть обёрток, остальное остаётся без домена
Два бесплатных способа опознания закрывают часть обёрток, остальное остаётся без домена

Первый — сверка заголовка с органикой того же ответа. Если у обёртки заголовок «Как попасть в ответы нейросетей», а в органике того же ответа есть страница ровно с таким заголовком, домен берётся оттуда.

Второй — домен, написанный прямо в заголовке источника. Каналы часто дописывают его хвостом: «… — vc.ru».

Порог 0,85 подобран руками по своим же данным: на 0,9 отваливались пары, где канал обрезал длинный заголовок многоточием, на 0,8 начали склеиваться разные материалы с типовыми названиями. Ниша, где половина заголовков состоит из одних и тех же четырёх слов, для нечёткого сравнения — тяжёлый случай, и порог тут не универсальная константа, а настройка под корпус.

Домыслить домен по смыслу заголовка соблазнительно и категорически нельзя: ошибка тихо поедет в таблицу площадок, по которой принимаются решения.

Как из‑за этого врут метрики

Фальшивый лидер таблицы. Если считать домены как есть, vertexaisearch.cloud.google.com встаёт в первую строку с 248 ссылками — выше любой реальной площадки. Формально верно, содержательно бессмысленно. У меня такие адреса помечены служебными вместе с документацией вендоров: в карте площадок они остаются видимыми, но в планы не попадают.

Заниженный вклад канала. Всё, что процитировал Gemini, в разбор по доменам почти не входит. Утверждать по этим данным, какие площадки читает Gemini, нельзя — независимо от того, сколько ссылок он отдал.

Смещённый знаменатель. Доля ответов с источниками у Gemini — 31 из 60. Но показанный источник и опознанный источник — разные события, и во второй метрике Gemini падает почти до нуля. Пока обе колонки не разведены, любая сводная цифра по прогону смешивает их.

Отсюда правило, которое у меня теперь зашито в код разбора: доля неопознанных источников считается и пишется в отчёт всегда, даже когда она нулевая.

Что осталось в списке после отсева обёрток

Девять доменов из 327 встретились пяти каналам и более
Девять доменов из 327 встретились пяти каналам и более

Из полного прогона после отсева обёрток остаётся 327 доменов на 1887 ссылок. Разбор этого остатка даёт картину не менее отрезвляющую, чем сам пробел в данных:

  • 98 доменов из 327 собрали 80% всех ссылок;

  • 140 доменов встретились ровно в одном ответе из 358;

  • 238 доменов из 327 попались ровно одному каналу из шести;

  • в пяти каналах и более встретились 9 доменов.

Три четверти списка — адреса, за которыми стоит один канал и обычно один‑единственный ответ. Открытая глазами выгрузка выглядит как карта возможностей: три сотни сайтов. Посчитанная — сжимается до девяти адресов, на которых сходятся почти все каналы.

Чего этот разбор не показывает

  • Считаны только источники, которые канал показал. Модель могла читать страницу и не отдать её в списке — такие ответы у меня выглядят как ответы без источников.

  • Прогон один и снят за один день. Состав источников заметно пересобирается от съёма к съёму, поэтому карту площадок я строю накоплением по нескольким прогонам, а не по одному.

  • Оценка «160 из 359» относится к одной подвыборке из семи запросов. По другой теме доля обёрток будет другой — постоянна тут только их природа.

  • Доля Google в разборе занижена по построению, и никакой поправкой это не лечится: занижение и есть предмет этого разбора.

Что я поменял в коде после разбора

Обёртки распознаются списком маркеров на входе, а не по домену на выходе. Домен у них валидный, и без явной проверки они доезжают до таблицы площадок в виде одной гигантской строки.

Опознание идёт бесплатными способами, а неопознанное остаётся неопознанным. Сверка заголовка с органикой и домен из хвоста заголовка закрывают часть адресов; остальное дешевле потерять, чем угадать.