Нейроконнекторы

Нейроконнекторы (ML)

Цель

Создание инструмента для формирования скрипта загрузки без необходимости использовать SQL в секции подключения.

Концепт ML

Языковая модель, способная обрабатывать запросы от пользователя и давать ответ + преобразовывать их в код на языке ClickHouse. Должна уметь распознавать и выполнять следующие типы запросов:

Задание на разработку ML

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

При обучении модели необходимо учитывать, что организация работы с данными происходит на ClickHouse, поэтому особенно важно обрабатывать особенности этого языка запросов, такие как использование сортировки для индексации и специфичность наименований типов данных.

ВАЖНО! Нейросеть не работает с готовым SQL-кодом или таблицей (не создаётся секции ALTER и запросов на изменение). Её задача - написать код для формирования модели данных как результата выборки из БД ClickHouse по шаблону, подставляя в него фрагменты, позволяющие решить поставленную пользователем задачу. 

Вход модели:

Таблицы со всеми столбцами и значениями в них + промпт от пользователя. Задачи от пользователя отправляются последовательно через чат, в то время как исходные таблицы неизменны. 

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

Работа с типами данных

Типы данных

Модель должна уметь:

Обработка данных

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

Фильтрация и ограничение 

Модель должна уметь конструировать запросы для секций WHERE, LIMIT и OFFSET:

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

Шаблон кода для скрипта загрузки (выход модели)

Table "Название таблицы"

Create @@@ -- шаблонная секция, подставляются из модели только названия столбцов и их типы данных
CREATE TABLE IF NOT EXISTS "Название таблицы"(
  "Название столбца 1" type, -- тип данных, если допускается null, то Nullable(type) // ЗАДАЧА НА РАБОТУ С ТИПАМИ ДАННЫХ
  "Название столбца 2" type, -- название столбца может быть изменено моделью
  ...
  "Название столбца n" type
) ENGINE = MergeTree ()

ORDER BY
  tuple ()
@@@

Delete @@@ -- ещё одна шаблонная секция
  ALTER TABLE "Название таблицы" DELETE WHERE 1=1 
@@@

Source "Название подключения"

Read @@@ -- основная секция для обработки моделью
SELECT
  "Название столбца 1", -- перенос столбцов из из источника
  "Название столбца 2",
  ...
  "Название столбца k",
  Выражение для изменения столбца 1, -- ЗАДАЧА НА ИЗМЕНЕНИЕ СТОЛБЦОВ
  Выражение для изменения столбца 2,
  ...
  Выражение для изменения столбца m,
  Выражение для нового столбца 1 as "Название нового столбца 1", -- ЗАДАЧА НА СОЗДАНИЕ НОВЫХ СТОЛБЦОВ
  Выражение для нового столбца 2 as "Название нового столбца 2",
  ...
  Выражение для нового столбца n as "Название нового столбца n" 
FROM 
  "Название таблицы"
WHERE
  toType("Название столбца k") Условие 1 -- для каждого столбца, используемого в WHERE, у которого изменился тип данных, необходимо указывать тип из Create (например, для типа Int32 будет toInt32 и т.д.) // ЗАДАЧА НА ОГРАНИЧЕНИЕ
  ...
ORDER BY
  "Название столбца k" тип сортировки -- ЗАДАЧА НА СОРТИРОВКУ
  ...
LIMIT a
OFFSET b -- ЗАДАЧА НА ОГРАНИЧЕНИЕ

Optimize @@@ -- шаблонная секция на удаление дубликатов
OPTIMIZE TABLE "Название таблицы" DEDUPLICATE
@@@

Пример выхода модели для скрипта загрузки

Table "Costs"

Create @@@
CREATE TABLE IF NOT EXISTS "Costs" (
  "Date" Date,
  "Sum" Int32,
  "Product_name" Nullable (String),
  "Category" Nullable (String),
  "file_name" Nullable (String),
  "new_object" Int32 
) ENGINE = MergeTree ()

ORDER BY
  tuple ()
@@@

Delete @@@
ALTER TABLE "Costs" DELETE WHERE 1=1
@@@

Source "01"

Read @@@
SELECT
  "Date",
  "Sum",
  "Product_name",
  "Category",
  "file_name",
  toInt32("Sum")+666
FROM
  "Costs"
WHERE 
  toInt32("Sum")>5000
ORDER BY 
  "Product_name" desc
LIMIT 10 
OFFSET 5
@@@

Optimize @@@
OPTIMIZE TABLE "Costs" DEDUPLICATE
@@@

Выход модели в секции подключения:

"Память" модели

Для каждого подключения нейросеть хранит собственную "Память", включающую в себя по меньшей мере историю переписки с пользователем и код для изменения выборки из 10 строк для предпросмотра. Кроме того, существует один из трёх вариантов (обсуждаемых с заказчиком), в зависимости от которого в памяти модели может храниться:

Поиск и анализ в секции подключения (дополнительно)

Поиск в данных ("Что и где находится?")

Не возвращает SQL-кода ни для таблицы-примера, ни для добавления в скрипт загрузки. 

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

Вид ответа может меняться в зависимости от сути вопроса пользователя. Модель должна определять последовательность логики запроса (когда пользователя интересует показатель, а когда - его аналитический разрез). Например, ответом на вопрос: "В каком городе наибольшее число жителей?" должно быть название города, а результатом поиска по запросу: "Найди наибольшее число жителей среди представленных городов" – число жителей.

Анализ использования ("Зачем и где применяется?")

Не возвращает SQL-кода ни для таблицы-примера, ни для добавления в скрипт загрузки. 

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

Для решения этой задачи необходимо анализировать не только метаданные (названия таблиц и столбцов), но и содержимое этих таблиц.

Нейроконнекторы (фронт + бэк)

Цель

Создание инструмента для формирования скрипта загрузки без необходимости использовать SQL в секции подключения.

Концепт для интерфейса

image.png

Задание на разработку для фронт- и бэкенда

Расположение элементов (см. Концепт):

Передача данных:

При нажатии на кнопку "Активировать модель" запускается асинхронная передача данных из источника в модель ИИ: сначала отправляется набор метаданных (название таблицы и столбцов, типы данных, количество строк), потом – сами значения из таблицы. Поскольку размер таблицы может быть достаточно велик, запускается сэмплирование (или ограничение с помощью Limit - НЕ РЕКОМЕНДУЕТСЯ!) исходной таблицы до 1 000 000 строк. Данная операция не занимает длительного времени, переданная таблица кэшируется. 

Чат с моделью

Выглядит как переписка. Работает как переписка. В общем, это переписка. С нейросетью.

image.png

Особенности:

Кнопки и обработки

Параллельные обработки

При активированной нейросети водить изменения в исходную таблицу вручную ЗАПРЕЩАЕТСЯ – все поля становятся некликабельными до окончания работы с моделью. 

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

Кнопка "Активировать нейросеть"

При нажатии на кнопку разблокируется чат и появляется редактируемая таблица, а сама кнопка меняет название на "Деактивировать нейросеть". При деактивации нейросети появляется диалоговое сообщение вида: "При деактивации результат обработки таблицы нейросетью не будет добавлен в скрипт загрузки. Если Вы хотите использовать обработанную таблицу, нажмите на кнопку "Вставить в скрипт" при активной модели" с вариантами ответа "Деактивировать" и "Вернуться".

После деактивации блокируется чат и исчезает редактируемая таблица. История переписки сохраняется.

Кнопка "Вставить в скрипт"

При активной нейросети нажатие на эту кнопку передаёт в скрипт загрузки SQL-код, сформированный моделью нейросети.

Кнопка "Очистить чат"

При нажатии на кнопку появляется диалоговое сообщение вида: "Подтвердите, что Вы хотите очистить чат с моделью" с вариантами ответа "Да/Нет". При подтверждении удаляются все сообщения из чата с моделью и отправляется сигнал об очистке памяти модели для текущего подключения.

Данная кнопка доступна как при активированной, так и при деактивированной модели.

Редактируемая таблица

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