От демонстраций преобразования данных из NL в SQL до ассистента для анализа с данными ИИ в изолированной среде
От демонстраций преобразования NL в SQL до аналитического помощника ИИ в изолированной среде: списки разрешенных схем, статические проверки, изолированная обработка, ограничения на результаты и журналы аудита для каждого запроса.
Источники: From “Natural Language to SQL” to a Secure AI Analytics Assistant: An Architecture Evolution
Позволение языковой модели писать и запускать код для аналитики — это проблема многократной защиты, а не трюк с запросами.
Исходная проблема
У бизнес-пользователей есть вопросы — «средняя цена дома по городам», «десять самых дорогих недвижимостей», «максимальная цена за квадратный фут» — но у них нет навыков SQL. Очевидным решением является преобразование естественного языка в SQL: задать вопрос на английском, сгенерировать запрос и выполнить его.
Версия один: простое преобразование естественного языка в SQL
Ранние версии генерируют SQL на основе вопроса и выполняют его в хранилище данных. Демонстрации производят впечатление. Затем кто-то просит выполнить расчёт, который плохо описуется SQL, или модель выдумывает новую колонку, или тщательно составленный запрос пытается выполнить команду DROP TABLE.
SELECT city, AVG(house_price) AS avg_price
FROM house_pricing
GROUP BY city;
SELECT department, AVG(salary) FROM employees GROUP BY department;
result = (
df.groupby("department")["salary"]
.mean()
.reset_index()
)
import os
os.remove("file.csv")
import subprocess
subprocess.run(…)
Полный отказ от SQL
Более гибкий подход: позвольте модели писать короткие скрипты на Python с использованием ограниченного API для работы с таблицами вместо простых строк SQL. Это открывает возможности для анализа в стиле pandas, но также увеличивает риски при отсутствии контроля за выполнением.
Обеспечение надежности запросов
Надежные запросы означают:
- карточки схем, содержащие только разрешенные таблицы/столбцы
- примеры безопасных шаблонов в формате нескольких примеров
- явный отказ, если в запросе требуются запрещенные поля
- структурированный вывод (блоки кода или JSON), который можно парсить
Самая важная проблема: выполнение кода, сгенерированного ИИ
Выполнение кода является ключевым элементом безопасности. Никогда не запускайте код модели в процессе приложения с полными привилегиями. Используйте песочницу: отсутствие доступа в сеть, ограниченные ресурсы CPU/памяти, разрешенный список импортов, таймауты и режим чтения только утвержденных наборов данных.
Многоуровневая защита
Многоуровневые механизмы защиты:
- Брандмауэр запросов — блокировка попыток обхода защиты и запросов, выходящих за рамки допуска
- Список разрешенных схем — модель видит только утвержденные поля
- Статические проверки — запрет на импорт, операции ввода-вывода с файлами, использование функции
evalи подпроцессов - Среда выполнения в песочнице — изоляция процесса выполнения
- Ограничения результатов — лимиты по количеству строк/байт перед возвратом к интерфейсу
- Журнал аудита — кто сделал запрос, какой код был выполнен и что было возвращено
Обеспечение устойчивости, а не только безопасности
Повторные попытки при временных сбоях, возможность использования детерминированных начальных условий, кэширование схем, а также передача запроса человеку в случаях, когда модель не может ответить безопасно. Безопасность без устойчивости приводит лишь к вежливым ошибках.
Сформировавшаяся архитектура
Gateway → policy → planner/prompt → sandboxed executor → formatter → audit. SQL может по-прежнему использоваться в качестве внутреннего инструмента для простых фильтров, но Python-in-a-box справляется со сложными аналитическими задачами, не позволяя выполнять произвольные запросы.
Почему именно этот проект оказался более интересным
NL-to-SQL — это демонстрация процесса перевода. Безопасные аналитические помощники представляют собой продукт инженерии: модели угроз, сандбоксы, списки разрешенных действий и интерфейс, объясняющий отказы. Именно в этом заключается работа, которую стоит сохранять.
Необходимо создать «золотой набор»: запросы добронамеренные, запросы для проверки схемы и попытки злонамеренного импорта. Сборка должна провалиться, если какой-либо злонамеренный запрос будет выполнен вне сандбокса или если добронамеренный запрос будет ложно отклонен без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна провалиться, если любой злонамеренный случай будет выполнен вне песочницы или если добронамеренный случай ложно откажет без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна провалиться, если любой злонамеренный случай будет выполнен вне песочницы или если добронамеренный случай ложно откажет без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна провалиться, если любой злонамеренный случай будет выполнен вне песочницы или если добронамеренный случай ложно откажет без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна завершиться с ошибкой, если любой злонамеренный запрос будет выполнен вне песочницы или если добронамеренный запрос ложно отклонится без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна завершиться с ошибкой, если любой злонамеренный запрос будет выполнен вне песочницы или если добронамеренный запрос ложно отклонится без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна завершиться с ошибкой, если любой злонамеренный запрос будет выполнен вне песочницы или если добронамеренный запрос ложно отклонится без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна завершиться с ошибкой, если любой злонамеренный запрос будет выполнен вне песочницы или если добронамеренный запрос ложно отклонится без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна завершиться с ошибкой, если любой злонамеренный запрос будет выполнен вне песочницы или если добронамеренный запрос ложно отклонится без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна завершиться с ошибкой, если любой злонамеренный запрос будет выполнен вне песочницы или если добронамеренный запрос ложно отклонится без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна завершиться с ошибкой, если любой злонамеренный запрос будет выполнен вне песочницы или если добронамеренный запрос ложно отклонится без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна завершиться с ошибкой, если любой злонамеренный запрос будет выполнен вне песочницы или если добронамеренный запрос ложно отклонится без четкой причины.
Предоставьте «золотой набор»: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка должна завершиться с ошибкой, если любой злонамеренный запрос будет выполнен вне песочницы или если добронамеренный запрос ложно отклонится без четкой причины.
Золотой набор тестов: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка считается неудачной, если любой злонамеренный тест выполняется вне песочницы или если добронамеренный тест ложно отклоняет запрос без четкой причины.
Золотой набор тестов: добронамеренные запросы, запросы на проверку схемы и попытки злонамеренного импорта. Сборка считается неудачной, если любой злонамеренный тест выполняется вне песочницы или если добронамеренный тест ложно отклоняет запрос без четкой причины.