- BrainTools - https://www.braintools.ru -

Как мы с ИИ сделали локальный ИИ, который учится по моим книгам и пишет за меня отчёты

Предыстория: зачем вообще это нужно

Каждый семестр одна и та же история: кипа учебников, дедлайны, отчёты, которые нужно было сдать «вчера», и презентации, от одного вида которых хочется закрыть ноутбук. ChatGPT и Claude помогают, но:

  1. Они не читали мои учебники — отвечают «в целом», а не по конкретному материалу курса

  2. Конфиденциальность — не все учебные материалы хочется загружать в облако

  3. Зависимость от интернета — в поезде, в общаге с плохим Wi-Fi это критично

  4. Стоимость — подписки на 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.

GitHub: emil-a-dev/lama-loca [1]

Архитектура

Система построена по принципу RAG (Retrieval-Augmented Generation) — модель не пытается “вспомнить” ответ, а сначала находит нужные фрагменты в ваших книгах, потом формулирует ответ на их основе.

Книги → Парсер → Чанкинг → Эмбеддинги → ChromaDB
                                              │
Запрос → Эмбеддинг → Поиск Top-15 → Реранкинг Top-8 → LLM → Документ
Как мы с ИИ сделали локальный ИИ, который учится по моим книгам и пишет за меня отчёты - 1 [2]

Почему 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   # Борьба с повторами
Как мы с ИИ сделали локальный ИИ, который учится по моим книгам и пишет за меня отчёты - 2 [2]

Низкая температура критична для учебных текстов — модель должна оперировать фактами, а не «фантазировать».

Эмбеддинги: 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}")
Как мы с ИИ сделали локальный ИИ, который учится по моим книгам и пишет за меня отчёты - 3 [2]

Реранкинг: 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)
Как мы с ИИ сделали локальный ИИ, который учится по моим книгам и пишет за меня отчёты - 4 [2]

Это двухстадийная система: 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"}
)
Как мы с ИИ сделали локальный ИИ, который учится по моим книгам и пишет за меня отчёты - 5 [2]

Данные персистентны: проиндексировали книги один раз — они остаются в базе между перезапусками.

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

Как выглядел процесс

Не было такого, что я написал один промпт и получил готовый проект. Это был итеративный диалог:

  1. Я: «Создай локальную ИИ-модель для учёбы по книгам» → получил CLI-версию

  2. Я: «Мне нужен GUI, не терминал» → переделка на Gradio

  3. Я: «Сделай деплой на GitHub» → автоматизация git + GitHub

  4. Я: «Напиши статью для Хабра» → эта статья

Каждый шаг — это ревью, правки, уточнения. ИИ не заменяет разработчика, он усиливает его. Я бы потратил неделю на то, что мы сделали за вечер, но без моего видения и контроля качества ИИ написал бы совсем другой (и скорее всего, худший) проект.

Честная оценка

Аспект

Без ИИ

С ИИ

Время разработки

~1 неделя

~3 часа

Качество кода

Выше (мой стиль)

Хорошее (но нужен ревью)

Документация

Минимальная

Подробная

Покрытие граничных случаев

По опыту [3]

По шаблонам

Архитектурные решения

Мои

Мои (ИИ выполняет)

Главный вывод: ИИ — это инструмент, не автор. Проект работает, потому что я знал, чего хочу, и направлял процесс. Но скорость реализации выросла в разы.

Главные грабли

1. Чанкинг — всё решает размер

Первая версия использовала чанки по 500 символов. Результат: модель получала обрывки предложений и генерировала бессвязный текст.

Оптимальный размер для учебных текстов — 1500 символов с перекрытием 300. Это примерно 1-2 абзаца — достаточно, чтобы сохранить смысл.

CHUNK_SIZE = 1500
CHUNK_OVERLAP = 300
Как мы с ИИ сделали локальный ИИ, который учится по моим книгам и пишет за меня отчёты - 6 [2]

2. Промпт-инжиниринг решает

Разница между «напиши отчёт» и структурированным промптом с ролью, требованиями к структуре и форматом вывода — колоссальная. Я потратил много времени на итерации промптов:

SYSTEM_PROMPT = """Ты — высокоинтеллектуальный учебный ассистент...
Твои принципы:
1. ТОЧНОСТЬ — используй только факты из контекста
2. ГЛУБИНА — анализируй многосторонне
3. СТРУКТУРА — чёткие логичные тексты
4. КРИТИЧЕСКОЕ МЫШЛЕНИЕ — сравнивай точки зрения
5. ЯЗЫК — грамотный русский, академический стиль"""
Как мы с ИИ сделали локальный ИИ, который учится по моим книгам и пишет за меня отчёты - 7 [2]

Также важен формат промпта: 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"
Как мы с ИИ сделали локальный ИИ, который учится по моим книгам и пишет за меня отчёты - 8 [2]

Что реально может эта система

Буду честен — это не ChatGPT. Локальная модель на 7-14B параметров не сравнится с 175B+ коммерческими моделями в общих знаниях и reasoning.

Но для конкретной задачи — работа с вашими учебниками — система работает отлично:

Плюсы:

  • ✅ Ответы привязаны к конкретным книгам — минимум галлюцинаций

  • ✅ Указывает источники — можно проверить

  • Офлайн — работает без интернета

  • ✅ Генерирует готовые файлы (DOCX, PPTX)

  • Бесплатно — после начальной настройки

Минусы:

  • ❌ Медленнее облачных решений (особенно на CPU)

  • ❌ Качество рассуждений ниже GPT-4/Claude

  • ❌ Нужно 4-24 GB RAM в зависимости от модели

  • ❌ Первый запуск долгий (скачивание моделей)

Как развивать дальше

У меня в планах:

  1. Мультимодальность — индексация изображений и таблиц из PDF

  2. Adaptive RAG — автоматический выбор количества контекста

  3. Цитирование — точные ссылки на страницы книг

  4. Fine-tuning адаптеры — LoRA на стиле конкретного предмета

  5. Коллаборация — расшаривание базы знаний между студентами

Попробовать

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
Как мы с ИИ сделали локальный ИИ, который учится по моим книгам и пишет за меня отчёты - 9 [2]

Скрипт установки определит RAM вашей системы и предложит оптимальную модель. После запуска откроется GUI в браузере.

GitHub: emil-a-dev/lama-loca [1] — буду рад звёздам ⭐ и обратной связи.


Какие open-source модели вы используете для работы с русским текстом? Используете ли ИИ-ассистентов в своей разработке? Делитесь опытом в комментариях.


Автор: Emi_Dev

Источник [4]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/26602

URLs in this post:

[1] GitHub: emil-a-dev/lama-loca: https://github.com/emil-a-dev/lama-loca

[2] Image: https://sourcecraft.dev/

[3] опыту: http://www.braintools.ru/article/6952

[4] Источник: https://habr.com/ru/articles/1006662/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1006662

www.BrainTools.ru

Rambler's Top100