исправь ошибки
<!DOCTYPE html>

<html lang="ru">

<head>

  <meta charset="UTF-8">

  <title>Вопрос-Ответ RNN с использованием GPU</title>

  <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"></script>

  <style>

    body {

      font-family: Arial, sans-serif;

      margin: 20px;

    }

    #status {

      margin-bottom: 20px;

      color: blue;

    }

    #question {

      width: 100%;

      padding: 10px;

      font-size: 16px;

    }

    #answer {

      margin-top: 20px;

      font-weight: bold;

    }

    button {

      padding: 10px 20px;

      font-size: 16px;

    }

  </style>

</head>

<body>

  <h1>Вопрос-Ответ на базе RNN с использованием GPU</h1>

  <div id="status">Инициализация...</div>

  <input type="text" id="question" placeholder="Введите вопрос">

  <button id="askButton" onclick="getAnswer()" disabled>Получить ответ</button>

  <p id="answer"></p>

  <script>

    // Данные для обучения (20 пар вопрос-ответ)

    const data = [

      {

        "question": "Что такое искусственный интеллект?",

        "answer": "Искусственный интеллект – раздел информатики, посвященный созданию систем, способных выполнять задачи, требующие человеческого интеллекта."

      },

      {

        "question": "Кто такой Альберт Эйнштейн?",

        "answer": "Альберт Эйнштейн – немецкий физик-теоретик, один из основоположников современной теоретической физики."

      },

      {

        "question": "Что такое теория относительности?",

        "answer": "Теория относительности – физическая теория пространства-времени и гравитации, созданная Альбертом Эйнштейном."

      },

      {

        "question": "Что изучает квантовая механика?",

        "answer": "Квантовая механика изучает физические явления на масштабах атомов и субатомных частиц."

      },

      {

        "question": "Кто написал 'Войну и мир'?",

        "answer": "Роман 'Война и мир' написал Лев Николаевич Толстой."

      },

      {

        "question": "Что такое фотосинтез?",

        "answer": "Фотосинтез – процесс преобразования энергии света в химическую энергию в растениях."

      },

      {

        "question": "Какая самая высокая гора в мире?",

        "answer": "Самая высокая гора в мире – Эверест, высотой 8848 метров."

      },

      {

        "question": "Кто создал первую периодическую таблицу?",

        "answer": "Периодическую таблицу элементов создал Дмитрий Иванович Менделеев."

      },

      {

        "question": "Что такое ДНК?",

        "answer": "ДНК – молекула, несущая генетическую информацию живых организмов."

      },

      {

        "question": "Что такое глобальное потепление?",

        "answer": "Глобальное потепление – долгосрочное повышение средней температуры климатической системы Земли."

      },

      {

        "question": "Кто написал симфонию №9?",

        "answer": "Симфонию №9 написал Людвиг ван Бетховен."

      },

      {

        "question": "Что такое интернет?",

        "answer": "Интернет – глобальная система объединенных компьютерных сетей для хранения и передачи информации."

      },

      {

        "question": "Что изучает астрономия?",

        "answer": "Астрономия изучает небесные тела и явления вне атмосферы Земли."

      },

      {

        "question": "Кто такой Исаак Ньютон?",

        "answer": "Исаак Ньютон – английский физик и математик, основоположник классической механики."

      },

      {

        "question": "Что такое клетка?",

        "answer": "Клетка – основная структурная и функциональная единица живых организмов."

      },

      {

        "question": "Что такое электромагнитное излучение?",

        "answer": "Электромагнитное излучение – форма передачи энергии через волны, включающая свет и радиоволны."

      },

      {

        "question": "Кто первый человек в космосе?",

        "answer": "Первый человек в космосе – Юрий Алексеевич Гагарин."

      },

      {

        "question": "Что такое гравитация?",

        "answer": "Гравитация – сила притяжения между массами, описываемая законом всемирного тяготения."

      },

      {

        "question": "Что изучает биология?",

        "answer": "Биология изучает жизнь и живые организмы, их структуру, функции и эволюцию."

      },

      {

        "question": "Что такое Великая Китайская стена?",

        "answer": "Великая Китайская стена – серия укреплений, построенных для защиты Китая от нашествий."

      }

    ];

    let model;

    let tokenizer;

    const sequenceLength = 20; // Максимальная длина последовательности

    // Инициализация бекенда WebGL для использования GPU

    async function initializeBackend() {

      const statusElem = document.getElementById('status');

      statusElem.innerText = 'Инициализация бекенда...';

      // Получаем список доступных бекендов

      const backends = tf.engine().backendNames();

      if (backends.includes('webgl')) {

        // Устанавливаем бекенд WebGL

        await tf.setBackend('webgl');

        await tf.ready();

        statusElem.innerText = 'Бекенд WebGL инициализирован. Используется GPU.';

      } else {

        statusElem.innerText = 'Бекенд WebGL не поддерживается. Используется CPU.';

      }

    }

    async function preprocessData() {

      const statusElem = document.getElementById('status');

      statusElem.innerText = 'Подготовка данных...';

      const texts = data.flatMap(item => [item.question, item.answer]);

      // Создаем словарь слов

      const vocab = new Set();

      texts.forEach(text => {

        text.toLowerCase().split(/\s+/).forEach(word => vocab.add(word));

      });

      const wordIndex = {};

      [...vocab].forEach((word, index) => {

        wordIndex[word] = index + 1; // Индексация с 1

      });

      tokenizer = {

        wordIndex: wordIndex,

        indexWord: Object.fromEntries(Object.entries(wordIndex).map(([k, v]) => [v, k])),

        textsToSequences: function(texts) {

          return texts.map(text => {

            return text.toLowerCase().split(/\s+/).map(word => wordIndex[word] || 0);

          });

        }

      };

    }

    function createModel(vocabSize) {

      const statusElem = document.getElementById('status');

      statusElem.innerText = 'Создание модели...';

      model = tf.sequential();

      model.add(tf.layers.embedding({ inputDim: vocabSize, outputDim: 64, inputLength: sequenceLength }));

      model.add(tf.layers.simpleRNN({ units: 128 }));

      model.add(tf.layers.dense({ units: vocabSize, activation: 'softmax' }));

      model.compile({

        loss: 'sparseCategoricalCrossentropy',

        optimizer: 'adam',

        metrics: ['accuracy']

      });

    }

    async function trainModel() {

      const statusElem = document.getElementById('status');

      statusElem.innerText = 'Обучение модели...';

      const questions = data.map(item => item.question);

      const answers = data.map(item => item.answer);

      const questionSequences = tokenizer.textsToSequences(questions);

      const answerSequences = tokenizer.textsToSequences(answers);

      const xs = tf.tensor2d(questionSequences.map(seq => padSequence(seq, sequenceLength)));

      const ys = tf.tensor2d(answerSequences.map(seq => padSequence(seq, sequenceLength)));

      await model.fit(xs, ys, {

        epochs: 10, // Уменьшено количество эпох для ускорения

        batchSize: 4, // Уменьшенный размер батча для снижения нагрузки на память

        callbacks: {

          onEpochEnd: (epoch, logs) => {

            statusElem.innerText = `Обучение модели... Эпоха ${epoch + 1}/10, потеря: ${logs.loss.toFixed(4)}`;

            console.log(`Эпоха ${epoch + 1}: потеря = ${logs.loss.toFixed(4)}`);

          }

        }

      });

      statusElem.innerText = 'Обучение завершено. Модель готова к использованию.';

      document.getElementById('askButton').disabled = false;

    }

    function padSequence(seq, length) {

      if (seq.length > length) {

        return seq.slice(0, length);

      } else if (seq.length < length) {

        return [...Array(length - seq.length).fill(0), ...seq];

      } else {

        return seq;

      }

    }

    async function getAnswer() {

      const questionInput = document.getElementById('question');

      const answerElem = document.getElementById('answer');

      const statusElem = document.getElementById('status');

      const question = questionInput.value.trim();

      if (!question) {

        answerElem.innerText = 'Пожалуйста, введите вопрос.';

        return;

      }

      statusElem.innerText = 'Генерация ответа...';

      const questionSequence = tokenizer.textsToSequences([question]);

      const paddedQuestion = tf.tensor2d(questionSequence.map(seq => padSequence(seq, sequenceLength)));

      const prediction = model.predict(paddedQuestion);

      const predictedIndices = prediction.argMax(-1).dataSync();

      const words = [];

      for (let index of predictedIndices) {

        const word = tokenizer.indexWord[index];

        if (word && word !== 'undefined') {

          words.push(word);

        }

      }

      const generatedAnswer = words.join(' ');

      answerElem.innerText = generatedAnswer || 'Извините, ответ не найден.';

      statusElem.innerText = 'Модель готова к использованию.';

    }

    async function init() {

      await initializeBackend(); // Инициализация бекенда WebGL

      await preprocessData();

      const vocabSize = Object.keys(tokenizer.wordIndex).length + 1;

      createModel(vocabSize);

      await trainModel(); // Обучение модели

    }

    init();

  </script>

</body>

</html>