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

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