История создания Text2SQL

История создания Text2SQL

С недавним развитием технологий ИИ также произошли значительные изменения в способах использования данных.

Чтобы решить проблему, как быстрее и точнее обрабатывать многочисленные запросы на извлечение данных (Ad Hoc), поступающие из бизнеса, я хочу исследовать последние тенденции технологии 'Text2SQL' и поделиться материалами для рассмотрения внедрения проекта.

1. Проблема: задолженность, накапливающаяся у разработчиков, и узкие места в принятии решений.

Существует общая ситуация, с которой сталкивается большинство организаций, использующих данные, включая наш проект.

- "Пожалуйста, напишите один запрос, чтобы узнать, сколько обучающихся соответствует таким условиям."

- "Мне нужны данные о результатах обучения за прошлую неделю, когда я могу их получить?"

Проблема в том, что такие запросы поступают не в одном-двух экземплярах. В качестве разработчика я трачу время не на фактический анализ и моделирование, а на написание простых запросов, и в результате запросы клиентов и проектировщиков создают узкие места, поскольку они ждут результатов для принятия решений.

Почему возникают такие проблемы?

1. Барьер SQL: большинство сотрудников, кроме разработчиков проекта, не знают SQL или, даже если знают, им трудно самостоятельно составить запрос с сложной бизнес-логикой.

2. Неясные вопросы: даже один вопрос "Скажите, пожалуйста, какой у нас коэффициент выполнения?" может иметь разные условия по времени, отделу и деталям курса, в результате чего возникают большие коммуникационные издержки.

3. Целостность данных: возникают низкие уровни доверия к сгенерированным запросам из-за галлюцинаций, возникающих при простой интеграции LLM.

2. Решение: естественный язык в SQL, создание сервиса 'Text2SQL'.

Чтобы решить эту проблему, мы хотим внедрить сервис Text2SQL, который будет создавать исполняемые SQL-запросы по запросам на естественном языке.

Почему 'Text2SQL'?

Text2SQL играет роль 'моста', который преодолевает 'языковые барьеры' между данными и людьми, и причина, по которой мы выбрали эту технологию как решение, заключается в следующих привлекательных аспектах.

- Реализация демократизации данных: даже планировщик или клиент, не знающий SQL, может задавать вопросы о данных на своем языке и получать ответы. Это ускоряет 'принятие решений на основе данных', распространяя полномочия по данным на всю организацию.

- Революционное улучшение производительности разработки: разработчикам предоставляется возможность сосредоточиться на проектировании более ценной бизнес-логики и улучшении архитектуры, сокращая время на ручное написание простых запросов на извлечение данных.

- Возможность обмена данными в реальном времени: теперь не нужно ждать несколько дней, чтобы получить отчет, вы можете сразу же увидеть результаты вопроса, что максимизирует гибкость бизнеса.

Ключевым моментом является сочетание специализированных знаний о проектах с LLM, выходя за рамки простого задавания вопросов. Изначально рассматривали DSL (язык специальной области) с заранее определенными всеми правилами, но сейчас ищем техническое решение для повышения точности в направлении 'гибкой структуры с акцентом на маленькие модели' и 'системы верификации на основе выполнения'.

3. Примеры реализации и стратегии проектирования

Давайте рассмотрим конкретные архитектуру и технические элементы, которые необходимо учитывать для внедрения реального проекта.

3-1. Построение системы: укрепление знаний на базе RAG

Принцип 'Garbage In, Garbage Out' также применим к Text2SQL. Мы создаем следующий неструктурированный поток данных, чтобы LLM могла понять сложную структуру таблиц нашего проекта.

- Укрепление метаданных таблицы: собираем не только имена столбцов, но и собираем обширную информацию DDL, включая цель столбца, характеристики и примеры основных значений.

- Использование примеров Few-shot SQL: предоставляем заранее подготовленные высококачественные пары запросов, чтобы аналитик данных или разработчик смогли дать модели возможность учиться на стиле запросов и бизнес-логике нашего проекта.

3-2. Стратегия вызова и интеграции в проекте Java Spring

Поскольку наш проект основан на Java/Spring, важно, как интегрировать экосистему LLM на Python. Можно рассмотреть две основные стратегии.

Стратегия A: Построение и вызов API сервера на Python

Наиболее рекомендуемый подход заключается в создании отдельного микросервиса на Python (FastAPI) через библиотеку LLM (LangChain) и его вызова через REST API в Spring Boot.

// Пример вызова сервера Python Text2SQL из Spring Boot
  @Service
public class Text2SqlService {
    private final RestClient restClient = RestClient.create();

    ...
    public String generateSql(String question) {
        return restClient.post()
                .uri("http://ai-service/generate-sql")
                .contentType(MediaType.APPLICATION_JSON)
                .body(Map.of("question", question))
                .retrieve()
                .body(String.class);
    }
}

Стратегия B: Нативная реализация Java с использованием LangChain4j

Если вы хотите интегрировать LLM непосредственно в проект Spring Boot без создания отдельного сервера, вы можете использовать библиотеку LangChain4j.

// Пример создания SQL на основе Java с использованием LangChain4j
  public interface SqlGenerator {
    @UserMessage("자연어 질문: {{it}}. 이 질문을 바탕으로 실행 가능한 SQL을 생성해줘. 테이블 정보: ...")
    String generate(String question);
}
// Service 로직
public void executeUserQuestion(String question) {
    String sql = sqlGenerator.generate(question);
    List<Map<String, Object>> result = jdbcTemplate.queryForList(sql);
    // 결과 처리...
}

3-3. Самокоррекция и цикл валидации

Одновременно проверяем, правильна ли созданная SQL с точки зрения синтаксиса и бизнес-целесообразности полученных результатов.

1. Генерация SQL: LLM создает SQL на основе заданного вопроса.

2. Попытка выполнения: Используя `JdbcTemplate` Spring, выполняем запрос в реальной БД (или в Read-only песочнице).

3. Обработка ошибок: Если возникает `SQLException`, мы передаем сообщение об ошибке обратно в LLM.

4. Исправление: LLM переписывает запрос на основе сообщения об ошибке, повторяя этот процесс до тех пор, пока не будет успешным (максимум N раз).

4. Результаты внедрения и будущие задачи

Ожидаемые эффекты внедрения

- Снижение технического долга: Автоматизация повторяющихся простых запросов повысит концентрацию на основной работе разработчиков.

- Демократизация данных: Даже планировщики или клиенты, не знающие SQL, смогут исследовать данные и извлекать инсайты с помощью естественного языка.

- Инновации в скорости принятия решений: Время ожидания, измеряемое в неделях, сокращается до уровней мгновенного ответа в секунды.

Будущие улучшения (по состоянию на 2026 год)

Хотя современные модели показывают высокую точность в бенчмарке BIRD-SQL, им все еще нельзя доверять на 100%.

- Интеграция семантического слоя: необходимо более строго управлять определением показателей, связывая семантическую модель (например, способ расчета коэффициента выполнения).

- Укрепление интерактивного интерфейса: необходимо усилить функцию уточнения у пользователя в случае неясных вопросов, чтобы предотвратить неопределенность.

5. Заключение...

Чтобы решить узкие места в анализе данных, наступила эпоха, когда умные сервисы, такие как Text2SQL, стали необходимыми.

Важно сначала построить проверяемую структуру, а затем постепенно улучшать её, вместо того чтобы ждать идеального результата.

Мы успешно внедрим рассмотренную систему Text2SQL в наш проект, создавая среду, в которой каждый сможет общаться с данными и принимать более обоснованные решения.

sauce0127

Site footer