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.
Пишем команду /newbot
Придумываем ему имя и юзернейм
В ответ, если все прошло успешно, получаем сообщение о создании бота и сохраняем сгенерировавшийся токен.
Внимание! С помощью токена можно получить полный контроль над ботом, никому не присылайте его!
Как получить ключ 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
Зарегистрируемся по ссылке, указав все требуемые данные.
После регистрации убеждаемся в получении бесплатного баланса и создаем новый проект.
В открывшемся окне вписываем данные о названии проекта и выбираем тариф. Желательно для рабочего проекта выбирать тариф не ниже Начального.
Далее, открывается окно загрузки данных. Мы можем загрузить код прямо через интерфейс в этом окне, либо воспользоваться инструментом git. Пока пропустим загрузку данных и нажмем Далее
Окно конфигурации. Именно здесь создается amvera.yml — инструкция для проекта. Выбираем окружение Python, инструмент pip. Теперь открываются дополнительные секции. Самое главное — версия Python (version), путь до главного файла (scriptName) и путь до файла зависимостей (requirements.txt)
После утверждения настроек мы можем завешать создание проекта.
Открываем страницу проекта и обязательно добавляем переменные окружения, используя кнопку “Создать секрет” во вкладке “Переменные”.
На этом завершается настройка проекта.
Доставка кода через Git
Как я уже сказал, можно воспользоваться загрузкой через сайт - это вкладка Репозиторий на странице проекта.
Но намного удобнее использовать git. С ним после небольшой настройки можно обновлять репозиторий, используя 3 команды.
Устанавливаем git и выполняем следующие команды в командной строке (убедитесь, что открыли cmd в директории с проектом):
git init
- инициализируем git (должна создаться папка .git)git remote add amvera https://git.amvera.ru/имя-пользователя/название-проекта
- добавляем удаленный репозиторий (эту ссылку можно получить во вкладке “Репозиторий”.git add .
- добавление всех файлов и папок в директории инициализированного gitgit commit -m "First commit"
- первый коммит (обязательно с комментарием)git push amvera master
- последнее действие - пуш файлов в репозиторий.
Сборка должна начаться автоматически.
Если вы все-таки решили загрузить все файлы вручную через интерфейс, после загрузки понадобится перейти во вкладку “Конфигурация” и нажать кнопку “Собрать”.
Теперь, если все пройдет успешно, бот заработает.
Итог
Теперь мы имеем доступ к относительно новой модели GPT-4 Omni прямо в телеграм!