Интеграция модели GPT-4 Omni в телеграм бота на Python

от автора

13 мая 2024 года, OpenAI официально представила новую модель. По словам самих OpenAI, Omni соответствует производительности GPT-4 Turbo для текста на английском языке и кода, со значительным улучшением для текста на языках, отличных от английского, при этом он намного быстрее и на 50% дешевле в API.

Преимущества модели в том, что она умеет работать со всем контентом (текстом, звуком и изображениями) и знает 50 языков.

И сегодня мы интегрируем эту модель в небольшого бота на Python и задеплоим его на облачный сервис Amvera.

Почему Amvera:

  • Это наш блог. Странно, если мы будем разворачивать у конкурентов)

  • Полное бесплатное проксирование проектов до OpenAI. Больше не требуется использовать свой прокси в коде!

  • Простая подготовка проекта в “два клика” с помощью yaml инструкции.

  • Удобная доставка файлов и обновлений через git буквально за 3 команды.

  • После регистрации и подтверждения номера телефона начисляется бесплатный баланс в размере 111 рублей!

План проекта (как все будет работать?)

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

  • aiogram 3.10.0 — асинхронная библиотека для взаимодействия с API Telegram

  • openai — официальная библиотека для работы с OpenAI REST API, работающая с httpx

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

Создание бота и ключа OpenAI

Начнем с создания бота.

Для этого воспользуемся ботом @BotFather.

  1. Пишем команду /newbot

  2. Придумываем ему имя и юзернейм

  3. В ответ, если все прошло успешно, получаем сообщение о создании бота и сохраняем сгенерировавшийся токен.

Внимание! С помощью токена можно получить полный контроль над ботом, никому не присылайте его!

Как получить ключ OpenAI?

Для начала вам нужно иметь аккаунт в OpenAI с подключенным биллингом. Для создания вам понадобится любой зарубежный номер. Можно воспользоваться любым сервисом для получения SMS подтверждения.

После переходим на страницу ключей и создаем ключ с любым названием кнопкой сверху:

Все! Теперь можно переходить к написанию кода.

Код бота

Структура проекта будет выглядеть так:

  • Папка bot с файлами handlers.py для обработчиков aiogram и gpt.py для генерации ответа нейросети.

  • Файл main.py с инициализацией бота

  • Также файлы, требуемые для деплоя (их нет на скрине)

В main.py, как и сказано выше, мы инициализируем и запускаем бота с подключенным логированием:

import os import logging import asyncio  from aiogram import Bot, Dispatcher from aiogram.types import Message from aiogram.filters import CommandStart  from bot.handlers import router  bot = Bot(token=os.getenv("TOKEN")) dp = Dispatcher()  logging.basicConfig(level=logging.INFO)  @dp.message(CommandStart()) async def start_cmd(message: Message):     await message.reply("Добро пожаловать в бота!\nНапишите свой вопрос и бот с помощью GPT4 Omni сгенерирует ответ!")  async def main():         dp.include_router(router)          await bot.delete_webhook(drop_pending_updates=True)     await dp.start_polling(bot)  if __name__ == "__main__":     asyncio.run(main())

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

Обязательно импортируем роутер из файла handlers.py в папке bot. Вот, кстати, содержимое самого файла:

from aiogram import Router, F from aiogram.types import Message from aiogram.filters import CommandStart from aiogram.fsm.state import State, StatesGroup from aiogram.fsm.context import FSMContext  from bot.gpt import gpt_request  router = Router()  class StateGpt(StatesGroup):   text = State()  @router.message(StateGpt.text) async def state_answer(message: Message):     await message.reply("Пожалуйста, дождитесь ответа!")  @router.message(F.text) async def gpt_work(message: Message, state: FSMContext):     await state.set_state(StateGpt.text)          answer = await message.reply("Ответ генерируется...")     response = await gpt_request(message.text)          await answer.edit_text(response.choices[0].message.content)     await state.clear()

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

Генерация ответа (gpt.py):

import os import httpx  from openai import AsyncOpenAI  gpt = AsyncOpenAI(api_key=os.getenv("AI_KEY"),                   http_client=httpx.AsyncClient())  async def gpt_request(text):     response = await gpt.chat.completions.create(         messages=[{"role": "user",                    "content": str(text)}],         model="gpt-4o"     )     return response

Так как весь наш бот асинхронный, мы будем использовать модуль AsyncOpenAI.

И здесь также AI_KEY записан в переменные окружения.

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

Деплой в облако

Подготовим файл зависимостей

Для деплоя в облако Amvera, нам нужно создать файл зависимостей — requirements.txt. В нашем случае он будет небольшой, т.к. мы используем лишь 2 библиотеки, требуемые загрузки через pip.

requirements.txt:

aiogram==3.10.0 openai==1.40.6

Зарегистрируемся по ссылке, указав все требуемые данные.

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

  1. В открывшемся окне вписываем данные о названии проекта и выбираем тариф. Желательно для рабочего проекта выбирать тариф не ниже Начального.

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

  2. Окно конфигурации. Именно здесь создается amvera.yml — инструкция для проекта. Выбираем окружение Python, инструмент pip. Теперь открываются дополнительные секции. Самое главное — версия Python (version), путь до главного файла (scriptName) и путь до файла зависимостей (requirements.txt)

После утверждения настроек мы можем завешать создание проекта.

Открываем страницу проекта и обязательно добавляем переменные окружения, используя кнопку “Создать секрет” во вкладке “Переменные”.

На этом завершается настройка проекта.

Доставка кода через Git

Как я уже сказал, можно воспользоваться загрузкой через сайт — это вкладка Репозиторий на странице проекта.

Но намного удобнее использовать git. С ним после небольшой настройки можно обновлять репозиторий, используя 3 команды.

Устанавливаем git и выполняем следующие команды в командной строке (убедитесь, что открыли cmd в директории с проектом):

  1. git init — инициализируем git (должна создаться папка .git)

  2. git remote add amvera https://git.amvera.ru/имя-пользователя/название-проекта — добавляем удаленный репозиторий (эту ссылку можно получить во вкладке “Репозиторий”.

  3. git add . — добавление всех файлов и папок в директории инициализированного git

  4. git commit -m "First commit" — первый коммит (обязательно с комментарием)

  5. git push amvera master — последнее действие — пуш файлов в репозиторий.

Сборка должна начаться автоматически.

Если вы все-таки решили загрузить все файлы вручную через интерфейс, после загрузки понадобится перейти во вкладку “Конфигурация” и нажать кнопку “Собрать”.

Теперь, если все пройдет успешно, бот заработает.

Итог

Теперь мы имеем доступ к относительно новой модели GPT-4 Omni прямо в телеграм!


ссылка на оригинал статьи https://habr.com/ru/articles/836556/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *