Бизнес-аналитик спрашивает: «Какова выручка за сентябрь?» Руководителю операций недостаточно получить одно число — ему нужны определение метрики, сохранённый SQL и перечень исключённых записей. Тогда ответ можно повторить и проверить.
Text-to-SQL, или text2sql, переводит вопрос на обычном языке в запрос к данным. Но модель не должна сама решать, что считать выручкой, выбирать похожие колонки или получать право на запись. Надёжный процесс начинается со словаря метрик и разрешённой схемы, а заканчивается проверкой SQL человеком.
Какую задачу решает этот процесс
Процесс подходит для вопросов к реляционной базе: аналитик формулирует вопрос, помощник составляет SELECT к ограниченной витрине, а проверяющий видит запрос и может воспроизвести результат. Например, в условном расчёте руководитель операций получает не просто «2500 условных денежных единиц», а пояснение: какие строки вошли в сумму, какой период использован и почему отменённые заказы исключены.
Граница процесса узкая: помощник читает только разрешённые объекты БД с ограниченными правами. Он не анализирует файл Excel, не изменяет рабочие данные и не записывает ответ в CRM. Передачу структурированных данных в рабочую систему стоит проектировать отдельно — этот смежный сценарий разобран в руководстве по передаче данных в CRM.
Какие данные и правила подготовить
До подключения модели составьте паспорт данных. В нём для каждого поля укажите источник, смысл, ответственного и статус. Ниже — заполненный синтетический образец без клиентских данных.
| Поле или правило | Источник | Ответственный | Статус | Что зафиксировать |
|---|---|---|---|---|
| Разрешённая схема | Каталог и описание витрины | Владелец витрины | Обязательно | Таблицы, колонки и допустимые связи |
| Словарь метрик | Утверждённые правила расчёта | Владелец метрики | Обязательно | Определение метрики, период, статусы и исключения |
| Учётная запись чтения | Настройки доступа к БД | Администратор БД | Обязательно | Минимальные права и разрешённые объекты |
| Шаблон SQL и параметры | Словарь метрик и схема | Аналитик данных | Обязательно | Допустимая структура запроса и параметры периода |
| Лимиты выполнения | Правила эксплуатации БД | Владелец БД | Обязательно | Timeout, лимит выдачи и порог стоимости плана |
| Проверочные вопросы | Словарь метрик | Владелец метрики | Обязательно | Статусы, даты, NULL, возвраты и валюты |
orders.order_id | Таблица orders | Владелец витрины | Обязательно | Идентификатор заказа |
orders.paid_at | Таблица orders | Аналитик данных | Обязательно | Дата, по которой заказ попадает в период |
orders.status | Таблица orders | Владелец метрики | Обязательно | Допустимые статусы и их смысл |
orders.amount | Таблица orders | Владелец метрики | Обязательно | Суммируемое значение и правило для NULL |
currency | Согласованная витрина | Владелец метрики | Условно | Нужно для мультивалютных данных; в учебной схеме поля нет |
| Трактовка возвратов | Правила заказчика | Профильный специалист заказчика | Неизвестно | Решить до расчёта реальной выручки |
Если таблица не помещается, прокрутите её вправо. С клавиатуры используйте стрелки.
К паспорту добавьте:
- схему разрешённых таблиц, колонок и связей;
- словарь бизнес-метрик с примерами вопросов;
- отдельную учётную запись с минимальными правами чтения;
- шаблоны SQL и параметры периода вместо свободной подстановки текста;
- allowlist объектов, лимит подробной выдачи, timeout и порог допустимой стоимости плана;
- проверочные вопросы: какой статус входит, по какой дате отбираются строки, что делать с NULL, возвратами и валютами.
Обязательные сведения блокируют запуск, если они не заполнены. Условные нужны только при соответствующем устройстве данных. Неизвестное нельзя заменять догадкой модели: решение принимает ответственный специалист.
Как перевести бизнес-вопрос в запрос к данным
Сначала разберите вопрос на определения. Для «выручки за сентябрь 2026 года» нужно согласовать три вещи:
- Метрика. В синтетическом примере выручка —
SUM(amount)только дляstatus = 'paid'. - Период. Используем полуинтервал:
paid_at >= DATE '2026-09-01'иpaid_at < DATE '2026-10-01'. Такая граница однозначно исключает 1 октября. - Статус.
canceledне входит в сумму.
Схема примера состоит из одной разрешённой таблицы reporting.orders, поэтому join не нужен. Имя схемы reporting условное; в рабочем запросе нужно использовать точное имя разрешённой схемы. Если для реального вопроса понадобится join, заранее укажите разрешённые таблицы, ключи и кардинальность связи. Без описанной связи помощник возвращает вопрос человеку: неверный join способен умножить строки и исказить сумму.
Нельзя угадывать колонку по похожему названию. Если словарь метрик не связывает слово «выручка» с orders.amount, orders.status и orders.paid_at, система должна спросить, какое поле, дату и набор статусов использовать.

Как ограничить выполнение SQL
Ограничение строится из нескольких независимых мер:
- отдельная роль получает
CONNECTк нужной базе,USAGEдля разрешённой схемы и только необходимые праваSELECTна объекты, но не становится владельцем и не получает прав записи; администратор отдельно проверяет права роли и при необходимости отзываетCREATEдля схем,TEMPORARYдля базы и ненужные праваEXECUTEна функции, в том числе выданныеPUBLIC; - запрос выполняется в транзакции
READ ONLY; - валидатор допускает только разрешённые схемы, таблицы, колонки, безопасные для чтения функции и связи;
- даты и другие значения передаются параметрами;
statement_timeoutостанавливает слишком долгую команду;- подробная выборка получает лимит строк;
- до выполнения система рассматривает план через
EXPLAINи сравнивает его оценку с правилами владельца БД.
Это учебная последовательность по документации PostgreSQL 18, а не отчёт о живом запуске. В PostgreSQL 18 транзакция READ ONLY запрещает перечисленные в документации команды записи для невременных таблиц и ряд DDL-команд, но остаётся высокоуровневым ограничением и не заменяет минимальные права роли. statement_timeout прерывает команду, превысившую заданное время. Значение порога зависит от базы и нагрузки.
LIMIT ограничивает число возвращённых строк, но не гарантирует дешёвое вычисление агрегата: для SUM серверу всё равно может понадобиться обработать множество строк. Оценка EXPLAIN также не равна измеренному времени — это оценка планировщика в его условных единицах.
Проверка одной подстроки SELECT не защищает систему. Запрос нужно разбирать по структуре и сопоставлять с allowlist. Полномочия роли и режим транзакции остаются обязательными даже после такой валидации.
Как проверить ответ и показать происхождение
Проверяющий должен видеть цепочку:
вопрос → определение метрики → таблицы и поля → SQL → исключённые строки → ручная сумма → решение.
Перед выполнением человек просматривает сгенерированный SQL. После выполнения он сравнивает результат с эталонным расчётом на контрольном наборе и читает пояснение исключений. Это позволяет отличить ошибку запроса от разногласия в определении метрики.
Неоднозначный вопрос не следует превращать в уверенный SQL. Например, фраза «покажи хорошие продажи за последнее время» не задаёт показатель, статусы, даты и валюту. Сигнал ошибки — отсутствуют обязательные определения. Действие человека — уточнить их и только затем разрешить новый запрос.
Учебный пример: путь от входных данных до результата
Все таблицы, имена, даты, суммы и лимиты ниже синтетические. Это не клиентский кейс Switch On AI и не результат живого теста.
Исходные данные:
| order_id | paid_at | status | amount |
|---|---|---|---|
| 101 | 2026-09-03 | paid | 1200 |
| 102 | 2026-09-11 | paid | 800 |
| 103 | 2026-09-28 | paid | 500 |
| 104 | 2026-09-15 | canceled | 900 |
| 105 | 2026-10-01 | paid | 700 |
Если таблица не помещается, прокрутите её вправо. С клавиатуры используйте стрелки.
Вопрос: «Какова выручка за сентябрь 2026 года?» Промежуточное решение: взять только paid, применить полуинтервал сентября и сложить amount. Строка 104 исключается по статусу, строка 105 — по верхней границе периода. Ручная сумма: 1200 + 800 + 500 = 2500 условных денежных единиц.
Учебный SQL для PostgreSQL 18 по официальной документации приведён с явными датами, чтобы расчёт можно было проверить вручную. В рабочей интеграции даты и другие входные значения нужно передавать параметрами, а не подставлять из текста вопроса:
| Шаг | SQL |
|---|---|
| Открыть транзакцию только для чтения | BEGIN TRANSACTION READ ONLY; |
| Задать условный лимит времени | SET LOCAL statement_timeout = '5s'; |
| Рассчитать выручку | SELECT COALESCE(SUM(amount), 0) AS revenue FROM reporting.orders WHERE status = 'paid' AND paid_at >= DATE '2026-09-01' AND paid_at < DATE '2026-10-01'; |
| Завершить транзакцию | COMMIT; |
Если таблица не помещается, прокрутите её вправо. С клавиатуры используйте стрелки.
Пять секунд — условный лимит примера, а не универсальная рекомендация. Владелец БД выбирает его по своей нагрузке. SUM пропускает значения amount, равные NULL. Если подходящих строк нет или во всех подходящих строках amount равен NULL, результатом будет NULL; COALESCE(..., 0) превратит его в ноль. Это правило нужно согласовать с владельцем метрики: отсутствие заказов и заказы с неизвестной суммой могут требовать разных решений.
| Вопрос | Определение метрики | SQL-ограничение | Контрольная сумма | Решение |
|---|---|---|---|---|
| Какова выручка за сентябрь 2026? | SUM(amount), только status = 'paid' | orders из allowlist; период [2026-09-01, 2026-10-01); read-only; timeout 5s | 1200 + 800 + 500 = 2500 | Вернуть 2500; исключить canceled и запись 1 октября |
Если таблица не помещается, прокрутите её вправо. С клавиатуры используйте стрелки.
Есть и отрицательный путь. На просьбу «удали отменённые заказы» помощник не должен генерировать или выполнять DELETE. Он сообщает, что операция записи запрещена, и передаёт запрос уполномоченному человеку. Это ожидаемое поведение проектируемой системы, а не заявление о проведённом тесте.

Как проверить результат перед запуском
Составьте приёмочные сценарии до подключения рабочей базы.
| Сценарий | Ожидаемый результат | Сигнал ошибки | Действие человека |
|---|---|---|---|
| Согласованный вопрос о выручке | Видны SQL, период, статус, исключения и результат 2500 на синтетическом наборе | SQL использует другой статус, дату, поле или объект вне allowlist | Остановить выполнение, исправить словарь или шаблон и повторить проверку |
В подходящих строках есть amount IS NULL | Результат следует согласованному правилу обработки NULL | NULL пропущен без пояснения или ошибочно превращён в сумму | Владелец метрики решает, исключать запись, останавливать расчёт или исправлять данные |
| За период нет подходящих строк | COALESCE возвращает 0, только если это согласованное правило | Ноль показан как выручка без различия между отсутствием строк и проблемой данных | Сверить правило метрики и при необходимости убрать COALESCE |
| Вопрос неоднозначен | Помощник запрашивает метрику, статусы, период и валюту | SQL создан по догадке | Не разрешать запрос до уточнения |
| Пользователь просит удалить данные | Запрос записи не создаётся и не выполняется | Появился DELETE или другая команда изменения | Заблокировать операцию и передать запрос уполномоченному сотруднику |
| Запрос превышает согласованный лимит | Команда останавливается, успех не показывается | Timeout или превышение допустимой оценки плана | Аналитик и владелец БД разбирают запрос, данные и пороги |
Если таблица не помещается, прокрутите её вправо. С клавиатуры используйте стрелки.
В тестовых материалах не должно быть реальных паролей, строк подключения и секретов. Отдельно проверьте роль чтения, read-only-транзакцию, allowlist, границы периода, статусы и NULL. SQL-инструкции в этом руководстве относятся к PostgreSQL 18; для другой версии или СУБД синтаксис и поведение нужно сверить с её документацией.
Что согласовать для внедрения
Готовый Text-to-SQL-инструмент может дать интерфейс и генерацию запросов, но сам по себе не знает определения ваших метрик, допустимые связи и правила доступа. Собственная интеграция связывает вопрос, словарь метрик, валидатор, учётную запись БД, журнал решений и передачу спорного случая человеку. Конкретную совместимость, тарифы, API и права выбранного продукта проверяют отдельно.
Switch On AI разрабатывает ИИ-помощника, бота или интеграцию для этой операции после проверки данных и API. Для данного сценария цель формулируется так: ответ на вопрос к базе можно воспроизвести по разрешённому SQL-запросу. Если модель выбирает разрешённый инструмент и запрашивает уточнения, уместен ИИ-помощник; если шаги всегда фиксированы, может хватить обычной интеграции. Диалоговый бот — лишь один из возможных интерфейсов.
Правила бухгалтерского, юридического, кадрового или отраслевого учёта задаёт и проверяет специалист заказчика. Этот материал не доказывает выполненное внедрение или совместимость с конкретным вендором.
Следующий шаг — выбрать ограниченную витрину и несколько типовых вопросов для пилота. На странице разработки ИИ-агентов можно сверить состав подходящей услуги. Затем можно разобрать одну операцию со Switch On AI и согласовать прототип: без обещания полного отраслевого внедрения, срока или гарантированного эффекта.
Вопросы по этой задаче
Можно ли подключить помощника к рабочей базе?
Можно проектировать такое подключение только после проверки схемы, прав и способов доступа. Помощнику нужна отдельная учётная запись с минимальными правами чтения, allowlist объектов, ограничения ресурсов и передача неоднозначных вопросов человеку. Сначала безопаснее проверить сценарий на ограниченной витрине и обезличенных примерах.
Как проверять правильность SQL?
Сопоставьте запрос со словарём метрик и схемой: проверьте таблицы, поля, связи, статусы, границы периода и обработку NULL. Затем сравните ответ с ручным эталонным расчётом, изучите исключённые строки и убедитесь, что запрос использует только разрешённые объекты.
Что делать с неоднозначным вопросом?
Не генерировать запрос по догадке. Помощник должен уточнить показатель, период, статусы, валюту и другие обязательные условия. Выполнение разрешают только после того, как ответы можно связать с согласованным определением метрики.
