Все уроки · 44
Что такое RAG
Генерация, дополненная поиском (RAG): дайте модели ваши данные в момент ответа, вместо того чтобы надеяться, что она их запомнила. Почему возникают галлюцинации, где RAG применяют на практике и чем он отличается от fine-tuning.
Два вида экзамена
Представьте два экзамена.
На закрытом экзамене вы приходите только с тем, что выучили. Если спросят о том, чего вы не учили, вариантов два: оставить ответ пустым или написать что-нибудь правдоподобное и понадеяться на удачу. Языковые модели устроены так, что пустых ответов не оставляют, — поэтому они пишут что-нибудь правдоподобное. Это и есть галлюцинация: уверенный ответ, который звучит безупречно и при этом просто выдуман.
На открытом экзамене вы приходите с учебником. Чтобы ответить на вопрос о правилах возврата, достаточно найти нужную страницу и прочитать её. Экзамен не стал проще оттого, что вы поумнели. Он стал проще, потому что нужная информация оказалась под рукой.
RAG — генерация, дополненная поиском (retrieval-augmented generation) — это и есть открытый экзамен. Прежде чем модель ответит, ваш код достаёт нужные страницы и кладёт их ей на стол. Теперь модель отвечает, читая эти страницы.
Вот и вся идея. Остальная часть урока уточняет каждую из двух половин: что такое поиск и почему модель не может просто знать ваши данные.
Что такое «поиск»
Поиск — это то, чем программы занимались всегда: по вопросу найти фрагменты, в которых, вероятно, есть ответ. Работает он по вашим собственным документам: возвращает текст и ничего не «понимает».
Он берёт ваш вопрос и возвращает несколько фрагментов:
Вопрос: «Какой у нас срок возврата для годовых тарифов?»
Найденный фрагмент: «Годовые тарифы можно вернуть полностью в течение 14 дней с момента покупки. После 14 дней мы начисляем на баланс остаток пропорционально неиспользованному сроку».
Этот фрагмент лежит в файле refunds.md в вики вашей компании. Модель его никогда
не видела. Поиск его нашёл, и мы вставляем его в промпт, чтобы модель прочитала его
перед ответом.
Три слова, на которых строится всё остальное:
- Окно контекста — рабочая память модели на время одного разговора. Всё, что вы вставляете, и всё, что она пишет в ответ, должно в нём уместиться.
- Дополненная — к промпту добавили найденные фрагменты.
- Генерация — модель пишет ответ.
Итак, генерация, дополненная поиском — это просто: найти, вставить, затем написать.
Почему модель не может просто знать ваши данные
Здесь многие спотыкаются: модель ничего не может посмотреть. У неё нет ни базы данных, к которой можно обратиться, ни подключения к интернету во время вызова, ни хранилища с вашими файлами. Она получает один блок текста и предсказывает, что идёт дальше. Вот и весь механизм.
Поэтому всё, что она может «знать» в момент ответа, берётся ровно из двух мест:
- Её веса — закономерности, сжатые в ней в ходе обучения. Они заморожены в тот день, когда обучение закончилось. Изменить в них один факт нельзя — пришлось бы обучать модель заново.
- Окно контекста — текст, который вы отправили вместе с этим запросом. Только эту половину вы можете контролировать.
Ваших данных по умолчанию нет ни там, ни там — по двум разным причинам:
- Дата отсечки. Обучение закончилось в какой-то день. Об изменении цен на прошлой неделе, о сегодняшнем сбое и о политике возврата, которую вы переписали вчера, модель ничего не слышала.
- В обучающих данных их не было вообще. Ваши документы, обращения, договоры и внутренняя вики закрыты. Никто в OpenAI не читал вики вашей компании, поэтому в весах нечего вспоминать — как бы удачно вы ни сформулировали вопрос.
Отсюда и уверенная чепуха вместо молчания. Хранилища фактов, в которое можно заглянуть и вернуться ни с чем, у модели нет: она всегда предсказывает следующее слово. Если дать ей «Наш срок возврата для годовых тарифов — ___», самое вероятное продолжение — число и правдоподобная фраза, потому что именно так такие фразы выглядят в интернете. Пропуск она заполняет потому, что заполнять пропуски — единственное, чем она занимается.
Раньше оставалось надеяться: «может быть, она запомнила достаточно». RAG заменяет надежду механизмом: положите факт в промпт — и угадывать будет нечего.
Увидеть разницу
Вот один и тот же вопрос на закрытом экзамене — модель без доступа к вашим данным — и затем с RAG. Посмотрите, что происходит, когда мы даём ей что-нибудь прочитать:
Первый ответ звучит уверенно и неверен — такое сочетание называется галлюцинацией. Злого умысла тут нет: модель достраивает привычные шаблоны по типовым интернет-текстам, потому что больше у неё ничего нет. Второй ответ ссылается на вашу политику возврата, потому что она лежала прямо в промпте.
Уверенно и неверно — худшее сочетание
Галлюцинацию, написанную с оговорками, заметят при проверке. Уверенная и хорошо написанная галлюцинация дойдёт до клиентов. RAG бьёт в корень проблемы: модель перестаёт гадать, потому что факты лежат у неё перед глазами.
Почему бы не вставить всё в промпт?
Этот вопрос задаёт каждый новичок, и он резонный: если модель умная, почему бы не отдать ей сразу всю вики и не покончить с этим?
Три причины — по степени вреда:
- Оно не помещается. Окно контекста — жёсткий бюджет. 200 тысяч токенов кажутся огромной цифрой, пока не посчитаете: вики компании приличного размера — это миллионы токенов. Вставить всё физически невозможно.
- Это медленно и дорого. Каждый отправленный токен стоит денег и добавляет задержку — и так на каждый вопрос. Платить за перечитывание 500 страниц ради ответа на «какой срок возврата?» — невыгодная сделка.
- Ответы становятся хуже. Если зарыть единственный нужный абзац в 500 страниц, модель отвлекается: уходит в оговорки, путает две политики или уверенно берёт ответ не из того раздела. Точность растёт не от большего контекста, а от правильного.
RAG и есть этот фильтр. Шаг поиска находит несколько абзацев, которые относятся к вопросу, и в промпт попадают только они. Вы получаете знания миллиона документов по цене нескольких тысяч токенов.
Почему без него возникают галлюцинации
К выдумыванию модель толкают три силы:
- Нет доступа. Факта просто нет ни в обучающих данных, ни в промпте. Единственный ход модели — всё равно выдать правдоподобно звучащий текст.
- Требование ответить. «Ответь на вопрос» — сильная инструкция. Модель, которая всегда отвечает «не знаю», — плохой помощник, поэтому при сомнении она всё же отвечает.
- Гладкость. LLM обучены выдавать гладкий текст, а гладкий текст о политике возврата выглядит одинаково, настоящие в нём факты или выдуманные.
С RAG модель остаётся прежней, но ситуация меняется: вместо того чтобы вспоминать, она цитирует. А читать LLM умеют хорошо.
Попробуйте RAG вручную прямо сейчас
Чтобы почувствовать разницу, база данных не нужна. Скопируйте промпт ниже в ChatGPT
и вставьте любой документ, который у вас есть (договор, инструкцию, длинное письмо),
туда, где написано DOCUMENT. Задайте вопрос, ответ на который вы уже знаете.
Затем задайте тот же вопрос в новом чате без документа и сравните:
Вот документ:
---
DOCUMENT
---
Ответь на мой вопрос, используя ТОЛЬКО документ выше.
Правила:
- Если ответа в документе нет, скажи «Не знаю» и объясни, чего не хватает.
- Процитируй точное предложение, на котором основан ответ.
- Не используй ничего из того, что тебе известно вне документа.
Вопрос: ...Это RAG в чистом виде — поиск вы сделали вручную. Всё остальное в этом курсе — об автоматизации того, что вы только что проделали копированием и вставкой.
Где применяют RAG
Стоит увидеть схему — найти, затем сгенерировать, — и вы начнёте замечать её повсюду:
- Боты поддержки, которые отвечают по вашему справочному центру и не выдумывают правила.
- Внутренние ассистенты по знаниям поверх вики, заявок и архивов Slack.
- Ассистенты для кода, опирающиеся на вашу кодовую базу вместо типовых руководств.
- Юридические и финансовые инструменты, которым нужно приводить точные пункты договоров.
- Чат с вашими документами — классическая демонстрация, прославившая RAG.
Если продукту нужно быть точным в конкретной информации, которая со временем меняется, почти наверняка он устроен как RAG.
RAG и fine-tuning
Классический повод для путаницы. Fine-tuning (дообучение) — это продолжение обучения модели на ваших собственных примерах, благодаря чему новое поведение становится частью весов модели. Оба подхода вносят знания, но делают это на разных уровнях:
| RAG | Fine-tuning | |
|---|---|---|
| Что меняет | То, что модель может прочитать в момент ответа | То, как модель ведёт себя по умолчанию |
| Обновление знаний | Обновили документы — и всё | Нужно заново обучать модель |
| Источники в ответе | Да — вы знаете, какие документы использованы | Отследить невозможно |
| Стоимость новой информации | Почти нулевая (один эмбеддинг) | Часы работы GPU |
| Лучше всего подходит для | Фактов, документов, меняющихся данных | Стиля, формата, поведения в предметной области |
Это та же аналогия с экзаменом, с которой мы начали: fine-tuning — месяцы учёбы до экзамена, а RAG — разрешение взять книгу на экзамен. Fine-tuning учит навыку, RAG даёт материалы. Если вопрос в том, знает ли модель новую политику возврата, RAG выигрывает вчистую: политика изменилась на прошлой неделе, и переобучать модель ради одного абзаца было бы абсурдно.
Fine-tuning выигрывает в трёх случаях:
- Тон, формат и привычки. Всегда отвечать JSON именно той формы, которая нужна вам, писать как ваша служба поддержки, отказывать вашими словами. Это поведение, и научить ему RAG не может.
- Задержка и стоимость в большом масштабе. Поведение, «зашитое» в модель, позволяет писать более короткие промпты и тратить меньше токенов на вызов. На миллионах вызовов набегает ощутимая сумма.
- Небольшие модели. Крошечная модель с правильным fine-tuning способна обойти большую модель с длинным промптом на узкой повторяющейся задаче.
У RAG своё слабое место: он ровно настолько хорош, насколько хорош его поиск. Если шаг поиска вернёт не тот абзац, модель гладко ответит на основе не того абзаца — это другая разновидность той же проблемы. RAG резко сокращает число галлюцинаций, но не устраняет их совсем.
Они не соперники. Серьёзные продукты часто используют оба подхода: fine-tuning для тона и формата, RAG для фактов.
Сначала — RAG
Когда кто-то говорит: «нам нужно дообучить модель на наших документах», правильный первый шаг почти всегда — вместо этого собрать небольшой RAG-пайплайн. Это работа на выходные, он обновляется и показывает свои источники. Попробуйте его, прежде чем хвататься за GPU.
В аналогии с экзаменом: чему соответствует RAG?
В момент ответа модель может опираться на…
В чём главная идея RAG?
Почему бы не вставлять всю базу знаний в каждый промпт?
Ваша компания вчера обновила политику возврата. Что делать?
Для чего на самом деле стоит делать fine-tuning?