Я дата-инженер, которому захотелось немного творчества. Писать сотни строк SQL на работе не всегда доставляет радость, поэтому решил углубиться в веб-разработку, чтобы иметь возможность сделать то, что можно "потрогать" руками и, возможно, поделиться этим с окружающими.

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

Изначально задумка была в том, чтобы люди могли найти готовую образовательную программу в виде списке тем, загружали в сервис и получали в ответ готовый структурированный курс с контентом от AI. Идея реализовалась, но достаточно быстро трансформировалась и обросла дополнительным функционалом.

Что имеем на данный момент?

Платформа поддерживает два режима создания курсов, которые подойдут как для быстрого старта, так и для опытных авторов:

AI-режим (быстрый)

Идеально подходит, если вы хотите быстро запустить курс. Достаточно ввести название , ваш запрос или список тем — AI сам:

  • предложит структуру курса (модули и уроки)

  • создаст содержимое всех уроков

  • сгенерирует задания

 Creator-режим (на основе своих материалов)

Вы полностью контролируете структуру и материалы курса:

  • Добавляйте модули и уроки вручную

  • Загружайте свои тексты и заметки

  • Используйте AI для редактирования и дополнения

Отлично подходит для авторов и индивидуальных программ.

Далее возникла мысль, что надо делиться. Вот сделал человек курс, как автор или как обучающийся и понимает, что годная вещь, реально полезная информация внутри. В таком случае курс можно опубликовать в библиотеку, а другие пользователи смогут найти там его и добавить к себе для прохождения.

Что есть кроме лекций?

Я решил сделать несколько дополнительных "фишек"

1. AI-тьютор внутри уроков

В каждом уроке работает AI-помощник: задавайте вопросы, получайте пояснения, расширяйте темы. Это как личный репетитор — всегда рядом и готов объяснить.

2. Умные задания с проверкой

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

3. Аудиоверсия лекций

Не любите читать? Слушайте уроки в аудиоформате. Генерация голосом — идеальна для обучения в дороге, на прогулке или по пути на работу.

4. Личный прогресс и достижения

Отмечайте пройденные уроки, следите за прогрессом и возвращайтесь к материалам, когда удобно. Обучение — в удобной системе, которая всё запомнит за вас.

А что же там под капотом?

По умолчанию используется open-source модель Qwen2.5-32B, но пользователь может в личном кабинете подлключить свой аккаунт от другой более продвинутой и быстрой модели для генерации более качественного контента. Например, всяческие GPT от OpenAI. Лично я тестировал разные варианты и все они +- одинаково справлялись с генерацией текстов. Но GPT от OpenAI, конечно, справляются с задачей пошустрее % на 20-30.

Запросы к LLM идут с заранее прописанными промптами, в которые втыкается пользовательский ввод. Единственное, что из-за ограничений OpenAI для РФ пришлось хостить сервис в Digital Ocean. Забавно то, что изначально он вообще был установлен просто дома на подоконнике на Raspberry Pi. Потом пару раз заглючил провайдер и решил, что потратить 1000р в месяц не жалко, зато пусть уж работает нормально + не пришлось мутить какую-то отдельную проксю, чтобы запросы в OpenAI отрабатывали корректно. Я, конечно, такой вариант потестил и в целом он работал, но проще сразу в иностранное облако все затолкать.

Из проблем с LLM это стриминг ответов на страницу. При флаге stream=True и запуске через Nginx + Runserver все ок, ответ модели печатается на страничке, а вот с uvicorn и gunicorn не срослось пока что, есть какие-то сложности. Весь ответ на каком-то этапе буферизируется и потом кучно попадает на фронт. То есть конфиг nginx один и тот же, бекенд и JS на странице тоже, но без Runserver ничего не стримится. Моих знаний пока не достаточно, чтобы понять, в чем причина.

Как вариант, сделать отдельный какой-то микросервис, который будет отвечать исключительно за стриминг и уже его дергать на фронте, чтобы получать нужный результат. (GPT советует Fast API сервис рядышком развернуть, руки пока не дошли протестировать гипотезу)

Сам сервис написан в классическом варианте Django + Jinja Templates. Нет никакого модного фронтенд фреймворка, т.к. я вообще в них ничего не знаю. Вся эта история задумывалась как некий учебный проект, который по итогу перерос в нечто большее.

Внутри 3 приложения:

Accounts - отвечает за юзеров и их атрибуты, типа использование токенов, подключенные AI модели и т.д.

Courses - тут все, что касается AI курсов и курсов, которые стали публичными

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

Внутри все построено на стандартных CBV типа ListView, CreateView и т.д. По моделям, это CustomUser, Course, Module, Lesson, Task. Отдельно есть модели Creator режима, аналогичные осноывным, просто в момент публикации Creator курса происходит клонирование всех данных в модели простых курсов.

Какие планы

  1. Хотелось бы прикрутить wysiwyg редактор, чтобы создавать более качественные уроки в Creator режиме

  2. Добавить всякие авторизации через Я, VK и другие почты, пока только через Gmail и штатную связку логин/пароль

  3. Подумать над UX и UI

  4. Восстановить стриминг ответов, чтобы текст от AI как бы печатался на странице, через Runserver + Nginx все ок, а как ставишь Uvicorn или Gunicorn, то поток на каком-то этапе буферизируется и не стримится на страницу. Пока в виде заглушки реализовал progress bar ожидания ответа.

Приглашаю всех дочитавших посетить мой сервис, написать слова поддержки, ну или накинуть г***а на вентилятор в комментариях :-)

https://aitutor.pnirtep.ru/

Комментарии (4)


  1. keyarituAI
    25.06.2025 09:01

    Сейчас все заполоняют подобные курсы. Доверие есть только к LLM с которыми взаимодействуешь напрямую. У Gemini например есть функция Gem-ботов - отличная вещь, может в RAG запросы на основе загруженных Вами источников. Самое главное достоинство курсов подобных Вашим - их дешевизна.


  1. GolosCD
    25.06.2025 09:01

    А мне понравилось! Дизайн сайтика - чистый и приятный.
    Автор ты молодец!


    1. keyarituAI
      25.06.2025 09:01

      Мой коммент не отменяет факта, что автор красавчик ). Время потратил на то чтобы поделиться опытом. Кому то точно пригодится.


  1. avshkol
    25.06.2025 09:01

    Интересное. Как быстрое введение в тему с нуля вполне пойдёт- для тех, кто не хочет заиорачиваться с промптами для llm.

    Задал тему: Практическая реализация методов RAG с использованием langchain

    Получил список уроков:

    Модуль 1 - Введение и подготовка данных

    Модуль 2 - Основы работы с langchain

    Модуль 3 - Работа с моделями LLM

    Модуль 4 - Применение и тестирование RAG

    Вот пример одного урока:

    Урок 2 - Сбор и предобработка данных для RAG

    Введение

    Распределенные алгоритмы генерации (RAG) представляют собой современный подход к обработке естественного языка, который объединяет методы поиска информации и генерации текста. В этом уроке мы рассмотрим процесс сбора и предобработки данных, необходимый для успешного применения RAG с использованием библиотеки langchain.

    Сбор данных

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

    • Интернет-ресурсы: Сбор данных с помощью web scraping. Например, использование библиотеки BeautifulSoup для парсинга HTML-контента.

    • Текстовые файлы: Чтение и обработка текстовых файлов (txt, pdf, docx).

    • Базы данных: Извлечение данных из SQL и NoSQL баз данных.

    Пример: Сбор данных с веб-страниц

    
    from bs4 import BeautifulSoup
    import requests
    
    url = "https://example.com"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    text_data = soup.get_text()
    

    Предобработка данных

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

    • Очистка текста: удаление лишних символов, HTML-тегов, стоп-слов и т.д.

    • Лемматизация и стемминг: приведение слов к нормальной форме для упрощения анализа.

    • Разбиение на предложения и токены: подготовка текста к дальнейшей обработке.

    Пример: Очистка и токенизация текста

    
    import re
    from nltk.tokenize import word_tokenize
    from nltk.corpus import stopwords
    from nltk.stem import WordNetLemmatizer
    
    # Удаление HTML-тегов
    cleaned_text = re.sub(r'<.*?>', '', text_data)
    
    # Удаление стоп-слов и токенизация
    stop_words = set(stopwords.words('english'))
    tokens = [word for word in word_tokenize(cleaned_text) if word not in stop_words]
    
    # Лемматизация
    lemmatizer = WordNetLemmatizer()
    lemmatized_tokens = [lemmatizer.lemmatize(word) for word in tokens]
    

    Вывод

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

    Полезные материалы