Найти в Дзене
BARS Agency

RAG (Retrieval-Augmented Generation): От наивной реализации к продвинутым архитектурам

Большие языковые модели продемонстрировали впечатляющие способности к генерации текста, но их прямое внедрение в бизнес-процессы выявило три фундаментальных ограничения. Первое — это склонность искусственного интеллекта к уверенному выдумыванию фактов, известному как галлюцинации. Второе — знания любой модели являются лишь срезом прошлого, зафиксированным на момент окончания ее обучения, что делает ее бесполезной для работы с актуальной информацией. Третий барьер, самый критичный для корпоративного использования, — это полная слепота ИИ к внутреннему контексту: частным базам знаний, финансовым отчетам, технической документации. Попытки решить эти вопросы через дообучение дороги, медленны и плохо масштабируются. Требуется иной подход, который меняет саму архитектуру взаимодействия с ИИ. Этот архитектурный паттерн — Retrieval-Augmented Generation, или RAG. Его суть заключается в том, чтобы вместо попыток заставить модель «вспоминать» информацию, дать ей возможность «читать» ее из внешнег
Оглавление

Аудио-версия статьи (в формате подкаста)

Большие языковые модели продемонстрировали впечатляющие способности к генерации текста, но их прямое внедрение в бизнес-процессы выявило три фундаментальных ограничения. Первое — это склонность искусственного интеллекта к уверенному выдумыванию фактов, известному как галлюцинации. Второе — знания любой модели являются лишь срезом прошлого, зафиксированным на момент окончания ее обучения, что делает ее бесполезной для работы с актуальной информацией. Третий барьер, самый критичный для корпоративного использования, — это полная слепота ИИ к внутреннему контексту: частным базам знаний, финансовым отчетам, технической документации. Попытки решить эти вопросы через дообучение дороги, медленны и плохо масштабируются. Требуется иной подход, который меняет саму архитектуру взаимодействия с ИИ.

Этот архитектурный паттерн — Retrieval-Augmented Generation, или RAG. Его суть заключается в том, чтобы вместо попыток заставить модель «вспоминать» информацию, дать ей возможность «читать» ее из внешнего источника. Перед генерацией ответа система сначала выполняет поиск релевантных данных в заранее подготовленной, актуальной базе. В результате ответ строится не на общих паттернах из обучающей выборки, а на конкретных, проверяемых фактах. В русскоязычной технической среде можно встретить термины «генерация, дополненная поиском» или «генерация с дополненной выборкой». Для краткости и соответствия глобальной практике в этой статье будет использоваться общепринятый акроним RAG.

Эта статья не будет повторять основы для новичков. Наша цель — пойти глубже. Мы начнем с анализа «наивной» реализации RAG, чтобы наглядно показать ее слабые места и границы применимости. После этого мы перейдем к ядру материала: детальному изучению продвинутых техник и современных архитектур, которые необходимы для построения систем производственного уровня. Мы разберем гибридный поиск, стратегии переранжирования, модульные RAG-системы с агентами и, что критически важно, коснемся методов объективной оценки качества всего пайплайна.

Анатомия классического («наивного») RAG-пайплайна

-2

Чтобы понять ограничения RAG, нужно сначала разобрать его базовую конструкцию. Весь процесс делится на два неравнозначных этапа. Первый — это офлайн-индексация, фоновая и вычислительно затратная операция по подготовке корпуса знаний. Второй — это работа в реальном времени, где система обрабатывает запрос пользователя для генерации ответа.

Процесс индексации — это фундамент для работы ИИ. Он начинается с загрузки данных. Современные фреймворки предоставляют готовые загрузчики (Loaders) практически для любых источников: от папки с PDF-файлами и документами Word до целых баз из Notion или Confluence. После загрузки сырые документы необходимо подготовить. Подавать на вход модели целые файлы бессмысленно из-за лимитов контекстного окна и распыления полезной информации. Здесь вступает в игру процесс разбиения на чанки (Splitting или Chunking). Самая примитивная стратегия — нарезка текста на фрагменты фиксированного размера, например, по 1000 символов. Такой подход быстр, но часто разрывает предложения и логические блоки, создавая семантический шум. Более осмысленной является стратегия рекурсивного разделения, которая пытается найти естественные границы: сначала по абзацам, потом по предложениям, и только потом по словам. Существует и семантическое чанкование, которое использует эмбеддинги для группировки предложений в чанки по смысловой близости, но требует больших вычислительных ресурсов на этапе индексации.

Когда корпус знаний разбит на управляемые фрагменты, каждый чанк необходимо векторизовать. Эту задачу выполняют специализированные модели-эмбеддеры, такие как Sentence-Transformers из экосистемы Hugging Face или коммерческие API вроде OpenAI text-embedding-ada-002. Они преобразуют каждый текстовый фрагмент в числовой вектор — многомерное представление его семантического значения. Полученные векторы сохраняются в специализированной векторной базе данных. Для локальных экспериментов и прототипов может быть достаточно библиотеки FAISS, работающей в оперативной памяти. В производственных системах применяют масштабируемые облачные решения, например, Pinecone, Weaviate или ChromaDB, которые обеспечивают быстрый и эффективный поиск по миллиардам векторов.

Второй этап, поиск и генерация, активируется при каждом запросе пользователя. Сначала запрос проходит через ту же модель-эмбеддер, что использовалась при индексации, и преобразуется в вектор. Затем этот вектор запроса используется для поиска в векторной базе. Система вычисляет семантическую близость (чаще всего через косинусное сходство или скалярное произведение) между вектором запроса и векторами всех чанков, возвращая N наиболее близких фрагментов. Эти найденные чанки текста вставляются в начало промпта, прямо перед исходным вопросом пользователя. Получившийся расширенный промпт отправляется большой языковой модели. Теперь у ИИ есть и задача (вопрос), и необходимый контекст для ее выполнения. На основе этих данных искусственный интеллект формирует окончательный ответ, который опирается на фактический материал из вашей базы знаний.

Болевые точки: Почему «наивный» RAG — это только начало?

-3

Описанный выше классический пайплайн выглядит логично и на простых примерах работает удовлетворительно. Но при переходе к реальным задачам и неоднородным базам знаний его хрупкость становится очевидной. Стандартная архитектура ломается в нескольких ключевых точках, что делает ее непригодной для производственного использования без существенных доработок.

Первая и самая частая проблема — низкая точность поиска (Low Precision). Векторный поиск находит семантически близкие, но не всегда релевантные фрагменты. Например, на запрос «стоимость внедрения нового ПО» система может вернуть чанк, где подробно описывается «процесс разработки», потому что слова «внедрение» и «разработка» семантически близки. В итоге LLM получает на вход «шумный» контекст, который сбивает ее с толку и ведет к неверным или уклончивым ответам.

Обратная ситуация — низкая полнота поиска (Low Recall). Нужная информация есть в базе знаний, но система не может ее найти. Это происходит, когда запрос пользователя сформулирован слишком общо или использует синонимы, которые модель-эмбеддер не смогла сопоставить с текстом в документах. Пользователь спрашивает «как сбросить пароль?», а в инструкции используется формулировка «процедура восстановления учетных данных». Наивный RAG не найдет этот фрагмент, и AI либо сообщит об отсутствии информации, либо начнет галлюцинировать.

Третья болевая точка — конфликтующая информация. Базы знаний редко бывают идеальными. Они могут содержать старые и новые версии одного и того же документа, например, инструкции по безопасности за 2023 и 2024 годы. Поиск по запросу «правила использования оборудования» с равной вероятностью может извлечь фрагменты из обеих версий. Базовый RAG просто передаст оба противоречащих друг другу чанка в промпт, оставляя LLM разбираться с этим конфликтом без каких-либо указаний.

Даже если релевантные чанки найдены, их эффективность снижается из-за феномена «потери в середине» (Lost in the Middle). Исследования показывают, что языковые модели уделяют больше внимания информации, расположенной в самом начале и в самом конце предоставленного контекста. Если ключевой факт находится в четвертом или пятом чанке из десяти, вероятность того, что искусственный интеллект его проигнорирует, значительно возрастает.

Наконец, классическая схема не справляется со сложными запросами. Она хорошо выполняет задачи по извлечению одного факта, но пасует перед вопросами, требующими синтеза информации из нескольких источников или сравнения. Запрос «Сравни основные преимущества нашего продукта с продуктом конкурента X, используя внутренние аналитические записки» ставит наивный RAG в тупик. Он может найти фрагменты по обоим продуктам, но у него нет механизма для их осмысленного сопоставления. Эти фундаментальные недостатки требуют перехода к более сложным и многоступенчатым архитектурам.

Advanced RAG: Модернизация конвейера

-4

Решение проблем наивного RAG требует многогранного подхода, который усиливает каждый узел конвейера: до, во время и после основного поиска. Эти продвинутые техники не являются взаимоисключающими; напротив, их комбинация формирует архитектуру современных и эффективных RAG-систем. Они превращают хрупкий прототип в инструмент, способный работать с реальными, неоднородными данными.

1. Техники до поиска (Pre-Retrieval)

Качество всего RAG-пайплайна напрямую зависит от качества первоначального поискового запроса. Вместо того чтобы слепо передавать ввод пользователя в систему, его можно и нужно интеллектуально обработать для максимизации шансов на успех.

Основной метод в этой категории — Query Expansion, или расширение запроса. Он напрямую атакует проблему низкой полноты (Low Recall), возникающую из-за несовпадения терминологии. Процесс прост и эффективен: исходный запрос пользователя «Как оформить служебный автомобиль?» передается быстрой LLM с инструкцией «Сгенерируй 3-4 альтернативных запроса, которые спрашивают о том же, но используют другую лексику». Модель может выдать варианты вроде: «Какова политика компании по корпоративному транспорту?», «Процедура запроса автомобиля из парка компании» и «Критерии для получения сотрудником машины». Затем система выполняет поиск не по одному, а сразу по всем четырем запросам, агрегируя результаты. Это кратно повышает вероятность найти нужный документ, даже если в нем используется специфическая корпоративная терминология.

Более сложный подход — Query Transformation, где запрос не просто дополняется, а структурно изменяется. Одна из мощных техник здесь — HyDE (Hypothetical Document Embeddings). Вместо того чтобы создавать вектор из короткого вопроса пользователя, система сначала просит LLM сгенерировать гипотетический, идеализированный ответ на этот вопрос. Например, на запрос «причины сбоя модуля аутентификации» ИИ может сгенерировать правдоподобный, но вымышленный ответ: «Сбой модуля аутентификации может быть вызван истекшим сроком действия SSL-сертификата, неверными учетными данными для подключения к базе данных или превышением лимита подключений». Затем система создает эмбеддинг именно этого гипотетического ответа и использует его для поиска. Логика в том, что такой детальный, хоть и выдуманный, текст семантически гораздо ближе к реальному документу с решением, чем исходный короткий вопрос.

Другая техника, «Step-back prompting», заставляет модель сделать «шаг назад» от специфичного запроса к более общему. На вопрос «Какой инженер отвечал за тестирование безопасности компонента X в релизе 2.5?» прямой поиск может провалиться. Step-back запрос будет звучать как «Какие отчеты о тестировании безопасности существуют для релиза 2.5?». Система найдет общий отчет, а уже внутри него финальная LLM легко извлечет конкретное имя инженера.

2. Техники поиска (Retrieval)

Опора исключительно на векторный поиск — это ограничение, которое необходимо преодолеть. Сегодня индустриальным стандартом стал Hybrid Search (гибридный поиск), который объединяет сильные стороны семантического и лексического поиска. Семантический поиск, основанный на векторах, улавливает смысл и контекст. Лексический поиск, ярким представителем которого является алгоритм BM25, обеспечивает точность, находя документы с точными совпадениями специфических терминов: артикулов, кодов ошибок, нестандартных аббревиатур или фамилий. На запрос «инструкция по устранению ошибки A-1138» векторный поиск может найти общие документы о сбоях, но именно BM25 гарантированно найдет документ, где упоминается код «A-1138».

Для объединения результатов из двух этих миров используется специальный алгоритм слияния, например, Reciprocal Rank Fusion (RRF). Он комбинирует ранжированные списки от обоих поисковиков, отдавая предпочтение документам, которые стабильно появляются в топе обоих списков, что обеспечивает высокую релевантность без сложной настройки весовых коэффициентов.

3. Техники после поиска (Post-Retrieval)

Этап, который следует за извлечением информации, критически важен для очистки сигнала от шума перед его передачей финальной генеративной модели.

Первый и обязательный шаг — Re-ranking (переранжирование). Первичный гибридный поиск часто настроен на максимальную полноту, поэтому он может вернуть избыточное количество кандидатов — 20, 50 или даже 100 чанков. Подавать их все в LLM — дорого и контрпродуктивно. Здесь в игру вступает другая, более точная модель — кросс-энкодер (cross-encoder). В отличие от стандартных эмбеддеров (bi-encoders), которые создают векторы для запроса и документа по отдельности, кросс-энкодер получает на вход пару «(запрос, документ)» и проводит глубокий совместный анализ их содержимого. Это вычислительно дороже, поэтому его применяют только к ограниченному числу лучших кандидатов от первичного поиска. Он переоценивает релевантность каждого из 50 чанков и отбирает из них 3-5 самых лучших, отсеивая остальные.

Даже после переранжирования отобранные чанки могут быть «загрязнены» лишней информацией. Если ответ на вопрос занимает одно предложение в абзаце на 500 слов, нет смысла передавать весь абзац. Для решения этой проблемы используется Context Compression (сжатие контекста). Этот процесс итеративно проходит по топ-3 или топ-5 чанкам и для каждого из них делает еще один вызов LLM с простой задачей: «Прочитай этот фрагмент и извлеки из него только те предложения, которые напрямую отвечают на вопрос пользователя: ‘[исходный вопрос]’». В результате из нескольких объемных чанков формируется короткая, концентрированная выжимка релевантных фактов. Этот сжатый контекст, лишенный информационного балласта, и передается в промпт основной, самой мощной и дорогой LLM. Такой подход не только драматически повышает точность финального ответа, но и значительно снижает операционные расходы на использование токенов.

Модульный подход и RAG-агенты

-5

Продвинутые техники, описанные ранее, значительно улучшают линейный RAG-пайплайн, но не меняют его фундаментальной природы — это все еще жесткий конвейер. Каждый запрос пользователя проходит через одни и те же стадии, независимо от его содержания. Такой подход неэффективен. Парадигма модульного RAG с использованием AI-агентов предлагает сдвиг от жесткой последовательности к гибкой, управляемой разумом системе.

В основе этой архитектуры лежит специальный компонент — RAG-Router или агент. Это еще одна, обычно легковесная, языковая модель, которая выступает в роли интеллектуального диспетчера. Ее задача не отвечать на вопрос, а на первом шаге проанализировать его и принять решение, по какому пути направить обработку. Это добавляет в систему слой рассуждений, который отсутствовал ранее. У агента есть несколько вариантов действий:

  • Вариант 1: Прямой ответ из собственных знаний. Если пользователь задает общий вопрос, не требующий обращения к специфической базе данных (например, «Объясни принцип работы фотосинтеза» или «Кто написал «Войну и мир»?»), запускать весь дорогостоящий RAG-процесс бессмысленно. Агент распознает такой тип запроса и передает его напрямую основной LLM для генерации ответа на основе ее параметрических знаний.
  • Вариант 2: Использование стандартного RAG-поиска. Когда запрос явно относится к внутренней базе знаний («Какие KPI у отдела продаж в этом квартале?» или «Найди инструкцию по работе с CRM»), роутер идентифицирует его как требующий извлечения данных. Он активирует описанный в предыдущем разделе продвинутый RAG-пайплайн (с гибридным поиском, переранжированием и сжатием) для поиска релевантного контекста и генерации ответа.
  • Вариант 3: Использование нескольких инструментов (Multi-tool). Это самый мощный сценарий, который превращает RAG-систему в настоящего цифрового ассистента. Агент получает доступ к набору «инструментов» — API-функций, которые он может вызывать. Это может быть RAG-поиск, поисковый запрос в интернете, обращение к SQL-базе данных, вызов калькулятора или даже запуск скрипта. Агент самостоятельно составляет план из нескольких шагов для ответа на сложный, многосоставный вопрос.

Рассмотрим практический пример, который наглядно демонстрирует работу такого агента. Пользователь задает вопрос:

«Сравни последнюю квартальную выручку компании Apple с нашей выручкой из внутреннего отчета за Q3».

Наивный RAG здесь бессилен. Но модульный агент-роутер разбивает задачу на логические шаги:

  1. Рассуждение агента: «Для ответа мне нужны два числовых значения из разных источников: публичные данные Apple и внутренние данные нашей компании».
  2. Шаг 1: Вызов инструмента. Агент выбирает инструмент web_search для получения публичной информации. Он выполняет вызов: web_search(query=’Apple latest quarterly revenue’).
  3. Шаг 2: Вызов другого инструмента. Для получения внутренних данных агент обращается к RAG-пайплайну. Он выполняет вызов: RAG_retriever(query=’our revenue from Q3 report’).
  4. Шаг 3: Синтез ответа. Собрав всю необходимую информацию из обоих источников, агент передает ее вместе с исходным запросом финальной LLM для генерации сравнительного анализа.

Такой модульный подход позволяет искусственному интеллекту не просто извлекать факты, а выполнять сложные аналитические задачи, комбинируя информацию из совершенно разных сред. Это переход от простого ответа на вопросы к динамическому решению проблем.

Оценка качества: Как понять, что ваш RAG работает?

-6

Создать сложный RAG-пайплайн — это лишь половина дела. Без системы измерения его эффективности любые дальнейшие улучшения превращаются в блуждание в темноте. Теория и практика разработки AI-систем показывают, что невозможно улучшить то, что невозможно измерить. Поэтому оценка качества — это не опциональный шаг, а фундаментальная часть жизненного цикла RAG-приложения.

Проблема оценки настолько распространена, что для ее решения возникли специализированные опенсорсные фреймворки. Индустриальными стандартами де-факто стали такие инструменты, как RAGAS (RAG Assessment), TruLens и ARES. Они предоставляют набор готовых метрик, которые используют другие языковые модели в роли «оценщиков» для анализа ответов вашей системы. Наиболее показательным для разбора является фреймворк RAGAS, который предлагает четыре ключевые метрики для всестороннего анализа качества.

  1. Faithfulness (Верность фактам). Она напрямую борется с галлюцинациями. LLM-оценщик получает сгенерированный вашей системой ответ и тот контекст, который был для этого использован. Его задача — проверить, не содержит ли ответ информации, которой не было в предоставленных фрагментах. Если искусственный интеллект в ответе упоминает факт, не подкрепленный найденными документами, метрика Faithfulness падает. Это самый базовый sanity-check системы.
  2. Answer Relevancy (Релевантность ответа). Она оценивает, насколько сгенерированный ответ соответствует исходному вопросу пользователя. При вычислении этой метрики LLM-оценщик смотрит только на пару «вопрос-ответ», сознательно игнорируя найденный контекст. Это позволяет понять, не ушел ли ИИ от темы, не ответил ли он на какой-то другой, более простой вопрос, или не оказался ли найденный контекст настолько «шумным», что сбил модель с толку.
  3. Context Precision (Точность контекста) анализирует, насколько релевантны найденные чанки. Оценщик проверяет каждый извлеченный фрагмент и определяет, действительно ли он нужен для ответа на вопрос. Если из пяти найденных чанков только два содержат полезную информацию, а остальные три — семантически близкий «мусор», Context Precision будет низкой. Это главный индикатор качества работы ретривера и ре-ранкера.
  4. Context Recall (Полнота контекста) — самая сложная для измерения метрика. Она пытается ответить на вопрос: смогла ли система найти все релевантные фрагменты информации из базы знаний, которые были необходимы для полного ответа? Низкая полнота означает, что поисковик упустил что-то важное. Для автоматического вычисления этой метрики требуется предварительная работа.

Основой для автоматизированного и воспроизводимого тестирования является создание «золотого» датасета. Это эталонный набор данных, который создается вручную экспертами. Каждый элемент этого датасета представляет собой тройку: (вопрос, идеальный_ответ, эталонный_контекст). Эксперты формулируют типичные вопросы к базе знаний, вручную находят все необходимые для ответа фрагменты (эталонный контекст) и пишут на их основе идеальный ответ. Этот датасет становится бенчмарком. При любом изменении в RAG-системе — замене эмбеддера, настройке чанкинга или добавлении ре-ранкера — вы прогоняете через нее этот датасет и автоматически рассчитываете метрики. Такой подход позволяет в цифрах увидеть, привело ли ваше изменение к улучшению или регрессии, и превращает процесс настройки RAG из искусства в инженерную дисциплину.

Подводим итоги

-7

Рассмотрение Retrieval-Augmented Generation провело нас от базовой, «наивной» реализации до сложных, многоступенчатых архитектур. Мы разобрали классический пайплайн, выявили его фундаментальные уязвимости и изучили арсенал продвинутых техник для их устранения: от трансформации запросов и гибридного поиска до переранжирования и сжатия контекста. Внедрение модульных агентов показало сдвиг парадигмы к гибким, рассуждающим системам, а обзор фреймворков оценки подчеркнул необходимость инженерного подхода к измерению качества.

Ключевое понимание, которое следует из этого анализа, заключается в том, что RAG — это не готовый продукт, который можно просто «включить», а скорее гибкий фреймворк или конструктор. Не существует универсальной конфигурации, которая будет одинаково хорошо работать для всех задач и баз знаний. Выбор стратегии чанкинга, модели-эмбеддера, методов поиска и постобработки напрямую зависит от специфики данных и ожидаемых сценариев использования. Эффективная RAG-система является результатом постоянных итераций, экспериментов и, что самое важное, непрерывного измерения метрик качества.

Вектор развития RAG указывает на создание еще более автономных и интеллектуальных систем. Будущее этой технологии лежит в самокорректирующихся пайплайнах — системах, способных на лету анализировать качество своего поиска по внутренним метрикам и автоматически менять стратегию, например, переключаясь с простого поиска на Query Expansion при обнаружении низкой полноты. Мы увидим более тесную интеграцию с файнтюнингом: дообученные под конкретный домен модели будут работать в связке с RAG-агентами, где файнтюнинг отвечает за понимание сложного языка и правильный стиль, а RAG — за поставку актуальных фактов. ИИ перестает быть просто генератором, он становится ядром динамической системы, способной к поиску, анализу и синтезу информации в реальном времени.