qvib.pro
EN

RAG по своим документам локально

Для чего: спросить ИИ по СВОИМ файлам (PDF, docx, заметки) — приватно и офлайн, чтобы он отвечал из документов со ссылкой на источник, а не выдумывал. Ollama + эмбеддинги, по шагам.

бесплатно open-source локально профи

RAG (Retrieval-Augmented Generation) = ИИ сначала НАХОДИТ нужные куски в твоих документах, потом отвечает, опираясь на них. Локально это даёт приватность (файлы не уходят в облако) и работу офлайн. Команды Ollama сверены с офиц. docs.ollama.com; стек — Ollama + эмбеддинг-модель + готовый RAG-инструмент.

🧭 Картина целиком

Что получишь на выходе: локального ИИ, который отвечает на вопросы ПО ТВОИМ документам (договоры, методички, PDF-книги, заметки, выгрузки) — с цитатой и ссылкой на источник, без интернета и без утечки данных наружу.

Зачем RAG, а не просто «вставить в чат». Обычный ИИ знает «общее» и врёт в деталях твоих файлов; вставить всё в чат нельзя — не влезет в контекст. RAG решает оба: документы один раз превращаются в эмбеддинги (числовые «отпечатки смысла») и кладутся в векторный индекс. На вопрос система достаёт 3–5 самых релевантных кусков и даёт их модели как опору — отсюда точность и ссылки на источник.

Путь — 4 шага: поставить движок (Ollama + модели) → собрать документы → построить индекс готовым инструментом → спрашивать и проверять источники.

💡 Нужны ДВЕ модели: одна отвечает (чат, напр. qwen3/llama3.2), вторая делает эмбеддинги для поиска (nomic-embed-text). Чат-модель искать по смыслу не умеет — эмбеддинг-модель обязательна. 💡 Это «развёрнутый» брат гайда про Obsidian: там акцент на vault-заметках, здесь — на любых документах (PDF/docx/txt) и на сборке RAG как системы.


Шаг 1. Поставить движок: Ollama + две модели

Что делаем: ставим Ollama (локальный запуск моделей) и качаем модель-ответчик и модель-эмбеддер. Подробности по железу — в гайде «Запуск локальной модели».

# установить Ollama: macOS/Windows — установщик с ollama.com/download; Linux:
curl -fsSL https://ollama.com/install.sh | sh

# модель для ответов (выбери под своё железо):
ollama pull qwen3                 # сильная многоязычная, хорошо знает русский
# модель эмбеддингов (для поиска по смыслу) — ОБЯЗАТЕЛЬНА:
ollama pull nomic-embed-text

Как понять, что ОК:

ollama ls            # в списке видны и qwen3, и nomic-embed-text

обе модели скачаны; ollama --version показывает версию; локальный сервер слушает http://localhost:11434.

Частые ошибки:

  • Скачал только чат-модель → RAG не строит индекс. Нужна именно эмбеддинг-модель (nomic-embed-text или mxbai-embed-large).
  • Error: model requires more system memory — чат-модель тяжела для RAM. Возьми легче (llama3.2, qwen3:1b); эмбеддер лёгкий, он не проблема.
  • connection refused на 11434 позже — сервер Ollama не запущен (Linux: ollama serve; mac/Win: открой приложение).

Шаг 2. Собрать документы в одну папку

Что делаем: складываем всё, по чему хотим спрашивать, в одну папку — это «корпус» для индекса.

  1. Создай папку, напр. ~/rag-docs, и положи туда файлы: .txt, .md, .pdf, .docx.
  2. Гигиена корпуса: осмысленные имена файлов (они станут «источником» в ответах), разумный размер документов, убери явный мусор/дубликаты.

Как понять, что ОК: в папке лежат нужные файлы, имена понятные (договор-аренды-2026.pdf, а не doc1.pdf); ничего лишнего и приватного-чужого, что не должно попасть в индекс.

Частые ошибки:

  • Один огромный файл «на всё» → поиск размывается, в ответ тащится лишнее. Лучше несколько документов по темам.
  • Скан-PDF без текстового слоя (картинки страниц) → из него нечего извлекать. Сначала прогони OCR (распознавание текста), иначе RAG «не увидит» содержимое.
  • Имена 1.pdf, новый.docx → в ответе «источник» бесполезен. Называй по смыслу.

Шаг 3. Построить индекс готовым инструментом

Что делаем: даём готовому RAG-инструменту папку — он сам режет документы на куски, считает эмбеддинги через Ollama и строит индекс. Выбери ОДИН путь:

Путь А — Open WebUI (графический, проще всего). Веб-интерфейс «как ChatGPT» поверх локального Ollama, с RAG из коробки.

# запуск через Docker (нужен Docker; см. гайд про сервер):
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway \
  -v open-webui:/app/backend/data --name open-webui ghcr.io/open-webui/open-webui:main

Открой http://localhost:3000 → раздел Workspace → Knowledge (или Documents) → создай базу → загрузи файлы из папки. В настройках укажи эмбеддинг-модель nomic-embed-text (Ollama). Теперь в чате выбери эту базу знаний и спрашивай.

Путь Б — свой мини-скрипт (LlamaIndex, максимум контроля). Несколько строк Python: читает папку, эмбеддит локально, отвечает локальной моделью.

pip install llama-index llama-index-llms-ollama llama-index-embeddings-ollama
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding

Settings.llm = Ollama(model="qwen3", request_timeout=120)
Settings.embed_model = OllamaEmbedding(model_name="nomic-embed-text")

docs = SimpleDirectoryReader("~/rag-docs").load_data()   # читает txt/md/pdf/docx
index = VectorStoreIndex.from_documents(docs)            # строит индекс (эмбеддинги)
engine = index.as_query_engine()
resp = engine.query("Какой срок оплаты по договору аренды?")
print(resp)                 # ответ
print(resp.source_nodes)    # из каких кусков/файлов он взят — это твои «источники»

Как понять, что ОК: инструмент проглотил файлы без ошибок; на тестовый вопрос приходит ответ, основанный на документе, и видно, ИЗ КАКОГО файла он взят. Всё работает без интернета.

Частые ошибки:

  • Эмбеддинг-модель не указана/не та → ошибка построения индекса или мусорный поиск. Должна стоять именно nomic-embed-text (или другой эмбеддер), не чат-модель.
  • pip не находит пакеты/конфликт версий → используй venv (python -m venv .venv и активируй), ставь в чистое окружение.
  • PDF «прочитался пустым» → это скан без текстового слоя (см. Шаг 2, нужен OCR).
  • Open WebUI в Docker не видит Ollama → на хосте нужен host.docker.internal (флаг --add-host выше) или укажи адрес Ollama явно в настройках.

Шаг 4. Спрашивать и проверять источник

Что делаем: задаём вопросы и убеждаемся, что ответ — ИЗ документов, а не выдуман.

  1. Спрашивай конкретно: «Что сказано про в <документе>?», «Собери из всех файлов, что касается <темы>, со ссылками».
  2. ВСЕГДА смотри блок источников (source_nodes в скрипте / «Citations» в Open WebUI): ответ должен опираться на реальный кусок реального файла.
  3. Добавил/изменил документы → переиндексируй (в Open WebUI — перезалей/обнови базу; в скрипте — перестрой индекс или включи персист/обновление), иначе RAG не видит новое.

Как понять, что ОК: на вопрос по детали, которая есть только в твоих файлах, ИИ отвечает верно и показывает источник; на вопрос, которого в корпусе нет, — честно говорит «в документах не нашёл», а не сочиняет.

Частые ошибки:

  • Веришь ответу без проверки источника → RAG тоже может «дотянуть» из общих знаний модели. Сверяй с процитированным куском.
  • Спросил, а ответа в документах нет, и модель «придумала» — добавь в вопрос «отвечай только по документам; если там нет — так и скажи».
  • Обновил файлы, но не переиндексировал → старые ответы. Переиндексация после изменений обязательна.

🧠 Для сеньора

  • Чанкинг решает всё: режь по заголовкам/абзацам с overlap (200–400 токенов, ~10–15% нахлёст); клади в метаданные кусок-источник (файл, страница/секция) — получишь точные цитаты. Слишком крупные чанки топят релевантность, слишком мелкие рвут смысл.
  • Гибридный поиск: вектор (nomic-embed-text/mxbai-embed-large) + ключевой (BM25) заметно точнее по терминам, именам, артикулам, чем чистые эмбеддинги. Добавь reranker для топ-k.
  • Векторное хранилище: для постоянства/масштаба — Chroma/Qdrant/LanceDB вместо in-memory; инкрементальная переиндексация по mtime файлов, а не «всё заново».
  • Качество ответа: подними количество источников (similarity_top_k), задай system-prompt «отвечай только из контекста, не хватает — скажи»; для длинных ответов — map-reduce по кускам.
  • Оценка: держи мини-набор «вопрос → ожидаемый документ/факт» и прогоняй после смены модели/чанкинга — чтобы не деградировать молча. Качество эмбеддера и чанкинга важнее размера чат-модели.

⚠️ Предупреждения (приватность / необратимое)

  • Смысл локального RAG — приватность: держи всё локально. Не подключай к этой схеме облачные эмбеддинги/модели, если документы чувствительные (договоры, ПД, NDA) — иначе содержимое уходит наружу, и приватность теряется.
  • Эмбеддинги не «зашифрованы». Папка индекса хранит куски твоих текстов в открытом виде. Лежит на диске → защищай как сами документы (доступ, шифрование диска), не клади индекс в публичный git.
  • Сторонний код и образы — supply-chain. Ставь Open WebUI/библиотеки из официальных источников; Docker-образ и pip-пакеты тоже исполняют код на твоей машине.
  • Бэкап документов. Индекс — производное; ценны сами файлы. Перед массовыми операциями держи копию корпуса (см. гайд «Бэкап 3-2-1»).

🆘 Промт-спасалка

Помоги собрать локальный RAG по моим документам через Ollama, объясняй по шагам.
МОИ ДОКУМЕНТЫ: <сколько, форматы: PDF/docx/txt/заметки>. ПРИВАТНОСТЬ: важно, всё локально.
МОЁ ЖЕЛЕЗО: <ОС, RAM, есть ли GPU>. ПУТЬ: <Open WebUI / свой скрипт на LlamaIndex / ещё не выбрал>.
Я ЗАСТРЯЛ: <что не работает / текст ошибки / PDF читается пустым / индекс не строится>.

Что делать:
1) Какие модели Ollama взять под моё железо (чат + эмбеддинг) и как скачать.
2) Дай точные шаги: собрать папку, построить индекс выбранным инструментом, задать вопрос.
3) Как проверить, что ответ идёт ИЗ моих документов (со ссылкой на источник), а не выдуман.
4) Предупреди: всё локально (приватность), OCR для сканов, переиндексация после изменений, бэкап файлов.

💎 Глубина и ценность

  • Приватный эксперт по твоим знаниям. Гора PDF, договоров и методичек, которую невозможно перечитать, превращается в собеседника: спросил — получил ответ с цитатой из нужного файла. И всё это не покидает твой диск.
  • Заземление убивает галлюцинации. Ответ «по источнику» проверяем и достоверен — это переводит ИИ из режима «уверенно сочиняет» в «отвечает по документу». Ровно ради этого RAG и придуман, и локально ты получаешь его без риска утечки.
  • Фундамент, который масштабируется. Та же схема (эмбеддинги → векторный поиск → ответ с источником) лежит под корпоративными «ИИ по базе знаний» за большие деньги. Освоив её на ноутбуке, ты понимаешь, как устроены такие системы — и можешь строить их сам, от личного «второго мозга» до бота поддержки по своей документации.