Этот скрипт представляет собой приложение на основе PyQt6, которое объединяет генерацию текстов с использованием модели GPT-2 и Telegram-бота. Оно позволяет пользователю подключаться к своему Telegram-боту и автоматически генерировать ответы на сообщения, используя возможности GPT-2.
Основные компоненты и функциональные возможности:
- GPT2Generator:Этот класс отвечает за генерацию текста на основе модели GPT-2. Он использует библиотеку transformers для работы с моделью и токенизатором.
Генерация текста настраивается через такие параметры, как температура, длина текста и количество вариантов ответа.
Сгенерированный текст возвращается в виде строки, которую затем можно отправить в чат Telegram. - TelegramBotThread:Класс TelegramBotThread представляет собой отдельный поток, отвечающий за работу Telegram-бота. Это необходимо для того, чтобы основной интерфейс приложения оставался отзывчивым во время работы бота.
Бот взаимодействует с пользователем через команду /start и сообщения. На любое текстовое сообщение, отправленное в бот, будет сгенерирован и отправлен ответ с использованием GPT-2.
Поток использует библиотеку python-telegram-bot и встроенные асинхронные функции для работы с Telegram API. - GPT2App:Основной класс приложения, представляющий собой графический интерфейс, разработанный с использованием PyQt6. Этот интерфейс позволяет пользователю управлять моделью и подключаться к Telegram-боту.
Пользователь может выбирать из списка загруженных моделей GPT-2, а также управлять подключением и отключением от Telegram-бота.
Приложение сохраняет настройки, включая путь к моделям, что упрощает работу при повторном запуске.
Основные шаги работы с приложением:
- Загрузка модели:Приложение позволяет пользователю выбирать предварительно обученную модель GPT для генерации текстов. Пользователь может добавить свои модели, путь к которым сохраняется для будущих сессий.
- Подключение к Telegram-боту:После выбора модели, пользователь может подключить приложение к своему Telegram-боту. Бот начинает работу в отдельном потоке, что обеспечивает бесперебойную работу графического интерфейса.
- Генерация и отправка сообщений:Когда пользователь Telegram отправляет сообщение боту, это сообщение обрабатывается моделью GPT, и ответ генерируется автоматически на основе настроек, заданных пользователем.
- Отключение бота:Пользователь может отключить бота в любой момент, прекратив работу отдельного потока. Это особенно полезно, если требуется временно остановить генерацию ответов.
Преимущества и возможности расширения:
- Интеграция с 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())