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

Интерфейс для общения с моделью GPT

Оглавление

Создание веб-интерфейса для генерации текста с помощью модели GPT-2

В данной статье мы рассмотрим, как создать простой веб-интерфейс для взаимодействия с предобученной моделью GPT-2 для генерации текста. В качестве фреймворка для веб-разработки будет использоваться Flask, а для работы с моделью GPT-2 — библиотека Transformers от Hugging Face.

Основы работы

Сначала мы создадим Python-скрипт, который будет основой нашего веб-приложения, используя Flask. Этот скрипт будет обрабатывать HTTP-запросы для генерации текста с помощью модели GPT-2 и отправлять результаты обратно клиенту.

Серверная часть

Класс GPT2Generator является центральным компонентом нашего приложения. Он инициализирует модель и токенизатор GPT-2 из указанного пути и предоставляет метод generate_text, который принимает текстовый запрос пользователя и параметры генерации (такие как температура, длина ответа, количество результатов и размер n-граммы), и возвращает сгенерированный текст.

Метод generate_text использует функцию generate модели GPT-2 для создания текста на основе входных данных, принимая во внимание заданные параметры. Результаты декодируются и форматируются перед отправкой клиенту.

Flask-приложение обрабатывает два типа запросов: GET и POST. Для GET-запросов отображается HTML-страница с формой для ввода текста. Для POST-запросов, которые отправляются асинхронно с помощью JavaScript, текст из формы обрабатывается, и результаты возвращаются в формате JSON.

Клиентская часть

HTML-страница содержит форму для ввода текста, кнопку для отправки запроса и блок для отображения результатов. Стили CSS используются для базового оформления страницы.

JavaScript код, встроенный в HTML, обрабатывает отправку формы, делая асинхронный запрос к серверу и отображая полученные результаты. Также в скрипте реализована простая подсветка синтаксиса для выделения ключевых слов Python в сгенерированном тексте.

Заключение

Разработанный проект демонстрирует, как можно сочетать возможности библиотеки Transformers для работы с нейросетевыми моделями и фреймворка Flask для создания веб-приложений. Полученный веб-интерфейс предоставляет удобный способ для пользователей генерировать текст с помощью модели GPT-2, что может быть полезно для различных творческих и образовательных целей.

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

код скрипта: import torch

from transformers import GPT2LMHeadModel, GPT2Tokenizer

from flask import Flask, render_template, request, jsonify

app = Flask(__name__)

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)

generated_text = generated_text[len(input_text):]  # удаляем затравку из сгенерированного текста

result_text.append(generated_text)

return result_text

gpt2_generator = GPT2Generator("C:/gpt/model")

temperature_value = 0.1

length_value = 200

num_results = 1

ngram_value = 1

@app.route('/', methods=['GET', 'POST'])

def index():

if request.method == 'POST':

input_text = request.get_json()['input_text']

result_text = gpt2_generator.generate_text(input_text, temperature_value, length_value, num_results, ngram_value)

return jsonify(result_text=result_text)

return render_template('index.html')

if __name__ == "__main__":

app.run(debug=True)

код html интерфейса: <!DOCTYPE html>

<html lang="ru">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Генератор ответов.</title>

<style>

body {

font-family: Arial, sans-serif;

text-align: center;

}

h1 {

font-size: 2.5em;

margin-bottom: 20px;

}

form {

display: flex;

flex-direction: column;

align-items: center;

margin-bottom: 20px;

}

label {

margin-bottom: 10px;

}

textarea {

width: 80%;

height: 150px;

padding: 10px;

border-radius: 10px;

border: 1px solid #ccc;

margin-bottom: 15px;

resize: none;

}

input[type="submit"] {

padding: 10px 20px;

border: none;

border-radius: 5px;

background-color: #4CAF50;

color: white;

font-size: 1em;

cursor: pointer;

transition: background-color 0.3s;

}

input[type="submit"]:hover {

background-color: #45a049;

}

#result {

display: none;

margin-top: 20px;

}

ul {

list-style: none;

padding: 0;

}

li {

margin-bottom: 10px;

border-radius: 5px;

background-color: #f2f2f2;

padding: 10px;

}

pre {

font-family: "Courier New", Courier, monospace;

background-color: #f8f8f8;

padding: 10px;

border-radius: 10px;

border: 1px solid #ccc;

margin-bottom: 15px;

overflow-x: auto;

}

.keyword {

color: #0000FF;

}

.builtin {

color: #A020F0;

}

.string {

color: #008000;

}

.comment {

color: #808080;

}

</style>

</head>

<body>

<h1>Генератор ответов.</h1>

<form id="answerForm" method="post" action="/">

<label for="input_text">Введите вопрос:</label>

<textarea name="input_text" id="input_text"></textarea>

<input type="submit" value="Сгенерировать ответ">

</form>

<div id="result">

<h2>Результат:</h2>

<ul id="resultList"></ul>

</div>

<script>

document.getElementById('answerForm').addEventListener('submit', function(event) {

event.preventDefault(); // Предотвратить отправку формы

var inputText = document.getElementById('input_text').value;

// Отправить введенный текст на сервер

fetch('/', {

method: 'POST',

body: JSON.stringify({input_text: inputText}),

headers: {'Content-Type': 'application/json'}

})

.then(response => response.json())

.then(data => {

var resultList = document.getElementById('resultList');

resultList.innerHTML = ""; // Очистить список результатов

// Вывести сгенерированные ответы в список

data.result_text.forEach(function(answer) {

var newResult = document.createElement('li');

var preElement = document.createElement('pre');

preElement.innerHTML = answer;

// Выделение синтаксиса кода

preElement.innerHTML = preElement.innerHTML.replace(/(import|from|class|def|for|while|if|else|elif|try|except|finally|return|yield|break|continue|pass|lambda|print)\b/g, '<span class="keyword">$1</span>');

preElement.innerHTML = preElement.innerHTML.replace(/(\b\w+\.\w+\b)/g, '<span class="builtin">$1</span>');

preElement.innerHTML = preElement.innerHTML.replace(/('[^']*'|"[^"]*")/g, '<span class="string">$1</span>');

preElement.innerHTML = preElement.innerHTML.replace(/(#.*)/g, '<span class="comment">$1</span>');

newResult.appendChild(preElement);

resultList.appendChild(newResult);

});

document.getElementById('result').style.display = 'block'; // Показать результат

});

});

</script>

</body>

</html>