Я дата-инженер, которому захотелось немного творчества. Писать сотни строк 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 курса происходит клонирование всех данных в модели простых курсов.
Какие планы
Хотелось бы прикрутить wysiwyg редактор, чтобы создавать более качественные уроки в Creator режиме
Добавить всякие авторизации через Я, VK и другие почты, пока только через Gmail и штатную связку логин/пароль
Подумать над UX и UI
Восстановить стриминг ответов, чтобы текст от AI как бы печатался на странице, через Runserver + Nginx все ок, а как ставишь Uvicorn или Gunicorn, то поток на каком-то этапе буферизируется и не стримится на страницу. Пока в виде заглушки реализовал progress bar ожидания ответа.
Приглашаю всех дочитавших посетить мой сервис, написать слова поддержки, ну или накинуть г***а на вентилятор в комментариях :-)
Комментарии (4)
GolosCD
25.06.2025 09:01А мне понравилось! Дизайн сайтика - чистый и приятный.
Автор ты молодец!keyarituAI
25.06.2025 09:01Мой коммент не отменяет факта, что автор красавчик ). Время потратил на то чтобы поделиться опытом. Кому то точно пригодится.
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. Правильно собранные и обработанные данные помогут модели лучше работать и обеспечить более качественные результаты.
Полезные материалы
keyarituAI
Сейчас все заполоняют подобные курсы. Доверие есть только к LLM с которыми взаимодействуешь напрямую. У Gemini например есть функция Gem-ботов - отличная вещь, может в RAG запросы на основе загруженных Вами источников. Самое главное достоинство курсов подобных Вашим - их дешевизна.