RAG поєднує потужність LLM з ретривалом зовнішніх знань. Замість покладання лише на те, що модель вивчила під час тренування, RAG отримує релевантні документи та включає їх у промпт. Це зменшує галюцинації та дозволяє працювати з приватною або актуальною інформацією.
Де це використовується
RAG забезпечує knowledge-intensive додатки в різних галузях:
- Корпоративний пошук: Внутрішня документація, вікі, бази знань
- Підтримка клієнтів: Пошук FAQ, вирішення тікетів
- Юридична сфера: Пошук судової практики, аналіз контрактів
- Медицина: Пошук медичної літератури, клінічна підтримка рішень
- Фінанси: Аналітичні звіти, регуляторні документи, новини
- E-commerce: Інформація про товари, підсумки відгуків
Продукти: Perplexity, Bing Chat, корпоративні копілоти, асистенти документації.
Типові дані
| Аспект | Типові значення |
|---|---|
| Корпус документів | 1K-10M документів |
| Розмір чанку | 200-2,000 токенів |
| Top-K ретривал | 3-20 чанків |
| Розмірність ембедингу | 384-3,072 |
| Розмір векторного індексу | 100K-100M векторів |
Типи документів: - PDF, Word, HTML, Markdown - Структуровані дані (таблиці, CSV) - Репозиторії коду - Логи розмов - Зображення з описами (мультимодальні)
Що ви робите на практиці
- Визначте scope - На які питання система має відповідати?
- Зберіть документи - Зберіть усі релевантні джерела знань
- Чанкіть документи - Розбийте на частини для ретривалу
- Згенеруйте ембединги - Створіть векторні репрезентації
- Побудуйте індекс - Збережіть вектори в базі для пошуку
- Реалізуйте ретривал - Пайплайн запитів з реранкінгом
- Дизайн промптів - Як включати отриманий контекст
- Оцініть якість - Точність ретривалу, якість відповідей
- Обробіть помилки - Немає результатів, погані результати
- Моніторте та ітеруйте - Відстежуйте використання, покращуйте
Спочатку бейзлайн
Почніть з простого naive RAG перед оптимізацією:
# Простий RAG пайплайн
query_embedding = embed(user_query)
chunks = vector_db.search(query_embedding, top_k=5)
context = "\n\n".join(chunks)
response = llm.generate(
f"Контекст:\n{context}\n\nПитання: {user_query}\nВідповідь:"
)
Чому naive RAG як бейзлайн: - Валідує роботу data pipeline - Встановлює floor якості - Ідентифікує очевидні прогалини - Швидко реалізувати
Додавайте складність (реранкінг, query expansion, гібридний пошук) лише коли обмеження бейзлайну очевидні.
Компоненти архітектури RAG
| Компонент | Опції | Компроміси |
|---|---|---|
| Чанкінг | Фіксований розмір, семантичний, рекурсивний | Якість vs складність |
| Ембединги | OpenAI, Cohere, open-source | Якість vs вартість vs приватність |
| Vector DB | Pinecone, Weaviate, pgvector | Managed vs self-hosted |
| Ретривал | Тільки вектори, гібридний, багатоетапний | Швидкість vs точність |
| Реранкінг | Cross-encoder, Cohere, LLM | Якість vs затримка |
| Генерація | GPT-4, Claude, open-source | Якість vs вартість |
Типова архітектура:
Запит → Обробка запиту → Ретривал → Реранкінг →
Збірка контексту → LLM генерація → Пост-обробка → Відповідь
Стратегії чанкінгу
Чанкінг фіксованого розміру:
chunks = split_text(doc, chunk_size=500, overlap=50)
- Простий, передбачуваний
- Може розрізати посередині речення або концепції
Семантичний чанкінг: - Розбивка по абзацах, секціях або семантичних межах - Краще зберігає значення - Складніша реалізація
Рекурсивний чанкінг: - Почати з великих чанків, рекурсивно ділити якщо завеликі - Поважає структуру документа - Добре для різних типів документів
Чанкінг з метаданими: - Зберігати заголовки, назви документів, дати з чанками - Покращує контекст ретривалу - Дозволяє фільтрацію
Найкращі практики: - Включайте overlap (10-20%) між чанками - Тримайте розмір чанку відповідним контекстному вікну - Тестуйте різні розміри на ваших даних - Включайте метадані для фільтрації
Оцінка та метрики
Оцінка RAG вимагає вимірювання і ретривалу, і генерації:
| Метрика | Що вимірює | Як |
|---|---|---|
| Retrieval Precision | Чи релевантні отримані документи? | Людські мітки або LLM |
| Retrieval Recall | Чи отримано всі релевантні документи? | Потрібен gold set |
| MRR | Чи найкращий результат перший? | Позиція першого релевантного |
| Answer correctness | Чи правильна фінальна відповідь? | Людська або LLM оцінка |
| Answer groundedness | Чи підтримується відповідь контекстом? | Перевірка цитат |
| Faithfulness | Чи суперечить відповідь контексту? | LLM верифікація |
Фреймворк оцінки: 1. Створіть golden dataset (50-200 Q&A пар) 2. Виміряйте якість ретривалу незалежно 3. Виміряйте якість генерації з ідеальним ретривалом 4. Виміряйте end-to-end якість 5. Ідентифікуйте чи помилки в ретривалі чи генерації
Інструменти: RAGAS, TruLens, кастомні пайплайни оцінки.
Режими відмов та чеклист налагодження
- [ ] Помилки ретривалу: Релевантні документи не знайдені
- [ ] Проблеми меж чанків: Відповідь охоплює декілька чанків
- [ ] Застарілі ембединги: Індекс не оновлено новими документами
- [ ] Query-document mismatch: Формулювання користувача відрізняється від документів
- [ ] Переповнення контексту: Забагато чанків, обрізання
- [ ] Галюцинації попри контекст: LLM ігнорує отриману інформацію
- [ ] Суперечливі чанки: Різні документи говорять різне
- [ ] Відсутні метадані: Неможливо відфільтрувати до релевантної підмножини
Чеклист для продакшну
Перед деплоєм: - [ ] Чанкінг протестовано на репрезентативних документах - [ ] Якість ембедингів валідовано - [ ] Ретривал оцінено на тестових запитах - [ ] Збірка контексту обробляє edge cases - [ ] Фолбек для відсутніх результатів - [ ] Контент-фільтрація на місці
Після деплою: - [ ] Затримка ретривалу моніториться (p50, p99) - [ ] Патерни запитів аналізуються - [ ] Невдалі запити логуються та рев'юяться - [ ] Свіжість індексу підтримується - [ ] Версіонування моделі ембедингів - [ ] Регулярне семплювання якості
Масштабування: - [ ] Шардінг векторного індексу для великих корпусів - [ ] Кешування ембедингів для повторюваних чанків - [ ] Rate limiting запитів - [ ] Стратегія оновлення індексу (batch vs streaming)
Просунуті техніки
Query expansion: - Генерувати варіації запиту - Використовувати LLM для переформулювання - Покращує recall
Гібридний пошук:
# Поєднання векторного та keyword пошуку
vector_results = vector_search(query_embedding)
keyword_results = bm25_search(query_text)
merged = reciprocal_rank_fusion(vector_results, keyword_results)
Багатоетапний ретривал: 1. Швидкий векторний пошук (top 100) 2. Cross-encoder реранкінг (top 10) 3. Збірка контексту
Parent document retrieval: - Індексувати малі чанки для точності - Повертати більші батьківські чанки для контексту
Self-querying: - LLM витягує фільтри з природної мови - "Покажи контракти з 2023" → date_filter: 2023
Інструменти та стек
| Категорія | Інструменти |
|---|---|
| Векторні бази | Pinecone, Weaviate, Qdrant, Milvus, pgvector |
| Моделі ембедингів | OpenAI, Cohere, sentence-transformers |
| Реранкери | Cohere, cross-encoders, Jina |
| Фреймворки | LangChain, LlamaIndex, Haystack |
| Оцінка | RAGAS, TruLens, Promptfoo |
| Обробка документів | Unstructured, LlamaParse, PyMuPDF |
Приклад міні-кейсу
Сценарій: Юридична фірма потребує AI-асистента для пошуку судової практики та регуляцій серед 500K документів.
Підхід: 1. Обробка документів: PDF → текст з екстракцією секцій 2. Чанкінг: 400 токенів з 50 токенів overlap, зберегти заголовки 3. Ембединги: OpenAI text-embedding-3-small 4. Індекс: Pinecone з метаданими (дата, суд, тема) 5. Ретривал: Гібридний (vector + BM25), реранк top 20 → top 5 6. Генерація: GPT-4 з цитатами
Досягнуті метрики: - Retrieval precision@5: 82% - Answer correctness: 78% - Затримка p50: 1.8s, p99: 4.2s - Вартість на запит: $0.08
Ключові рішення: - Фільтрація метаданих критична для дат/юрисдикцій - Реранкінг покращив precision на 15% - Вимога цитат зменшила галюцинації - Фолбек до результатів пошуку при низькій впевненості
Пов'язані сторінки
- Індекс: ML Field Guide
- Патерни інтеграції LLM
- Системи семантичного пошуку
- Класифікація тексту в масштабі
Додаткове читання
- LlamaIndex Documentation
- Pinecone Learning Center
- RAGAS Evaluation Framework
- Building Production-Ready RAG Applications
Спробуйте наживо
Дослідіть пов'язану модель на практиці: відкрийте Vector Database Embedding Explorer і змінюйте параметри під час роботи. Усе лишається у вашому браузері.
▶ Відкрити симуляцію Vector Database Embedding Explorer