С некоторым уровнем контроля и гарантиями безопасности. Барьеры безопасности обеспечивают это для приложений на базе ИИ. Но как именно их интегрировать в приложения?
Некоторые барьеры устанавливаются еще до начала разработки кода. Во-первых, существуют юридические барьеры от государства, такие как Закон ЕС об ИИ, который определяет допустимые и запрещенные сценарии применения ИИ. Затем следуют корпоративные политики, которые задают рамки для приемлемых сценариев использования ИИ с учетом вопросов безопасности и этики. Эти два типа барьеров отсеивают неподходящие сценарии для внедрения ИИ.
После прохождения первых двух этапов приемлемый сценарий попадает к команде разработчиков. При реализации сценария инженеры добавляют технические барьеры, чтобы гарантировать безопасное обращение с данными и поддерживать предсказуемое поведение приложения. В этой статье мы разберем третий тип барьеров.
Основные технические барьеры на различных уровнях ИИ-приложений
Барьеры внедряются на уровнях ввода, модели и вывода. Каждый из них выполняет особую функцию:
- Уровень данных: Барьеры на этом уровне предотвращают попадание в систему чувствительных, проблемных или неверных данных.
- Уровень модели: Полезно устанавливать барьеры здесь, чтобы убедиться в корректной работе модели.
- Уровень вывода: Барьеры на выходе гарантируют, что модель не выдает неверные ответы с высокой степенью уверенности — типичная уязвимость ИИ-систем.

1. Уровень данных
Рассмотрим обязательные барьеры на уровне данных:
(i) Валидация и очистка ввода
Первое, что нужно проверить в любом ИИ-приложении, — это соответствие входных данных правильному формату и отсутствие в них неподобающего или оскорбительного языка. Это относительно просто реализовать, поскольку большинство баз данных предоставляют встроенные SQL-функции для сопоставления шаблонов. Например, если столбец должен содержать только буквенно-цифровые символы, можно подтвердить формат значений с помощью простого регулярного выражения. Аналогично, в облачных сервисах вроде Microsoft Azure есть функции для проверки на непристойный язык. Если в вашей базе такой нет, всегда можно создать собственную функцию.
Валидация данных: – Запрос ниже выбирает записи из таблицы клиентов, где customer_email_id имеет валидный формат SELECT * FROM customers WHERE REGEXP_LIKE(customer_email_id, '^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$'); —----------------------------------------------------------------------------------------- Очистка данных: – Создание пользовательской функции offensive_language_check для выявления оскорбительного языка CREATE OR REPLACE FUNCTION offensive_language_check(INPUT VARCHAR) RETURNS BOOLEAN LANGUAGE SQL AS $$ SELECT REGEXP_LIKE(INPUT '\b(abc|...)\b', — список оскорбительных слов, разделенных вертикальной чертой ); $$; – Применение пользовательской функции profanity_check для фильтрации комментариев с оскорбительным языком SELECT user_comments from customer_feedback where offensive_language_check(user_comments)=0; (ii) Защита PII и чувствительных данных
Еще один важный аспект при создании безопасного ИИ-приложения — убедиться, что персональные идентифицирующие данные (PII) не доходят до уровня модели. Большинство инженеров данных сотрудничает с межфункциональными командами, чтобы пометить все столбцы с PII в таблицах. Существуют также автоматизированные инструменты для идентификации PII, которые проводят профилирование данных и отмечают соответствующие столбцы с помощью моделей машинного обучения. Типичные столбцы PII включают: имя, адрес электронной почты, номер телефона, дату рождения, номер социального страхования (SSN), номер паспорта, номер водительских прав и биометрические данные. Другие примеры косвенных PII — медицинская или финансовая информация.
Обычный способ предотвратить попадание таких данных в систему — применить механизм деидентификации. Это может быть полное удаление данных или использование продвинутых методов маскировки или псевдонимизации через хэширование, которое делает данные нечитаемыми для модели.
– Хэширование PII-данных клиентов для обеспечения конфиденциальности SELECT SHA2(customer_name, 256) AS encrypted_customer_name, SHA2(customer_email, 256) AS encrypted_customer_email, … FROM customer_data (iii) Выявление и устранение предвзятости
Перед передачей данных на уровень модели необходимо подтвердить их точность и отсутствие предвзятости. Среди распространенных видов предвзятости:
- Предвзятость отбора: Входные данные неполные и не отражают полностью целевую аудиторию.
- Предвзятость выживших: Больше данных для успешных сценариев, что затрудняет работу модели с неудачными случаями.
- Расовая или ассоциативная предвзятость: Данные отдают предпочтение определенному полу или расе из-за исторических шаблонов или предрассудков.
- Предвзятость измерения или меток: Данные неверны из-за ошибок в разметке или предвзятости того, кто их записывал.
- Предвзятость редких событий: Входные данные не содержат крайних случаев, давая неполную картину.
- Временная предвзятость: Входные данные устаревшие и не отражают текущую реальность.
Хотя хотелось бы простую систему для обнаружения таких предвзятостей, на деле это требует тщательной ручной работы. Специалист по данным должен выполнять запросы и тестировать данные на каждом сценарии, чтобы выявить предвзятость. Например, если вы разрабатываете приложение для здоровья и у вас недостаточно данных для определенной возрастной группы или индекса массы тела (BMI), то вероятность предвзятости высока.
– Проверка на отсутствие данных по возрастным или BMI-группам select age_group, count(*) from users_data group by age_group; select BMI, count(*) from users_data group by BMI; (iv) Своевременная доступность данных
Еще один параметр для проверки — актуальность данных. Для эффективной работы моделей нужны правильные и релевантные данные. Некоторые модели требуют данных в реальном времени, другие — почти в реальном, а для кого-то хватит пакетной обработки. Независимо от нужд, необходима система мониторинга, чтобы убедиться в наличии свежих данных.
Например, если менеджеры категорий обновляют цены продуктов каждую полночь в зависимости от рыночных условий, модель должна использовать данные, обновленные после полуночи. Можно настроить оповещения о устаревших данных или внедрить проактивный мониторинг в слой оркестрации данных, отслеживая timely ETL-пайплайны.
– Создание оповещения, если данные за сегодня недоступны SELECT CASE WHEN TO_DATE(last_updated_timestamp) != TO_DATE(CURRENT_TIMESTAMP()) THEN 'FRESH' ELSE 'STALE' END AS table_freshness_status FROM product_data; (v) Целостность данных
Поддержание целостности также критично для точности модели. Целостность данных подразумевает их точность, полноту и надежность. Любые старые, нерелевантные или неверные данные в системе приведут к хаосу в выводах. Например, если вы создаете чат-бот для клиентов, он должен иметь доступ только к последним файлам с политиками компании. Доступ к неверным документам может вызвать галлюцинации, когда модель смешивает термины из разных файлов и дает полностью ошибочный ответ клиенту. И вы все равно понесете юридическую ответственность, как это произошло с Air Canada, которая вернула деньги за билеты, когда ее чат-бот ошибочно пообещал возврат.
Прямых методов проверки целостности нет. Аналитикам и инженерам данных приходится вручную проверять файлы и данные, убеждаясь, что на уровень модели попадают только актуальные и релевантные. Поддержание целостности — лучший способ контролировать галлюцинации, предотвращая ситуацию 'мусор на входе — мусор на выходе'.
2. Уровень модели
После уровня данных в слой модели можно добавить следующие контрольные точки:
(i) Разрешения пользователей по ролям
Защита уровня модели ИИ важна, чтобы избежать несанкционированных изменений, которые могут внести ошибки или предвзятость. Это также предотвращает утечки данных. Необходимо контролировать доступ к этому слою. Стандартный подход — контроль доступа на основе ролей (RBAC), где доступ имеют только сотрудники в авторизованных ролях, такие как инженеры машинного обучения, специалисты по данным или инженеры данных.
Например, инженеры DevOps могут иметь только чтение, поскольку не должны менять логику модели. Инженеры ML — чтение и запись. Внедрение RBAC — ключевой практикум безопасности для сохранения целостности модели.
(ii) Аудит предвзятости
Работа с предвзятостью — непрерывный процесс. Она может появиться позже в системе, даже если на входе все проверки пройдены. Некоторые предвзятости, особенно подтверждение (confirmation bias), возникают именно на уровне модели. Это происходит, когда модель полностью переобучена на данных, не оставляя места для нюансов. В случае переобучения модель нуждается в калибровке. Популярный метод — сплайн-калибровка, которая вносит небольшие корректировки в данные для соединения всех точек.
import numpy as np import scipy.interpolate as interpolate import matplotlib.pyplot as plt from sklearn.metrics import brier_score_loss # Высокий уровень шагов: #Определить входные (x) и выходные (y) данные для подгонки сплайна #Установить параметры B-сплайна: степень и количество узлов #Использовать функцию splrep для вычисления представления B-сплайна #Оценить сплайн на диапазоне x для генерации гладкой кривой #Построить график оригинальных данных и кривой сплайна для визуального сравнения #Рассчитать Brier score для оценки точности предсказаний #Использовать eval_spline_calibration для оценки сплайна на новых x #В финале проанализировать график: #Проверить качество подгонки (хорошая, переобучение, недообучение), подтвердить соответствие ожидаемым тенденциям и интерпретировать Brier score для производительности модели. ######## Пример кода для шагов выше ######## # Пример данных: Подстройте под реальные точки x_data = np.array([...]) # Входные x значения, замените '...' на реальные данные y_data = np.array([...]) # Соответствующие y значения, замените '...' на реальные данные # Подгонка B-сплайна к данным k = 3 # Степень сплайна, обычно кубический (k=3) num_knots = 10 # Количество узлов для интерполяции сплайна, настройте по сложности данных knots = np.linspace(x_data.min(), x_data.max(), num_knots) # Равномерно распределенные узлы по диапазону данных # Вычислить представление сплайна # Функция 'splrep' вычисляет B-сплайн представление 1D-кривой tck = interpolate.splrep(x_data, y_data, k=k, t=knots[1:-1]) # Оценить сплайн в желаемых точках x_spline = np.linspace(x_data.min(), x_data.max(), 100) # Генерация x для гладкой кривой сплайна y_spline = interpolate.splev(x_spline, tck) # Оценка сплайна в x_spline # Построить результаты plt.figure(figsize=(8, 4)) plt.plot(x_data, y_data, 'o', label='Data Points') # Оригинальные точки plt.plot(x_spline, y_spline, '-', label='B-Spline Calibration') # Кривая сплайна plt.xlabel('x') plt.ylabel('y') plt.title('Spline Calibration') plt.legend() plt.show() # Рассчитать Brier score для сравнения # Brier score измеряет точность вероятностных предсказаний y_pred = interpolate.splev(x_data, tck) # Оценка сплайна в оригинальных точках brier_score = brier_score_loss(y_data, y_pred) # Brier score между оригиналом и предсказанными print("Brier Score:", brier_score) # Заглушка для функции калибровки # Эта функция оценивает сплайн в произвольных x def eval_spline_calibration(x_val): return interpolate.splev(x_val, tck) # Возврат оценки сплайна для x_val (iii) LLM в роли судьи
Использование большой языковой модели (LLM) как судьи — интересный метод валидации моделей, где одна LLM оценивает вывод другой. Это заменяет ручное вмешательство и позволяет масштабировать проверку ответов.
Для реализации LLM как судьи нужно создать промпт, который будет оценивать вывод. Результат промпта должен быть измеримым, например, баллом или рейтингом.
Пример промпта для справки: Назначьте балл полезности ответу на основе политик компании, где 1 — наивысший балл, а 5 — наинизший Вывод такого промпта можно использовать для запуска системы мониторинга, когда ответы неожиданны.
Совет: Одно из преимуществ недавних технологических достижений — нет нужды строить LLM с нуля. Доступны готовые решения, такие как Meta Llama, которые можно скачать и запустить локально.
(iv) Непрерывная доработка
Для долгосрочного успеха любой модели необходима регулярная доработка для повышения точности. Простой способ — ввести обучение с подкреплением на основе человеческой обратной связи, где рецензенты оценивают вывод модели, и она учится на этом. Но процесс ресурсоемкий. Для масштаба нужна автоматизация.
Распространенный метод доработки — адаптация низкого ранга (LoRA). В этой технике создается отдельный обучаемый слой с логикой оптимизации. Можно улучшить точность вывода, не трогая базовую модель. Например, при создании системы рекомендаций для стриминговой платформы, если текущие рекомендации не приводят к кликам, в слое LoRA строится логика группировки кластеров зрителей с похожими привычками просмотра и использование кластерных данных для рекомендаций. Этот слой применяется до достижения нужной точности.
3. Уровень вывода
На уровне вывода проводятся финальные проверки для обеспечения безопасности:
(i) Фильтрация контента по языку, непристойности, блокировке ключевых слов
Аналогично уровню ввода, на выходе тоже применяется фильтрация для выявления оскорбительного языка. Двойная проверка гарантирует отсутствие негативного опыта для конечных пользователей.
(ii) Валидация ответов
Базовые проверки ответов модели можно реализовать через простую правилооснованную систему. Это может включать верификацию формата вывода, допустимых значений и т.д. Легко сделать на Python или SQL.
– Простая правилооснованная проверка для пометки неверных ответов select CASE WHEN <condition_1> THEN ‘INVALID’ WHEN <condition_2> THEN ‘INVALID’ ELSE ‘VALID’ END as OUTPUT_STATUS from output_table; (iii) Порог уверенности и триггеры с участием человека
Ни одна ИИ-модель не идеальна, и это нормально, если можно привлекать человека при необходимости. Есть ИИ-инструменты, где можно жестко задать, когда использовать ИИ, а когда запускать триггер с человеком в цикле. Можно автоматизировать это через порог уверенности. Если модель показывает низкую уверенность в выводе, запрос перенаправляется человеку для точного ответа.
import numpy as np import scipy.interpolate as interpolate # Один вариант генерации балла уверенности — использование B-сплайна или его производных для входных данных # scipy имеет функцию interpolate.splev, которая принимает два основных входа: # 1. x: x-значения для оценки сплайна # 2. tck: кортеж (t, c, k), представляющий узлы, коэффициенты и степень сплайна. Это можно сгенерировать с помощью make_splrep (или старой splrep) или вручную # Генерация баллов уверенности и удаление значений вне 0 и 1, если они есть predicted_probs = np.clip(interpolate.splev(input_data, tck), 0, 1) # Объединение балла с входными данными confidence_results = list(zip(input_data, predicted_probs)) # Установка порога и выявление входов, не соответствующих ему, для ручной проверки threshold = 0.5 filtered_results = [(i, score) for i, score in confidence_results if score <= threshold] # Записи для маршрутизации на ручную/человеческую проверку for i, score in filtered_results: print(f"x: {i}, Confidence Score: {score}") (iv) Непрерывный мониторинг и оповещения
Как и любое программное приложение, модели ИИ нуждаются в системе логирования и оповещений, которая выявляет ожидаемые и неожиданные ошибки. С этим барьером вы получаете подробный лог для каждого действия и автоматическое уведомление при проблемах.
(v) Соответствие регуляциям
Большая часть работы по compliance происходит задолго до уровня вывода. Юридически допустимые сценарии определяются на этапе сбора требований. Чувствительные данные хэшируются на входе. Если есть дополнительные регуляторные нужды, такие как шифрование данных, это можно реализовать на выходе через простую правилооснованную систему.
Баланс между ИИ и человеческим опытом
Барьеры безопасности позволяют максимально использовать автоматизацию ИИ, сохраняя при этом контроль над процессом. В статье рассмотрены все распространенные типы барьеров, которые могут потребоваться на разных уровнях модели.
Кроме того, если вы столкнетесь с фактором, влияющим на ожидаемый вывод модели, можно установить барьер и для него. Эта статья — не жесткая формула, а руководство по выявлению (и устранению) типичных препятствий. В итоге ваше ИИ-приложение должно выполнять предназначенное: автоматизировать рутинную работу без лишних хлопот. И барьеры безопасности помогают этого добиться.