Как собрать RAG-бота на T4 для учебников обществознания: Qwen вместо веб-поиска

Автор собрал RAG-бот для учебников обществознания 9 и 10 класса, который ищет ответы не в интернете, а в загруженных текстах. На уроках важна не правильность ответа вообще, а совпадение с формулировками конкретного учебника — вот почему бот ограничивает контекст вместо доступа в веб. Пайплайн парсит PDF через pymupdf4llm, нарезает текст с метаданными (класс, параграф, страница), кодирует эмбеддингами intfloat/multilingual-e5-large в FAISS. Пользователь спрашивает про параграф, бот ищет в метаданных, передает найденные фрагменты в Qwen2.5-3B-Instruct с системным промптом, получает ответ со ссылкой на страницу. • **Стек**: Qwen2.5-3B-Instruct на T4 (4-битная квантизация NF4 через bitsandbytes), FAISS в памяти, intfloat/multilingual-e5-large для эмбеддингов, Google Colab. • **Ограничение модели**: фильтрация по метаданным, узкий контекст в промпте, низкая температура генерации (0.1). • **В планах**: валидация ответов на соответствие контексту, хранение состояния сессии, коррекция номеров страниц.

AI-обработка оригинала Хабр: Машинное обучение; редакция Hamidun News
Как собрать RAG-бота на T4 для учебников обществознания: Qwen вместо веб-поиска
Источник: Хабр: Машинное обучение. Коллаж: Hamidun News.
Слушать статью
Паспорт материала и цифры
ПараметрДанные
ПервоисточникХабр: Машинное обучение ↗
Главный редактор
СтекQwen2.5-3B-Instruct на T4 (4-битная квантизация NF4 через bitsandbytes), FAISS в памяти, intfloat/multilingual-e5-large для эмбеддингов, Google Colab.
Ограничение моделифильтрация по метаданным, узкий контекст в промпте, низкая температура генерации (0.1).
В планахвалидация ответов на соответствие контексту, хранение состояния сессии, коррекция номеров страниц.

Маленькая модель с контекстом вместо большой с интернетом

В России вводятся единые государственные учебники, и энтузиаст решил собрать помощника для них. RAG-бот ищет ответы на вопросы по обществознанию не в интернете и не в общих весах модели, а в двух загруженных учебниках за 9 и 10 класс.

Почему это нужно? На уроке за ответ по конкретному учебнику ставят оценку, за философский ответ из общих знаний — нет. Обычная большая модель с доступом в интернет выдает правильное, но не совпадающее с учебником объяснение. Нужна другая архитектура: маленькая модель, которая получает короткий, узкий контекст и не уходит в общие рассуждения. Низкая температура генерации и системный промпт помогают держаться ближе к тексту. Ограниченный контекст не лишает модель базовых знаний, но все же переводит ее в режим поиска в конкретном материале, а не рассуждения на тему.

Пайплайн: от PDF до ответа

Стек технологий прост. pymupdf4llm парсит PDF постранично, конвертирует в Markdown с сохранением таблиц и списков. MarkdownHeaderTextSplitter разбирается с тремя уровнями: Глава (#) → Параграф (##) → Подраздел (###). Каждый фрагмент сохраняет метаданные: класс, номер параграфа, номер страницы.

Второй проход — RecursiveCharacterTextSplitter с chunk_size=1000 и chunk_overlap=150 режет длинные секции на управляемые чанки. Эмбеддинги intfloat/multilingual-e5-large кодируют текст, база FAISS (faiss-cpu) работает в памяти Colab.

Когда пользователь пишет «дай ответы на вопросы 13 параграфа 10 класса», регулярное выражение вытаскивает класс и номер. Функция smart_filter проверяет совпадение метаданных с запросом. FAISS возвращает до четырех релевантных фрагментов. Если жесткий фильтр ничего не нашел, код повторяет поиск только по классу — контекст может прийти из другого параграфа.

Найденные фрагменты собираются в контекст с метаданными [10 класс | § 13 | Стр. 45] и идут в Qwen2.5-3B-Instruct с системным промптом: отвечай строго по предоставленному тексту, в конце напиши номер страницы. Модель работает при температуре 0.1. После каждого ответа вызывается torch.cuda.empty_cache(), освобождая кешированную память.

Инфраструктура, проблемы и планы

Модель: Qwen2.5-3B-Instruct (3 млрд параметров). Квантизация: 4-битная NF4 через bitsandbytes — так модель влезает в видеопамять T4. Эмбеддинги: intfloat/multilingual-e5-large. Векторная база: FAISS (faiss-cpu) в оперативной памяти. Инфраструктура: Google Colab с бесплатным T4 GPU. Все работает на одной машине.

Форматирование ответов выглядит как сырой Markdown (видны маркеры **). Метаданные параграфа теряются на страницах без заголовка: если параграф начинается на 139-й и продолжается на 140-й, фрагменты со второй страницы остаются без метаданных и не попадают в выдачу по конкретному параграфу. Нет фактчекинга: бот не проверяет, действительно ли фраза в ответе соответствует найденному контексту. Класс пользователя не запоминается между сообщениями. Номер страницы файла может отличаться от напечатанного в бумажном издании.

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

Сюжет

Вопросы и ответы по материалу

Что известно по теме: маленькая модель с контекстом вместо большой с интернетом?

В России вводятся единые государственные учебники, и энтузиаст решил собрать помощника для них. RAG-бот ищет ответы на вопросы по обществознанию не в интернете и не в общих весах модели, а в двух загруженных учебниках за 9 и 10 класс. Почему это нужно? На уроке за ответ по конкретному учебнику ставят оценку, за философский ответ из общих знаний — нет. Обычная большая модель с доступом в интернет выдает правильное, но не совпадающее с учебником объяснение. Нужна другая архитектура: маленькая модель, которая получает короткий, узкий контекст и не уходит в общие рассуждения. Н

Что известно по теме: пайплайн: от PDF до ответа?

Стек технологий прост. pymupdf4llm парсит PDF постранично, конвертирует в Markdown с сохранением таблиц и списков. MarkdownHeaderTextSplitter разбирается с тремя уровнями: Глава (#) → Параграф (##) → Подраздел (###). Каждый фрагмент сохраняет метаданные: класс, номер параграфа, номер страницы. Второй проход — RecursiveCharacterTextSplitter с chunk_size=1000 и chunk_overlap=150 режет длинные секции на управляемые чанки. Эмбеддинги intfloat/multilingual-e5-large кодируют текст, база FAISS (faiss-cpu) работает в памяти Colab. Когда пользователь пишет «дай ответы на вопросы 13

Что известно по теме: инфраструктура, проблемы и планы?

Модель: Qwen2.5-3B-Instruct (3 млрд параметров). Квантизация: 4-битная NF4 через bitsandbytes — так модель влезает в видеопамять T4. Эмбеддинги: intfloat/multilingual-e5-large. Векторная база: FAISS (faiss-cpu) в оперативной памяти. Инфраструктура: Google Colab с бесплатным T4 GPU. Все работает на одной машине. Форматирование ответов выглядит как сырой Markdown (видны маркеры ). Метаданные параграфа теряются на страницах без заголовка: если параграф начинается на 139-й и продолжается на 140-й, фрагменты со второй страницы остаются без метаданных и не попадают в выдачу по ко

ЖХ
Жемал Хамидун — CPO Alpina Digital, продакт-менеджер AlpinaGPT. Делает AI-продукты с 2019 года. Hamidun News — pet project, который вырос в production-агрегатор с 6000+ читателей.
✦ Практика · Hamidun Academy

Соберите рабочего ИИ-агента или сервис своими руками без ручного кода

В Академии Жемала Хамидуна (academy.hamidun.com) открыт бесплатный 72-часовой тест-драйв: интерактивные скетч-уроки по Claude Code и Cursor, живой Tech Radar и готовые шаблоны агентов.

Открыть 72ч бесплатный доступ →Интенсив по Вайб-кодингу
Что вы думаете?
Загружаем комментарии…