Как быстро нейросети забывают источники: за месяц большинство теряется, но выжившие держатся долго

от автора

Два месяца назад я запустил повторный замер одних и тех же 20 промптов в двух ИИ-поисковых системах — хотел посчитать, с какой скоростью источники вымываются из цитируемой выдачи. Результат оказался неожиданно резким: за первый месяц ChatGPT перестаёт ссылаться примерно на три четверти доменов, которые цитировал в начале, Алиса AI — примерно на половину. А между первым и вторым месяцем распад почти останавливается. Ниже — как я это мерил, что получилось и почему на трёх точках во времени можно уверенно говорить про форму кривой, но нельзя — про точный коэффициент.

Зачем мерить выживаемость когорты, а не общее число упоминаний

Если просто взять число упоминаний домена в ответах ИИ сегодня и сравнить с прошлым месяцем — ничего не выйдет. За месяц могло выйти десять новых публикаций про тот же домен, и общее присутствие вырастет, даже если старые статьи выпали из выдачи одна за другой. Рост новых источников маскирует убыль старых, и на графике вы увидите плюс там, где идёт убыль.

Решение — заморозить когорту. Смотреть не на общее присутствие сейчас, а на то, сколько из тех же самых доменов, что были процитированы в момент T0, всё ещё цитируются в T+31 и T+61 по тому же промпту. Новые источники, появившиеся после T0, в расчёт не попадают вообще — они не часть эксперимента, даже если их стало больше. Так замеряется именно выживаемость исходного набора, а не суммарная динамика ниши.

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

Метод по шагам

  1. В момент T0 по каждому из 20 промптов фиксирую множество доменов, которые платформа процитировала — поле sources_cited в логах.

  2. В T+31 и T+61 по тому же промпту смотрю пересечение: сколько доменов из исходной когорты всё ещё в списке цитируемых.

  3. Делю пересечение на размер исходной когорты — получаю долю выживших по одному промпту.

  4. Усредняю по всем промптам, где когорта в T0 была непустой (пустые пропускаю — делить не на что).

Из шести платформ, которые я обычно гоняю, для расчёта годятся только те, где sources_cited реально заполнено во всех трёх точках. В выборке остались две: ChatGPT (через gpt-4o-search-preview) и Алиса AI. Почему выпала третья, Perplexity, разбираю ниже в ограничениях — это важнее, чем кажется из скобки.

Код

Ничего хитрого, кроме одной идеи: считать пересечение множеств доменов по промптам, а не общее присутствие.

#!/usr/bin/env python3"""Citation decay из логов monitor.py.Идея: берём когорту доменов-источников, которые платформа процитировала вмомент T0 (по каждому промпту — свою). На повторных замерах T+31 и T+61смотрим, какая доля этих же доменов ещё цитируется по тому же промпту.Считаем выживаемость когорты, а не общее присутствие, — иначе рост отсвежих публикаций замаскировал бы распад.Логи: logs/<point>/<platform>/pNNN_iterK.json  # выгрузка monitor.py, поле sources_cited[].domain.Запуск: python3 decay.py"""import json, globfrom collections import defaultdictBASE = "logs"   # каталог с выгрузками monitor.py# Три временные точки. T0 склеен из четырёх baseline-прогонов 10-11 мая.POINTS = {    0:  ["baseline-iter1", "baseline-iter2", "baseline-iter3", "baseline-iter4"],    31: ["checkpoint-0611"],    61: ["checkpoint-0711"],}# Только платформы, у которых sources_cited реально заполнен на всех точках.PLATFORMS = ["chatgpt", "yandex_neuro"]def domains_by_prompt(point_dirs, platform):    """prompt_id -> множество доменов, объединённое по итерациям точки.    Домены приводим к единому виду (срезаем www., нижний регистр), иначе один    и тот же домен посчитается как выпавший."""    out = defaultdict(set)    for d in point_dirs:        for path in glob.glob(f"{BASE}/{d}/{platform}/*.json"):            rec = json.load(open(path))            pid = rec.get("prompt_id")            for src in rec.get("sources_cited") or []:                dom = (src.get("domain") or "").lower()                if dom.startswith("www."):                    dom = dom[4:]                if dom:                    out[pid].add(dom)    return outdef cohort_survival(t0, later):    """Средняя по промптам доля доменов из T0, дожившая до later.    Считаем только промпты, где в T0 когорта непустая."""    ratios = []    for pid, base in t0.items():        if not base:            continue        alive = base & later.get(pid, set())        ratios.append(len(alive) / len(base))    return sum(ratios) / len(ratios), len(ratios)for pl in PLATFORMS:    t0 = domains_by_prompt(POINTS[0], pl)    print(f"\n=== {pl} ===")    cohort_prompts = sum(1 for v in t0.values() if v)    cohort_domains = len(set().union(*t0.values())) if t0 else 0    print(f"когорта T0: {cohort_prompts} промптов, {cohort_domains} уникальных доменов")    for t in (31, 61):        later = domains_by_prompt(POINTS[t], pl)        s, n = cohort_survival(t0, later)        print(f"T+{t:<3} выживаемость когорты: {s:6.1%}  (по {n} промптам)")

Данные

20 промптов ниши «контент-завод / AI-производство контента», три точки:

  • 10–11 мая (T0),

  • 11 июня (T+31),

  • 11 июля (T+61).

Платформа

Когорта T0 (доменов)

Выживаемость T+31

Выживаемость T+61

ChatGPT (gpt-4o-search-preview)

96

24.2%

22.0%

Алиса AI

101

50.4%

42.6%

Выживаемость замороженной когорты источников по трём точкам: за первый месяц ChatGPT теряет около 76% процитированных доменов, Алиса AI — около 50%

Выживаемость замороженной когорты источников по трём точкам: за первый месяц ChatGPT теряет около 76% процитированных доменов, Алиса AI — около 50%

За месяц ChatGPT теряет три четверти исходной когорты, Алиса AI — около половины. Дальше начинается интересное: между T+31 и T+61 распад почти останавливается. ChatGPT теряет меньше двух процентных пунктов из оставшегося, Яндекс — примерно шестую часть остатка. То есть на втором интервале выживает почти всё, что дожило до конца первого месяца.

Почти весь распад приходится на первый месяц (ChatGPT −75.8 п.п., ▎ Алиса AI −49.6), на втором интервале — лишь −2.2 и −7.8 п.п. Май–июль 2026

Почти весь распад приходится на первый месяц (ChatGPT −75.8 п.п., ▎ Алиса AI −49.6), на втором интервале — лишь −2.2 и −7.8 п.п. Май–июль 2026

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

Из формы кривой следует вывод про окно уязвимости

У попавшего в цитируемый набор материала есть узкий период — первые тридцать дней, — когда шанс выпасть максимален. Если материал пережил этот месяц и остался в ядре, риск выпадения резко падает: дальше он держится месяцами почти без потерь. Отсюда напрашивается ритм проверки не раз в квартал, а примерно через месяц после публикации или крупного обновления — в этот момент уже видно, попал ли материал в устойчивое ядро или вымывается вместе с волатильным слоем.

У меня нет данных, что именно обновление контента переводит материал из волатильного слоя в ядро — я не ставил такой эксперимент, я только смотрел на то, что уже произошло с существующим набором источников. Гипотеза, что поддержка на границе первого месяца помогает удержаться, логически следует из формы кривой, но проверяется только контролируемым экспериментом: часть источников обновлять специально на T+30, часть не трогать, и сравнить выживаемость на T+61 и дальше. Этого у меня в данных нет — это следующий заход, а не вывод из текущего.

Ограничения — почему это оценка формы, а не точный коэффициент

Три точки — это два интервала. У меня нет данных на T+15, T+45 или где-то ещё внутри отрезков. Форма кривой между T0 и T+31 — прямая линия в логарифмических координатах, потому что я её так провёл, а не потому что наблюдал. Может быть, обвал произошёл за первую неделю, а следующие три недели уже было плато, и тогда двухфазная картина ещё резче, чем я показал. Может быть, распад шёл ровно всю первую половину. По трём точкам это неразличимо — это интерполяция, а не статистика с доверительным интервалом.

Perplexity выпал не потому, что там нет распада, а потому что нечем его измерить. На чекпоинтах T+31 и T+61 поле sources_cited у этой платформы приходит пустым — модель через прокси-доступ не отдаёт стабильный список цитируемых источников в те дни, когда я снимал замер. Распад там наверняка есть, я просто не могу посчитать его по имеющимся логам. Молча выбросить платформу из таблицы и не сказать почему — исказить картину надёжности метода сильнее, чем любая из цифр. Весь вывод про две скорости опирается только на ChatGPT и Алиса AI — две из как минимум трёх платформ, которые стоило бы сравнивать.

T0 и чекпоинты собраны разным числом итераций. T0 — склейка четырёх прогонов подряд (10–11 мая), чекпоинты — по три итерации каждый. Больше итераций в T0 означает более полную когорту: если домен процитирован хотя бы раз из четырёх прогонов, он попадает в множество T0. На чекпоинтах с тремя итерациями шанс поймать редкий домен ниже. Это может завышать распад — часть доменов из T0 могли бы выжить на четвёртой итерации чекпоинта, которой в замере просто не было.

Версия модели могла измениться между замерами. gpt-4o-search-preview — не статичный артефакт, а живой эндпоинт, который может тихо обновляться на стороне провайдера между 11 мая и 11 июля. Если поведение поиска внутри модели изменилось, то часть распада — это не эрозия присутствия конкретных доменов во времени, а сдвиг алгоритма ранжирования источников. Отделить одно от другого по имеющимся данным нельзя — у меня нет способа зафиксировать версию модели на каждой точке.

Двадцать промптов — это одна ниша. Числа в таблице — про конкретный тематический кластер. Перенос коэффициента на любую другую тему без повторного замера — экстраполяция, а не факт. В нишах с более частым обновлением фактуры волатильный слой, скорее всего, толще и вымывается быстрее; в стабильных справочных темах ядро может быть больше с самого начала.

Итого → честного доверительного интервала вокруг этих чисел я дать не могу — не хватает точек и повторов для нормальной статистики. Но это порядок величины: недели, а не месяцы для первой фазы, и совсем другой, гораздо более медленный порядок для второй.

Вывод

Несмотря на все дыры, сигнал полезный — только читать его надо не как точную константу, а как качественную находку. Распад цитируемости идёт минимум в два режима: первый месяц вымывает большую часть исходной когорты, дальше тянется куда более устойчивое плато. Для практики это значит, что единой цифре скорости распада доверять как формуле планирования нельзя, но на факт двухфазности опираться можно: если источник пережил первый месяц после цитирования, у него заметно выше шанс держаться и дальше.

Проверить это на большем числе точек и без слепых зон вроде Perplexity — следующий заход. Дальше добавлю T+91 и T+121 — тогда станет видно, продолжается плато или это ещё один участок медленно затухающей кривой, который я по трём точкам принял за стабильное ядро раньше времени.

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