Разбираем историю Джой Буоламвини и реальные сбои. Даем простой процесс, чтобы тестирование предвзятости ИИ стало частью требований продукта.

Предвзятость в ИИ - это ситуация, когда система заметно хуже работает для одних людей, чем для других, хотя пользователи ждут одинакового качества. Чаще всего это не злой умысел, а «слепое пятно»: модель уверенно справляется с одним типом лица, речи или поведения, но регулярно ошибается на другом.
Еще недавно предвзятость обсуждали в основном в исследованиях и этических спорах. Сейчас это часть продуктового качества, наравне со скоростью, стабильностью и безопасностью. Если система принимает решения или подсказывает действия, от нее ждут справедливости и предсказуемости, а от команды - понятного ответа, где границы надежности.
Больше всего страдают те, кто хуже представлен в данных или отличается по признакам: люди с более темной кожей, женщины, пожилые, люди с акцентом, пользователи с нетипичными именами, клиенты из регионов, а также те, кто попадает в редкие сценарии. И важно помнить: «редкий» не значит «неважный». Именно такие случаи часто критичны - доступ к сервису, проверка личности, модерация.
Когда перекосы всплывают, это бьет не только по репутации. Растет нагрузка на поддержку, появляются спорные блокировки и возвраты, увеличивается отток. Команда начинает тушить пожары вместо развития.
Поэтому проверка на перекосы стала продуктовой обязанностью. Минимум, которого обычно ждут:
Даже маленькая команда может начать с простого: выделить ключевые группы пользователей, описать рискованные сценарии и поставить 2-3 метрики качества по сегментам. Если вы делаете ИИ-функцию быстро (например, собираете прототипы на TakProsto), этот шаг лучше сразу включать в требования к фиче, а не оставлять «на потом».
Джой Буоламвини стала известна после того, как публично показала неприятную вещь: системы распознавания лиц работали заметно хуже для темнокожих людей, особенно для женщин. По ее словам, в одном из проектов алгоритм корректно «видел» лицо только когда она надевала белую маску. Личный опыт превратился в исследование, и цифры подтвердили проблему: точность отличалась между группами не на проценты, а кратно.
Главный урок здесь даже не в том, что «модель ошиблась». Ошибка долго оставалась незаметной, потому что продукт тестировали на привычных данных и привычных пользователях. Если в датасете и тестовой выборке мало людей с разным тоном кожи, возрастом, типами внешности и условиями съемки, система выглядит «нормальной» в демо и пилотах. Заказчики тоже часто проверяют решения в «лабораторных» сценариях: хороший свет, фронтальная камера, сотрудники компании в роли пользователей.
Когда сбой касается доступа, безопасности или прав человека, он быстро выходит за пределы техподдержки. История Буоламвини изменила ожидания рынка: качество перестало означать «одну среднюю точность». У продукта появился обязательный вопрос: «Для кого он работает хуже и что мы с этим делаем?»
После таких кейсов команды стали закладывать в требования то, что раньше считалось бонусом: качество по группам (а не одним числом), ясные ограничения, план быстрого отключения функции и аккуратные обещания в маркетинге и документации. Цена ошибки стала репутационной, юридической и финансовой - и это закрепило fairness и риск-менеджмент как часть продуктового качества.
Предвзятость редко «живет» в одном месте. Обычно это цепочка мелких решений: какие данные собрали, как разметили, как обучили, какие пороги выбрали и как показали результат пользователю. Поэтому начинать стоит не с формул, а с карты рисков: где именно система может споткнуться.
Самый частый источник - перекос в данных. В наборе может быть мало людей из отдельных групп (по полу, возрасту, тону кожи, региону, акценту, типу устройства, условиям съемки). Даже если группы есть, они могут быть показаны в неравных условиях: одни в хорошем освещении, другие - в шуме, на дешевых камерах или в плохом звуке. Модель учится на том, что видит чаще и четче.
Отдельная проблема - прокси-признаки. Формально нейтральные поля (индекс, тип телефона, время активности, язык, место работы) нередко косвенно указывают на чувствительные признаки и позволяют модели делать выводы «в обход».
Даже хороший набор данных портит разметка. Если критерии расплывчаты, разные разметчики вкладывают свои ожидания. «Агрессивный комментарий», «подозрительная транзакция», «профессиональное фото» - оценочные понятия. Без четких инструкций и примеров стереотипы попадают в метки и становятся «правдой» для модели.
Модель часто выдает вероятность, а продукт превращает ее в действие: отказать, заблокировать, отправить на проверку. Один общий порог для всех выглядит справедливо, но на практике сильнее бьет по тем, у кого входные данные чаще шумные или реже встречаются.
Добавьте сюда ручные правила вокруг модели: «если адрес новый - повышаем риск», «если фото нечеткое - отклоняем». Иногда такие правила вредят сильнее самой модели.
Чтобы поймать риск до релиза, полезно пройтись по нескольким вопросам:
Даже точная модель может выглядеть предвзятой из-за UX. Если интерфейс говорит «Мы уверены», хотя вероятность слабая, люди доверяют ошибке. Если отказ звучит обвиняюще, ущерб растет.
Нейтральный тон, понятная причина, вариант «исправить и отправить снова» и прозрачные статусы («на проверке», «нужно уточнение») снижают риск. Например, если проверка личности чаще отклоняет фото у людей с темным тоном кожи из-за освещения, продукт может компенсировать это подсказками (как поставить свет), проверкой качества снимка до отправки и безопасным маршрутом «проверка человеком», вместо немого отказа.
Ошибки в ИИ редко воспринимаются как «просто баг». Они выглядят как несправедливое решение о человеке - и ставки сразу выше.
Для пользователя последствия измеряются не точностью, а вредом. Один неверный отказ в услуге, лишняя проверка личности или блокировка аккаунта бьет по доверию сильнее, чем падение кнопки «Оплатить». Самое неприятное - человек обычно не понимает причину: «система решила», а объяснить нечем.
Для бизнеса это быстро превращается в потери: жалобы в поддержку, негативные отзывы, падение конверсии и отток. Даже небольшой процент ошибок заметен, потому что он концентрируется на конкретных группах и сценариях. И истории про несправедливость распространяются быстрее, чем рассказы про обычные сбои.
Для команды предвзятость почти всегда означает «пожар» после релиза. Нужно срочно разбираться в данных, логах, правилах и текстах интерфейса, пока пользователи уже страдают. Фикс редко бывает один: меняются модель, пороги, UX, добавляется ручная проверка - и все это нужно согласовать.
Аргумент «у нас так редко бывает» не спасает. Во-первых, редкое событие может быть критичным (например, блокировка). Во-вторых, «редко» часто означает «мы не умеем замечать» - нет разрезов по группам, тестов по сценариям и понятных сигналов.
От ИИ ждут другого уровня ответственности, чем от обычных багов:
Если вы выпускаете функции быстро, эти риски только выше: скорость помогает проверять гипотезы, но требует короткого ритуала оценки последствий до релиза.
Чтобы проверка не превращалась в бесконечный проект, сделайте ее привычным этапом, как проверку требований и тестирование функционала. Нужен короткий ритуал, который повторяется перед ключевыми вехами и оставляет след.
Практичный график - три точки: до MVP (когда еще легко менять идею), перед бетой (когда появляются реальные пользователи), и перед релизом (когда важны юридические и репутационные риски). Если команда совсем маленькая, MVP и бета могут быть одной сессией, но финальную перед релизом лучше не пропускать.
Участники: продукт (задача и аудитория), разработчик (ограничения и реализация), аналитик или человек, который смотрит на данные (пусть даже part-time), и поддержка или sales (они первыми услышат жалобы). Если поддержки нет, подойдет любой, кто регулярно общается с пользователями.
Главный артефакт - карточка риска на одну страницу. Она нужна не для красоты, а чтобы решения не растворялись в чате.
В карточке держите только то, что помогает принять решение:
Чтобы не утонуть, заранее ограничьте фокус: выберите 3-5 критичных сценариев и не больше 3-5 групп для каждого. Например, для ассистента в найме вместо абстрактных «всех» берут конкретные роли (джуны, сеньоры), форматы резюме (короткое, с пробелами, на английском) и признаки, которые точно нельзя использовать.
Фиксируйте итог так, чтобы через месяц было ясно, почему вы приняли решение: «приняли X, потому что Y, риск Z, пересмотр N». Это защищает от повторных споров и помогает улучшать процесс по мере роста.
Эту проверку можно уложить в 1-2 коротких созвона и несколько часов тестов, если заранее договориться о формате.
Описать решение и где оно влияет на людей. Одной фразой: что делает функция, на кого влияет и чем ошибка опасна (отказ, блокировка, унижение, неверный совет).
Составить список групп пользователей и контекстов использования. Сфокусируйтесь на 5-8 самых вероятных сочетаниях: возраст, опыт, язык, доступность, тип устройства, рабочая или личная ситуация.
Выбрать метрики успеха и метрики вреда. Успех - «правильно и полезно», вред - «ошибка, которая задевает человека». Удобно заранее определить 3-5 типов проблем: несправедливый отказ, токсичная формулировка, разные ответы на одинаковый запрос, утечка личных данных, опасный совет.
Так вы проверяете не абстрактную «справедливость ИИ», а конкретные сценарии и конкретный вред.
Собрать тестовые срезы и прогнать одинаковые проверки. Набор может быть небольшим (30-50 примеров), но разделенным по группам и контекстам. Важно, чтобы сценарий был один и тот же, а менялся только признак: тон, язык, роль, имя, опыт.
Решить, что делаем до релиза, а что откладываем. Зафиксируйте порог: какие ошибки блокируют релиз, а какие можно выпустить с ограничениями (предупреждение, ручная проверка, выключенный режим по умолчанию). Назначьте владельца и срок для отложенного.
Добавить мониторинг и правило отката при всплеске ошибок. Определите сигналы, которые вы смотрите каждую неделю (жалобы, частота отказов, доля «непонятных» ответов), и что считается тревогой. При тревоге должно быть простое действие: откат версии, выключение функции или возврат к более безопасному режиму.
Пример для чат-помощника, который предлагает текст ответа клиенту: проверьте один и тот же запрос в разных ролях (новичок, эксперт), с разными стилями (вежливо, резко) и разными именами. Если уважительность или качество меняются без причины, это продуктовый дефект, а не «особенность модели».
Начните с метрик, понятных продукту и поддержке. Цель не в том, чтобы «найти идеальную справедливость», а в том, чтобы увидеть, где система ошибается чаще и кого эти ошибки задевают сильнее.
Соберите небольшой проверочный набор и разметьте его по группам, которые реально встречаются в вашем продукте (тон голоса, язык интерфейса, тип устройства, условия съемки - только то, что уместно и законно). Затем посчитайте качество отдельно по каждой группе.
Для старта достаточно трех показателей: доля правильных ответов, доля пропусков (должна была сработать, но не сработала) и доля ложных тревог (не должна была, но сработала). Если разница между группами заметная, продукт будет «работать по-разному» для разных людей.
Во многих системах есть порог уверенности: выше - принимаем решение, ниже - отправляем на ручную проверку или просим повторить действие. Тут важно измерить не только качество, но и «цену» порога: сколько людей вы отсекаете и кого именно.
Практика: выберите 2-3 порога (строгий, средний, мягкий) и для каждого оцените, какая доля запросов уходит в «не уверен/нужна проверка», как меняются пропуски и ложные срабатывания, и как распределяется отсев по группам.
Ошибки бывают двух типов, и последствия у них разные. В антифроде ложная тревога раздражает клиента, а пропуск мошенничества стоит денег. В фильтре токсичности лишняя блокировка бьет по свободе общения и репутации, а пропуск - по безопасности.
Заранее договоритесь, что хуже именно для вашего продукта. Тогда обсуждение упрощается: «Мы готовы терпеть X ложных тревог, чтобы снизить пропуски до Y».
Даже если сегодня все хорошо, завтра меняются данные: сезонность, новые устройства, обновления камер, новая аудитория, другой словарь. Минимальная проверка - сравнить качество на «старых» и «новых» примерах (например, прошлый месяц и текущий). Просадка качества почти всегда значит, что изменился вход, контент или поведение пользователей.
Часть проблем выглядит как «предвзятость», но на деле это плохой вход: темно, шумно, камера слабая, акцент сильнее, язык смешанный. Сделайте простую матрицу условий (свет/шум/качество фото или аудио) и посмотрите, где система ломается.
Если вы делаете быстрый прототип (в том числе на TakProsto), полезно заранее зафиксировать минимальные требования к входу и честно показать их в UX: подсказки, повторная попытка, безопасный ручной путь. Иногда это снижает риск быстрее, чем попытки «подкрутить модель».
Представьте сервис, где вход происходит через селфи: пользователь смотрит в камеру, система сравнивает лицо и либо пускает в аккаунт, либо блокирует вход после нескольких неудач. На бумаге это удобно, но в реальности перекос в распознавании превращается в прямой вред: люди теряют доступ к деньгам, заказам или рабочим задачам.
Чтобы проверка была посильной, начните с одного сценария и одной метрики вреда: сколько людей неправильно не пускаем (ложный отказ) и как часто это случается в разных условиях.
Соберите срезы, которые чаще всего ломают селфи-верификацию. Не обязательно пытаться охватить весь мир - достаточно условий, где риск заметно растет:
Дальше - небольшой тестовый набор. Практичный размер: 30-100 примеров, распределенных по ключевым срезам, например по 5-10 на каждую проблемную комбинацию. Важно, чтобы примеры включали разные группы пользователей (пол, возрастные группы, разные оттенки кожи) и были собраны с согласия людей и понятными правилами хранения.
С результатами лучше работать «по-продуктовому», а не пытаться добить идеальную точность. Если в темноте система чаще ошибается для части пользователей, простые рычаги обычно такие: отправлять сомнительные случаи в ручную проверку, ограничить число жестких блокировок, дать альтернативный путь входа (код, документ, поддержка), просить переснять селфи при плохих условиях и логировать причины отказов.
Отдельно продумайте текст ошибки. Пользователь не должен слышать «ваше лицо не распознано» или «вы не тот человек», если система просто не уверена. Лучше нейтрально: «Снимок получился слишком темным. Встаньте лицом к источнику света и попробуйте еще раз. Если не получится, войдите по коду».
Если вы работаете короткими итерациями, такой сценарий удобно превратить в регулярную мини-проверку перед релизом: один и тот же набор примеров, одни и те же срезы, короткое решение, что меняем в порогах и UX.
Проверка предвзятости часто проваливается не потому, что команда «плохо старалась», а потому что тест устроен так, что он не может поймать проблему.
Если смотреть одну общую точность по всем пользователям, перекосы почти неизбежно пройдут мимо. Модель может отлично работать для большинства и стабильно ошибаться для меньшинства - средняя метрика это спрячет.
Привычка, которая помогает: регулярно смотреть результаты по небольшим срезам, которые реально отличаются по контексту. Не обязательно лезть в чувствительные признаки. Иногда достаточно устройства, условий съемки, языка, региона или статуса пользователя (новый vs постоянный).
Команда видит «в этой группе ошибок больше» и делает вывод, что причина в самой группе. Часто причина другая: данные собраны иначе, качество входов ниже, сценарии использования отличаются.
Пример: верификация личности чаще ошибается у пользователей со старыми камерами. Это выглядит как «проблема группы», но на деле это проблема качества изображения и порога решения. Если перепутать причину, можно исправлять не то.
Даже если вы не собираете пол, возраст или этничность, система все равно может быть несправедливой из-за прокси-признаков: язык, время активности, модель телефона, район, способ оплаты, длина имени, стиль письма.
И еще один важный момент: перекос может быть не в модели, а в продукте - кому вы показываете подсказки, кого отправляете на «допроверку», кому даете меньше попыток, как формулируете отказ.
Во многих продуктах итоговое решение принимает связка «скор + порог + бизнес-правила». Можно улучшить модель на тестах, но оставить порог, который и создает перекос.
Перед тем как «лечить модель», проверьте:
Если не фиксировать, где система работает плохо, продукт начинает обещать невозможное. Маркетинг пишет «распознает всех», поддержка обвиняет пользователя, а команда через месяц не помнит, какие риски уже находили.
Минимум, который спасает: короткое описание ограничений и известных провалов, что делать пользователю при ошибке, и где система не должна быть единственным источником решения.
Если вы делаете продукт в формате vibe-coding, такие заметки полезно держать рядом с проектом. Ограничения, пороги и формулировки меняются быстро, и их легко потерять между итерациями.
Перед релизом важно убедиться, что проверка не осталась «заметкой в блокноте». Зрелый признак - вы можете быстро показать, какие сценарии тестировали, какой вред возможен и что будете делать, если пользователи заметят проблему.
Короткий чеклист, который реально пройти за 30-60 минут, если основная работа уже сделана:
Если в одном из пунктов пусто, это не всегда повод отменять релиз. Но это повод сделать поведение продукта безопаснее: добавить «путь без риска» (например, запросить подтверждение, скрыть чувствительный вывод, включить ручную проверку) и честно обозначить ограничения.
Следующий шаг после релиза - закрепить процесс так, чтобы он повторялся в каждом спринте и не зависел от памяти конкретного человека:
Если вы ведете разработку в TakProsto, этот процесс удобно привязать к привычным шагам работы: в режиме планирования фиксировать риски и критерии, перед изменениями сохранять снапшоты и держать быстрый откат как обязательную часть релиза.
Лучший способ понять возможности ТакПросто — попробовать самому.