Seed — это начальное значение генератора псевдослучайных чисел, из которого движок берёт «случайность» при выборе очередного токена. Зафиксировали seed — зафиксировали последовательность случайных чисел. Модель по-прежнему выбирает из распределения, но выбирает всегда одинаково.
Отсюда обещание: одинаковый seed — одинаковый ответ. На своей машине оно почти всегда выполняется. У облачного провайдера — почти никогда, и это не обман.
#Что должно совпасть, чтобы ответ повторился
Seed — лишь один из множителей. Полный список условий:
- Тот же файл весов, вплоть до варианта квантизации.
- Та же сборка движка и та же версия.
- То же железо и тот же бэкенд вычислений — CPU и GPU дают разные результаты округления.
- Полностью совпадающий контекст, включая системный промпт и все пробелы в нём.
- Те же параметры сэмплинга: температура, top-p, top-k, штрафы.
- Тот же seed.
- Тот же размер батча и то же состояние KV-кэша.
Нарушьте любой пункт — и ответ разойдётся. Причём разойдётся он не плавно: достаточно одного шага, где два кандидата почти равны, чтобы дальше текст пошёл совсем в другую сторону.
#Почему облако не повторяется даже с seed
| Источник расхождения | Есть локально | Есть в облаке |
|---|---|---|
| Другой seed | управляется вами | часто не принимается вовсе |
| Обновление версии модели | вы решаете, когда | происходит молча |
| Смена железа под запросом | нет | да, запрос уходит на любую свободную ноду |
| Динамическая пакетная обработка | нет | да |
| Маршрутизация экспертов в MoE | детерминирована | зависит от состава батча |
Ключевая строка — пакетная обработка. Провайдер собирает запросы разных пользователей в один батч, чтобы загрузить GPU. Состав батча меняет порядок суммирования чисел с плавающей точкой, а такое сложение неассоциативно: (a + b) + c и a + (b + c) дают чуть разные результаты в последних разрядах. Разница ничтожна, но на шаге, где два кандидата отличаются в шестом знаке, она переворачивает выбор.
Поэтому seed у облачных провайдеров, где он вообще есть, документируется как «наилучшее усилие», а не как гарантия.
#Где путают
Заблуждение первое: температура ноль даёт детерминизм. Ноль убирает случайность выбора, но не убирает численный шум и не фиксирует версию модели. Локально этого обычно достаточно, в облаке — нет. Что температура делает на самом деле, разобрано в справке про температуру модели.
Заблуждение второе: невоспроизводимость — признак поломки. Это штатное свойство сэмплинга. Ненормально другое: когда ответы расходятся не в формулировках, а в фактах.
Заблуждение третье: если ответы разные, значит, сравнивать модели бессмысленно. Наоборот — просто сравнивать надо не один прогон, а серию. Прогоните каждый вопрос по пять раз и смотрите на долю верных ответов, а не на один текст; методика описана в разборе того, как тестировать модель на своих задачах.
#Частые вопросы
#Как зафиксировать seed локально?
В Ollama это options.seed в запросе или PARAMETER seed в Modelfile, в llama.cpp — ключ -s. Вместе с фиксированной температурой и неизменным промптом этого обычно хватает для повторения ответа на той же машине.
#Почему при одном seed ответы всё равно разные?
Проверьте по списку выше: чаще всего меняется не seed, а контекст. Дата в системном промпте, номер сообщения, изменившаяся подмешанная память — любая мелочь во входе даёт другой выход.
#Нужна ли воспроизводимость в обычной работе?
Для диалога — нет. Она нужна в двух местах: при отладке (иначе непонятно, помогла ли правка промпта) и при замерах скорости, где разная длина ответа искажает результат; про это — в разборе того, как измерить скорость LLM.
#Влияет ли seed на качество ответа?
Не влияет. Он выбирает одну траекторию из множества примерно равнокачественных. Если при разных seed ответы отличаются по правильности, это говорит о том, что задача на границе возможностей модели, а не о том, что бывают «удачные» seed.
Что вообще происходит в момент генерации ответа — в справке про инференс. Полный словарь — в глоссарии терминов ИИ.