🗺️ Хранитель датасета: QA в нейросетевом Средиземье 💾

Глава 1. 🧙 Гэндальф словил флейк: магия без воспроизведения бага 🎲

Двадцать лет профессия QA-инженера держалась на удобной аксиоме: система делает ровно то, что ей сказали, и делает это одинаково при каждом прогоне. Один вход — один выход, один прогон — один результат, зелёная галочка в отчёте ✅. Эта аксиома формировала всю культуру: баг-репорты со «шагами воспроизведения» 📋, приёмочные критерии в формате «если X, то Y» и само понятие «ожидаемый результат». Тестировщик был строгим, но справедливым судьёй ⚖️ — и почти всегда выигрывал процесс, потому что спорить с воспроизводимым багом тяжело даже у архитектора.

Затем в это аккуратное мироустройство ворвались генеративные модели, и аксиома рассыпалась 🌪️. Один и тот же запрос сегодня возвращает выверенный деловой абзац, а завтра — творческий монолог с внезапной капибарой 🦫. Формально система работает, фактически — не повторяет сама себя. Понятие «ожидаемый результат» умерло: ожидаемой строки больше не существует, существует лишь пространство допустимых ответов. Классика была железная: «вводим два плюс два — ожидаем четыре». Теперь тот же шаг может вернуть «примерно четыре, смотря что вы имели в виду», и ассерт на точное равенство превращается в памятку о былой уверенности 📜.

Отсюда первый и главный сдвиг мышления: от бинарного «прошёл/упал» к оценке «приемлемо/неприемлемо» 🎯. Качество перестало быть точкой и стало распределением 📏. Тестировать нейросеть — не сверять цифру на калькуляторе, а принимать творческую работу: нужно заранее определить границы допустимого, иначе приёмка превращается в спор вкусов, а споры вкусов в CI не автоматизируются. Границы приходится формализовать письменно: критерии качества, шкалы, рубрики ✍️ — то, что раньше называли чек-листом, теперь называется рубрикой оценки и живёт в коде рядом с ассертами.

Второй сдвиг: мы тестируем не функцию, а вероятность 🎲. Один прогон одного теста больше ничего не доказывает — он говорит о прогоне, а не о системе. Чтобы оценить долю корректных ответов, нужен статистический подход: один и тот же промпт прогоняется N раз 🔁, замеряется доля удач, выставляются пороги. Это уже не проверка, а измерение. Флейки 🌀, которые десять лет были проклятием UI-тестов, переехали в ядро продукта: непостоянство — не дефект, а свойство. Ответ здесь и есть продукт, и бороться с его настроением бесполезно — можно лишь измерять его статистически и закладывать запас в релизный план.

Третий сдвиг: артефакты ожидания 📦. Эталонный ответ перестал быть строкой и превратился в перечень свойств: ответ должен быть валидным JSON, укладываться в лимит токенов 💬, опираться на указанные источники, не упоминать конкурентов и не обижать бабушек 👵. Хорошая новость: свойства проверяются кодом, привычными средствами, детерминированно. Плохая новость: проверка свойств заняла место проверки содержания, а содержание как раз стало вероятностным.

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

Ирония эпохи в том, что инженер, всю жизнь ловивший один правильный ответ, теперь обязан описывать пространство правильных ответов — и следить, чтобы модель туда попала 🎯. Мы наняли в команду чёрный ящик с настроением 🕳️, который ещё и обновляется без нашего ведома. Прежние баги вели себя честно: они не притворялись фичами. Новый коллега сам решает, воспроизводиться ли ему сегодня. В итоге «шаги воспроизведения» в репорте приходится писать с припиской «в среднем», а эталонный ответ оформлять как распределение вероятностей. Привычный приём «перезапустить прогон — само пройдёт» здесь срабатывает чаще, чем хотелось бы, — уже не баг, а религия 🙏.

🗺️ Хранитель датасета: QA в нейросетевом Средиземье 💾 | Сетка — социальная сеть от hh.ru