RAG (Retrieval-Augmented Generation) у виробничому середовищі — це не просто “підключи і працюй”: без правильної архітектури система або галюцинує, або втрачає критичні події в потоці даних. Цей туторіал покаже, як побудувати RAG-пайплайн, який виявляє аномалії та інциденти в реальному часі — наприклад, збої обладнання, пікові навантаження або нестандартну поведінку сенсорів. Ти витратиш орієнтовно 3-4 години на першу робочу версію. Потрібен базовий досвід з Python та розуміння того, що таке векторні бази даних.
🛠️ Що знадобиться
- Python 3.11+ — основна мова розробки; встанови через pyenv або офіційний інсталятор
- LangChain 0.3 / LlamaIndex 0.11 — фреймворки для побудови RAG-пайплайнів; обидва безкоштовні з відкритим кодом
- Qdrant (self-hosted або Qdrant Cloud) — векторна база даних для зберігання ембедингів; є безкоштовний tier на 1GB
- Apache Kafka або Redpanda — стрімінг даних у реальному часі; Redpanda простіший для локального запуску через Docker
- OpenAI API або Mistral API — LLM для генерації відповідей; OpenAI від $5 за перше поповнення, Mistral має безкоштовний tier
- Prometheus + Grafana — моніторинг якості RAG у production; обидва безкоштовні та відкриті
- Docker Desktop — для локального запуску Qdrant, Kafka і Grafana без зайвого болю
📋 Покрокова інструкція
Крок 1: Розгортання векторної бази та стрімінгового брокера через Docker
Відкрий термінал і створи файл docker-compose.yml у новій папці проєкту. Встав туди конфіг для Qdrant на порту 6333 і Redpanda на порту 9092. Запусти командою docker compose up -d — обидва сервіси підіймуться за 30-60 секунд. Перевір, що Qdrant відповідає: відкрий браузер і зайди на http://localhost:6333/dashboard — побачиш веб-інтерфейс із порожньою базою колекцій. Якщо сторінка не відкривається — перевір, чи не зайнятий порт 6333 іншим процесом командою lsof -i :6333.

Крок 2: Підготовка та індексація знань про типові проблеми
Це найважливіший крок — якість RAG напряму залежить від того, що ти поклав у базу знань. Зібери документацію: журнали минулих інцидентів, runbooks, специфікації обладнання, описи помилок із JIRA чи Confluence. Перетвори їх на текстові файли або JSON. Потім у Python встанови бібліотеки: pip install langchain-community qdrant-client openai tiktoken. Напиши скрипт індексації: завантаж документи через DirectoryLoader, розбий їх через RecursiveCharacterTextSplitter із розміром чанку 512 токенів і перекриттям 64 токени — саме такі параметри дають кращий recall для технічних текстів. Запусти індексацію: скрипт створить колекцію у Qdrant і заповнить її векторами через text-embedding-3-small від OpenAI.
Крок 3: Побудова стрімінгового пайплайну для прийому подій у реальному часі
Тепер підключи джерело даних — наприклад, логи з виробничих машин або метрики сенсорів. Створи Kafka-топік командою: docker exec -it redpanda rpk topic create production-events --partitions 3. Напиши Python-продюсера, який кожні 5 секунд надсилає в топік JSON-повідомлення із полями: timestamp, device_id, metric_name, value, raw_log. Для тесту згенеруй штучні аномалії — наприклад, температура вище 90°C або помилка коду E_TIMEOUT у логах. Підводний камінь: не надсилай у Kafka повідомлення більші за 1MB без попередньої конфігурації брокера, інакше отримаєш мовчазне відкидання даних — встанови max.message.bytes=10485760 у налаштуваннях топіку.
Крок 4: Реалізація RAG-логіки з онлайн-детекцією аномалій
Напиши Kafka-консьюмер, який читає події та для кожної запускає RAG-запит. Логіка така: спочатку перевір подію простим порогом (value > threshold) або регулярним виразом на відомі коди помилок — це швидкий перший фільтр. Якщо подія підозріла, сформуй запит до Qdrant: виконай векторний пошук по тексту події і поверни топ-5 найрелевантніших документів із бази знань. Передай знайдені документи як контекст у промпт до LLM із чітким інструкцією: “На основі наведеного контексту визнач: чи є ця подія критичним інцидентом? Якщо так — вкажи ймовірну причину та рекомендовані дії. Відповідай лише на основі контексту, не вигадуй.” Отриману відповідь разом із оригінальною подією збережи у структурований лог — наприклад, у PostgreSQL або ClickHouse для подальшого аналізу.
Крок 5: Налаштування моніторингу якості та деплой у production
RAG без моніторингу — це чорна скринька. Підключи Prometheus Python Client і додай метрики: кількість оброблених подій, кількість виявлених інцидентів, середній час відповіді RAG-запиту, а головне — relevance score із Qdrant для кожного пошуку (якщо він нижче 0.75, варто попереджати). Імпортуй готовий дашборд для Grafana (JSON-шаблон є у репозиторії LangSmith або зроби власний) і налаштуй алерт: якщо relevance score падає нижче порогу — значить нові типи проблем не покриті базою знань і треба дооповнити документацію. Запакуй усе в Docker-образ, встанови restart: always у compose-файлі і деплой на VPS або Kubernetes. У фінальному результаті ти маєш систему, яка: читає потік подій → знаходить релевантний контекст → класифікує проблему через LLM → логує рішення → відображає статистику в Grafana.
⚠️ Типові помилки та як їх уникнути
- Занадто великі чанки документів — чанки більше 1024 токенів знижують точність пошуку, бо вектор “розмивається” по кількох темах одночасно; тримай розмір 256-512 токенів для технічних логів
- Відсутність фільтрації перед LLM-запитом — надсилати кожну подію у LLM дорого і повільно; спочатку фільтруй простими правилами (regex, пороги) і тільки підозрілі — у RAG
- Ігнорування drift бази знань — якщо виробниче середовище змінюється, а база знань не оновлюється, система починає пропускати нові типи інцидентів; налаштуй автоматичне переіндексування нових документів раз на добу
- Немає fallback при недоступності LLM API — якщо OpenAI лежить, твій пайплайн зупиняється; завжди додавай circuit breaker і fallback на rule-based класифікацію
- Зберігання API-ключів у коді — використовуй виключно змінні середовища через .env файл і бібліотеку python-dotenv; ніколи не комітай ключі в git
💡 Поради для кращого результату
Використовуй гібридний пошук у Qdrant — комбінуй векторний пошук із BM25 (keyword search). Для технічних кодів помилок на кшталт “ERR_CONNECTION_TIMEOUT” ключовий пошук часто точніший за семантичний. У Qdrant 1.7+ це вмикається одним параметром using=”hybrid” у запиті.
Додай metadata-фільтри до векторного пошуку — при індексації зберігай разом із вектором метадані: тип обладнання, лінія виробництва, версія ПЗ. Тоді при пошуку фільтруй за device_type == “pump” — і отримуєш контекст лише для релевантного обладнання, а не весь корпус документів.
Кешуй ембединги запитів — якщо однакові або схожі події повторюються часто (що типово для виробництва), використовуй Redis із TTL 5 хвилин для кешування векторів запитів. Це зменшує витрати на OpenAI Embeddings API до 60-70%.
Логуй всі RAG-відповіді для подальшого fine-tuning — зберігай пари (запит, контекст, відповідь LLM) у базі даних. Через місяць у тебе буде датасет для дообучення власної малої моделі, яка замінить дорогий GPT-4 на специфічних задачах твого виробництва.

❓ Часті запитання (FAQ)
1. Чи можна використовувати відкриті моделі замість OpenAI?
Так, і це часто краще для виробництва через питання конфіденційності даних. Mistral 7B або Llama 3.1 8B через Ollama локально показують прийнятну якість для класифікації технічних інцидентів. Для ембедингів використовуй nomic-embed-text — безкоштовно і точніше за text-embedding-ada-002 для технічних текстів.
2. Як виміряти якість RAG системи перед деплоєм?
Використовуй фреймворк RAGAS — він автоматично оцінює faithfulness (чи відповідь відповідає контексту), answer relevancy і context recall. Запусти evaluation на тестовому наборі з 50-100 реальних інцидентів із відомими відповідями. Цільові значення: faithfulness > 0.85, answer relevancy > 0.80.
3. Що робити, якщо система видає забагато хибних спрацьовувань?
Підвищ поріг similarity score для Qdrant-пошуку з дефолтного 0.7 до 0.82-0.85 — це зменшить шум. Також додай другий LLM-крок: перший класифікує як “підозріло”, другий (більш консервативний промпт) підтверджує або відхиляє інцидент.
4. Як обробляти багатомовні логи — суміш англійської та, наприклад, польської?
Використовуй мультилінгвальну модель ембедингів — multilingual-e5-large від Microsoft або paraphrase-multilingual-mpnet-base-v2. Вони значно краще справляються зі змішаними текстами, ніж монолінгвальні OpenAI-моделі.
5. Скільки коштує утримання такої системи на місяць?
При обробці 100 000 подій на добу з фільтрацією 95% простими правилами: витрати на OpenAI API складуть приблизно $15-30/місяць. Qdrant Cloud на 1GB — безкоштовно. VPS для Kafka + Python сервісів — $20-40/місяць на Hetzner або DigitalOcean. Загалом — $35-70/місяць для середнього виробничого навантаження.
🏁 Підсумок
Ти побудував повноцінний RAG-пайплайн для виробничого середовища: від стрімінгу подій через Kafka до векторного пошуку в Qdrant, LLM-класифікації інцидентів і моніторингу якості в Grafana. Система вміє виявляти нові проблеми в реальному часі, пояснювати їх причини на основі бази знань і не галюцинує завдяки чіткому розмежуванню між знайденим контекстом і генерацією.
Починай прямо зараз з найпростішого: запусти docker compose up -d з Qdrant і Redpanda, проіндексуй 10-20 реальних документів про минулі інциденти у твоєму середовищі — і вже за годину матимеш перший прототип, який відповідає на запитання “що це за помилка і як її вирішити”.
РОЗСИЛКА
📬 Щотижневий AI-дайджест
Найкращі статті про ШІ та автоматизацію — без спаму, лише суть
Без спаму · Відписатись будь-коли

