Мы только что запустили проект с открытым исходным кодом с целью создания готовых к производству подсказок большой языковой модели (LLM) для преобразования текста в SQL. Наша цель? Используйте LLM, наши собственные глубокие знания баз данных PostgreSQL и тщательное тестирование для разработки лучшего в своем классе преобразования текста в SQL.

Чтобы в полной мере воспользоваться преимуществами LLM, мы разрабатываем производственные LLM-подсказки, которые тщательно тестируются, тщательно настраиваются и разрабатываются с учетом требований безопасности. В этом сообщении в блоге будет представлен проект и рассмотрены ключевые принципы, проблемы и передовые методы создания готовых к работе приглашений, которые можно использовать для надежного создания точных SQL-запросов из обычного текста, избегая при этом непреднамеренного использования и эффектов. Хотите прыгнуть прямо в? Клонируйте репозиторий проектов с открытым исходным кодом и попробуйте площадку подсказок.

Убедитесь, что вы подписаны на Информационную рассылку Inner Join, чтобы быть в курсе всех последних событий проекта.

Преобразование текста в SQL: основы

SQL является третьим наиболее используемым языком программирования. Это первый язык, который изучают многие начинающие разработчики. Мы только что выпустили преобразование текста в SQL с помощью ИИ в bit.io, чтобы снизить входные барьеры для изучения и использования SQL, позволяя пользователям сосредоточиться на базовой логике своих запросов, а не на синтаксисе.



Вы можете использовать это на bit.io прямо сейчас. В редакторе запросов или API запросов bit.io поместите в первую строку следующее: #!translate:text. В следующей строке напечатайте свой простой запрос в форме вопроса, что-то вроде what record with provider 'aws' has the lowest latency? по нашим данным о задержке в облаке (см. нашу статью о задержке в облачном центре обработки данных). Он преобразуется в запрос, который вы можете отредактировать или запустить.

Наша функция преобразования текста в SQL использует модели OpenAI Codex для отправки текста и информации о схеме базы данных (приглашение) в OpenAI LLM. Модель генерирует запрошенный SQL и возвращает его пользователю, который затем может отредактировать (при необходимости) и выполнить запрос.

Это может показаться простым, как будто мы просто отправляем текст в сторонний API и возвращаем результаты. Конечно, LLM OpenAI делают здесь тяжелую работу. Но есть много нюансов, связанных с обеспечением того, чтобы модели возвращали пригодный для использования результат и делали это быстро, эффективно и безопасно. Именно на этом мы сосредоточим наши усилия. Такие решения, как выбор модели, значения гиперпараметров и содержимое подсказок, могут существенно повлиять на качество возвращаемых результатов.

Современное состояние (на данный момент)

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

Текущая подсказка довольно проста. Сначала он передает три комментария: первый указывает язык (PostgreSQL); второй передает детали схемы (схемы, таблицы, столбцы, типы); а третий указывает желаемый результат, включая запрос пользователя на естественном языке. В последней строке подсказки указано SELECT 1;, что указывает на то, что мы хотим получить выходной SQL не как комментарий, а как готовый к выполнению SQL.

-- Language PostgreSQL
-- Table penguins, columns = [species text, island text, bill_length_mm double precision, bill_depth_mm double precision, flipper_length_mm bigint, body_mass_g bigint, sex text, year bigint]
-- A PostgreSQL query to return 1 and a PostgreSQL query for {natural language query}
SELECT 1;

С помощью этой подсказки при наличии четко определенного запроса на простом языке модели OpenAI обычно:

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

Проблемы

Есть еще возможности для улучшения.

Одним из основных препятствий является отправка краткой подсказки модели Codex, при этом предоставляя достаточно информации о схеме. Мы хотим предоставить достаточно информации о схемах базы данных, чтобы получать пригодные для использования запросы, не отправляя лишние токены в приглашении и потенциально увеличивая стоимость использования API-интерфейсов модели OpenAI.

Еще одной проблемой является правильное форматирование и цитирование некоторых идентификаторов. В большинстве случаев выходные данные правильные, но в некоторых случаях таблицы в схемах, отличных от «общедоступных», форматируются неправильно, а имена таблиц с заглавными буквами или специальными символами не возвращаются в кавычках. Эти специфические нюансы синтаксиса SQL требуют осторожного обращения, чтобы обеспечить точность вывода.

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

#!translate:text
return a string defining a python function for adding two numbers

Этот запрос возвращает:

SELECT 'def add(x, y): return x + y'

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

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

Например, (довольно плохо сформулированная) подсказка

#!translate:text
update the table to make it clear that all of the islands in the table are in Antarctica.

Результаты в следующем SQL:

UPDATE penguins SET island = 'Antarctica' WHERE island IS NOT NULL

Вероятно, пользователь не собирался перезаписывать столбец «остров» Антарктидой. Возможно, целью было добавить столбец «континент» или добавить «(Антарктида)» к каждой записи в столбце острова, хотя это намерение не ясно из подсказки. В любом случае было бы полезно иметь меры безопасности, которые не позволяют пользователям слепо выполнять такие запросы и случайно изменять данные.

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

Проект с открытым исходным кодом pg-text-query

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

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

Быстрая игровая площадка

Клонировать репо; установить стримлит с pip install streamlit.py; и из корневого каталога запустите streamlit run playground/app.py. Это откроет интерактивную игровую площадку подсказок, где вы сможете поэкспериментировать с различными комбинациями подсказок и деталей схемы.

Это полезно для быстрого тестирования и повторения различных подсказок, а также для создания интуитивных представлений о том, что работает, а что нет. Вы можете установить «подсказку инициализации» (к которой у конечного пользователя нет доступа); пользовательский запрос на простом языке и детали схемы и посмотрите, как эти разные части запроса взаимодействуют друг с другом. Затем вы можете сгенерировать SQL и даже выполнить его в действующей базе данных. Внимательно просмотрите все сгенерированные SQL-запросы перед их выполнением, чтобы случайно не удалить или изменить данные.

Утилиты детализации схемы

Модуль db_schema.py включает утилиты для извлечения данных структурированной схемы из базы данных Postgres. Полезно предоставить достаточно информации о схеме, чтобы модель могла включать правильные идентификаторы. Однако слишком большой объем информации о схеме может потребовать большого количества токенов, что повлечет за собой ненужные затраты и, возможно, оставит слишком мало токенов для того, чтобы модель успешно сгенерировала желаемый SQL.

Вы можете использовать модуль следующим образом:

import os
from pprint import pprint

import bitdotio
from dotenv import load_dotenv
from pg_text_query import get_db_schema

DB_NAME = "bitdotio/palmerpenguins"
b = bitdotio.bitdotio(os.getenv("BITIO_KEY"))

# Extract a structured db schema from Postgres
with b.pooled_cursor(DB_NAME) as cur:
db_schema = get_db_schema(cur, DB_NAME)
pprint(db_schema)

Генерация подсказок и запросов

Вы можете генерировать подсказки (на основе нашей работы по разработке подсказок) с помощью модуля prompt.py, который предоставляет помощников для подготовки подсказок запросов Postgres.

# Construct a prompt that includes text description of query
prompt = get_default_prompt(
"most common species and island for each island",
db_schema,
)

# Note: prompt includes extra `SELECT 1` as a naive approach to hinting for
# raw SQL continuation
print(prompt)

который возвращает следующее приглашение:

-- Language PostgreSQL
-- Table penguins, columns = [species text, island text, bill_length_mm double precision, bill_depth_mm double precision, flipper_length_mm bigint, body_mass_g bigint, sex text, year bigint]
-- A PostgreSQL query to return 1 and a PostgreSQL query for most common species and island for each island
SELECT 1;

Модуль gen_query.py — это оболочка openai.Completion.create, которая обрабатывает отправку запросов в API OpenAI.

# Using default OpenAI request config, which can be overriden here w/ kwargs
query = generate_query(prompt)
print(query)

который из подсказки выше возвращает:

SELECT species, island, COUNT(*) FROM penguins GROUP BY species, island

Следующие шаги

Этот проект находится в зачаточном состоянии, но у нас есть несколько основных направлений, которые мы хотели бы изучить:

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

Заключение

Мы в восторге от потенциала преобразования текста в SQL для улучшения взаимодействия с пользователем и устранения барьеров для доступа к базам данных SQL. Следите за проектом с открытым исходным кодом, направленным на совместное создание наилучших возможных переводов текста в SQL с использованием LLM OpenAI. Для получения всех обновлений подпишитесь на информационный бюллетень Inner Join и присоединяйтесь к нашему сообществу Discord. Хотите внести свой вклад? Разветвите репозиторий pg-text-query, попробуйте игровую площадку подсказок и посмотрите, сможете ли вы найти лучшие подсказки для преобразования текста в SQL!