Бот для проверки орфографии и пунктуации через GPT-4o на Python

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Я не обладаю природной грамотностью, и мне бывает мучительно стыдно за то, что я пишу. Для приведения текстов в минимально читабельный вид я использую специальные сервисы, которые проверяют орфографию и пунктуацию. И сегодня мы попробуем не просто использовать такой сервис, а написать свой. В этой статье мы напишем и развернем на удаленном сервере Telegram бота, который проверяет грамматику.

Бот будет проверять текст на грамматические ошибки, исправлять их и даст рекомендации по грамотному написанию.

Саму проверку грамматики осуществляет GPT-4o, что нам даст возможность легкой корректировки и адаптации решения к реальным кейсам в случае необходимости.

Функциональность бота проверки орфографии

Бот проверяет и исправляет текст с грамматическими ошибками следующим образом.

Пример работы бота
Пример работы бота

После написания кода бота проверки орфографии и пунктуации мы развернем его в облаке Amvera, так как оно из коробки поддерживает бесплатное встроенное проксирование до API OpenAI, дает возможность развертывания проектов через загрузку файлов в интерфейсе и начисляет при регистрации бонусный баланс для бесплатных тестов.

Исходный код бота доступен в репозитории GitHub

Приступим.

Создание бота проверки правописания

Зарегистрируем бота в @BotFather и получим токен по данному примеру:

Процесс регистрации бота
Процесс регистрации бота

Успешно! Мы создали бота, сохраним его токен.

Написание бота с использованием библиотеки aiogram 3

Установим локально все необходимые библиотеки. Хотя можно использовать библиотеку telebot, aiogram является более подходящим вариантом для новичков благодаря своей простоте.

pip install aiogram nest_asyncio g4f

Переходим в командную строку и прописываем данную команду выше. 

Теперь можно приступить к написанию кода

  1. Создаём файл main.py

  2. Импортируем необходимые библиотеки

import logging  # Импортируем модуль для ведения логов
import asyncio  # Импортируем модуль для работы с асинхронным кодом
import nest_asyncio  # Импортируем библиотеку, позволяющую использовать asyncio в уже работающих циклах событий
import os  # Импортируем модуль для работы с операционной системой (например, для доступа к переменным окружения)
from g4f.client import Client  # Импортируем класс Client из библиотеки g4f для взаимодействия с API


from aiogram import Bot, Dispatcher, types  # Импортируем основные классы aiogram для работы с Telegram Bot API
from aiogram.filters import CommandStart  # Импортируем фильтр для обработки команды /start
from aiogram.types import Message  # Импортируем класс Message для работы с сообщениями

Чтобы развернуть нашего бота проверки грамотности текста на удаленном сервере, нам понадобится написать файл requirements.txt, куда мы запишем все наши зависимости.

Выглядеть requirements.txt будет  так

nest-asyncio==1.6.0
g4f==0.4.5.3
aiogram==3.17.0

3. Создаём экземпляр бота

# Настраиваем уровень логирования на INFO
logging.basicConfig(level=logging.INFO)


# Создаем экземпляр бота с токеном, который берется из переменных окружения
bot = Bot(token=os.environ["TOKEN"])
# Создаем диспетчер для обработки входящих сообщений
dp = Dispatcher()


# Применяем nest_asyncio для работы с асинхронным кодом в Jupyter или других средах, где уже запущен цикл событий
nest_asyncio.apply()


# Основная асинхронная функция для запуска бота
async def main():
    # Запускаем опрос (polling) для получения обновлений от Telegram
    await dp.start_polling(bot)


# Проверяем, что этот файл запускается как основная программа
if __name__ == "__main__":
    # Запускаем основную функцию в асинхронном режиме
    asyncio.run(main())

Создадим команды бота для проверки грамотности текста

  1. Команда старта

# Обрабатываем команду /start
@dp.message(CommandStart())
async def cmd_start(message: Message):
    # Формируем текст приветствия, используя имя пользователя
    text = f"Привет, @{message.from_user.username}! Напиши мне текст, а я его подправлю."
    # Отправляем ответ пользователю с текстом приветствия в формате Markdown
    await message.answer(text, parse_mode="Markdown")

2. Далее напишем саму функцию, которая отвечает за проверку грамматических и орфографических ошибок

# Обрабатываем все остальные сообщения
@dp.message()
async def handle_message(message: Message):
    # Создаем экземпляр клиента для работы с API g4f
    client = Client()
    # Отправляем запрос на создание завершения чата с моделью gpt-4o
    response = client.chat.completions.create(
        model="gpt-4o",  # Указываем модель, которую будем использовать
        messages=[  # Передаем список сообщений для контекста
            {"role": "user", "content": f"Привет! Проверь мой текст на наличие грамматических ошибок: \"{message.text}\""},
            {"role": "system", "content": "Отвечай таким шаблоном и никак иначе: \"Исправленные слова:\n\nПравила, которые стоит вам прочесть:\", если ты не нашёл ошибки, то скажи об этом."}
        ]
    )
    # Отправляем пользователю ответ от модели
    await message.answer(response.choices[0].message.content) 

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

Подготовка к деплою

Деплой мы произведем в облаке Amvera, которое поддерживает бесплатное встроенное проксирование до API OpenAI, что нужно нам для работы GPT-4o и возможность развертывания через загрузку файлов в интерфейсе (или через git push). Помимо этого, при регистрации будет начислен бонусный баланс в 111 руб., который позволит пользоваться сервисом бесплатно на время тестов.

Создадим конфигурационный файл amvera.yaml

Используем генератор для создания этого файла или зададим поля в разделе Конфигурация.

Задаем параметры конфигурации проекта
Задаем параметры конфигурации проекта

Выбираем окружение Python. Далее вводим версию Python, в нашем случае 3.10. Указываем путь к файлу с зависимостями, requirements.txt 

Вводим имя нашего основного файла, в моём случае main.py

Важно: если вы используете в проекте SQLite, обязательно сохраните ее в постоянное хранилище /data и пропишите в коде к ней пути в виде /data/имя_файла. Это позволит не потерять данные при пересборке.

Вот так выглядит файл конфигурации:

meta:
  environment: python
  toolchain:
    name: pip
    version: 3.10
build:
  requirementsPath: requirements.txt
run:
  scriptName: main.py
  persistenceMount: /data
  containerPort: 80

Деплой через интерфейс

  1. Нажимаем на кнопку создать проект.

  2. Выбираем тип сервиса — приложение, вводим название проекта и выбираем тарифный план.

  3. Нажимаем далее.

  4. Выбираем файлы которые нужно закинуть в проект и перемещаем их в окно загрузки.

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

Нажимаем на кнопку далее. У нас появится окно загрузки файлов, куда их надо перетянуть. Важно не загружать папку venv. Система сама создаст ее на основе файла с зависимостями.

Здесь ничего не требуется делать, так как мы загрузили файл amvera.yaml, и все настройки происходят автоматически. Просто нажмите «Завершить». Начнется сборка, но она завершится ошибкой, так как мы не добавили токен нашего бота в секреты.

Теперь нам необходимо добавить секрет — токен нашего бота. В методе bot.run() мы указали просто слово TOKEN, но теперь нужно создать переменную как секрет. Для этого переходим на вкладку «Переменные» в проекте и нажимаем «Создать секрет». В поле «Название» вводим переменную TOKEN, а в поле «Значение» — сам токен.

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

Поздравляю, наш проект запущен.
Поздравляю, наш проект запущен.

Рассмотрим альтернативный способ — деплой через Git

Механика доставки кода через git push amvera master даст возможность обновлять наш проект всего тремя командами в терминале, без необходимости заходить на сайт облачного сервиса, что значительно удобнее.

  1. Создаём папку проекта и помещаем в неё все файлы. 

  2. Открываем командную строку и переходим в нашу папку с помощью команды cd "путь к папке". После этого инициализируем репозиторий, выполнив команду. 

git init 

Далее заходим в Amvera и создаём новый проект.

Теперь мы выбираем метод «Через Git».

Теперь нам нужно подключиться к существующему репозиторию, для этого копируем команду ниже и вставляем в командную строку.

Потребуется ввести логин и пароль от сервиса Amvera. При этом терминал при вводе пароля не будет его отображать. Это сделано для безопасности.

После чего вводим команды для добавления файлов и создания коммита:

git add .

Не забываем про точку в конце команды, она нужна.

git commit -m "initial commit" 

Вместо "initial commit" пишем любое описание изменений, но это на ваш вкус.

Запушим все файлы и сборка начнется автоматически. Для этого вводим команду:

git push amvera master

Если все выполнено корректно, после сборки начнётся процесс запуска бота проверки грамматики. В случае возникновения ошибки рекомендуется изучить Лог сборки и Лог приложения, а также ознакомиться с распространёнными ошибками в документации сервиса.

Результат

Мы написали Telegram бота, который проверяет орфографию и подсказывает, есть ли в тексте ошибки и как их исправить. Для этого мы задействовали API OpenAI, а именно сеть GPT-4o, которая позволяет реализовать решение с высоким потенциалом для изменений и дальнейшего совершенствования приложения.

Исходный код бота в репозитории GitHub

Источник: https://habr.com/ru/companies/amvera/articles/882728/


Интересные статьи

Интересные статьи

Применять паттерны программирования — хорошая практика. К сожалению, на проектах CMS Bitrix редко встречаются примеры использования. В статье я покажу на примере, как можно использовать паттерн D...
Итак, вы уже получили всю необходимую информацию в результате разведки — о том, как это сделать мы говорили в первой части статьи.  Помните, на чем мы остановились? Мы предупреждали, что выполнят...
Карликовая многозубка, самое маленькое млекопитающее по массе. Источник. Внутри маленький целостный сложный мозг, который уже принципиально можно картировать Короткий ответ — мо...
Много всякого сыпется в мой ящик, в том числе и от Битрикса (справедливости ради стоит отметить, что я когда-то регистрировался на их сайте). Но вот мне надоели эти письма и я решил отписатьс...
Как широко известно, с 1 января 2017 года наступает три важных события в жизни интернет-магазинов.