Корпоративні команди щодня тонуть у сотнях PDF-звітів, внутрішніх регламентів і контрактів — знайти потрібну інформацію вручну займає години. RAG (Retrieval-Augmented Generation) вирішує цю проблему: система сама знаходить релевантні фрагменти документів і генерує точні відповіді на запити. Цей туторіал покаже, як побудувати повноцінний корпоративний RAG-пайплайн з нуля приблизно за 3-4 години. Вам знадобляться базові знання Python і доступ до термінала.
🛠️ Що знадобиться
- Python 3.11+ — основна мова для написання пайплайну; безкоштовний, завантажити з python.org
- LangChain 0.3+ — фреймворк для побудови RAG-ланцюжків; безкоштовний (pip install langchain)
- ChromaDB — локальна векторна база даних для зберігання ембедингів документів; безкоштовний (pip install chromadb)
- OpenAI API або Ollama — LLM для генерації відповідей; OpenAI платний (~$0.01 на тисячу токенів), Ollama безкоштовний і локальний
- Unstructured.io — бібліотека для парсингу PDF, DOCX, XLSX; є безкоштовний tier (pip install unstructured)
- FastAPI — для розгортання REST API поверх системи; безкоштовний (pip install fastapi uvicorn)
📋 Покрокова інструкція
Крок 1: Налаштування середовища та структури проєкту
Відкрий термінал і створи папку проєкту командою mkdir corporate-rag && cd corporate-rag. Далі створи віртуальне середовище: python -m venv venv, активуй його командою source venv/bin/activate (на Windows: venv\Scripts\activate). Встанови всі залежності однією командою: pip install langchain langchain-openai langchain-community chromadb unstructured fastapi uvicorn python-dotenv tiktoken. Створи файл .env у корені проєкту і додай туди рядок OPENAI_API_KEY=sk-твій-ключ — ключ береш у dashboard.openai.com у розділі API Keys → Create new secret key.

Крок 2: Побудова модуля завантаження та розбиття документів
Створи файл ingestion.py. Спочатку імпортуй потрібні модулі та напиши функцію завантаження документів — вона має підтримувати PDF, DOCX і TXT одночасно. Використай DirectoryLoader з LangChain: вкажи шлях до папки ./documents і glob-патерн "**/*", щоб підхопити всі формати рекурсивно. Після завантаження застосуй RecursiveCharacterTextSplitter з параметрами chunk_size=1000 і chunk_overlap=200 — перекриття в 200 символів критично важливе, бо без нього контекст на межі чанків обривається і відповіді стають неточними. Додай до кожного чанку метадані: ім’я файлу, дату завантаження і відділ — це дозволить потім фільтрувати пошук за джерелом.
Крок 3: Створення векторної бази та індексування документів
Створи файл vectorstore.py. Ініціалізуй ембединг-модель командою embeddings = OpenAIEmbeddings(model="text-embedding-3-small") — ця модель коштує у 5 разів дешевше за попередню версію при схожій якості. Створи ChromaDB-колекцію: vectorstore = Chroma(persist_directory="./chroma_db", embedding_function=embeddings, collection_name="corporate_docs"). Щоб додати документи, виклич vectorstore.add_documents(chunks) — для 500-сторінкового корпусу це займе 2-3 хвилини. Після індексування виклич vectorstore.persist() щоб зберегти базу на диск — інакше після перезапуску доведеться індексувати знову. Перевір результат командою print(vectorstore._collection.count()) — має вивестись кількість збережених чанків.
Крок 4: Побудова RAG-ланцюжка з фільтрацією та ранжуванням
Створи файл rag_chain.py — це серце всієї системи. Налаштуй ретривер з параметром search_type="mmr" (Maximal Marginal Relevance) замість звичайного similarity-пошуку: це зменшує дублювання в результатах і підвищує різноманітність контексту. Встанови k=6 і fetch_k=20 — система спочатку знайде 20 кандидатів, потім відбере 6 найрелевантніших і несхожих між собою. Напиши системний промпт, який чітко обмежує модель: “Відповідай виключно на основі наданого контексту. Якщо відповіді немає в документах — скажи про це прямо, не вигадуй.” Використай RetrievalQAWithSourcesChain замість базового RetrievalQA — він автоматично додає до відповіді посилання на джерела, що критично для корпоративного середовища де потрібна аудит-трасабельність.
Крок 5: Розгортання API та тестування системи
Створи файл main.py з FastAPI-додатком. Додай два ендпоінти: POST /ingest для завантаження нових документів і POST /query для запитів до системи. У /query прийми JSON з полями question і опціональним department_filter — це дозволить відділу HR бачити тільки свої документи. Запусти сервер командою uvicorn main:app --host 0.0.0.0 --port 8000 --reload. Протестуй через термінал: curl -X POST http://localhost:8000/query -H "Content-Type: application/json" -d '{"question": "Яка процедура відпустки для нових співробітників?"}' — у відповіді маєш отримати JSON з полями answer і sources де будуть назви конкретних файлів-джерел. Якщо все працює — система готова до тестування з реальними документами вашої компанії.
⚠️ Типові помилки та як їх уникнути
- Занадто великий або малий chunk_size — чанки по 200 символів втрачають контекст, по 3000 перевищують ліміт контекстного вікна. Оптимум для більшості корпоративних документів — 800-1200 символів; тестуй на 20-30 запитах перед повним запуском
- Відсутність overlap між чанками — якщо встановити
chunk_overlap=0, відповіді на питання про інформацію на межі сторінок будуть обривистими. Завжди встановлюй overlap на рівні 15-20% від chunk_size - Ігнорування якості парсингу PDF — сканований PDF без OCR дає порожні рядки замість тексту. Перевір вивід парсера командою
print(docs[0].page_content[:500])одразу після завантаження — якщо бачиш суцільні пробіли, підключиpytesseractдля OCR - Зберігання API-ключів у коді — ніколи не хардкодь
OPENAI_API_KEYпрямо у Python-файлах. Використовуйpython-dotenvі додай.envдо.gitignoreперед першим комітом
💡 Поради для кращого результату
По-перше, використовуй гібридний пошук: поєднай векторний similarity-пошук з BM25 keyword-пошуком через EnsembleRetriever — це підвищує точність на 15-25% для документів з великою кількістю специфічних термінів, абревіатур і числових даних, які погано ловляться ембедингами. По-друге, додай re-ranking через Cohere Rerank API (є безкоштовний tier на 1000 запитів на місяць) — після первинного пошуку він переранжовує знайдені чанки за точнішими критеріями і суттєво покращує якість топ-результатів. По-третє, логуй кожен запит і оцінку користувача в окрему SQLite-базу: через місяць у тебе буде датасет для fine-tuning або оцінки якості системи через RAGAS-метрики. По-четверте, налаштуй автоматичне перевиндексування через watchdog-бібліотеку — вона відстежує зміни у папці documents і автоматично додає нові файли до ChromaDB без ручного запуску скриптів.
❓ Часті запитання (FAQ)
1. Чи можна запустити систему повністю локально без OpenAI?
Так, замість OpenAI використай Ollama з моделлю llama3.2 або mistral-nemo. Встанови Ollama з ollama.ai, виклич ollama pull llama3.2 і заміни ініціалізацію LLM на ChatOllama(model="llama3.2"), а ембединги на OllamaEmbeddings(model="nomic-embed-text"). Якість дещо нижча за GPT-4o, але для більшості корпоративних завдань цілком достатня.

2. Скільки документів може обробити система?
ChromaDB локально стабільно тримає до 1-2 мільйонів чанків — це приблизно 50 000-100 000 сторінок документів. Якщо корпус більший, переходь на Qdrant або Weaviate з хмарним розгортанням: вони горизонтально масштабуються і мають вбудовану реплікацію.
3. Як обмежити доступ різних відділів до своїх документів?
Використовуй metadata-фільтри в ChromaDB: при індексуванні додавай до кожного документа поле {"department": "hr"}, а при пошуку передавай filter={"department": {"$eq": current_user.department}}. Це набагато ефективніше ніж створювати окремі колекції для кожного відділу.
4. Як виміряти якість роботи RAG-системи?
Встанови бібліотеку RAGAS командою pip install ragas і виміряй чотири ключові метрики: faithfulness (чи відповідь відповідає контексту), answer_relevancy (чи відповідь на питання), context_precision і context_recall. Цільові значення для продакшн-системи — вище 0.8 по кожній метриці.
5. Що робити якщо система дає неправильні відповіді?
Спочатку перевір чи правильно індексовані документи — виклич vectorstore.similarity_search("твій запит", k=3) і подивись чи релевантні чанки повертаються. Якщо чанки правильні але відповідь неточна — проблема в промпті, посили обмеження через системне повідомлення. Якщо чанки нерелевантні — зменш chunk_size або додай BM25 гібридний пошук.
🏁 Підсумок
Ти побудував повноцінну корпоративну RAG-систему: від автоматичного парсингу документів через векторне індексування до REST API з фільтрацією за відділами і посиланнями на джерела. Система готова обробляти тисячі сторінок внутрішньої документації і відповідати на запити співробітників за секунди замість годин пошуку вручну.
Почни прямо зараз з найпростішого: встанови залежності, поклади 5-10 PDF зі своєї роботи у папку documents і запусти індексування. Перший працюючий результат ти побачиш вже за 30 хвилин — і це найкращий спосіб зрозуміти де саме вашій команді потрібне додаткове налаштування.
РОЗСИЛКА
📬 Щотижневий AI-дайджест
Найкращі статті про ШІ та автоматизацію — без спаму, лише суть
Без спаму · Відписатись будь-коли

