Данная статья описывает моё знакомство с ChatGPT на уровне API и интеграцию с платформой создания ботов Salebot.
Давно занимаюсь сборкой ботов в Salebot и на Python, и я не мог просто пройти мимо ChatGPT и её API (модель GPT 3). Но, во время изучения API, меня понесло дальше, невозможно было остановиться на GPT 3. Вот какие задачи я себе поставил:
Доступная функциональность на ChatGPT:
Чат с ботом
Генератор изображений по нашему описанию
Редактор картинки по нашему описанию
Генератор похожих изображений
Пожалуй, интересно всё! Можно пообщаться с роботом и картинку сгенерировать, и, интересно, как ChatGPT отредактирует изображение по описанию.
Буду пробовать все-ё!???? в Salebot.
Подготовка
Проходим регистрацию на https://chat.openai.com.
Получаем ключи доступа к API https://beta.openai.com/account/api-keys.
Там же находим доки https://platform.openai.com/docs/api-reference/introduction, и изучаем API.
Создаем новый проект в Salebot.
Чат с ботом
В API ChatGPT указаны все нужные нам параметры:
Все они на экране и думаю нет необходимости их перечислять, отмечу только, что здесь имеется возможность выбора модели и ЯП:
Я остановился на модели text-davinci-003
, в рамках знакомства, мне этого будет достаточно. Вы же, можете использовать непосредственно модель ChatGPT (на текущий момент, это: gpt-3.5-turbo
). В исходниках есть обе модели.
Портируем все параметры в Salebot (справка по API Salebot):
Переходим в наш проект Salebot.
Создаем новый блок Первостепенная проверка условия (светло-зеленый).
Это будет меню бота
Создаем ещё один блок Первостепенная проверка условия.
Здесь разместим условие запуска: "Поболтать с ботом" и начальный текст для пользователя:
Теперь, когда пользователь нажмёт Поболтать с ботом, он пойдет в этот блок. От него дальше будем писать запрос к API.
Общая схема проекта должна получиться примерно такой:
Создаем два блока Состояние диалога, связываем их как на схеме выше.
В первом блоке делаю запрос к API:
URL запроса: https://api.openai.com/v1/completions
Сохраняемые значения: choices|0|text->text;
Заголовок запроса: {"Content-Type": "application/json", "Accept": "application/json", "Authorization": "Bearer YOUR_API_KEY_HERE"}
JSON параметры: {"model": "text-davinci-003", "prompt": "#{question}", "max_tokens": 2000, "temperature": 1}
Во втором блоке показываем результат: #{text}
.
Переходим к тестированию:
Обмениваемся парой фраз с ботом, бот решает задачу. Значит, всё работает, иду дальше, к генерации изображения.
Генератор изображений по нашему описанию
Дублирую 3 связанных между собой блока из схемы выше.
В условии запуска ставлю условие: Придумай картинку.
Смотрю API для генерации изображения:
И подставляю параметры в скопированный блок:
URL запроса: https://api.openai.com/v1/completions
Сохраняемые значения: data|0|url->picture_url;
Заголовок запроса: {"Content-Type": "application/json", "Accept": "application/json", "Authorization": "Bearer YOUR_API_KEY_HERE"}
JSON параметры: {"prompt": "#{question}", "n": 1, "size": "512x512"}
Во втором блоке во вложении просто указываю URL картинки: picture_url
.
Готово. Тестируем.
Справился на отлично! Дальше сложнее.
Редактор картинки по нашему описанию
Иду уже в привычный API ChatGPT в раздел Images->Create image edit, смотрим:
Если я правильно понял смысл, то здесь мы передаем картинку и описание того, что на ней нужно изменить/добавить/убрать и нейросеть корректирует изображение и отдает результат.
Чтож, делаю всё по аналогии с предыдущими действиями:
Копирую блоки и корректирую запрос:
URL запроса: https://api.openai.com/v1/images/edits
Сохраняемые значения: data|0|url->picture_url;
Заголовок запроса: {"Content-Type": "application/json", "Accept": "application/json", "Authorization": "Bearer YOUR_API_KEY_HERE"}
JSON параметры: {"image": "#{image_url}", prompt:"#{question}", "n": 1, "size": "512x512"}
На тестировании получаю ответ:
{"error":{"code":null,"message":"Invalid Content-Type header (application/json), expected multipart/form-data. (HINT: If you're using curl, you can pass -H 'Content-Type: multipart/form-data')","param":null,"type":"invalid_request_error"}}
Ок, меняю заголовок на multipart/form-data
.
Тестирую. Получаю ответ:
{"error":{"code":null,"message":"Additional properties are not allowed ('image' was unexpected)","param":null,"type":"invalid_request_error"}}
Дальше, какие только настройки и параметры не пробовал менять натыкался на эту или другие ошибки.
Пробовал:
Передать картинку в режиме "rb", как говорилось в референсе. В разных кодировках, с заголовками и без них - результат был один и тот же. Точнее не было его )
Надоело, перехожу в Python:
Тут получаю нормальный ответ и сгенерированное изображение.
Понимаю, что в salebot нет библиотек openai и os, но все равно пробую различные варианты этого куска кода запихать в salebot, но все безуспешно.
Генератор похожих изображений
Так как принцип запросов схож с предыдущим, то смысла пробовать не было.
Такие результаты у меня получились от знакомства с ChatGPT. Возможно, Salebot внедрит поддержку библиотеки openai в будущем и это упростит работу, но, пока этого не случилось.
Вариант интеграций на стороне я не рассматривал, так как хотелось одноплатформенное решение.
Кто хочет пощупать бота, разместил в телеграм: https://t.me/chatgpt_image_bot.
Может у вас есть какие-то замечания или свои идеи по данной теме, поделитесь, пожалуйста в комментариях. Буду рад их услышать!
В следующей статье расскажу, как я познакомился с девушкой в ChatGPT.
Комментарии (31)
lair
00.00.0000 00:00+3Неловкий вопрос - а что это за цифры в ссылке на Salebot:
https://salebot.pro/l/16835
?botdev Автор
00.00.0000 00:00Ссылка на salebot, можете использовать для бесплатного премиум доступа. По ссылке дается 7 дней, будете использовать без цифр в конце, будет 3 дня. Вот и вся разница.
lair
Ммм, а вы знаете, что модели GPT-3 - это не модели ChatGPT?
botdev Автор
Спасибо, что здесь уточнили. Возможно, вам показалось, что я приравниваю эти модели, но, на самом деле, это не так. Если говорить в общем, то, конечно, всё это модели OpenAI.
lair
Мне показалось, что вы в статье неоднократно упоминаете ChatGPT, хотя вообще нигде его не используете.
Например:
Но вы нигде не знакомитесь с ChatGPT.
botdev Автор
От того, как вы их назовёте, сути это не изменит - дочерние от ChatGPT, родители или смежные продукты OpenAI, я объединил их в одно, более популярное название - ChatGPT. В референсе также есть и другие модели OpenAI (если вам так больше нравится), можете использовать их, никто не запрещает.
lair
Вообще-то, как раз изменит. С другой стороны, конечно, смотря что считать сутью. Если то, что вы сделали пяток вызовов апи через конструктор ботов - то да, ничего не изменится, это как было тривиальным упражнением, так и осталось.
Это называется "кликбейт". Ну или "не разобрался", такое тоже возможно.
botdev Автор
Ещё раз. Называйте как хотите. Это всё равно, что если бы вы пришли в магазин и сказали: покажите мне вон тот ксерокс, а вам бы ответили, что это не ксерокс, а копировальный аппарат фирмы ксерокс. И я думаю, что, используя примеры, вам не составит труда заменить модель на ту, которую вы хотите.
lair
То есть вы даже не понимаете разницы между GPT-3 и ChatGPT? Печально.
Я думаю, что я смогу написать интеграцию с этим апи без ваших примеров быстрее, чем с ними.
В частности, я думаю, что:
для чатов предполагается использовать не
/v1/completions
, как у вас, а/v1/chat/completions
(прямо скажем, я подозреваю, что в/v1/completions
просто нельзя запихнутьgpt-3.5-turbo*
, а именно это ChatGPT-модели)в
/v1/image/...
вообще никакая модель не передается (там зафиксирована DALL-E, если не ошибаюсь)botdev Автор
Все верно. Используйте, если вам это нужно. В боте представлена и та, и другая модель. В тексте, я описал алгоритм реализации в salebot без привлечения сторонних сервисов и использования python.
lair
Это где? В вашем посте этого нет. Ваш бот на прямой вопрос "какая ты модель" отвечает "Я - модель базового уровня генерации текста GPT-3".
...и не справились даже с отправкой мультипарта?
botdev Автор
????????♂️
заголовок читали?
Давайте вы как справитесь, сделаете публикацию и выложите исходники, так сказать поделитесь с людьми, будет о чем разговарить. А так, это неконструктивный диалог.
lair
Читал. Я о том и говорю, что какой смысл в вашем "алгоритме", если вы даже не смогли реализовать мало-мальски нетривиальный кусок, и не поняли, в чем же дело.
"Спервадобейся"? Спасибо, нет, я уже добился.
botdev Автор
Надеюсь, это не пустые слова? - интересно было бы увидеть результат!
lair
Резюме находимо через профиль.
Но так, развлечения ради, я еще в 2016 году делал бот для интеграции Slack-Jira-BitBucket для решения внутренних задач в разработческой компании.
botdev Автор
Вы не слышите или не хотите.
Зачем мне ваше резюме, не понятно.
В статье четко написано:
Раз результат у вас уже готов, было бы кстати на него взглянуть
lair
Ну, вам хотелось одноплатформенное решение, но оно у вас не работает (потому что фундаментальные ограничения платформы). А за пределами платформы, как я уже написал, ценность вашего поста стремится к нулю, потому что вы не делаете ничего за пределами базового туториала OpenAI. Так какой смысл обсуждать платформу, востребованность которой в моей жизни равна нулю, и которая не может сделать того, что вы от нее хотите?
botdev Автор
Тогда зачем вы осуждаете:
Совершенно не разбираясь ни в платформе и в её возможностях? И не предлагая никаких вариантов?
Складывается впечатление, что трепа ради.
lair
Ровно затем, что вы не справились (и платформа не справилась). И, что хуже, вы не разобрались, что же конкретно происходит, в чем конкретно причина ошибки (и, как следствие, недостаток платформы) - хотя именно эта информация представляет хоть какой-то интерес, а не "Дальше, какие только настройки и параметры не пробовал менять натыкался на эту или другие ошибки", которому место в бложике.
...а не работает у вас по одной простой причине: OpenAI для
images/edits
хочет тело файла (бинарный поток), что хорошо видно изcurl ... -F='@...'
(илиopen(..., 'rb')
в Питоне, который не про "передать картинку в режиме "rb"", а про то, чтобы открыть файл на чтение (r
) как байт-поток (b
)), а вы ему пытаетесь запихнуть адрес.botdev Автор
Вы очень странно читаете, ровно до того момента, как вам выгодно для своего ответа, коим желаете утвердиться, но не ответить. Дальше я написал, про режим rb при передаче файла в python, он же -F в curl. И действия в salebot, которые не привели к результату и написал почему. А после, успешный ответ в python. Адрес же я отправлял в запросе сейлбота, которым вы не владеете, в надежде, что сейлбот подтянет сам файл.
lair
Вы не понимаете, что это совершенно разные вещи?
Нет, вы не написали почему.
А почему вдруг он должен что-то за вас сам подтягивать, и в каком формате?
lair
На всякий случай сохраню то, что сейчас написано в статье:
Здесь нет ответа, почему не работает (который ответ звучит так: потому что данные передаются в неправильном формате, правильный формат - такой-то, а передается - вот так-то или вот так-то).
lair
Я любопытства ради проверил, на хабре упоминаний про Salebot (а за его пределами ваша статья представляет нулевую ценность) - два, оба в статьях-списках сервисов.