В этой статье я объясню, как быстро внедрить бота Telegram для быстрого взаимодействия с ChatGPT, даже с голосовыми сообщениями!
Когда у нас будет бот, мы сможем бесплатно развернуть его на платформе Railway.
Введение
Платформы обмена мгновенными сообщениями, такие как Telegram, стали неотъемлемой частью нашего общения. Боты Telegram сделали Telegram еще более мощным инструментом. В то же время ChatGPT меняет наше восприятие технологий, потребление и поиск информации. Однако официальный чат-сервис OpenAI требует частой перезагрузки страницы, что приводит к неоптимальному взаимодействию с пользователем.
Вот почему я считаю, что предоставление пользователям возможности взаимодействовать с ChatGPT с помощью текстовых и голосовых сообщений Telegram может еще больше расширить возможности использования ChatGPT.
В этой статье я кратко опишу, что такое API ChatGPT и Whisper и как использовать API через Python. Затем я покажу, как развернуть бота Telegram, использующего обе модели, с помощью сервиса Railway.
Если вам не терпится увидеть его в действии, вы можете попробовать моего бота @Audio_ChatGPT.
ChatGPT и Whisper
Мы все это знаем, но repetita iuvant. ChatGPT — это языковая модель ИИ, которая может генерировать человеческие ответы на текстовые вводы. Вы можете взаимодействовать с ним, и модель может отвечать на дополнительные вопросы, признавать ошибки и помогать вам во многих задачах, от кода и написания статей до генерирования идей для рождественских подарков.
С другой стороны, Whisper — это модель автоматического распознавания речи (ASR), разработанная для задач распознавания и перевода аудиоданных. Его архитектура основана на сети Transformer, обученной прогнозировать текстовые подписи, а также выполнять идентификацию языка и перевод речи на английский язык.
Обе модели были разработаны OpenAI, и недавно были выпущены официальные API (хотя неофициальные проекты уже были доступны). Ниже вы можете увидеть, насколько просто использовать API OpenAI с Python.
import openai
openai.api_key = OPENAI_TOKEN
prompt = [{"role":"user", "content":"It's raining and cold in Zurich. What can I do today?"}]
result_chatgpt = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=prompt)
audio_file= open("voice_message.mp3", "rb")
result_whisper = openai.Audio.transcribe("whisper-1", audio_file)
Железнодорожный
Железная дорога — это платформа для развертывания, которая устраняет препятствия для разработчиков при развертывании приложений. Вы можете не настраивать серверы и обеспечивать автоматическое масштабирование, балансировку нагрузки и SSL-сертификаты. У вас может быть автоматическое зелено-голубое развертывание при фиксации в определенной ветке вашего репозитория, и вы можете добавлять такие службы, как базы данных (SQL и NoSQL).
В целом, Railway — идеальное решение для разработчиков, которые хотят быстро развернуть приложений, не беспокоясь об управлении инфраструктурой. Важно отметить, что вы получаете бесплатные кредиты в месяц, и именно поэтому я хотел использовать их для своего бота Telegram!
Настройка бота
Есть много отличных статей о том, как создать телеграмм-бота, например эта. Для простоты я перенаправляю вас на Github репозиторий моего проекта, который вы можете клонировать на свой локальный сервер.
Во-первых, вам нужно будет создать нового бота с помощью @BotFather и скопировать токен API. Затем вы можете работать над скриптом main Python, который может выглядеть следующим образом:
from telegram.ext import CommandHandler, Filters, MessageHandler, Updater
...
def main():
updater = Updater(TELEGRAM_TOKEN, use_context=True)
dp = updater.dispatcher
# command handlers
dp.add_handler(CommandHandler("help", help_command_handler))
dp.add_handler(CommandHandler("start", start_command_handler))
dp.add_handler(CommandHandler("reset", reset))
# message handler
dp.add_handler(MessageHandler(Filters.text, echo))
dp.add_handler(MessageHandler(Filters.voice, handle_voice_message))
# log all errors
dp.add_error_handler(error)
# Start the Bot
if MODE == "webhook":
updater.start_webhook(
listen= "0.0.0.0",
port= int(PORT),
url_path= TELEGRAM_TOKEN,
webhook_url= WEBHOOK_URL + TELEGRAM_TOKEN
)
logging.info(f"Start webhook mode on port {PORT}")
else:
updater.start_polling()
logging.info(f"Start polling mode")
updater.idle()
Сначала он создает экземпляр Updater с токеном и контекстом Telegram, а затем настраивает различные обработчики событий команд и сообщений (например, обработка голосовых сообщений с определенной функцией, текстовых сообщений с другой). Если бот находится в режиме веб-хука, он запускает сервер веб-хука и прослушивает входящие запросы, в противном случае он начинает опрашивать сервер Telegram на наличие обновлений. В то время как для разработки и тестирования мы можем использовать опрос, который позволяет повторно проверять наличие новых обновлений, во время развертывания мы хотели бы иметь веб-перехватчик, чтобы Telegram отправлял обновления. к назначенной конечной точке бота, как только они станут доступны. Следовательно, веб-перехватчики быстрее и эффективнее, но для обработки входящих запросов им требуется общедоступная конечная точка.
Железная дорога: настройка базы данных
Бот также использует простую базу данных PostgreSQL для обработки пользовательской истории. Поскольку модель ChatGPT не имеет памяти, чтобы модель учитывала прошлые запросы, необходимо добавить предыдущее приглашение. Так запоминают чат-боты. Вот интересный блог, посвященный этому аспекту и тому, как обрабатывать историю в Python.
Теперь мы можем начать пользоваться железной дорогой! Войдите в свою учетную запись GitHub, нажмите «Начать новый проект» и подготовьте базу данных PostgreSQL.

Затем щелкните плитку PostgreSQL на панели инструментов, а затем нажмите кнопку «Создать новую таблицу». Напишите имя таблицы, а также имена и типы столбцов.

Создав таблицу, вы можете напрямую запросить базу данных, скопировать соединительную строку и проверить другую информацию.
Железная дорога: подключение репозитория GitHub
Железные дороги позволяют подключаться и развертывать изменения, зафиксированные в конкретной ветке. Нажмите кнопку «+ Создать», «Репозиторий GitHub» и выберите репозиторий, в котором реализован ваш бот.
Теперь Railway готова развернуть ваше приложение… но не так быстро.
Скорее всего, ваше приложение содержит переменные среды. В этом случае нам нужно добавить ключи для OpenAI и Telegram Bot, а также информацию о модели ChatGPT и URL-адрес веб-перехватчика, который Telegram будет использовать для отправки обновлений.
Давайте откроем страницу Переменные и добавим переменные среды, необходимые для работы вашего приложения (в вашем локальном компьютере вы можете создать файл .env и использовать python-dotenv для загрузки переменных).
Интересно видеть, что Railway автоматически вставляет переменную PostgreSQL в вашу среду, поэтому вы сможете подключиться к базе данных с помощью своего скрипта. Ниже вы можете увидеть, как это выглядит для моего бота:

Как было показано ранее, URL-адрес веб-перехватчика используется для получения обновлений от Telegram. URL-адрес и ПОРТ автоматически генерируются компанией Railway. Следовательно, вам нужно перейти в раздел Настройки › Среда › Домены и скопировать/вставить URL-адрес домена в переменную среды WEBHOOK_URL.
Железная дорога: создание приложения
Железные дороги используют Nixpacks для создания образа из корневого каталога, который затем будет использоваться в качестве среды для запуска вашего приложения. Он поддерживает множество языков и может быть настроен с помощью переменных среды или файлов.
Обычно вам могут понадобиться дополнительные пакеты, чтобы ваше приложение заработало. Например, я использую ffmpeg для преобразования .oga голосовых сообщений Telegram в .mp3 (принятый формат для Whisper API).
Для этого вы можете создать файл nitpicks.toml в корневом каталоге и добавьте пакеты Nix или APT, которые должны быть доступны во время сборки:
[phases.setup] nixPkgs = ["...", "ffmpeg"] # Install the ffmpeg package from Nix aptPkgs = ["...", "wget"] # Install the wget package with apt-get
Когда вы сделаете коммит, Railway автоматически определит Python, добавит новые пакеты и создаст образ Docker для запуска ваших приложений. Более того, он установит все необходимые библиотеки в requirements.txt

Железная дорога: мы живы!
Процесс создаст ваш образ и развернет вашего бота. Теперь вы можете проверять журналы, использование вашего сервиса, а также настраивать параметры для запуска развертывания в определенной ветке и автоматического перезапуска в случае сбоя!

Вы можете нажать кнопку «Просмотреть журналы», чтобы проверить журналы развертывания, куда будут перенаправлены все выходные данные ваших приложений.
Давайте откроем Telegram и начнем использовать нашего бота. Вы можете видеть, что мы можем задавать вопросы и продолжать следить за другими сообщениями, используя наш голос.
(Я попросил бота дополнить последний пункт о крытых парках развлечений с помощью голосового сообщения)



Шаблон железной дороги: создайте своего помощника
Я создал Железнодорожный шаблон, который позволяет вам напрямую создавать своего бота без необходимости выполнять ручные действия. ChatGPT правильно говорит:
Шаблон Railway — это предварительно настроенный шаблон проекта, который можно использовать в качестве отправной точки для создания приложения в Railway.app. Шаблоны включают предопределенные файлы конфигурации и зависимости для популярных фреймворков и языков программирования, таких как Node.js, Python, Ruby on Rails и других. Используя шаблон, вы можете избежать трудоемкого процесса настройки проекта с нуля и вместо этого сосредоточиться на создании и настройке приложения в соответствии с вашими конкретными потребностями.
Вам просто нужно будет получить токен OpenAI и BotFather для вашего личного помощника ChatGPT и добавить их в качестве переменных среды.
Кроме того, пока просто поместите заполнитель в WEBHOOK_URL, так как вам нужно будет скопировать/вставить тот, который был сгенерирован Railway, и установить CHATGPT_MODEL = "gpt-3.5-turbo".
Вы можете быстро создать своего бота, без каких-либо ограничений по токенам! (Поскольку API OpenAI не бесплатны, через некоторое время мне нужно будет ограничить доступ для пользователей…)

Заключение
Железная дорога предлагает строителям и исполнителям быстрый способ прототипирования и создания ботов или приложений Telegram, которые можно быстро масштабировать, чтобы разработчикам не приходилось управлять инфраструктурой. В будущем к боту могут быть добавлены дополнительные функции, такие как возможности преобразования текста в речь (TTS) или «поведение» ответа ChatGPT.
Доступность ChatGPT через приложения для обмена сообщениями, такие как Telegram, может значительно увеличить его использование и, следовательно, влияние.
Я надеюсь, что моя первая статья помогла читателям лучше познакомиться с ботами Telegram, железными дорогами и моделями OpenAI. Весь код, используемый в этом проекте, доступен на GitHub, здесь.
Находитесь ли вы в пути или лежите на диване, теперь вы знаете, к кому обратиться за ответами на ваши вопросы или за вдохновением для вашего следующего крупного проекта. А для тех, кто предпочитает более легкий подход, вы даже можете отправлять голосовые сообщения!