Назад
296

RAG, или лучший друг достоверных генеративных ответов

296

Введение

Рисунок 1. Ответ известной большой языковой модели — DeepSeek

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

Тем не менее, у таких моделей есть один существенный недостаток — их знания ограничены данными, на которых они обучались, и часто они не успевают включить в себя свежую, доменную или специализированную информацию. Представьте ситуацию: ваша LLM обучалась на данных, собранных до 2021-го года. Если вы в 2025-ом попросите её назвать курс доллара — вы скорее обрадуетесь выданному значению, но пользы получите от него довольно мало.

Именно здесь на сцену выходит Retrieval Augmented Generation, или RAG. Основная идея подхода — интеграция механизмов поиска и извлечения информации с помощью генерации. Чтобы не полагаться только на обученную модель, система обращается к внешним источникам (базам знаний, архивам, интернету) для получения дополнительного контекста, который затем используется для формирования финального ответа.

Таким образом, RAG объединяет два ключевых момента:

  1. Генеративную способность LLM создавать текст на основе паттернов, усвоенных из огромного объёма данных.
  2. Механизм retrieval — поиск актуальной информации из внешних источников, который позволяет модели оперировать свежими и специализированными знаниями.
Рисунок 2. Типичная RAG-схема, состоящая из поиска и генератора

Такой гибридный подход имеет три важных преимущества:

  • актуальность и точность — механизм поиска позволяет оперативно включать в ответ последние данные, корректируя устаревшие знания модели;
  • специализация: система может обращаться к нишевым источникам информации, обеспечивая ответы в областях с глубокой экспертизой, где данные LLM могут быть недостаточно полными;
  • доказуемость и прозрачность: при помощи retrieval можно отследить, на основании каких источников была сформирована конечная генерация — это особенно важно, когда требуется высокая степень доверия к ответу (например, в медицине или праве).
Рисунок 3. А с релевантным документом ответ уже гораздо лучше!

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

Кто такой «хороший RAG»

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

  1. Актуальность и достоверность. Ответ должен включать только свежую информацию, а всё, что в генеративном ответе можно назвать фактами, должно быть взято строго из выбранных ретривером документов (позволять модели выдавать информацию из своих весов — прямой путь к неточностям и галлюцинациям).
  2. Релевантность. Ответ, основанный на внешних документах, должен точно соответствовать поставленному вопросу, а если в документах его нет — модель должна честно в этом признаваться. Пользователи оценят честность гораздо больше, чем галлюцинации, которые введут их в заблуждение.
  3. Полнота. Ответ должен охватывать все ключевые аспекты запроса, не оставляя значимых пробелов в информации. В идеале вашей модели нужно понимать по запросу, какую именно проблему пытается решить пользователь (спойлер: это далеко не всегда можно понять, но иногда возможно догадаться с большой вероятностью), и своим ответом эту проблему решать. Ответ, конечно, должен быть полезным 🙂
  4. Грамотность и «плавность». Каким бы полезным ваш ответ ни был, мало кто захочет его читать, если он выглядит неестественным, с сомнительными грамматическими конструкциями, странными переходами или просто неграмотно. Благо, эти проблемы часто решаются уже на уровне хорошей претрейн-модели. Также отметим, что «плавность» ответа влияет на поддержку стиля, общего для всех ответов вашей системы.
  5. Интерпретируемость и прозрачность. Качественный RAG-ответ должен давать возможность отслеживать, на каких именно источниках базируется информация. Наличие ссылок на первоисточники помогает пользователю оценить надёжность и проверяемость предоставленных сведений. Такая прозрачность важна, особенно в областях, где требуется высокая степень доверия, например, в медицине, финансах или праве.
  6. Этичность и безопасность. Прежде, чем помочь пользователю с какой-то его задачей, стоит сначала позаботиться о том, чтобы ему не навредить. Поэтому система должна обладать высокой степенью безопасности и всегда стараться выдавать этичные ответы (либо отказываться отвечать, если это невозможно). И помните: какую бы доброжелательную систему вы не строили, её все равно будут пытаться сломать и спровоцировать выдать ответ, который может вылиться в пиар-инцидент.
Рисунок 4. Пример неудачного ответа RAG-модели. Благо, здесь мы всего лишь подкорректировали html 🙂

Пара слов про поиск

Рисунок 5. RAG-схема (напоминание)

Важно отметить: как минимум половина хорошо решённой RAG-задачи — поиск. Даже с самой умной и хорошо обученной LLM-моделью вы не сможете построить полезный релевантный ответ, если вы не найдёте для запроса релевантные документы.

В зависимости от задачи, наличия вычислительных ресурсов и требований к скорости ответа, можно говорить о разных способах поиска релевантных документов в вашей базе. Работу большей части поисковых систем можно свести к такому принципу: из большого количества кандидатов мы быстрыми подходами (эвристика, текстовые пересечения, лёгкие модели) находим небольшое количество документов-кандидатов. Затем с помощью более умных и, возможно, тяжёлых моделей (часто семантических, по типу моделей семейства BERT) мы отбрасываем совсем нерелевантные документы и переранжируем оставшиеся с учётом их полезности для ответа LLM. Здесь вступают в дело лучшие практики ранжирования, для которого существует большое количество литературы (для знакомства с поисковыми системами можно начать, например, отсюда).

Документы, о которых мы говорили, — понятие растяжимое. Оно зависит от вашей задачи (это содержание html-страницы, последовательность комментариев в тикете Jira или история чата в Telegram), а также от вашей подготовки этих документов. Во многих задачах большие документы, загрязнённые большим количеством служебного текста, бывает полезно разбить на части (чанки), и эти части предобрабатывать, чистить, выделять самое нужное.

И ещё одна важная мысль — перед запуском RAG-системы на вашем запросе научитесь отвечать на вопрос: «А точно ли на данный запрос нужно отвечать генеративно?». Умение отвечать на такой вопрос сэкономит вам кучу вычислительных ресурсов и улучшит общее качество RAG-системы.

Дообучение LLM на задачу RAG

Рисунок 6. Архитектура RLHF [источник]

При обучении LLM можно условно выделить три этапа:

  • Pretraining. Первая и самая фундаментальная стадия, где модель обучается на огромном количестве неразмеченных текстовых данных. Задача предобучения — дать модели возможность изучить синтаксические, семантические и фактические закономерности языка, освоить широкий спектр знаний и развить способность предсказывать следующий токен в последовательности.
  • Supervised Fine-Tuning. После этапа предобучения модель дообучается на специально размеченных данных, где пары «вопрос-ответ», инструкции или диалоги собираются и корректно размечаются экспертами. Цель SFT — адаптировать базовые знания модели для конкретных задач.
  • Alignment. Этап, направленный на согласование поведения модели с ожиданиями пользователей и этическими нормами. В результате модель не только генерирует грамматически правильный и информативный текст, но и старается соответствовать ожиданиям, требованиям к стилю и политике безопасности.

Один из современных подходов для третьего этапа — использование методов Reinforcement Learning from Human Feedback (RLHF). Здесь эксперты оценивают сгенерированные моделью ответы, а затем на основании этих оценок строится reward-модель (модель награды), которая отражает качество и полезность выдачи. Эту reward-модель можно дальше использовать для протаскивания в LLM сигнала о том, какой ответ является «хорошим» в терминах какого-то выбранного свойства: либо в абсолютном смысле, либо в смысле сравнения нескольких ответов (например, даны два ответа на один и тот же запрос, у одного награда побольше, у другого поменьше, и мы дообучаем LLM понимать эту разницу и в итоге умеем генерировать все ответы лучше).

Существует целый зоопарк методов alignment-а, некоторые из них построены на методах RL (PPO, GRPO и тд), некоторые нет (Rejection Sampling, DPO и др.). Каждый из них имеет свои плюсы и минусы по качеству, стабильности, сходимости, скорости — нужный выбирается в зависимости от ваших возможностей и ресурсов. Подробнее про alignment можно почитать, например, тут.

Как из RAG сделать супер-RAG

Рисунок 7. Различие распределений обучающих и тестовых данных к добру не приведет 🙂 [источник]

Итак, вы создали неплохой бейзлайн RAG-системы, и теперь у вас может возникнуть вопрос: «А как улучшить её качество?». Тут можно действовать в нескольких направлениях.

Работа с данными

80% (и больше) качества вашей LLM-модели, как это всегда бывает в задачах ML/DL, зависит от качества ваших данных. Где и как его можно улучшить:

  • Распределение обучающих данных. Через реальную RAG-систему всегда проходит поток запросов в определённом соотношении тематик, стилей, длины, ошибок и других свойств, и точно также определёнными свойствами обладают ожидаемые ответы в этом потоке. В большинстве случаев стоит озаботиться тем, чтобы обучающая выборка имела несмещённое относительно реального потока распределение. Это часто справедливо для первых этапов дообучения LLM на задачу RAG.
  • Качество данных. В зависимости от алгоритма дообучения стоит следить за специфичным для них качеством данных. Например, в рамках алгоритма DPO LLM дообучается определять, какой из двух ответов (на один и тот же запрос) лучше по какой-то характеристике. В этом примере большую роль играет качество составления пар: они должны различаться не слишком сильно (иначе задача становится простой) и не слишком слабо (тогда сигнал очень шумный).
  • Reward-модели. Если в методах alignment-а вы опираетесь на награды, то инвестировав в улучшение качества reward-модели, вы можете сильно улучшить качество ответов LLM.
  • Несколько reward-моделей. Часто качество ответа определяется различными свойствами (например, достоверность и визуальная привлекательность), которые нередко могут противоречить друг другу. В таком случае можно комбинировать значения reward-моделей для скоринга лучшего ответа, либо расставлять между ними приоритет.
  • Качество кандидатогенераторов. При дообучении LLM вы опираетесь на ответы одной или нескольких моделей (например, пары ответов в DPO, наборы ответов в Rejection Sampling). Чем лучше будет модель, с помощью которой генерируются кандидаты, тем выше может быть качество дообученной на них LLM (главное, чтобы ответы этих генераторов не слишком сильно отличались от тех, которые «привыкла» видеть ваша LLM — иначе есть шанс её «сломать», и она в целом перестанет генерировать адекватные ответы).
  • Количество данных. Большую роль может играть также количество данных, которое вы используете для дообучения. Поэтому бывает полезно проверять законы масштабирования и держать под рукой соответствующий график: насколько увеличивается качество, если вы увеличиваете выборку в 2 раза?
  • Количество документов. В зависимости от задачи вам может помочь увеличение количества документов, на которые вы опираетесь при ответе (главное — не закрывать этим проблему плохого ранжирования).
  • Размер документов. Выбор чанков большего / меньшего размера, а также предобработка документов могут также прибавить вам немного пунктов к вашим метрикам.

Базовая модель и обучение

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

Точно так же, как и в других задачах, в RAG в LLM можно дообучать как все веса, так и только небольшое их количество, используя подходы по типу p-tuning или Low-Rank Adaptation. Выбор подхода может зависеть от количества вычислительных ресурсов, времени и количества данных.

И, наконец, к окончательному успеху могут привести: эксперименты с числом итераций дообучения, выбор алгоритма alignment-а и подбор их оптимальных гиперпараметров.

Если вы прошлись по всем этим шагам — поздравляем! Ваш RAG — эталон в мире RAG-ов!

Заключение

Retrieval Augmented Generation (RAG) — это то самое чудо-изобретение, которое может помочь вам генерировать гораздо более актуальные и достоверные ответы, и выводить их на приемлемый для продакшена уровень. Этот подход увеличивает возможности современных языковых моделей, преодолевая ограничения, связанные с устаревшими или неполными внутренними данными.

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

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

Мы же этого с вами и добивались? 🙂

Рисунок 8. DeepSeek с нами согласен!

💡 Если хотите научиться использовать LLM в приложениях — обучать, деплоить, ускорять и не только — записывайтесь на наш курс по LLM. Старт 26 февраля. А 20 февраля мы проведём открытую лекцию, на которой откроем продажи и подарим скидки на курс.

Телеграм-канал

DeepSchool

Короткие посты по теории ML/DL, полезные
библиотеки и фреймворки, вопросы с собеседований
и советы, которые помогут в работе

Открыть Телеграм

Увидели ошибку?

Напишите нам в Telegram!