Архитектура RAG и пайплайн обработки данных
Архитектура RAG и пайплайн обработки данных
Представьте, что вы внедрили самую мощную LLM в корпоративный портал. Пользователь спрашивает: «Как оформить отпуск по новым правилам от 15 октября?». Модель уверенно, красивым языком выдает инструкцию. Проблема в одном: она выдумала эту инструкцию, опираясь на общие знания из интернета трёхлетней давности.
Большие языковые модели (LLM) обладают прекрасными навыками синтеза речи, но у них есть два фундаментальных недостатка: знания заморожены на момент окончания обучения, и они склонны к галлюцинациям, когда не знают точного ответа.
Переобучать (Fine-tuning) модель каждый раз, когда в компании выходит новый приказ — невероятно дорого, долго и не гарантирует, что модель не перепутает факты. Индустриальным стандартом решения этой проблемы стала архитектура RAG.
RAG (Retrieval-Augmented Generation) — это архитектурный паттерн, который разделяет базу знаний и языковые навыки. Вместо того чтобы полагаться на внутреннюю память модели, система сначала ищет релевантную информацию во внешней базе данных, а затем передает её LLM для генерации ответа.
Для инженера GenOps понимание RAG — это абсолютный базис. На собеседованиях редко просят написать RAG с нуля, но всегда спрашивают, как его масштабировать, оптимизировать и почему пайплайн работает не так, как ожидалось.
Чтобы разобраться в этом, мы разделим RAG на две независимые фазы: Offline (подготовка данных) и Online (обслуживание запроса).
Offline-пайплайн: Подготовка базы знаний
LLM не умеет читать базу данных напрямую. Чтобы система могла быстро находить нужные абзацы среди миллионов документов, текст нужно превратить в математические векторы. Этот процесс происходит асинхронно, до того как пользователь задаст свой вопрос.
Пайплайн подготовки состоит из трех шагов: Ingestion, Chunking и Embedding.
1. Ingestion (Сбор и очистка)
Документы в реальном мире грязные: это PDF с колонтитулами, HTML с тегами, логи в JSON. На этом этапе мы извлекаем сырой текст. Если в базу попадет мусор (например, меню навигации сайта), он испортит качество поиска.
2. Chunking (Разбиение на фрагменты)
Мы не можем скормить LLM книгу целиком — у моделей есть лимит контекстного окна (Context Window). Кроме того, если искать по целым книгам, мы найдем книгу, но не конкретный ответ в ней.
Поэтому текст разбивают на чанки (chunks) — небольшие фрагменты.
При нарезке текста возникают два ключевых параметра:
chunk_size— размер фрагмента (например, 500 токенов).chunk_overlap— перекрытие между соседними чанками (например, 50 токенов). Перекрытие нужно, чтобы не разорвать смысл, если конец одного предложения оказался в первом чанке, а его продолжение — во втором.
3. Embedding (Векторизация)
Каждый чанк текста пропускается через специальную модель (Embedding Model), которая превращает текст в массив чисел с плавающей точкой — вектор.
Суть эмбеддинга в том, что он кодирует семантический смысл текста. В многомерном пространстве векторы текстов с похожим смыслом будут находиться рядом, даже если в них нет общих слов.
Полученные векторы вместе с исходным текстом чанка и метаданными (автор, дата, ссылка на оригинал) сохраняются в Векторную базу данных (Vector DB). На этом Offline-фаза завершена.
Online-пайплайн: От запроса до ответа
Теперь система готова к работе с пользователями. Когда поступает запрос, запускается синхронный Online-пайплайн.
1. Векторизация запроса
Пользователь пишет: «Как оформить отпуск?». Этот текст передается в ту же самую Embedding-модель, которая использовалась в Offline-фазе. Запрос превращается в вектор.
2. Retrieval (Поиск)
Вектор запроса отправляется в Векторную БД. База вычисляет математическое расстояние между вектором запроса и всеми векторами чанков. Чаще всего для этого используется косинусное сходство (Cosine Similarity).
Где:
- — вектор запроса пользователя.
- — вектор чанка из базы данных.
- — угол между этими векторами в многомерном пространстве. Чем меньше угол, тем ближе смысл текстов, и тем ближе значение косинуса к единице.
База возвращает топ-K (например, 5) самых похожих чанков. Это и есть наш найденный контекст.
3. Prompting (Сборка промпта)
Мы берем найденные тексты и вставляем их в заранее заготовленный шаблон (Prompt Template).
Ты — корпоративный ассистент. Ответь на вопрос пользователя,
используя ТОЛЬКО предоставленный контекст. Если ответа в контексте нет,
скажи "Я не знаю".
КОНТЕКСТ:
[Сюда вставляются найденные чанки из базы]
ВОПРОС ПОЛЬЗОВАТЕЛЯ:
Как оформить отпуск?
4. Generation (Генерация ответа)
Собранный промпт отправляется в LLM. Модель читает правила оформления отпуска из предоставленного контекста и формулирует красивый, связный ответ. Так как она опирается на факты, которые мы ей дали, риск галлюцинаций снижается до минимума.
Главный вызов для GenOps
На собеседовании в ДАДМ от вас будут ждать понимания, что RAG — это не просто «вызвать API OpenAI». Это сложная распределенная система.
Вам предстоит управлять жизненным циклом данных: что делать, если документ удалили из базы? Как обновить эмбеддинги, если мы решили сменить модель векторизации? Как обеспечить отказоустойчивость векторной базы и как оптимизировать задержку (latency) при обращении к LLM?
Архитектура RAG — это фундамент. В следующих статьях мы углубимся в то, как именно работают векторные хранилища и как оптимизировать инференс моделей, чтобы пайплайн выдерживал продакшен-нагрузки.