Локальная нейросеть для PDF: Ollama, Open WebUI и RAG

Локальный ИИ · PDF · документы · RAG

Локальная нейросеть для PDF и документов: Ollama, Open WebUI и RAG без облака

Можно загрузить инструкции, договоры, техническую документацию, книги или сотни PDF и задавать вопросы по ним локальной LLM. Но качественный результат зависит не только от самой модели. Документ нужно правильно извлечь, разбить на фрагменты, превратить в embeddings, найти релевантные куски и только затем передать их LLM. Разберём весь путь без лишней магии.

Актуально: сентябрь 2026 Ollama · Open WebUI PDF · DOCX · TXT · OCR
RAG Embeddings Knowledge Base OCR Chunking Citations
Короткий ответ. Для домашнего или небольшого рабочего архива проще всего начать с Ollama и Open WebUI. Ollama запускает локальную LLM, Open WebUI извлекает текст из документов, создаёт embeddings, хранит индекс и перед запросом находит релевантные фрагменты. Для одного PDF достаточно обычного вложения. Для постоянной библиотеки создайте Knowledge Base.

Что такое RAG и зачем он нужен для PDF

RAG — Retrieval-Augmented Generation, то есть генерация с дополнением найденным контекстом. Его задача — дать модели факты из документов, которых нет в её исходных знаниях.

Если просто сказать LLM «ответь по моему договору», она ничего не знает о файле, пока текст договора не попадёт в её контекст. Для небольшого документа можно передать весь текст целиком. Для сотен страниц это дорого по памяти и контексту, поэтому используется retrieval.

1 Извлечение

PDF/DOCX превращается в текст или структурированный документ.

2 Chunking

Текст делится на небольшие логические фрагменты.

3 Embeddings

Каждый фрагмент преобразуется в числовой вектор.

4 Retrieval

По вопросу находятся наиболее подходящие фрагменты.

5 LLM

Найденный контекст добавляется к запросу и модель формирует ответ.

RAG не «обучает» модель на ваших файлах. Веса LLM не переписываются. Документы хранятся отдельно, а релевантные фрагменты подставляются в текущий запрос.

Из чего состоит локальная система вопросов по документам

Ollama Запускает основную LLM и, при желании, embedding-модель.
Open WebUI Чат, пользователи, файлы, Knowledge Base, retrieval и цитаты.
Vector DB Хранит embeddings фрагментов для поиска.

Для первого домашнего стенда отдельный Qdrant или PostgreSQL не обязателен. Open WebUI умеет работать со своей встроенной инфраструктурой хранения. Внешняя vector database становится полезна при больших коллекциях, нескольких workers или уже существующем корпоративном индексе.

Что понадобится

  • ПК или сервер с Windows, Linux или macOS;
  • Ollama с локальной языковой моделью;
  • Docker Desktop или Docker Engine для простого запуска Open WebUI;
  • несколько гигабайт свободного диска под модели и документы;
  • embedding-модель или встроенный SentenceTransformers Open WebUI;
  • нормально извлекаемый текст документа либо OCR для сканов.

Если Ollama ещё не установлена, начните с отдельного гайда «Ollama на Windows: установка и первый запуск».

Как установить Open WebUI рядом с Ollama

Официальная документация Open WebUI рекомендует Docker как простой способ запуска. Если Ollama уже установлена на Windows как обычное приложение, контейнеру Open WebUI нужно разрешить обращаться к host через host.docker.internal.

Open WebUI + Ollama на хосте
docker run -d ^
  -p 3000:8080 ^
  --add-host=host.docker.internal:host-gateway ^
  -v open-webui:/app/backend/data ^
  -e WEBUI_SECRET_KEY=ЗАДАЙТЕ_СВОЙ_ДЛИННЫЙ_СЕКРЕТ ^
  --name open-webui ^
  --restart always ^
  ghcr.io/open-webui/open-webui:main

В PowerShell перенос строки обычно удобнее делать обратной кавычкой, а в CMD — символом ^. Если не хотите разбираться с переносами, команду можно выполнить одной строкой.

Для постоянного рабочего сервера лучше фиксировать конкретную версию Open WebUI, а не использовать плавающий тег :main. Это упрощает воспроизводимость и откат после обновления.

После запуска откройте:

http://localhost:3000

Том open-webui:/app/backend/data обязателен, если нужно сохранять пользователей, чаты, настройки и индекс после пересоздания контейнера.

Как подключить Open WebUI к Ollama

Когда Ollama работает на том же компьютере, Open WebUI обычно пытается найти её автоматически. Для Docker-контейнера типичный адрес backend:

http://host.docker.internal:11434

Проверить соединение можно в:

Settings → Admin → Connections → Ollama

После успешного подключения локальные модели Ollama должны появиться в селекторе моделей Open WebUI.

Самый простой вариант: задать вопрос одному PDF

Для разового документа отдельную Knowledge Base создавать не обязательно.

  1. Откройте новый чат.
  2. Перетащите PDF в поле сообщения.
  3. Дождитесь завершения обработки.
  4. Выберите локальную модель.
  5. Задайте конкретный вопрос по содержимому.

Open WebUI извлечёт текст, разделит его на фрагменты, создаст embeddings и при запросе передаст модели найденные части документа. В официальной документации этот сценарий описан как one-off attachment.

Как правильно тестировать

Не начинайте с вопроса «расскажи всё про этот документ». Возьмите фразу или число, которое точно есть на одной конкретной странице:

Пример

«Какой гарантийный срок указан в документе? Ответь только на основании файла и укажи источник.»

Так проще понять, работает ли retrieval вообще.

Когда нужна Knowledge Base

Если одни и те же файлы нужны во многих чатах, создайте постоянную базу знаний:

Workspace → Knowledge → Create Knowledge Base

Туда можно добавить документацию, инструкции, регламенты, договоры, технические паспорта и другие материалы.

Затем базу можно:

  • подключить к отдельному чату;
  • выбрать через символ # в строке ввода;
  • привязать к созданной модели/ассистенту;
  • использовать через API.
One-off attachment Один файл или разовая задача. Минимум подготовки.
Knowledge Base Постоянный архив, который используется снова и снова.
External source Уже существующий Qdrant/Milvus/pgvector, который не нужно копировать в Open WebUI.

Что такое embeddings и почему это отдельная модель

Embedding-модель не отвечает пользователю. Она превращает текст в вектор — набор чисел, который отражает его смысловое положение в многомерном пространстве.

Тот же процесс выполняется для вопроса пользователя. Затем vector database ищет фрагменты документов, расположенные ближе всего к вектору запроса.

вопрос → embedding → поиск похожих embeddings → подходящие chunks → LLM

Что использовать сначала

Open WebUI по умолчанию умеет использовать локальный SentenceTransformers-модуль. Для одного пользователя это нормальный старт без дополнительной настройки.

Если Ollama уже работает, embeddings можно вынести туда. В документации Open WebUI среди self-hosted вариантов рекомендуются, в частности, nomic-embed-text и mxbai-embed-large.

Пример embedding-модели Ollama
ollama pull nomic-embed-text
Нельзя бездумно менять embedding-модель после индексации. Старые и новые embeddings находятся в разных векторных пространствах. После смены embedding-модели Open WebUI требует переиндексировать документы.

Что такое chunking и почему от него зависит качество

Большой PDF не превращается в один embedding. Сначала текст разбивается на фрагменты — chunks.

Если chunks слишком маленькие, контекст разваливается: заголовок может оказаться в одном фрагменте, условие — в другом, а таблица — в третьем. Если слишком большие, поиск становится менее точным и быстрее заполняет контекст LLM.

Слишком маленький chunk

Точное совпадение, но мало смысла вокруг найденной фразы.

Слишком большой chunk

Больше контекста, но retrieval получает много нерелевантного текста.

Overlap

Повтор части текста между соседними chunks уменьшает риск разрыва важного фрагмента на границе.

Универсального идеального значения нет. Технический справочник, договор, книга и таблица требуют разных подходов.

Markdown Header Splitting

Open WebUI умеет сначала делить Markdown по H1–H6, а затем применять обычный splitter. Для хорошо структурированной технической документации это полезно: разделы сохраняются логически связанными.

Не начинайте оптимизацию с случайных чисел chunk size из чужого YouTube-видео. Сначала посмотрите, что реально извлеклось из вашего документа, и протестируйте несколько вопросов с известными ответами.

Почему обычный PDF работает, а сканированный — нет

В PDF может вообще не быть текстового слоя. Визуально вы видите страницу, но для парсера это просто изображение.

Open WebUI поддерживает несколько способов извлечения документов, включая встроенные механизмы, Apache Tika, Docling и OCR-сценарии.

Признаки проблемы с extraction

  • модель говорит, что документ пуст;
  • в preview нет текста;
  • русские буквы превратились в мусор;
  • таблицы потеряли строки и столбцы;
  • найдена только первая часть документа;
  • скан виден глазами, но retrieval ничего не находит.

Что попробовать

  1. Откройте preview извлечённого содержимого.
  2. Для сложных PDF попробуйте Tika или Docling.
  3. Для изображений и сканов включите OCR / PDF image extraction.
  4. Проверьте результат до изменения LLM.
Если extraction плохой, смена чат-модели проблему не исправит. LLM не может найти текст, который вообще не попал в индекс.

Почему RAG упирается в context window

Retrieval может найти десять хороших фрагментов, но их ещё нужно передать языковой модели. Они конкурируют за context window с историей диалога, системным prompt и самим вопросом.

В актуальной документации Open WebUI отдельно предупреждается: при использовании Ollama на GPU с объёмом менее 24 GiB default context length может составлять всего 4096 токенов. Для RAG это мало, потому что часть найденного контекста может быть усечена или вообще не использоваться.

Типичный симптом: документ успешно проиндексирован, нужный fragment retrieval находит, но модель всё равно отвечает как будто его не видит. Проверьте context length до бесконечного изменения chunk size.

Подробно о памяти и контексте: «Сколько RAM и VRAM нужно для локальной LLM».

Как заставить ответы быть проверяемыми

Хороший RAG должен не только отвечать, но и показывать, откуда взят факт. Open WebUI поддерживает citations для найденного контекста.

Для важных документов используйте prompt, который запрещает додумывать отсутствующую информацию:

Рабочий prompt

«Отвечай только по подключённой базе знаний. Если ответа в найденных фрагментах нет — прямо скажи, что информация не найдена. Для фактов показывай источник.»

Даже при citations ответ нужно проверять: LLM может правильно сослаться на документ, но неверно интерпретировать число, исключение или юридическую формулировку.

Почему локальный RAG плохо отвечает: диагностика по шагам

01
Проверьте extraction

Есть ли нужный текст в извлечённом содержимом? Если нет — исправляйте parser/OCR.

02
Проверьте retrieval

Находит ли система нужный chunk? Если нет — embeddings, chunking, hybrid search, reranker.

03
Проверьте context

Помещаются ли retrieved chunks вместе с prompt и историей диалога?

04
Проверьте LLM

Может ли выбранная модель корректно использовать предоставленный контекст?

Модель «не видит» файл

Частая причина — extraction. Open WebUI рекомендует сначала проверить preview извлечённого текста и при необходимости сменить parser на Tika или Docling.

Находит не тот PDF

Проблема уже на этапе retrieval. Помогают другая embedding-модель, reindex, hybrid search, reranking и корректная структура базы.

Находит только один и тот же кусок

Проверьте Top K, similarity threshold, chunking и состав Knowledge Base. Для больших наборов документов простой nearest-vector search может быть слишком узким.

После смены embeddings стало хуже

Переиндексируйте все документы. Open WebUI прямо предупреждает, что embeddings разных моделей несовместимы.

Ответ хороший на первом вопросе и медленный на следующих

Для больших документов в документации предлагается RAG_SYSTEM_CONTEXT=True: retrieved context помещается в system message, что позволяет эффективнее использовать prefix/prompt caching в совместимых backend.

Когда базового RAG уже мало

Для десятка технических инструкций встроенного RAG часто достаточно. Для сотен или тысяч документов появляются дополнительные задачи.

  • hybrid search: vector similarity + BM25;
  • reranking найденных фрагментов;
  • метаданные: номер документа, версия, дата, раздел, страница;
  • несколько коллекций с разными правами доступа;
  • отдельный OCR pipeline;
  • обновление только изменившихся файлов;
  • external vector database;
  • агентный поиск по базе.

Hybrid search и reranking

Vector search хорошо находит семантически похожий текст, но иногда плохо справляется с точными кодами, артикулами, номерами ГОСТ, пунктами договора и редкими терминами. BM25, наоборот, полезен для точных слов. Hybrid search сочетает оба подхода, а reranker заново сортирует найденные кандидаты.

Agentic retrieval и kb_exec

В актуальном Open WebUI есть режим filesystem-style access к Knowledge Base через kb_exec. При поддержке native function calling модель получает инструменты вроде ls, tree, grep, cat и чтения по строкам. Для способных tool-calling моделей это может быть надёжнее простого fan-out поиска.

Agentic Knowledge
ENABLE_KB_EXEC=True

Когда нужен Qdrant, Milvus или pgvector

Open WebUI умеет подключать внешние Knowledge Sources без повторного импорта всех документов. В текущей документации экспериментально поддерживаются Qdrant, Milvus и pgvector.

Это имеет смысл, если:

  • vector database уже используется другими приложениями;
  • индекс формируется отдельным ingestion pipeline;
  • документов очень много;
  • Open WebUI работает в нескольких экземплярах;
  • нужна централизованная корпоративная база;
  • требуется независимое масштабирование retrieval.
Embedding-модель для запроса должна совпадать с моделью, которой построен внешний индекс. Совпадать должны и размерность, и само пространство embeddings. Иначе поиск будет плохим или бессмысленным.

Насколько такая система действительно локальная

Стек может работать полностью внутри вашей инфраструктуры, но только если локальными остаются все его компоненты.

LLM Локальная модель в Ollama.
Embeddings Локальный SentenceTransformers или Ollama embedding model.
Extraction Локальный pypdf, Tika, Docling или OCR.
Vector DB Локальная встроенная база либо свой Qdrant/pgvector.

Если embeddings отправляются в облачный API, наружу уходят chunks документов. Если OCR выполняет внешний сервис, наружу уходят страницы или изображения. Если основная LLM облачная, ей передаются retrieved fragments.

«Open WebUI локально» ещё не означает «все документы остаются локально». Проверяйте backend LLM, embedding engine, OCR/extraction и внешние tools по отдельности.

Пример разумной домашней схемы

01 Ollama

Локальная LLM на GPU или CPU.

02 nomic-embed-text

Отдельная локальная embedding-модель через Ollama.

03 Open WebUI

Интерфейс, Knowledge Base, retrieval и citations.

04 Docling / Tika

Подключать только если встроенного извлечения недостаточно.

Не нужно сразу строить LangChain + Qdrant + reranker + OCR + пять микросервисов. Сначала проверьте простой стек на реальных документах. Усложняйте только тот этап, где действительно есть проблема.

Полезные open-source проекты

Частые вопросы

Нужно ли обучать модель на своих PDF?

Обычно нет. Для вопросов по меняющимся документам RAG практичнее fine-tuning: документы индексируются отдельно и могут обновляться без переобучения LLM.

Можно ли работать с 500 PDF локально?

Да. Ограничение определяется не тем, что все 500 PDF должны одновременно попасть в context, а качеством ingestion и retrieval. Для крупных коллекций особенно важны embeddings, метаданные, hybrid search, reranking и архитектура vector database.

Какую модель использовать для embeddings?

Для первого запуска достаточно встроенной SentenceTransformers-модели Open WebUI. Если Ollama уже используется, можно вынести embeddings в nomic-embed-text или mxbai-embed-large. Для русского языка выбор стоит проверять на своих запросах и корпусе.

Почему PDF загрузился, но модель ничего не знает?

Сначала проверьте extraction preview. Если нужного текста там нет, проблема возникает до LLM. Если текст есть, проверяйте retrieval и context length.

Что лучше: Full Context или RAG?

Для короткого документа Full Context может быть проще и точнее. Для большого PDF или коллекции документов RAG экономит контекст, передавая только найденные части.

Можно ли искать по сканированным договорам?

Да, но нужен OCR. Если в PDF нет текстового слоя, обычный parser не сможет получить содержимое без распознавания изображений.

Можно ли сделать всё без интернета?

Да, после предварительной загрузки Docker image и моделей. Для полностью локальной схемы LLM, embeddings, OCR/extraction и vector DB должны работать внутри вашей инфраструктуры.

Нужна ли мощная видеокарта именно для RAG?

Основная GPU-нагрузка обычно приходится на LLM и, при выборе GPU embedding model, на embeddings. Retrieval из vector database сам по себе не требует игровой GPU. Для небольших баз embeddings можно считать на CPU.

Первичные источники

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

Локальная база знаний

Если PDF загружаются, но локальная модель ищет по ним плохо

Можно удалённо проверить Ollama, Open WebUI, extraction, embedding-модель, chunking, контекст и retrieval, а затем настроить базу знаний под реальные документы.