Проект представляет собой исследовательский NLP-пайплайн для построения вопросно-ответной системы над учебными материалами университета. Система ориентирована на сценарий «университетского помощника»: пользователь задаёт вопрос о направлениях подготовки, дисциплинах, практиках, учебных планах, языках программирования, формах контроля или различиях между образовательными программами, а система ищет релевантные фрагменты документов и формирует ответ с опорой на найденные источники.
Цель работы — разработать и протестировать RAG-пайплайн, который объединяет:
- парсинг рабочих программ дисциплин и практик в формате DOCX;
- парсинг учебных планов в формате XLSX;
- разбиение документов на текстовые и табличные чанки;
- извлечение метаданных уровня документа;
- гибридный поиск по корпусу учебных материалов;
- локальное расширение контекста через граф сущностей;
- генерацию ответов с помощью локальных LLM-моделей;
- экспертную оценку качества ответов на golden-set наборе вопросов.
Обычный семантический поиск по учебным документам плохо справляется с вопросами, где ответ лежит в таблицах, зависит от направления подготовки, учебного года, образовательной программы или требует сопоставления нескольких источников. Поэтому в проекте используется RAG-архитектура с двумя контурами данных:
- Контур РПД и практик — DOCX-документы с описанием дисциплин, практик, компетенций, тем, часов, форм контроля и литературы.
- Контур учебных планов — XLSX-файлы с учебными планами, семестрами, длительностью обучения, практиками, курсовыми работами и распределением дисциплин по курсам.
На этапе ответа система анализирует вопрос, определяет его тип, выбирает подходящий контур поиска, извлекает релевантные фрагменты и передаёт их в LLM как контекст.
Основной контур подготовки данных включает следующие этапы:
- загрузка архива с учебными документами;
- парсинг DOCX-файлов РПД и практик;
- распознавание структуры документа: заголовки, разделы, таблицы, порядок блоков;
- извлечение метаданных: направление подготовки, образовательная программа, год документа, название дисциплины или практики, тип документа;
- формирование текстовых и табличных чанков;
- построение эмбеддингов;
- построение гибридного индекса;
- построение графа сущностей;
- сохранение состояния системы.
Отдельный контур учебных планов включает загрузку XLSX-файлов, выделение строк учебного плана, извлечение метаданных программы, разбиение табличной структуры на плановые чанки, построение отдельного индекса учебных планов и интеграцию этого индекса в общий процесс ответа.
Контур обработки пользовательского вопроса:
- анализ вопроса;
- определение намерения и аудитории;
- маршрутизация между РПД/практиками и учебными планами;
- гибридный поиск BM25 + dense retrieval;
- при необходимости — multi-hop расширение через граф сущностей;
- сбор структурированных фактов;
- построение prompt для LLM;
- генерация ответа;
- возврат ответа с цитируемыми источниками.
- гибридный поиск через BM25 и векторные эмбеддинги;
- метрика Reciprocal Rank Fusion для объединения результатов;
- плотные эмбеддинги на базе предобученной модели
intfloat/multilingual-e5-base; - семантические движки FAISS, HNSW для поиска по векторам;
- данные spaCy
ru_core_news_smдля обработки русскоязычных сущностей; - граф сущностей для локального расширения контекста;
- отдельная обработка табличных чанков;
- эвристическая маршрутизация запросов по типам документов.
| Ноутбук | LLM-модель | Назначение |
|---|---|---|
notebooks/RAG_LLM_Qwen2.5_1.5B_up_plans.ipynb |
Qwen/Qwen2.5-1.5B-Instruct |
компактная локальная модель для базового сравнения |
notebooks/RAG_LLM_Qwen2.5_3B_up_plans.ipynb |
Qwen/Qwen2.5-3B-Instruct |
более сильная локальная модель Qwen |
notebooks/RAG_LLM_YandexGPT5_8B_up_plans.ipynb |
yandex/YandexGPT-5-Lite-8B-instruct |
крупная русскоязычная модель для сравнения |
.
├── README.md
└── notebooks/
├── RAG_LLM_Qwen2.5_1.5B_up_plans.ipynb
├── RAG_LLM_Qwen2.5_3B_up_plans.ipynb
└── RAG_LLM_YandexGPT5_8B_up_plans.ipynb
└── models/
└── Qwen2.5-1.5B-Instruct/
└── Qwen2.5-3B-Instruct/
└── YandexGPT-5-Lite-8B-instruct/
└── workdir_full/
└── dataset_extracted/
└── dataset/
└── А и СД в яз Python, БИ, 2023.docx
└── А и СД в яз Python, ИБ, 2023.docx
└── А и СД в яз Python, МиКН, 2023.docx
└── ...
└── export/
└── chunks.jsonl
└── docs_meta.jsonl
└── entity_graph.pkl
└── faiss.index
└── hnsw.index
└── study_plans/
└── chunks.jsonl
└── docs_meta.jsonl
└── hnsw.index
└── vector_meta.json
└── vector_meta.json
└── runs.jsonl
└── study_plans_extracted/
└── dataset_up_plans/
└── УП 01.03.02 ПМИ, ПМО 2024.xlsx
└── УП 01.03.02 ПМО 2022.xlsx
└── УП 01.03.02 ПМО 2023.xlsx
└── ...
└── datasets/
└── dataset.zip
└── dataset_up_plans.zip
└── test_golden_sets/
└── Golden set (модель Qwen2.5_1.5B).docx
└── Golden set (модель Qwen2.5_3B).docx
└── Golden set (модель YandexGPT-5_8B).docx
В ноутбуках реализованы основные компоненты RAG-системы:
RuntimeResources— централизованный выбор устройства, spaCy-модели и доступных библиотек индексации.RAGConfig— конфигурация чанкинга, индексации, графа сущностей, retrieval и логирования.Chunk— базовая структура фрагмента корпуса.DocxStructureParser— парсинг структуры DOCX-документов.TableBlockParser— обработка табличных блоков РПД.DocumentCorpusLoader— загрузка и подготовка корпуса документов.StudyPlanWorkbookParser— обработка XLSX-файлов учебных планов.HybridIndex— гибридный индекс BM25 + dense retrieval.EntityGraphService— построение и использование графа сущностей.PromptBuilder— формирование промпта для LLM с учётом аудитории и типа вопроса.HFChatLLM— интерфейс запуска локальной HuggingFace-модели.UniversityRAG— итоговый класс, объединяющий загрузку корпуса, индексацию, поиск, генерацию ответа, сохранение и загрузку состояния.
Пример базовой установки зависимостей:
pip install faiss-cpu rank-bm25 transformers torch tiktoken hnswlib spacy openpyxl python-docx
python -m spacy download ru_core_news_smДля загрузки моделей через HuggingFace CLI:
pip install -U "huggingface_hub[cli]"Пример загрузки модели Qwen2.5-3B:
hf download Qwen/Qwen2.5-3B-Instruct --local-dir ./models/Qwen2.5-3B-InstructПример загрузки YandexGPT-5-Lite-8B:
hf download yandex/YandexGPT-5-Lite-8B-instruct --local-dir ./models/YandexGPT-5-Lite-8B-instructВ ноутбуках используются два архива:
dataset.zip
dataset_up_plans.zip
Где:
dataset.zip— архив с DOCX-файлами рабочих программ дисциплин и практик;dataset_up_plans.zip— архив с XLSX-файлами учебных планов.
Пример запуска индексации:
ZIP_PATH = "dataset.zip"
PLANS_ZIP_PATH = "dataset_up_plans.zip"
WORKDIR = "./workdir_full_v2"
rag.ingest_from_zip(
zip_path=ZIP_PATH,
extract_dir=os.path.join(WORKDIR, "dataset_extracted"),
glob_ext=".docx"
)
rag.ingest_study_plans_from_zip(
zip_path=PLANS_ZIP_PATH,
extract_dir=os.path.join(WORKDIR, "study_plans_extracted"),
glob_ext=".xlsx"
)
rag.save_state(os.path.join(WORKDIR, "export"))Пример ответа на вопрос:
out = rag.answer(
"Сколько длится практика на направлении программная инженерия?",
top_k=10
)
print(out["answer"])
print(out["citations"])Качество ответов оценивалось на golden-set наборе из 26 вопросов:
- 11 фактологических вопросов;
- 10 интерпретационных вопросов;
- 5 сложных контекстуальных вопросов.
Каждый ответ оценивался экспертом по трём критериям:
- Точность — фактологическая корректность и отсутствие галлюцинаций.
- Полнота — покрытие всех аспектов вопроса.
- Ясность — понятность, структурированность и пригодность ответа для абитуриента.
Каждый критерий оценивался по шкале от 1 до 5. Максимальная оценка за один ответ — 15 баллов, максимальная оценка за весь golden-set — 390 баллов.
| Модель | До внедрения учебных планов | После внедрения учебных планов | Изменение |
|---|---|---|---|
| Qwen2.5-1.5B-Instruct | 197 / 390 = 50.5% | 213 / 390 = 54.6% | +16 баллов |
| Qwen2.5-3B-Instruct | 220 / 390 = 56.4% | 229 / 390 = 58.7% | +9 баллов |
| YandexGPT-5-Lite-8B-Instruct | 200 / 390 = 51.3% | 197 / 390 = 50.5% | -3 балла |
- Лучший суммарный результат показала модель Qwen2.5-3B-Instruct после внедрения контура учебных планов:
229/390. - Добавление учебных планов улучшило результаты обеих моделей Qwen:
- Qwen2.5-1.5B:
197 → 213; - Qwen2.5-3B:
220 → 229.
- Qwen2.5-1.5B:
- Для YandexGPT-5-Lite-8B добавление учебных планов не дало улучшения по суммарной оценке:
200 → 197. - Наиболее проблемными остаются вопросы, где требуется точное извлечение факта из табличного источника или сопоставление нескольких образовательных программ.
- Основной резерв улучшения связан не только с выбором LLM, но и с качеством retrieval: точнее маршрутизировать запросы между РПД и учебными планами, лучше нормализовать названия направлений и образовательных программ, усиливать работу с табличными фактами, снижать шум в графе сущностей и добавлять reranking для спорных запросов.
Проект показывает, как можно построить прикладную RAG-систему для домена образовательных документов, где данные представлены одновременно в текстовой и табличной форме. Такой подход может использоваться для консультации абитуриентов, студентов, преподавателей, использования своего внутреннего поисковика по образовательным программам, сравнения направлений подготовки, анализа структуры учебных планов и поддержки сотрудников при работе с большим корпусом нормативных учебных документов.
Текущая версия проекта имеет исследовательский характер. Ключевые ограничения:
- качество ответа сильно зависит от качества найденного контекста;
- табличные документы требуют более строгого извлечения фактов;
- локальные LLM могут уверенно формулировать неверный ответ при шумном контексте;
- граф сущностей полезен не для всех типов вопросов и требует фильтрации общеупотребительных терминов;
- для production-сценария необходимы отдельные модули тестирования, API-обёртка и интерфейс пользователя.
- вынести код из ноутбуков в отдельный Python-пакет;
- добавить CLI/API-интерфейс;
- реализовать отдельный fact extractor для учебных планов;
- добавить cross-encoder reranker;
- расширить golden-set и автоматизировать оценку;
- добавить Streamlit/FastAPI-интерфейс;
- реализовать отчётность по источникам и confidence-score;
- улучшить визуализацию графа сущностей.