Pull to refresh
172.44
Amvera
Amvera — облако для хостинга IT-приложений

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

Reading time5 min
Views5.4K

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

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

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

Почему 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 прямо в телеграм!

Tags:
Hubs:
Total votes 8: ↑6 and ↓2+6
Comments5

Articles

Information

Website
amvera.ru
Registered
Employees
11–30 employees
Location
Россия
Representative
Кирилл Косолапов