Предыстория: зачем вообще это нужно
Каждый семестр одна и та же история: кипа учебников, дедлайны, отчёты, которые нужно было сдать «вчера», и презентации, от одного вида которых хочется закрыть ноутбук. ChatGPT и Claude помогают, но:
-
Они не читали мои учебники — отвечают «в целом», а не по конкретному материалу курса
-
Конфиденциальность — не все учебные материалы хочется загружать в облако
-
Зависимость от интернета — в поезде, в общаге с плохим Wi-Fi это критично
-
Стоимость — подписки на API складываются
Так родилась идея: взять мощную open-source LLM, скормить ей все мои учебники и получить персонального ассистента, который работает полностью на моём компьютере.
А помог мне воплотить эту идею в код — GitHub Copilot (Claude). Да, ирония: я использовал ИИ, чтобы создать другой ИИ. Но об этом подробнее ниже.
Что получилось
Lama Loca (да, название — отсылка к «безумной ламе» 🦙) — это десктопное приложение с веб-интерфейсом, которое:
-
📖 Индексирует книги — PDF, EPUB, DOCX, TXT, FB2, HTML
-
🔍 Ищет релевантные фрагменты при запросе (RAG)
-
🎯 Переранжирует результаты через Cross-Encoder
-
🤖 Генерирует тексты через локальную LLM (Qwen2.5)
-
📝 Экспортирует в DOCX, PPTX, Markdown
Весь стек: Python + Gradio + ChromaDB + llama-cpp-python + sentence-transformers.
Архитектура
Система построена по принципу RAG (Retrieval-Augmented Generation) — модель не пытается “вспомнить” ответ, а сначала находит нужные фрагменты в ваших книгах, потом формулирует ответ на их основе.
Книги → Парсер → Чанкинг → Эмбеддинги → ChromaDB
│
Запрос → Эмбеддинг → Поиск Top-15 → Реранкинг Top-8 → LLM → Документ
Почему RAG, а не fine-tuning?
Первое, что приходит в голову — дообучить модель на своих книгах. Но для учебных задач это плохая идея:
|
|
Fine-tuning |
RAG |
|---|---|---|
|
Добавление новой книги |
Переобучение (часы) |
Индексация (минуты) |
|
Ссылки на источники |
Нет |
Да, с указанием книги и фрагмента |
|
Галлюцинации |
Много |
Мало (ответ привязан к контексту) |
|
Требования к GPU |
Высокие |
Минимальные |
|
Актуальность |
Замороженные знания |
Всегда свежие данные |
С RAG достаточно бросить новый PDF в папку, нажать «Индексировать» — и модель уже «знает» материал.
Выбор компонентов
LLM: Qwen2.5 через llama-cpp-python
Я перебрал несколько вариантов:
-
LLaMA 3 — хорошая, но слабо работает с русским
-
Mistral/Mixtral — отличный английский, средний русский
-
Qwen2.5 — 🏆 лучший русский среди open-source моделей
Qwen2.5 доступна от 1.5B до 72B параметров. Я использую GGUF-квантизацию (Q4_K_M) через llama-cpp-python — это позволяет запускать модели на обычном железе:
|
Модель |
RAM |
Качество русского |
|---|---|---|
|
Qwen2.5-3B |
4 GB |
Приемлемое |
|
Qwen2.5-7B |
8 GB |
Хорошее |
|
Qwen2.5-14B |
12 GB |
Отличное |
|
Qwen2.5-32B |
24 GB |
Близко к GPT-4 |
Ключевые настройки инференса:
LLM_CONTEXT_SIZE = 32768 # 32K контекст — помещается много текста
LLM_TEMPERATURE = 0.3 # Низкая температура = точные ответы
LLM_TOP_P = 0.9 # Фильтрация маловероятных токенов
LLM_REPEAT_PENALTY = 1.15 # Борьба с повторами
Низкая температура критична для учебных текстов — модель должна оперировать фактами, а не «фантазировать».
Эмбеддинги: E5-Large Multilingual
Для семантического поиска нужна модель эмбеддингов, которая хорошо понимает русский. Сравнение:
|
Модель |
Размер |
Качество RU |
Скорость |
|---|---|---|---|
|
all-MiniLM-L6-v2 |
80 MB |
❌ Только EN |
Быстро |
|
paraphrase-multilingual-MiniLM-L12 |
420 MB |
👍 Среднее |
Средне |
|
multilingual-e5-large |
1.1 GB |
⭐ Отличное |
Средне |
E5-Large от Microsoft — однозначный выбор для русскоязычного RAG. Важная деталь: E5 модели требуют префиксы query: и passage: — без них качество поиска падает на 15-20%:
# При индексации
batch_with_prefix = [f"passage: {chunk}" for chunk in batch]
embeddings = self.embeddings.embed_documents(batch_with_prefix)
# При поиске
query_embed = self.embeddings.embed_query(f"query: {query}")
Реранкинг: Cross-Encoder
Обычный векторный поиск находит «похожие» фрагменты, но не всегда «релевантные». Например, запрос «причины Первой мировой войны» может найти фрагмент про Вторую мировую, потому что они семантически близки.
Cross-Encoder решает эту проблему — он берёт пару (запрос, документ) и оценивает именно релевантность, а не похожесть:
# 1. Находим 15 кандидатов через ChromaDB (быстро, но грубо)
results = collection.query(query_embeddings=, n_results=15)
# 2. Переранжируем через Cross-Encoder (медленнее, но точнее)
reranked = reranker.rerank(query, documents, top_k=8)
Это двухстадийная система: ChromaDB быстро отсеивает 99% базы, а Cross-Encoder точно ранжирует оставшиеся кандидаты. На практике это убирает 2-3 нерелевантных фрагмента из контекста LLM, что заметно повышает качество ответов.
ChromaDB: хранение и поиск
ChromaDB выбрана за простоту — встраивается прямо в приложение, не нужен отдельный сервер:
client = chromadb.PersistentClient(path="data/chromadb")
collection = client.get_or_create_collection(
name="study_books",
metadata={"hnsw:space": "cosine"}
)
Данные персистентны: проиндексировали книги один раз — они остаются в базе между перезапусками.
GUI: Gradio
Выбор стоял между Gradio, Streamlit и PyQt:
-
PyQt — мощный, но много кода на UI
-
Streamlit — простой, но перерисовывает страницу при каждом действии
-
Gradio — 🏆 оптимальный баланс: красивый UI, поддержка стриминга, минимум кода
Весь интерфейс с 6 вкладками, чатом со стримингом и drag & drop загрузкой файлов — это один файл на ~300 строк.
Как ИИ помогал создавать ИИ: процесс разработки с GitHub Copilot
Этот проект — результат совместной работы человека и ИИ. Я использовал GitHub Copilot на базе Claude прямо в VS Code, и хочу честно рассказать, как это происходило.
Что делал я (человек):
-
🧠 Идея и архитектура — определил, что нужна RAG-система с GUI, выбрал стек
-
🎯 Постановка задач — формулировал, что именно нужно: «сделай GUI на Gradio», «добавь реранкинг»
-
🔍 Ревью и тестирование — проверял код, находил баги, просил исправления
-
📐 Продуктовые решения — какие типы документов поддерживать, как организовать UX
-
✍️ Итерации — «мне нужна не CLI, а GUI», «добавь поддержку FB2»
Что делал ИИ (GitHub Copilot / Claude):
-
💻 Написание кода — вся кодовая база написана при помощи Copilot
-
🏗️ Проектирование модулей — структура файлов, классы, интерфейсы
-
🔧 Конфигурация — подбор параметров LLM, размеров чанков, промптов
-
📝 Документация — README, эта статья, комментарии в коде
-
🚀 Деплой — настройка git, создание репозитория, CI
Как выглядел процесс
Не было такого, что я написал один промпт и получил готовый проект. Это был итеративный диалог:
-
Я: «Создай локальную ИИ-модель для учёбы по книгам» → получил CLI-версию
-
Я: «Мне нужен GUI, не терминал» → переделка на Gradio
-
Я: «Сделай деплой на GitHub» → автоматизация git + GitHub
-
Я: «Напиши статью для Хабра» → эта статья
Каждый шаг — это ревью, правки, уточнения. ИИ не заменяет разработчика, он усиливает его. Я бы потратил неделю на то, что мы сделали за вечер, но без моего видения и контроля качества ИИ написал бы совсем другой (и скорее всего, худший) проект.
Честная оценка
|
Аспект |
Без ИИ |
С ИИ |
|---|---|---|
|
Время разработки |
~1 неделя |
~3 часа |
|
Качество кода |
Выше (мой стиль) |
Хорошее (но нужен ревью) |
|
Документация |
Минимальная |
Подробная |
|
Покрытие граничных случаев |
По опыту |
По шаблонам |
|
Архитектурные решения |
Мои |
Мои (ИИ выполняет) |
Главный вывод: ИИ — это инструмент, не автор. Проект работает, потому что я знал, чего хочу, и направлял процесс. Но скорость реализации выросла в разы.
Главные грабли
1. Чанкинг — всё решает размер
Первая версия использовала чанки по 500 символов. Результат: модель получала обрывки предложений и генерировала бессвязный текст.
Оптимальный размер для учебных текстов — 1500 символов с перекрытием 300. Это примерно 1-2 абзаца — достаточно, чтобы сохранить смысл.
CHUNK_SIZE = 1500
CHUNK_OVERLAP = 300
2. Промпт-инжиниринг решает
Разница между «напиши отчёт» и структурированным промптом с ролью, требованиями к структуре и форматом вывода — колоссальная. Я потратил много времени на итерации промптов:
SYSTEM_PROMPT = """Ты — высокоинтеллектуальный учебный ассистент...
Твои принципы:
1. ТОЧНОСТЬ — используй только факты из контекста
2. ГЛУБИНА — анализируй многосторонне
3. СТРУКТУРА — чёткие логичные тексты
4. КРИТИЧЕСКОЕ МЫШЛЕНИЕ — сравнивай точки зрения
5. ЯЗЫК — грамотный русский, академический стиль"""
Также важен формат промпта: Qwen2.5 обучена на ChatML формате (<|im_start|>system, <|im_start|>user, <|im_start|>assistant). Использование правильного формата даёт заметный прирост качества.
3. GPU — не обязательно, но сильно ускоряет
На CPU (Ryzen 5 3600) генерация 1000 токенов 7B-моделью занимает ~45 секунд. На GPU (RTX 3060) — ~8 секунд. Для интерактивного чата разница критична, для генерации документов — терпимо.
Для NVIDIA GPU нужна специальная сборка llama-cpp-python:
pip install llama-cpp-python --force-reinstall
-C cmake.args="-DGGML_CUDA=ON"
Что реально может эта система
Буду честен — это не ChatGPT. Локальная модель на 7-14B параметров не сравнится с 175B+ коммерческими моделями в общих знаниях и reasoning.
Но для конкретной задачи — работа с вашими учебниками — система работает отлично:
Плюсы:
-
✅ Ответы привязаны к конкретным книгам — минимум галлюцинаций
-
✅ Указывает источники — можно проверить
-
✅ Офлайн — работает без интернета
-
✅ Генерирует готовые файлы (DOCX, PPTX)
-
✅ Бесплатно — после начальной настройки
Минусы:
-
❌ Медленнее облачных решений (особенно на CPU)
-
❌ Качество рассуждений ниже GPT-4/Claude
-
❌ Нужно 4-24 GB RAM в зависимости от модели
-
❌ Первый запуск долгий (скачивание моделей)
Как развивать дальше
У меня в планах:
-
Мультимодальность — индексация изображений и таблиц из PDF
-
Adaptive RAG — автоматический выбор количества контекста
-
Цитирование — точные ссылки на страницы книг
-
Fine-tuning адаптеры — LoRA на стиле конкретного предмета
-
Коллаборация — расшаривание базы знаний между студентами
Попробовать
git clone https://github.com/emil-a-dev/lama-loca.git
cd lama-loca
chmod +x setup.sh && ./setup.sh
source venv/bin/activate
python main.py
Скрипт установки определит RAM вашей системы и предложит оптимальную модель. После запуска откроется GUI в браузере.
GitHub: emil-a-dev/lama-loca — буду рад звёздам ⭐ и обратной связи.
Какие open-source модели вы используете для работы с русским текстом? Используете ли ИИ-ассистентов в своей разработке? Делитесь опытом в комментариях.
Автор: Emi_Dev


