{"id":14268,"url":"\/distributions\/14268\/click?bit=1&hash=1e3309842e8b07895e75261917827295839cd5d4d57d48f0ca524f3f535a7946","title":"\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c \u0438\u0433\u0440\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e?","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"f71e1caf-7964-5525-98be-104bb436cb54"}

Как запустить ChatGPT-бота на сервере? Программирование с нуля для начинающих. Python + Telebot + демон PM2

В этом уроке по программированию с нуля я покажу, как запустить на сервере Телеграм-бота, использующего API ChatGPT, и как настроить специальный сервис «демон» (daemon) для его бесперебойной работы. Урок будет полезен, если вы хотите сделать пет-проект или MVP своими руками, умеете писать Телеграм-боты на Python, но не знаете, как работать с сервером.

План урока:

Меня очень вдохновила реакция на предыдущую статью «Обучение программированию с нуля. Вы напишете MVP для стартапа на Python за 1 день. OpenAI API + Google API». Я решил поднять планку контента и добавить видео.

Запускаем ChatGPT на сервере. Пишем Telegram bot на Python, используем демон pm2
Игорь Диев
Запускаю стартапы и учу новичков программированию. Подпишитесь на мои linkedin или телеграм. Это вдохновит на новые материалы 🤗

Постановка задачи — зачем что-то выкладывать на сервер?

Представьте, вы написали первую программу, и вы решаете ее показать друзьям, коллегам или, например. потенциальным инвесторам. Они смогут посмотреть ее только тогда, когда она запущена. Допустим, они решат ее посмотреть в выходные, и если у вас не будет включен компьютер, то программа работать не будет. Для этого мы и выкладываем ее на сервер.

Аренда виртуального выделенного сервера

Я не буду делать объективных обзоров или рейтингов провайдеров серверов. Моя цель — показать, что лично я делаю для достижения результата, какими сервисами и решениями пользуюсь. Мы будем использовать ruvds, это не реклама, просто мне их сервис кажется удобным.

Заходим на ruvds. com.

Регистрируемся или авторизуемся.

Нажимаем на кнопку «Заказать сервер». Выбираем страну.

Выбираем параметры, можно выбрать базовые настройки, например, 1 Gb RAM, 2CPU, 20Gb жесткий диск.

Для базовых задач с запасом подойдет сервер с таким набором параметров. Но можно еще покопаться в настройках, еще урезать параметры и получить максимально дешевый сервер с 1 ядром, 0,5 Гб оперативной памяти, 10 Gb диска. Для этого нужно выбрать сразу Ubuntu в качестве операционной системы.

Выбираем чистую операционную систему Ubuntu. Нам не нужно, чтобы Python или какие-то еще программы были установлены, мы это все будем ставить с нуля.

Обратите внимание, что во многих уроках предлагается арендовать хостинг, а не виртуальный выделенный сервер. На хостинге будет сразу установлен Python и кажется, что это удобно. Но на деле, если вам, например, понадобится другая версия Python, вы не сможете ничего именить, т. к. у вас не будет прав root. Root — это главный пользователь сервера с максимальными правами. К тому же, т. к. нам нужно будет ставить много разных программ, нет никакой гарантии, что хостинг разрешит вам это сделать без root-доступа.

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

После оплаты сервер начнет создаваться. Изучите появившийся экран, самая важная информация — это пароль от root и ip-адрес. Их нужно сохранить в отдельный файлик, например в блокнот.

Написание программы (Телеграм-Бот, использующий ChatPGT)

Обратите внимание, мы не будем для этого урока использовать программу из прошлой статьи (Обучение программированию с нуля. Вы напишете MVP для стартапа на Python за 1 день. OpenAI API + Google API). Ее мы будем выкладывать на сервер позднее, т. к. для нее процесс будет сложнее.

Для этого урока мы напишем максимально простую, но при этом рабочую и полезную программу, использующую ChatGPT. Она будет принимать на вход текст для поста для Инстаграма на русском, переводить на английский и добавлять хештеги.

Процесс создания программы вам уже знаком по предыдущей статье, кратко по нему еще раз пройдемся:

  1. Авторизуемся на сайте OpenAI, заходим в раздел API Keys, получаем ключ.
  2. Заходим в PyCharm, создаем новый проект. Называем его, например, ChatGPTHashtags.
  3. Жмем File > New, создаем файл config. py. В нем создаем переменную openai_token и сохраняем в нее наш ключ.
  4. Заходим в Open AI Playground. Создаем и тестируем промпт на примере нейросети da_vinci. У меня получился такой: I give you a post in Russian. You translate it to English. AND you also add appropriate hashtags.
  5. Копируем код с помощью кнопки View code. Вставляем его в main. py.
  6. Оборачиваем обращение к нейросети в функцию make_post. В качестве аргумента получаем пост, в качестве result передаем ответ от нейросети.
  7. Импортируем токен OpenAI (Api key) в основном коде.
  8. Заходим в @botfather в Телеграме, создаем нового бота, получаем токен.
  9. Добавляем токен в config. py. Импортируем токен Telegram в основном коде.
  10. Пишем функции для команды start и для типа контента text.
  11. Пишем bot. polling().
  12. Устанавливаем модули telebot и openai командами pip3 install telebot и pip3 install openai. Важно делать это в режиме активированной виртуальной среды (venv).

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

Тестируем бота в видим, что он генерирует нужный нам результат.

Тестируем бота, генерирующего перевод постов и добавляющего хештеги

Бот перестанет работать, когда мы выключим PyCharm. Дальше мы узнаем как сделать так, чтобы он работал 24/7.

Код для нейросети da_vinci:

import telebot import config import openai openai.api_key = config.openai_token bot = telebot.TeleBot(config.tg_token) def make_post(text): response = openai.Completion.create( model="text-davinci-003", prompt="We are making a post for Instagram. " "I give you a post in Russian. " "You translate it to English. " "AND you also add appropriate hashtags.\n" + text + "\n", temperature=0.7, max_tokens=256, top_p=1, frequency_penalty=0, presence_penalty=0 ) return response['choices'][0]['text'] @bot.message_handler(commands=['start']) def show_start(message): bot.send_message(message.chat.id, text="Введите любой пост на русском. Я переведу" "его на английский и добавлю хештеги") @bot.message_handler(content_types=['text']) def show_response(message): bot.send_message(message.chat.id, text=make_post(message.text)) bot.polling()

Код для нейросети Chat GPT-3.5-turbo:

import telebot import config import openai openai.api_key = config.openai_token bot = telebot.TeleBot(config.tg_token) def make_post(text): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": "We are making a post for Instagram. " "I give you a post in Russian. " "You translate it to English. " "AND you also add appropriate hashtags.\n" + text + "\n"} ] ) return response.choices[0].message.content @bot.message_handler(commands=['start']) def show_start(message): bot.send_message(message.chat.id, text="Введите любой пост на русском. Я переведу" "его на английский и добавлю хештеги") @bot.message_handler(content_types=['text']) def show_response(message): bot.send_message(message.chat.id, text=make_post(message.text)) bot.polling()

Если нейросеть будет возвращать кавычки, которые нам не нужны, можно будет прописать такой код:

@bot.message_handler(content_types=['text']) def show_response(message): bot.send_message(message.chat.id, text=(make_post(message.text).replace('"', '')))

Эмулируем Linux на Windows, разбираемся в командах

Данный блок только для пользователей WIndows. Пользователи Mac могут переходить сразу к следующей части, т. к. Mac OS — это Unix-подобная система и на нее не нужно ставить эмуляцию Unix/Linux. Все команды в Mac нужно выполнять в Терминале. Если что-то не сработает, попробуйте установить Java JDK. Если не получится, пишите в комментариях, я помогу разобраться.

Набираем в разделе «Поиск» на панели быстрого запуска слово cmd.

Нажимаем на слово «Командная строка», открываем Терминал.

В Терминале пишем wsl --install.

WSL (Windows Subsystem for Linux) — это как бы Linux/Unix на Windows. В Unix проще выполнять некоторые команды, которые нам нужны для работы с сервером. Да и в целом, это полезная вещь, например, на сайте OpenAI многие команды написаны именно для Unix:

Команды с сайта Open AI

Когда операционная система Unix установится, она попросит ввести логин и пароль для вашего юзера (как бы создается учетная запись). Введите, и вы увидите префикс с названием вашего компьютера, это означает, что вы в Unix.

Входим в Unix через командную строку Windows

Теперь выполните следующую команду (напишите ее в терминале и нажмите Enter):

sudo apt install ssh​

Apt install — это команда, которая устанавливает одобренные Unix дистрибутивы. SSH нужен нам для безопасного доступа к серверу.

Теперь достаем из файлика, куда мы сохранили IP и пароль, наши данные. Либо заходим в личный кабинет хостинг-провайдера и берем их там.

Выполняем команду

ssh root@ip-адрес-сервера

Система попросит ввести пароль от сервера. Вводим его и жмем Enter.

Обратите внимание, что пароль не отображается на экране в целях безопасности даже в виде звездочек. Еще интересно, что в эмуляции Unix операции «копировать» и «вставить» могут выполняться просто правой кнопкой мыши, это может стать для вас неожиданностью. Нажатием кнопки »вверх» на клавиатуре вы можете увидеть предыдущие выполненные команды, а кнопка «tab» просит Unix дополнить начатую строку.

Если все прошло успешно, вы попадете на сервер и увидите префикс с именем сервера.

Вошли на виртуальный выделенный сервер

Устанавливаем Python на сервер с Ubuntu, устанавливаем модули

Установка Python на сервер

Процесс установки Python состоит из нескольких этапов.

Сначала мы заходим на сервер (см. инструкцию выше) и вводим следующую команду:

sudo apt-get install software-properties-common

Эта команда установит программу, которая нам позволит управлять PPA-пакетами, с помощью которых мы будем устанавливать Python. Разница между PPA и Apt install в том, что PPA позволяет ставить неодобренные Unix программы. Последние версии Python не получалось ставить через простой Apt install, поэтому я воспользовался этим методом.

Далее пишем

sudo add-apt-repository ppa:deadsnakes/ppa -y

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

Ставим Python.

sudo apt install python3.10

Проверяем, что Python работает. Набираем python3, видим, что в терминале появились три скобки >>> в начале строки. Можем написать 3+5, если получим ответ 8, значит Python работает.

Создаем на сервере папку для нашего проекта и заходим в нее с помощью команд mkdir (make directory) и cd (change directory).

mkdir HTbot cd HTbot

Уходим с сервера, возвращаемся в WSL. Командой cd переходим в папку нашего проекта ChatGPTHashtags. У меня команды такие. У вас могут быть другие, в зависимости от того, куда вы положили ваш проект.

cd PycharmProjects cd ChatGPTHashtags

Копируем файлы программы на сервер.

scp main.py root@193.___.___.___:HTbot scp config.py root@193.___.___.___:HTbot

При копировании система попросит ввести пароль от сервера. Вы знаете, где его искать. Обратите внимание на синтаксис этой операции, если куда-то добавить лишний /, например, то все скопируется не туда.

Возвращаемся на сервер с помощью ssh.

ssh root@ip-адрес-сервера

Установка pip

Пишем стандартную команду, все должно пройти успешно. Система попросит ввести Y для подтверждения операции.

sudo apt install pip

Установка виртуальной среды (venv) на сервер

С виртуальной средой вы уже знакомы. Если нет — читайте подробный гайд Обучение программированию с нуля. Вы напишете MVP для стартапа на Python за 1 день. OpenAI API + Google API.

Работа с виртуальной средой на сервере состоит из 3-х этапов: мы ее устанавливаем, мы ее создаем и мы ее активируем.

Установка виртуальной среды. По какой-то причине работает только для версии 3.8, поэтому пишем команду так:

apt install python3.8-venv

Создание venv. Обратите внимание, что лучше это делать, находясь в нашей папке HTbot.

python3 -m venv venv

Если команда прошла успешно, ничего не произойдет, вы увидите новую пустую строку.

Если после любой из команд возникает ошибка, которую не получается исправить. вы всегда можете перезапустить сервер и попробовать все с начала. Важно следить за тем, все ли префиксы указаны в командах, правильно ли прописаны пути. Еще один способ решить возникающие проблемы — это команды sudo apt update и sudo apt upgrade. Также сервер может ругаться, что у вас неправильно прописано имя хоста. Решается путем команды sudo nano etc/hosts. В открывшемся файле нужно добавить строчку, написать 127.0.1.1 ruvds-____ — имя вашего хоста, которое вы видите в терминале, когда заходите на сервер.

Теперь активируем venv.

source venv/bin/activate

Делаем мы это из той папки, в которой создавали venv. Если все прошло успешно, вы видите префикс (venv) в начале строки в терминале.

Устанавливаем модули (важно, что после активации venv).

pip3 install telebot pip3 install openai

Создаем демона (daemon) для бесперебойной работы программы на сервере

Выполняем несколько команд. Сначала:

sudo apt install npm

Npm — это программа для установки пакетов Node. js. Наш менеджер демонов pm2 — это как раз программа для проектов, написанных на Node. js. Но и для Python решение подойдет.

Устанавливаем pm2:

npm install pm2 -g

Запускаем нашу программу из корневой директории. Чтобы вернуться в корневую директорию (вернее подняться на уровень выше) наберите:

cd ..

Теперь пишем

pm2 start HTbot/main.py

Протестируйте бота — он должен работать на этом этапе. Если все ок, выполните две последние команды и можно отключаться от сервера и наслаждаться бесперебойной работой нашей программы.

pm2 startup pm2 save

Проверим, как работает бот.

От сервера отсоединился, а бот работает!

Надеюсь, второй урок вам покажется таким же полезным, как и первый. Лично я долго искал информацию про запуск демона, когда самому нужно было в первый раз запустить Телеграм-бота на сервере.

Я также сгенерировал скидку на 15% на сервер (это максимальная скидка, которую дает хостинг), всю ее отдаю вам. Но ее запрещено передавать в статье публично, поэтому отправлю в личку всем, кто подпишется на мой Телеграм-канал.

Бот из данного урока:

Примеры следующих тем:

  • Подключаем базу данных.
  • Используем GIT.
  • Улучшаем код по рекомендациям профессиональных программистов.
  • Доработка программы Linguo Raccoon — выбор языка, выбор количества слов в словаре, улучшение интерфейса через inline-кнопки.
  • Добавляем новые тесты.
  • Реализация таймера для отправки сообщений по расписанию.
  • Генерация аудио и распознавание голосовых сообщений.
  • Обработка word chunks и идиом.

Пишите, какая интересней, и я ее приоритизирую.

Всем ❤

0
24 комментария
Написать комментарий...
Антон Кузьмин

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

Почитайте про systemctl: всего-то надо, что создать один файл /etc/systemd/system/mysuperbot и выполнить одну команду systemctl start mysuperbot

Кстати именно так запускается в режиме демона мой бот, который делает стикеры из фотографий с помощью Stable Diffusion: https://t.me/magic_sticker_bot?start=refVC

Ответить
Развернуть ветку
Игорь Диев
Автор

Бот хороший, спасибо!

Ответить
Развернуть ветку
Игорь Диев
Автор

В чем минусы использования pm2 для этой задачи?

А в файле systemctl что нужно прописать? Его же не просто нужно создать, его нужно заполнить. По количеству действий ваш способ будет более удобный и простой?

Ответить
Развернуть ветку
Игорь Диев
Автор

Вообще, хорошая идея, спасибо.
Добавлю как альтернативный способ. Пусть люди сами решают, что удобнее.

Ответить
Развернуть ветку
Антон Кузьмин

Вот один из тысяч туториалов: https://medium.com/codex/setup-a-python-script-as-a-service-through-systemctl-systemd-f0cc55a42267

Файл конфигурации буквально в 7 строк, делается копипастом)

Ответить
Развернуть ветку
Игорь Диев
Автор

Ну вот мне самому удобней использовать pm2. Для новичков вот такая история будет казаться замороченной, имхо:

[Unit]
Description=My test service
After=multi-user.target
[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/python3 /home//test.py
[Install]
WantedBy=multi-user.target

Ответить
Развернуть ветку
Антон Кузьмин

На самом деле pm2 ведь тоже демон, и тоже скорее всего запускается через systemctl ;)

Ответить
Развернуть ветку
Игорь Диев
Автор

Да, но сам набор команд для юзера (на мой взгляд) проще :)

Ответить
Развернуть ветку
Кирюша Блиновский

сверхразумно!

Ответить
Развернуть ветку
Анна Федосова

Игорь, спасибо за полезный контент!

Ответить
Развернуть ветку
Ira BARSKAYA

Завтра попробую, спс

Ответить
Развернуть ветку
Максим Марьин

Спасибо за статью, интересно было бы почитать про функции телеграм ботов ( например генерация аудио и т.д).
Сейчас тг боты выглядят как один из самых простых вариантов запустить mvp и посмотреть спрос, поэтому хотелось бы увидеть побольше возможностей что они могут )

Ответить
Развернуть ветку
Nickolai Vasiliev

Игорь, спасибо большое - очень полезная статья!

Запрос на подключение базы данных (MySQL) для сохранения контекста и обучения бота.

Ответить
Развернуть ветку
Игорь Диев
Автор

Да, про базу данных планирую скоро сделать урок ) Пришлю вам

Ответить
Развернуть ветку
Nickolai Vasiliev

Супер, жду 🤝

Ответить
Развернуть ветку
Игорь Диев
Автор

Простите, совсем завалило делами. Стараюсь выпустить

Ответить
Развернуть ветку
Игорь Сакай

Большое спасибо, Игорь.

Ответить
Развернуть ветку
Игорь Сакай

Благодарю. Вопрос. Насколько сложно интегрировать gpt chat в Телеграм?

Ответить
Развернуть ветку
Игорь Диев
Автор
Ответить
Развернуть ветку
George Tkachenko

Здравствуйте, подключение базы данных когда выйдет?

Ответить
Развернуть ветку
Игорь Диев
Автор

George, увы, не хватает времени.
Вы для бота на Python хотите использовать?

Ответить
Развернуть ветку
George Tkachenko

Да. С сыном по вашему уроку замутили бот для отслеживания личных рекордов в лёгкой атлетике. На каждого пользователя бот зааодит txt файл, где хранит данные пользователя и сделав мы поняли насколько это несовременно.. надо базу данных. https://t.me/res_track_bot. Урок ваш очень понравился и честно говоря мы сыном раскатали губу на все 10 аннонсированых урока. Удачи вам в делах и творчестве

Ответить
Развернуть ветку
Игорь Диев
Автор

Ого, вы разобрались, как на сервер выложить? Очень здорово. Постараюсь найти время, добить уроки )

Ответить
Развернуть ветку
Евгений Коростелев

Благодарю, полезная статья!

Ответить
Развернуть ветку
21 комментарий
Раскрывать всегда