ЗАЧЕМ ВООБЩЕ ОФЛАЙН-RAG В 2026
RAG (Retrieval-Augmented Generation) — это когда LLM отвечает не из головы, а подтягивает куски твоих документов и генерит ответ поверх них. Облачные решения давно есть, но у них два врождённых дефекта: твои данные утекают на чужой сервер и ты платишь за каждый токен. Для юриста, врача, разработчика с закрытым кодом или человека, который просто не хочет кормить своими NDA-файлами очередной API, — это неприемлемо.
К 2026 году железо и модели дозрели. Модель на 7-8B параметров в квантовании Q4 занимает около 4-5 ГБ и уверенно крутится на ноутбуке без дискретной видеокарты. Эмбеддинг-модели уровня bge-m3 и nomic-embed весят десятки-сотни мегабайт и считают векторы локально за миллисекунды. Векторные базы вроде Qdrant или встроенного Chroma поднимаются одной командой. Приватность перестала быть компромиссом по качеству.
АРХИТЕКТУРА: ИЗ ЧЕГО СОСТОИТ ЛОКАЛЬНЫЙ RAG
Любой RAG-конвейер, облачный он или локальный, состоит из одних и тех же кирпичей. В офлайн-варианте каждый кирпич — это самохостинг-компонент на твоей машине:
- Загрузчик и чанкер — режет PDF/DOCX/Markdown на куски по 300-800 токенов с перекрытием.
- Эмбеддер — превращает каждый чанк в вектор. Локальная модель, никакого OpenAI embeddings API.
- Векторная база — хранит векторы и делает поиск ближайших соседей (ANN). Chroma, Qdrant, LanceDB, FAISS.
- Ретривер — по запросу достаёт топ-k релевантных чанков, часто с реранкером поверх.
- Локальный LLM — Ollama, llama.cpp или LM Studio генерят финальный ответ по найденному контексту.
Весь трафик остаётся на localhost. Отключаешь Wi-Fi — система работает так же. Это и есть проверка на честный офлайн: если что-то падает без интернета, значит где-то спрятался облачный вызов.
ВЫБОР СТЕКА: СРАВНЕНИЕ КОМПОНЕНТОВ
Не существует единственно верного стека, но есть удобные дефолты под разное железо. Свежие релизы всех этих инструментов удобно отслеживать в каталоге REDDYX — обновления выходят чуть ли не еженедельно.
| Компонент | Лёгкий вариант | Продвинутый | Заметка |
|---|---|---|---|
| LLM-раннер | Ollama | llama.cpp / vLLM | Ollama проще всего, vLLM — если нужен throughput |
| Модель | Llama 3.1 8B Q4 | Qwen2.5 14B Q5 | 7-8B хватает для большинства QA |
| Эмбеддер | nomic-embed-text | bge-m3 | bge-m3 — мультиязычный, лучше для русского |
| Векторная БД | Chroma | Qdrant | Qdrant масштабируется, Chroma — «поставил и забыл» |
| Реранкер | нет | bge-reranker-v2-m3 | Заметно поднимает точность топ-k |
Про русский язык
Отдельная боль — качество эмбеддингов на русском. По замерам сообщества bge-m3 и мультиязычные модели e5 стабильно обходят чисто англоязычные эмбеддеры на кириллических корпусах. Если документы русские, не экономь на эмбеддере — именно он определяет, найдётся ли нужный чанк вообще.
СБОРКА ЗА 15 МИНУТ: РАБОЧИЙ КОД
Ниже минимальный, но полностью офлайн-конвейер. Ставим Ollama, тянем модели заранее (пока интернет ещё есть), потом отключаемся от сети и работаем.
# 1. Модели (один раз, с интернетом)
ollama pull llama3.1:8b
ollama pull nomic-embed-text
# 2. Python-зависимости
pip install chromadb ollama pypdf
Сам конвейер — индексация документов и запрос:
import ollama, chromadb
from pypdf import PdfReader
client = chromadb.PersistentClient(path="./ragdb")
col = client.get_or_create_collection("docs")
def embed(text):
return ollama.embeddings(model="nomic-embed-text", prompt=text)["embedding"]
def chunk(text, size=600, overlap=80):
words = text.split()
for i in range(0, len(words), size - overlap):
yield " ".join(words[i:i + size])
# --- Индексация ---
reader = PdfReader("secret_contract.pdf")
full = "\n".join(p.extract_text() or "" for p in reader.pages)
for i, ch in enumerate(chunk(full)):
col.add(ids=[f"c{i}"], documents=[ch], embeddings=[embed(ch)])
# --- Запрос ---
def ask(q, k=4):
hits = col.query(query_embeddings=[embed(q)], n_results=k)
context = "\n---\n".join(hits["documents"][0])
prompt = f"Отвечай ТОЛЬКО по контексту.\n\nКонтекст:\n{context}\n\nВопрос: {q}"
r = ollama.chat(model="llama3.1:8b",
messages=[{"role": "user", "content": prompt}])
return r["message"]["content"]
print(ask("Какой срок действия договора?"))
Всё. База хранится в папке ./ragdb, модели крутятся через Ollama на localhost:11434, документ никуда не улетает. Выдёргивай сетевой кабель — работает.
ГРАБЛИ, О КОТОРЫЕ СПОТЫКАЮТСЯ ВСЕ
1. Скрытые облачные вызовы
Многие фреймворки (LangChain, LlamaIndex) по умолчанию тянут OpenAI embeddings или шлют телеметрию. Проверяй явно: заверни всё в мониторинг трафика и убедись, что при офлайне ничего не падает. Отключи телеметрию Chroma переменной ANONYMIZED_TELEMETRY=False.
2. Плохой чанкинг убивает всё
Резать текст по фиксированному числу слов — грубо. Таблицы, списки, код рвутся посреди строки, и ретривер достаёт мусор. Используй семантический или структурный чанкинг: по заголовкам Markdown, по абзацам, по разделам PDF. Перекрытие 10-15% обязательно.
3. Отсутствие реранкера
Векторный поиск возвращает «похожее», но не всегда «релевантное». Реранкер (bge-reranker) пересортировывает топ-20 и оставляет реально нужные 3-4 чанка. По ощущениям — один из самых дешёвых способов поднять качество ответов.
4. Контекст переполнен
Пихать в промпт 15 чанков бессмысленно: модель на 8B теряется в длинном контексте. Держи k в районе 3-5 и следи, чтобы суммарный контекст влезал с запасом в окно модели.
ЖЕЛЕЗО: ЧТО РЕАЛЬНО НУЖНО
Офлайн-RAG не требует топовой видеокарты. Ориентиры на 2026 год:
- Минимум: ноутбук с 16 ГБ RAM, любой современный CPU. Модель 7B Q4 на CPU даёт около 5-15 токенов/с — терпимо для личного использования.
- Комфорт: Apple Silicon (M-серия) с 24-32 ГБ единой памяти или ПК с GPU на 8-12 ГБ VRAM. Скорость вырастает в разы.
- Мощно: GPU на 16-24 ГБ VRAM тянет модели 14-32B и позволяет держать эмбеддер, реранкер и LLM одновременно.
Эмбеддинг всего корпуса — разовая операция. Тысячу страниц PDF на среднем CPU проиндексируешь за минуты. Дальше запросы идут быстро, потому что векторный поиск дешёвый.
КОГДА ОФЛАЙН-RAG НЕ НУЖЕН
Честно: если документы публичные и приватность не важна, облачный API часто проще и качественнее на сложных рассуждениях. Локальный стек оправдан, когда:
- данные конфиденциальны (медицина, юриспруденция, закрытый код, коммерческая тайна);
- нет стабильного интернета или работа в изолированном контуре;
- объём запросов большой и облачные токены дорого обходятся;
- ты просто не хочешь зависеть от чужого сервиса и его политики. Инструменты для самохостинга регулярно появляются в каталоге REDDYX.
Частые вопросы
Можно ли сделать RAG полностью без интернета?
Да. После разовой загрузки моделей (LLM и эмбеддера) весь конвейер — индексация, векторный поиск и генерация — работает офлайн на localhost. Ни один документ не покидает вашу машину.
Какая векторная база лучше для локального RAG?
Для старта — Chroma: ставится одной командой и хранит данные в файле. Для роста и нагрузки — Qdrant. Обе работают полностью офлайн и поддерживают самохостинг.
Сколько нужно оперативной памяти для офлайн-RAG?
Минимально комфортно — 16 ГБ RAM для модели 7-8B в квантовании Q4. Для моделей 14B и выше или одновременной работы эмбеддера, реранкера и LLM желательно 24-32 ГБ.
Насколько локальный LLM хуже облачного для RAG?
Для задач вопрос-ответ по документам разрыв невелик: ответ строится по найденному контексту, а не по знаниям модели. Модели 8-14B справляются уверенно, если чанкинг и ретрив настроены грамотно.
Собираешь свой приватный стек и хочешь не пропускать свежие модели, эмбеддеры и векторные базы? Подпишись на Telegram-канал REDDYX AI — новые репозитории каждые 30-60 минут.