← Усі статті

Офлайн-RAG з коробки: Ollama, FastAPI і Docker без хмари

VaultRAG — стартовий набір для локального RAG: PDF, ембединги в Ollama, пошук у власному індексі й відповіді через SSE. Для клієнтів, яким не можна в OpenAI.

Офлайн-RAG з коробки: Ollama, FastAPI і Docker без хмари
Зміст

Коротко

Підняти локальну модель через Ollama зараз просто. Зібрати навколо неї повний контур RAG — завантаження PDF, нарізка, ембединги, пошук, чат із потоком відповіді — досі набір розрізнених шматків.

Автор допису на Dev.to виклав VaultRAG: готовий стартовий набір під Docker Compose. У стеку Ollama, FastAPI, LangChain і React. Документи не йдуть у хмарний API: усе крутиться на вашій машині або у вашій мережі.

Слово «корпоративний» тут про продажі не каже. Це чесний стартовий каркас, щоб не склеювати сервіси з нуля, коли клієнт прямо каже: PDF у OpenAI не надсилаємо.

Що сталося

Мотив знайомий: експерименти з локальними LLM ідуть легко, а «продукт, яким можуть користуватися люди без досвіду адміністрування» збирається з бекенду, фронту, векторного сховища й оркестрації. Кожен шар сам по собі задокументований. Стиків зазвичай немає.

VaultRAG закриває типовий шлях. Користувач завантажує PDF. FastAPI приймає файл і віддає його в ланцюжок LangChain. Текст ріжеться через RecursiveCharacterTextSplitter. Ембединги рахує локальна модель в Ollama (у дописі фігурує nomic-embed-text). Вектори кладуться в локальне сховище. На запитання система піднімає близькі фрагменти й віддає відповідь потоком через SSE, не чекаючи «всього тексту одразу».

Для генерації автор згадує сімейства на кшталт Llama 3.1 і Qwen, теж через Ollama, без зовнішнього ключа. Клієнт на React із Tailwind — це звичайний чат поверх цього контуру. Увесь контур піднімається через Docker Compose: один каталог, один compose up, замість ручної склейки портів і змінних середовища.

Код: репозиторій стартового набору на GitHub.

Два місця, де автор реально вперся. Спочатку мережа Docker: контейнер FastAPI має бачити Ollama за іменем сервісу, а не через localhost з хоста. Потім розмір і перекриття фрагментів: занадто дрібні шматки гублять контекст, занадто великі сповільнюють вивід моделі й роздувають індекс.

Чому це важливо

Багато пілотів RAG гинуть не на якості відповіді, а на політиці даних. Юристи, медицина, внутрішні регламенти: прохання «надішліть корпус у хмару» уже стоп. Локальний стек знімає цей стоп, але лише якщо його можна відтворити без тижневої збірки.

Готовий Compose-контур корисний як еталон стиків, а не як фінальна архітектура. Він показує, де живе завантаження, де нарізка, де ембединги і де потік відповіді. Який індекс у проді, як версіонувати документи й як міряти якість — уже інша глибина, ближче до промислової інженерії RAG.

Уявіть кухню, де не можна віддавати продукти на сторону: усі ножі й плити мають стояти в тому ж приміщенні. VaultRAG тут як зібраний кухонний кут, не ресторан: можна готувати, не купуючи кожен прилад окремо.

На практиці

Має сенс дивитися на набір, якщо ви вже знаєте, навіщо вам офлайн, і не хочете тиждень витрачати на склейку.

  1. Підніміть Compose і перевірте, що FastAPI ходить в Ollama за іменем сервісу з мережі Docker, а не на 127.0.0.1 хоста.
  2. Завантажте один знайомий PDF і поставте запитання, відповіді на які ви знаєте напам’ять — так швидше видно, що індекс «живий».
  3. Покрутіть chunk_size і chunk_overlap у RecursiveCharacterTextSplitter: почніть з помірних значень і дивіться, чи не рвуться абзаци посеред думки.
  4. Змініть модель генерації (Llama 3.1, Qwen тощо) і ембединги (nomic-embed-text) під залізо: слабкий ноутбук і сервер із GPU — різні бюджети.
  5. Перевірте потік SSE в інтерфейсі: обрив з’єднання й повторний запит мають поводитися передбачувано.
  6. Не плутайте стартовий каркас із продакшеном: права доступу, версії документів, оцінка якості й спостережуваність сюди майже напевно не входять — їх додають зверху.

Підсумок

VaultRAG відповідає на питання «як швидко підняти приватний RAG без хмари»: PDF → нарізка → локальні ембединги → пошук → потік відповіді, усе в Docker Compose.

Цінність у зібраних стиках Ollama ↔ FastAPI ↔ React і в двох відомих граблях: мережа контейнерів і розмір фрагментів. Маркетингове «корпоративний» тут ні до чого.

Якщо клієнт забороняє винесення документів, такий стартовий набір економить час на склейці. Далі вже інженерія: міряти, версіонувати й не приймати демо за готову систему.

Коментарі

Завантаження коментарів…