Когда мне нужны тестовые данные, а модель уже открыта, я просто прошу её. “Generate 30 random email addresses for test fixtures.” Ответ приходит за секунду и список выглядит случайным. Через час коллега делает то же самое для другого теста. Потом обе фикстуры попадают в 1 сид базы с ограничением UNIQUE на колонке.
Тут случайный вид 1 списка ничего не говорит. Сид падает, когда 2 списка из 2 отдельных запросов делят хотя бы 1 значение. Мне нужно было это число, поэтому я его измерил. В статье оно называется P_pair: доля пар независимых запусков, у которых есть общее значение.
Здесь уже были до меня
Общая идея не моя. Что модели повторяются на открытых вопросах, хорошо измерено, а Artificial Hivemind называет генерацию имён среди задач, где разнообразие уже проверяли. Ближе всего работа про поддельные персональные данные (arXiv:2605.13538). Там маленькая модель придумывала имена и адреса, а авторы напрямую сравнили их с Faker. По результату на задаче NER подделки модели дали менее разнообразный обучающий набор, чем Faker. Более ранняя работа про синтетические удостоверения личности (arXiv:2411.14962) сообщила обратное: поля от LLM оказались разнообразнее шаблонов Faker.
Так что фразу “выдуманные моделью данные однообразнее, чем у Faker” уже произносили, причём в обе стороны. Моё добавление узкое. Единица счёта здесь пара независимых запусков, ровно как в сиде выше. В тесте есть идентификаторы: email и имена пользователей. Faker работает на тех же размерах, что и модели. Модели это 7 моделей Claude, текущие и предыдущие, через тот CLI, в который разработчик действительно пишет.
Как я спрашивал
Типов значений было 7, каждый в самой простой формулировке, какую я мог придумать, вроде “Generate 30 random person full names for test fixtures.” Каждый запрос шёл в 3 вариантах. Первый просил по одному значению на строку. Второй просил массив JSON. Третий просил по одному значению на строку и добавлял фразу с просьбой сделать значения как можно более непохожими друг на друга.
Из текущего поколения я взял Opus 5.5, Sonnet 5.5, Haiku 5.5 и Fable 5.1, из предыдущего Opus 5, Sonnet 5 и Haiku 4.5. 1274 вызова прошли 19 и 20 октября 2026. Каждый вызов был отдельным процессом claude -p без истории и с выключенными инструментами, так что 2 запуска ничего друг о друге не знают. Для сравнения Faker 40.43.0 сделал по 300 наборов из 30 значений на каждый тип.
Имена
На простом запросе 2 списка по 30 имён от одной модели делили хотя бы 1 имя в 64-98% пар. Faker того же размера сделал это в 1,29% пар. По всем 7 моделям это 256 пар из 315.
Внутри одного ответа ни одна модель имя не повторила, так что каждый список сам по себе выглядит нормально. Повтор возникает только между запусками. Dmitri Volkov вернулся в 26 простых запусках из 70, Priya Raghunathan в 24 и Kwame Asante в 19.
Идентификаторы зависят от модели
С email модели разошлись. 2 списка от Opus 5.5 совпали в 56% пар, от Sonnet 5.5 в 36%, а у Haiku 5.5 ни одна из 45 пар не совпала. Адрес alice.morgan@example.com вернулся в 7 запусках из 70. По именам пользователей 4 модели из 7 стоят выше Faker даже нижней границей интервала.
Я ждал, что вариант с JSON снизит разнообразие, потому что работа 2026 года нашла ровно это на ответах из одного слова. Здесь это правилом не стало. У одних моделей разнообразие выросло, у других упало.
Просьба о разнообразии
Лишняя фраза про разнообразие полностью починила email: 0 совпадений в 105 парах по всем 7 моделям. Имена она не починила. Имена стали разнообразнее у каждой модели, но ни одна не дошла до Faker и 58 пар из 105 всё равно делили имя.
Что я не смог разделить
CLI это не голый API. Он отправляет свой системный промпт и в этом контексте были данные моего аккаунта. В 1 ответе модель воспроизвела email аккаунта, мой ник на GitHub и город, совпадающий с часовым поясом машины. Значит эта информация до модели дошла.
Самое частое имя Dmitri Volkov, а Дмитрий это моё имя. По всем 3 вариантам запроса оно встречается в 66 запусках с именами из 182. Подтолкнул ли его контекст моего аккаунта или модели любят его и так? Я этого не проверял. Если убрать это имя из всех списков, общий счёт меняется с 256 на 254 пары из 315, так что доли на нём не держатся. Какие имена окажутся наверху, от контекста зависеть всё же может. Это решил бы прогон через голый API без контекста аккаунта, а его я не делал.
Есть ещё 2 вещи, которые надо сказать прямо. Результаты по UUID здесь ничего не значат, потому что с выключенными инструментами несколько моделей отвечали на запрос UUID разметкой вызова инструмента вместо значений. И свои ожидания я записал за 18 минут до старта прогона, а закоммитил их только тогда, когда в журнале уже было 52 ответа. Ни одной доли совпадений к тому моменту посчитано не было, а что я видел и менял в промежутке, перечислено в статье.
Что я делаю теперь
Для любой колонки с ограничением UNIQUE я бы не брал значения у модели. 30 значений это маленькая фикстура, а у большой шансов совпасть больше. Хуже всего то, что падение плавающее: оно зависит от того, какой ответ достался каждой фикстуре. Генератор вроде Faker это решает, а модель всё так же может написать вызов генератора. Просьбы о разнообразии в этой выборке хватило для email, но не для имён.
Полный текст со всеми таблицами лежит на странице статьи. Обвязка, все ответы целиком и скрипты анализа лежат в репозитории.