Найти тему
Обо всем по немногу.

Обзор и функциональность скрипта для генерации ответов в Telegram с использованием GPT

Оглавление

Этот скрипт представляет собой приложение на основе PyQt6, которое объединяет генерацию текстов с использованием модели GPT-2 и Telegram-бота. Оно позволяет пользователю подключаться к своему Telegram-боту и автоматически генерировать ответы на сообщения, используя возможности GPT-2.

Основные компоненты и функциональные возможности:

  1. GPT2Generator:Этот класс отвечает за генерацию текста на основе модели GPT-2. Он использует библиотеку transformers для работы с моделью и токенизатором.
    Генерация текста настраивается через такие параметры, как температура, длина текста и количество вариантов ответа.
    Сгенерированный текст возвращается в виде строки, которую затем можно отправить в чат Telegram.
  2. TelegramBotThread:Класс TelegramBotThread представляет собой отдельный поток, отвечающий за работу Telegram-бота. Это необходимо для того, чтобы основной интерфейс приложения оставался отзывчивым во время работы бота.
    Бот взаимодействует с пользователем через команду /start и сообщения. На любое текстовое сообщение, отправленное в бот, будет сгенерирован и отправлен ответ с использованием GPT-2.
    Поток использует библиотеку python-telegram-bot и встроенные асинхронные функции для работы с Telegram API.
  3. GPT2App:Основной класс приложения, представляющий собой графический интерфейс, разработанный с использованием PyQt6. Этот интерфейс позволяет пользователю управлять моделью и подключаться к Telegram-боту.
    Пользователь может выбирать из списка загруженных моделей GPT-2, а также управлять подключением и отключением от Telegram-бота.
    Приложение сохраняет настройки, включая путь к моделям, что упрощает работу при повторном запуске.

Основные шаги работы с приложением:

  1. Загрузка модели:Приложение позволяет пользователю выбирать предварительно обученную модель GPT для генерации текстов. Пользователь может добавить свои модели, путь к которым сохраняется для будущих сессий.
  2. Подключение к Telegram-боту:После выбора модели, пользователь может подключить приложение к своему Telegram-боту. Бот начинает работу в отдельном потоке, что обеспечивает бесперебойную работу графического интерфейса.
  3. Генерация и отправка сообщений:Когда пользователь Telegram отправляет сообщение боту, это сообщение обрабатывается моделью GPT, и ответ генерируется автоматически на основе настроек, заданных пользователем.
  4. Отключение бота:Пользователь может отключить бота в любой момент, прекратив работу отдельного потока. Это особенно полезно, если требуется временно остановить генерацию ответов.

Преимущества и возможности расширения:

  • Интеграция с Telegram: Этот скрипт позволяет пользователям легко подключить GPT к Telegram, что открывает широкий спектр возможностей для автоматизации общения, создания чат-ботов и других приложений.
  • Асинхронная работа: Использование потоков и асинхронных функций обеспечивает стабильную работу приложения, даже при высоких нагрузках или длительных операциях.
  • Гибкость настроек: Возможность выбора модели и управления параметрами генерации позволяет настроить бота под различные задачи, от простой переписки до сложных диалогов.

Заключение

Этот скрипт представляет собой мощное средство для создания интеллектуального Telegram-бота с использованием модели GPT. Он может быть полезен как для индивидуальных проектов, так и для бизнеса, позволяя автоматизировать общение и создавать уникальные пользовательские интерфейсы на базе современных технологий искусственного интеллекта.

И сам скрипт:

import sys

import asyncio

import json

import os

from PyQt6.QtCore import QThread, pyqtSignal

from PyQt6.QtGui import QIcon

from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QLabel, QVBoxLayout, QComboBox, QMessageBox

from telegram import Update

from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, ContextTypes

from transformers import GPT2LMHeadModel, GPT2Tokenizer

import torch

import nest_asyncio

nest_asyncio.apply()

class GPT2Generator:

def __init__(self, model_path):

self.tokenizer = GPT2Tokenizer.from_pretrained(model_path)

self.model = GPT2LMHeadModel.from_pretrained(model_path)

def generate_text(self, input_text, temperature_value, length_value, num_results, no_repeat_ngram_size):

input_ids = self.tokenizer.encode(input_text, return_tensors='pt')

attention_mask = torch.ones(input_ids.shape, dtype=torch.long, device=input_ids.device)

outputs = self.model.generate(

input_ids=input_ids,

attention_mask=attention_mask,

max_length=length_value,

num_return_sequences=num_results,

no_repeat_ngram_size=no_repeat_ngram_size,

repetition_penalty=1.5,

temperature=temperature_value,

do_sample=True

)

result_text = ""

for i, output in enumerate(outputs):

generated_text = self.tokenizer.decode(output, skip_special_tokens=True)

if i == 0:

generated_text = generated_text.replace(input_text, "")

result_text += generated_text + "\n\n"

return result_text

class TelegramBotThread(QThread):

bot_started = pyqtSignal()

bot_stopped = pyqtSignal()

def __init__(self, model_path, temperature, parent=None):

super().__init__(parent)

self.model_path = model_path

self.temperature = temperature

self.bot_token = '1491583093:AAGvgsivhMwSk-c9Lek7TcgyBvohwvlb1VU' # Replace with your actual bot token

self.application = None

async def start_bot(self):

self.application = ApplicationBuilder().token(self.bot_token).build()

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:

await update.message.reply_text('Привет! меня зовут Александр.')

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:

user_message = update.message.text

length_value = 32 # Example length, can be adjusted

num_results = 1

no_repeat_ngram_size = 2

try:

gpt2_generator = GPT2Generator(self.model_path)

response = gpt2_generator.generate_text(

user_message, self.temperature, length_value, num_results, no_repeat_ngram_size

)

chunk_size = 4096

for i in range(0, len(response), chunk_size):

await update.message.reply_text(response[i:i + chunk_size])

except Exception as e:

await update.message.reply_text(f"Error: {str(e)}")

self.application.add_handler(CommandHandler('start', start))

self.application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))

self.bot_started.emit()

await self.application.run_polling()

self.bot_stopped.emit()

def run(self):

asyncio.run(self.start_bot())

def stop(self):

if self.application:

self.application.stop()

class GPT2App(QMainWindow):

def __init__(self):

super().__init__()

self.model_paths = []

self.current_model_path = ""

self.temperature_value = 0.1

self.loadSettings()

self.initUI()

self.telegram_thread = None

def initUI(self):

self.setWindowTitle('Генератор ответов')

self.setWindowIcon(QIcon('icon.png'))

self.resize(400, 200)

self.central_widget = QWidget()

self.setCentralWidget(self.central_widget)

self.layout = QVBoxLayout(self.central_widget)

self.model_label = QLabel('Выберите модель:')

self.model_combo = QComboBox()

self.updateModelComboBox()

self.connect_button = QPushButton('Подключиться к Telegram')

self.connect_button.clicked.connect(self.connectToTelegramBot)

self.disconnect_button = QPushButton('Отключиться от Telegram')

self.disconnect_button.clicked.connect(self.disconnectFromTelegramBot)

self.disconnect_button.setEnabled(False)

self.layout.addWidget(self.model_label)

self.layout.addWidget(self.model_combo)

self.layout.addWidget(self.connect_button)

self.layout.addWidget(self.disconnect_button)

def updateModelComboBox(self):

self.model_combo.clear()

self.model_combo.addItems(self.model_paths)

self.updateCurrentModelPath()

def updateCurrentModelPath(self):

self.current_model_path = self.model_combo.currentText()

def connectToTelegramBot(self):

if not self.current_model_path:

QMessageBox.warning(self, "Ошибка", "Выберите модель для подключения.")

return

self.telegram_thread = TelegramBotThread(self.current_model_path, self.temperature_value)

self.telegram_thread.bot_started.connect(self.onBotStarted)

self.telegram_thread.bot_stopped.connect(self.onBotStopped)

self.telegram_thread.start()

def disconnectFromTelegramBot(self):

if self.telegram_thread:

self.telegram_thread.stop()

self.telegram_thread = None

self.connect_button.setEnabled(True)

self.disconnect_button.setEnabled(False)

def onBotStarted(self):

self.connect_button.setEnabled(False)

self.disconnect_button.setEnabled(True)

def onBotStopped(self):

self.connect_button.setEnabled(True)

self.disconnect_button.setEnabled(False)

def loadSettings(self):

if os.path.exists("settings.json"):

with open("settings.json", "r") as file:

settings = json.load(file)

self.model_paths = settings.get("model_paths", [])

self.current_model_path = settings.get("current_model_path", "")

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = GPT2App()

ex.show()

sys.exit(app.exec())