RAG в LLM: что это такое, как устроен и чем RAG-агент отличается от обычного RAG

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

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

Зачем LLM внешняя база знаний

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

Положить в запрос все документы целиком обычно не выходит: руководство на 100-200 страниц может не поместиться в контекстное окно, а длинный разнородный контекст зашумляет ответ — модели хуже находят в нем один нужный факт (проблема «иголки в стоге сена»).

RAG дает модели не всю библиотеку, а несколько фрагментов по вопросу. Подход описан в 2020 году в статье исследователей Facebook AI Research «Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks» — еще до появления ChatGPT.

Как устроен RAG: три шага на одном примере

Название совпадает с шагами: retrieval — поиск фрагментов, augmented — дополнение запроса найденным, generation — генерация ответа. Пройдем их на вопросе сотрудника во внутреннюю службу поддержки: «Как оформить замену ноутбука и сколько ждать решения по заявке?». Термины, которые понадобятся дальше:

Термин Что это
Чанк Фрагмент документа, по которому ищут
Эмбеддинг Вектор чисел, отражающий смысл текста
Векторная база Хранилище эмбеддингов с поиском ближайших
Ретривер Компонент, который находит фрагменты под вопрос
Реранкер Вторая модель, которая переставляет найденное по релевантности

Подготовка: документы режут на чанки

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

Резать можно по структуре (главы, пункты, статьи закона, функции в коде) или по длине с перекрытием — например, по 512 токенов, где каждый кусок захватывает около 100 токенов конца предыдущего, чтобы мысль на стыке не потерялась. Встречается ориентир около 256 слов на чанк, но это эвристика: размер подбирают под данные и под максимальную длину входа модели эмбеддингов.

Регламент сервисных заявок из примера лучше резать по пунктам: иначе условие окажется в одном чанке, а исключение из него — в другом. Еще две детали: таблицы не рвут без шапки (делят, повторяя заголовок в каждом куске), а в метаданные чанка пишут документ, страницу и дату — по ним ассистент покажет источник ответа.

Эмбеддинги и векторный поиск

Каждый чанк прогоняют через модель эмбеддингов, и она превращает текст в вектор. Тексты, близкие по смыслу, например «как подключиться к корпоративному VPN» и «настройка VPN для удаленного доступа», получают векторы, направленные почти в одну сторону. Близость обычно считают как косинус угла между векторами: чем он ближе к 1, тем сильнее тексты совпадают по смыслу.

Векторы хранят в векторной базе (Qdrant, Milvus, Chroma, расширение pgvector для PostgreSQL). Вопрос превращают в вектор той же моделью и достают top-k ближайших чанков. Так работает семантический поиск: он сравнивает векторы и найдет пункт о замене оборудования, даже если в вопросе написано «поменять ноутбук». Полнотекстовый поиск опирается на термины и их обработку: анализаторы приводят слова к основе и подключают словари синонимов, а точные коды и артикулы он находит надежнее векторного. Поэтому на практике их часто сочетают — об этом ниже.

Модели эмбеддингов берут с Hugging Face через библиотеку sentence-transformers (например, multilingual-e5, BGE-M3, для русского — также FRIDA) или по API; англоязычная all-MiniLM-L6-v2 для русских текстов слабая. Рейтинги быстро меняются, поэтому модель проверяют на своих вопросах.

Сборка промпта и генерация

Найденные фрагменты вставляют в промпт вместе с вопросом и инструкцией. Сама LLM в документы не ходит: поиск и вставку делает код приложения. Обычно берут три-пять фрагментов и отсекают слабые совпадения порогом по оценке близости; порог подбирают на своих данных.

Ниже минимальный полный пример шагов retrieval и augmented на Python: три фрагмента, вопрос, два ближайших к нему и готовый промпт (вызов LLM опущен). Код проверен 22.10.2026 на Python 3.9, sentence-transformers 5.1.2 и модели intfloat/multilingual-e5-small:

# pip install sentence-transformers
from sentence_transformers import SentenceTransformer

chunks = [
    "Регламент сервисных заявок, п. 3.1: заявку на замену рабочего ноутбука подает руководитель отдела через портал поддержки.",
    "Регламент сервисных заявок, п. 3.4: заявку на замену оборудования рассматривают в течение пяти рабочих дней.",
    "Инструкция по VPN: для удаленного доступа установите клиент и получите токен у администратора.",
]

model = SentenceTransformer("intfloat/multilingual-e5-small")
# моделям e5 нужны префиксы: "passage: " для фрагментов, "query: " для вопроса
chunk_vecs = model.encode(["passage: " + c for c in chunks], normalize_embeddings=True)

question = "Как оформить замену ноутбука и сколько ждать решения по заявке?"
q_vec = model.encode("query: " + question, normalize_embeddings=True)

scores = chunk_vecs @ q_vec  # для векторов длины 1 это косинусная близость
top = scores.argsort()[::-1][:2]  # индексы двух самых близких фрагментов

context = "\n".join(f"[{n}] {chunks[i]}" for n, i in enumerate(top, start=1))
prompt = (
    "Ответь только по фрагментам ниже и укажи номер фрагмента. "
    "Если ответа в них нет, так и скажи.\n\n"
    f"Фрагменты:\n{context}\n\nВопрос: {question}"
)
print(prompt)

В промпт попадут оба пункта регламента сервисных заявок, а фрагмент про VPN — нет. В нашем прогоне оценки близости составили около 0,85 и 0,83 у пунктов регламента и около 0,79 у постороннего фрагмента. Числа зависят от версии модели и окружения и при повторе могут сдвинуться, поэтому ориентируйтесь на порядок результатов. Разрыв при этом невелик — у моделей e5 значения сжаты у верхней границы, так что порог отсечения подбирают на своих вопросах, а не задают на глаз. В реальной системе вместо списка chunks будет векторная база, а вместо print — запрос к LLM. Как собрать такой конвейер целиком, с хранилищем, реранкером и оценкой качества, разбирают на курсе «LLM-инженер».

Почему RAG ошибается

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

Симптом Вероятная причина Что делать
Ответ по постороннему документу Много однотипных разделов («Побочные действия» у разных лекарств), а в чанке нет названия объекта Добавить в чанк название документа (или переписать чанк с помощью LLM), фильтровать по метаданным
Не находится код ошибки или артикул Для вектора такой токен почти не несет смысла Гибридный поиск: полнотекстовый плюс векторный
Перепутаны значения таблицы Таблица разорвана без шапки Переразбить с повтором заголовка
Уточнение «а когда нельзя?» уходит мимо Короткий вопрос без контекста диалога Перед поиском переписать запрос с учетом переписки

Если ответа в найденном нет, модель часто все равно пытается его составить, поэтому в инструкцию добавляют право на отказ, а в поддержке — передачу вопроса оператору.

Как улучшать качество RAG

Порядок ниже — практический ориентир от дешевых шагов к дорогим, а не закон:

  1. Измерить: на реальных вопросах с известными ответами отдельно проверять, попал ли нужный фрагмент в top-k и верен ли ответ по нему.
  2. Навести порядок в документах: дубли, распознавание сканов, таблицы, даты. Это дорого, но по опыту внедрений сильнее всего влияет на точность.
  3. Гибридный поиск и словарь терминов: полнотекстовый поиск (например, BM25 в OpenSearch или Elasticsearch) вместе с векторным, синонимы, расшифровка внутренних кодов в контексте.
  4. Реранкинг: взять 20-30 кандидатов, переставить их моделью-реранкером и отдать в промпт три-пять лучших.
  5. Сужение контекста: найти большой фрагмент и программно выделить нужный пункт.
  6. Дообучение и более крупная модель — в последнюю очередь.

Если поиск приносит правильные фрагменты, а ответ неверный, начинать стоит с инструкции и модели. Для документов со схемами и графиками есть мультимодальный RAG, для баз с множеством похожих объектов — графовый.

RAG, обычный поиск или дообучение: что выбрать

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

Задача Что взять Когда иначе
Найти документ, читатель прочтет сам Поиск Нужен сжатый ответ из нескольких источников — RAG
Отвечать по актуальным фактам своих документов со ссылкой на источник RAG Документов мало и они целиком влезают в контекст — промпт без поиска
Освоить лексику, стиль и формат ответов домена Дообучение, например LoRA Для точных фактов к нему добавляют RAG
Посчитать, сходить во внешнюю систему, сделать несколько шагов Агентный RAG Шаги всегда одни и те же — фиксированный конвейер в коде

Затраты на RAG зависят от индексации, модели эмбеддингов, поиска, LLM и нагрузки. Начните с небольшого прототипа из готовых компонентов и сравните стоимость поиска, индексации и генерации на своих запросах, а MVP стройте только после проверки на реальных вопросах.

Агентный RAG: когда к поиску добавляют инструменты

В классическом RAG путь фиксирован: вопрос — поиск — промпт — ответ. В агентном поиск становится одним из инструментов, которыми модель распоряжается сама: решает, хватает ли данных, искать ли еще и где, нужен ли калькулятор, API трекера задач или веб-поиск. Сама модель ничего не вызывает — она выдает запрос на вызов в заданном формате, а код приложения его выполняет и возвращает результат в контекст.

Распространенный шаблон такого цикла — ReAct (Reasoning and Acting, 2022): рассуждение — действие — наблюдение — снова рассуждение, пока ответ не готов. Пример, где простого RAG мало: нужно найти нормы в справочнике и посчитать по ним. LLM часто ошибается в точной арифметике, поэтому агент найдет нормы, извлечет числа из найденного и из вопроса и вызовет калькулятор. Чем различаются два варианта:

Признак Классический RAG Агентный RAG
Кто решает, искать ли Код, поиск всегда Модель
Сколько поисков Обычно один Сколько понадобится
Инструменты Только поиск Поиск, калькулятор, API систем
Стоимость и задержка Ниже Выше: больше вызовов модели

Типичная поломка агента — петля: он раз за разом вызывает один инструмент с теми же параметрами. Поэтому ограничивают число шагов, при срыве передают запрос оператору, а для действий с последствиями оставляют подтверждение человеком (human-in-the-loop). Как это выглядит в проекте, можно посмотреть в кейсе выпускника Otus «RAG-агент для автоматизации инцидент-менеджмента».

Выводы

Коротко о главном:

  • RAG дополняет генерацию найденным: ретривер достает фрагменты из базы знаний, код вставляет их в промпт, LLM отвечает по ним.
  • Качество определяется в основном данными и поиском: нарезкой чанков, таблицами и метаданными, моделью эмбеддингов, гибридным поиском.
  • RAG снижает вероятность галлюцинаций, но не исключает их, поэтому нужны измерения, право на отказ и реранкинг.
  • Агентный RAG нужен, когда к ответу добавляются расчеты, внешние системы или несколько шагов поиска; за это платят задержкой, стоимостью и риском петель.

Где применяется RAG и как освоить его на практике

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

Собирать RAG-конвейер, подбирать эмбеддинги и реранкер, добавлять агентную часть и доводить систему до продакшена учат на курсе «LLM-инженер». Познакомиться с темой и преподавателями до записи можно на открытых уроках Otus.

Смежные темы: Векторы: операции, длина и применение в ML и графике, Нейросети: как работают, достоинства и недостатки, популярные программы, RAG-агент для автоматизации инцидент-менеджмента.

FAQ

Нужна ли для RAG видеокарта?
Не обязательно. Легкие модели эмбеддингов и векторная база работают на сервере с CPU, а генерацию можно получать по API. Небольшую или квантованную LLM реально запустить локально и на CPU, а GPU нужен, чтобы крупные модели отвечали с приемлемой скоростью.

Можно ли обновлять знания RAG без переобучения модели?
Да. Новые документы нарезают и индексируют, устаревшие удаляют из векторной базы — модель не меняется, а на следующий вопрос уже получит свежие фрагменты.

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

OTUS Журнал
Распродажа ноябрьских курсов (поп-ап)
Бесплатные открытые уроки (поп-ап)