Вы являетесь естественным переводчиком кода SQL. Ваша роль заключается в переводе текста в SQL. Возврат только SQL. Не включать…

Изменить от 21 марта 2023 г.: OpenAI прекращает поддержку Codex API 23 марта 2023 г. и рекомендует перейти на ChatGPT API. В этой статье показаны некоторые ключевые различия между двумя моделями и показано, как использовать ChatGPT в качестве замены модели Codex.

На прошлой неделе был выпущен OpenAI ChatGPT API. OpenAI рекламирует базовую модель gpt-3.5-turbo как самую мощную модель GPT-3.5 и оптимизированную для чата за 1/10 стоимости text-davinci-003. OpenAI отмечает, что модель одинаково хороша при завершении работ по сравнению с семейством моделей Davinci.

Самый мощный и дешевле? Естественно, мы хотим использовать его для работы нашего механизма перевода текста в SQL. Изначально мы построили нашу систему перевода текста в SQL, используя модель OpenAI Codex code-davinci-002:



Мы не хотим, чтобы интерфейс или пользовательский интерфейс изменились: нам по-прежнему нужен прямой перевод текста в SQL, а не интерфейс чата. К сожалению, изменить модель с code-davinci-002 (Codex) на gpt-3.5-turbo (ChatGPT) не так просто.

Это формат приглашения, который мы используем для моделей Codex (обратите внимание на спецификацию языка и детали схемы):

-- Language PostgreSQL
-- Table = <table name>, columns = [col1 type1, col2 type2, ...]
-- A PostgreSQL query to return 1 and a PostgreSQL query for <natural language prompt>

SELECT 1;

Отправка этой подсказки в ChatGPT API с простым вопросом о базе данных Palmer Penguins дала следующие результаты:

The query to return 1 in PostgreSQL is:

```sql
SELECT 1;
```

And the query to count the number of penguins in the "penguins" table is:

```sql
SELECT COUNT(*) FROM penguins;
```

This will return the total number of rows in the "penguins" table, which represents the number of penguins in the table.

Все, что нам нужно, это SELECT COUNT(*) FROM penguins;. Другие детали являются полезным учебным ресурсом и отличным контекстом, но нам они не нужны для нашей системы перевода — чрезмерный контекст фактически работает вразрез с нашим вариантом использования. Мы, конечно, не одиноки.

В этом посте мы покажем, как мы использовали модель gpt-3.5-turbo в качестве замены модели code-davinci-002, что позволило нам напрямую использовать ChatGPT для перевода кода.

Как работает завершение чата

Мы не хотим, чтобы наша система перевода текста в SQL была системой на основе чата — мы хотим, чтобы пользователи могли задавать вопросы, а затем переводить их в SQL, а не ходить туда-сюда с системой. Чтобы получить индивидуальные, конкретные завершения, нам все еще нужно понять, как работает API завершения чата.

Ожидается, что ChatGPT «запомнит» прошлые части разговора. Таким образом, вместо простой подсказки API ChatGPT принимает список сообщений, где каждое сообщение относится к системе, пользователю или помощнику. Вы можете передать целую серию сообщений в каждом запросе API, представляя состояние диалога до этого момента.

Например, начало разговора может выглядеть так:

messages = [
{"role":"system",
"content": "you are a helpful assistant"},
{"role":"user",
"content": "I need help writing SQL"},
{"role": "assistant",
"content": "Sure, I'd be happy to help! What do you need help with specifically? Do you have a specific database and table in mind, or a particular query you're trying to write?"}
]

Каждое сообщение представляет собой пару "ключ-значение" с ключами user и content. Роль указывает, кто отправил сообщение (обычно это пользователь или помощник (ChatGPT)). Контент — это само сообщение: либо то, что написал пользователь, либо ответ ChatGPT.

Приведенный выше пример обмена начинается с системного сообщения. Системное сообщение содержит высокоуровневые инструкции о том, как должен вести себя ChatGPT. Примечательно, что в документации OpenAI упоминается, что gpt-3.5-turbo не уделяет особого внимания системному сообщению, и поэтому важные инструкции часто лучше помещать в пользовательское сообщение.

Следующее сообщение с ролью user представляет собой первое сообщение от пользователя. А следующее сообщение от помощника — это ответ ChatGPT. В ходе сеанса чата мы отправляли растущий список сообщений, чтобы модель могла ответить на основе полной истории обмена.

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

Очень простой запрос на перевод SQL в Python выглядит так:

import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")

system_prompt = "you are a text-to-SQL translator. You write PostgreSQL code based on plain-language prompts."
user_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]
You are a SQL code translator. Your role is to translate natural language to PostgreSQL. Your only output should be SQL code. Do not include any other text. Only SQL code.
Translate "How many penguins are there?" to a syntactically-correct PostgreSQL query.
"""

# list of dicts specifying roles and content
query = [{"role":"system", "content": system_prompt},
         {"role":"user", "content": user_prompt}]

completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo"
    messages=query,
)
print(completion.choices[0].message)

Здесь мы отправляем одно системное приглашение, объясняющее цель сеанса «чата», и одно очень конкретное пользовательское приглашение. Подсказка является ключевой: нам нужно сообщить ChatGPT, что именно мы ищем, иначе мы можем потратить токены или получить длинный и сложный для анализа вывод.

Обучение ChatGPT говорить на SQL

Из ответа ChatGPT в начале этой статьи вы могли заметить четко разграниченные блоки кода SQL. Технически мы могли проанализировать выходные данные ChatGPT и извлечь SQL. Однако есть веские причины этого не делать:

  • Он тратит жетоны. Мы не собираемся использовать текст между SQL, так зачем включать его в первую очередь?
  • Если ChatGPT возвращает несколько блоков SQL, как это часто бывает, у нас нет четкого указания, какой из них выбрать и вернуть пользователю.

Итак, как мы это делаем? Нам просто нужно сообщить ChatGPT, что именно мы хотим. Если это может быть пират, таблица Excel или терминал Linux. Конечно, это может быть переводчик 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]
You are a SQL code translator. Your role is to translate natural language to PostgreSQL. Your only output should be SQL code. Do not include any other text. Only SQL code.

Translate "How many penguins are there?" to a syntactically-correct PostgreSQL query.

Вот сравнение подсказки ChatGPT (зеленая) с подсказкой Codex (красная):

Вы можете попробовать это прямо на chat.openai.com.

Никаких дополнительных объяснений, никакого форматирования, только SQL.

Стоит ли оно того?

В настоящее время модели завершения кода Codex находятся в ограниченной бета-версии и могут использоваться бесплатно. Примечательно, что на них распространяются сниженные ограничения скорости: будь то бесплатная пробная версия или платный план, вы можете делать только 20 запросов API модели Codex в минуту. Если вы не ожидаете, что превысите это, Codex — хороший выбор на данный момент (но следите за более подробными тестами, сравнивающими качество завершения на основе Codex и ChatGPT).

Завершение ChatGPT стоит 0,002 доллара за 1000 токенов по сравнению с 0,02 доллара за 1000 токенов для флагмана OpenAI text-davinci-003 model. Это может не привести к сокращению затрат на 90 %, поскольку для получения желаемого поведения от ChatGPT могут потребоваться более длинные подсказки. Но в нашем ограниченном тестировании подсказки ChatGPT были далеко не в 10 раз больше, чем подсказки Codex.

Например, в следующей подсказке для преобразования текста в SQL с помощью ChatGPT было использовано всего 142 токена: 135 для подсказки и 7 для завершения.

-- 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]
You are a SQL code translator. Your role is to translate natural language to PostgreSQL. Your only output should be SQL code. Do not include any other text. Only SQL code.

Translate "How many penguins are there?" to a syntactically-correct PostgreSQL query.

И вот подсказка кодекса для создания того же запроса:

-- 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 How many penguins are there?

SELECT 1;

Всего было использовано 97 токенов: 87 для подсказки и 10 для завершения.

Таким образом, запрос ChatGPT стоил 135 токенов * 0,000002 доллара США = 0,00027 доллара США. Если предположить, что цены Кодекса будут связаны с моделью text-davinci-003, запрос Кодекса будет стоить 97 токенов * 0,00002 доллара США = 0,00194 доллара США: более чем в семь раз больше, чем завершение ChatGPT. И это без согласованных усилий по созданию краткой подсказки для модели ChatGPT.

Подводя итог: с некоторыми осторожными подсказками мы можем получить чистый вывод SQL из ChatGPT. Прямо сейчас это не дешевле, чем модели Кодекса, потому что модели Кодекса находятся в бесплатной (но с уменьшенными ограничениями скорости) ограниченной бета-версии. Но если модель Codex code-davinci-002 в конечном итоге будет стоить так же, как модель text-davinci-003, экономия средств, связанная с использованием ChatGPT для завершения кода, будет весьма значительной.

Попробуй сам

Мы добавили возможность попробовать завершение SQL в ChatGPT на нашей Площадке подсказок перевода с естественного языка на SQL. Просто выберите ChatGPT в качестве модели и попробуйте разные подсказки.

Дайте нам знать, что вы найдете! Какие изменения вам нужно было внести в подсказки? Удалось ли вам найти более краткую подсказку, которая по-прежнему неизменно приводила к выводу SQL?