Два отказа, которые снаружи выглядят одинаково
Неверный ответ модели — это не один дефект, а два разных, и лечатся они противоположными средствами.
Первый: у модели нет знания. Вопрос касается вашего продукта, ваших регламентов, вашей номенклатуры — того, чего в обучающих данных не было. Модель честно закрывает пробел общими представлениями о том, как устроены «примерно такие» вещи, и получается складная, уверенная ерунда.
Второй: знание было — вы сами положили его перед моделью, — но она им не воспользовалась. Пересказала своими словами и исказила, пропустила оговорку, свернула ответ не в тот формат, слила два пункта политики в один.
Снаружи оба отказа выглядят одинаково: «отвечает неправильно». Дообучение второй отказ лечит хорошо, первый — плохо и недолго. Поиск по документам — наоборот. Спор «дообучение или RAG» бесконечен ещё и потому, что спорящие выбирают инструмент на одной оси, а инструменты живут на разных: одно меняет поведение, другое — доступное знание.
Поэтому правильный вопрос звучит не «что выбрать», а «какой у нас отказ».
Что дообучение меняет на самом деле
Дообучение — это градиентные шаги по весам. Хорошо усваивается то, что повторяется от примера к примеру: стиль, структура ответа, схема JSON, терминология. Регулярность, живущая в каждом примере, получает подкрепление снова и снова и оседает прочно.
Факт — антипод регулярности. В корпусе он мелькает раз-другой, конкурирует с тем, что модель уже вынесла из предобучения, и в итоге размазывается по огромному числу параметров, не оставляя следа, который можно было бы найти.
У факта в весах нет адреса. Строка в базе имеет ключ: её можно обновить, удалить, повесить на неё право доступа. Факт в весах распределён по множеству параметров, и те же параметры обслуживают массу других фактов. Убрать один устаревший, не потревожив соседей, нельзя. Спросить у весов, откуда взялась формулировка, нельзя. Показать пользователю, на каком документе основан ответ, тоже: основывать не на чем — есть тенденция отвечать похоже.
Зато поведение — та же регулярность. «Всегда отвечай такой схемой», «всегда зови инструмент с этими аргументами» — градиенты это схватывают намертво, потому что цель здесь — форма распределения, а не таблица фактов.
И побочный выигрыш, о котором часто забывают: дообучение снимает налог на промпт. Если в каждом запросе таскается многостраничный пласт стоячих инструкций, за него платится токенами при каждом обращении. Цена этого на живой нагрузке — тема нашего разбора «Сколько стоит инференс на реальной нагрузке»; перенос инструкций в веса убирает расходы из каждого запроса.
Что на самом деле даёт поиск
Окно контекста — рабочая память модели: положенный в него текст приличная модель способна процитировать и применить к вопросу. Поиск по документам — не «модель становится умнее», а конвейер, который в момент запроса кладёт перед ней нужные строки.
Знание при этом живёт снаружи, в хранилище с ключами. Обновить страницу — значит обновить страницу, а не переобучать модель. На строке висит источник, на разделе — права доступа, по выдаче можно провести аудит: что именно показали модели, когда она давала этот ответ. Это не удобства, а структурные свойства, которых у весов нет в принципе.
Но у конвейера своя цена, и не в токенах. Поиск — отдельная система: нарезка документов, эмбеддинги, ранжирование. Каждое звено ломается по-своему: нарезка режет таблицу посередине строки, эмбеддинг не узнаёт термины вашей предметки, ранжирование вытаскивает похожий, но чужой пункт. Модель не наследует истинность из документов — она наследует то, что ей принесли. Принесли не то — ответ будет неверным, со ссылкой на документ, который выглядит подходящим.
Мы уже спорили об этом в материале «Поиск решает меньше, чем принято считать»: поиск — не кнопка «сделать правильно», а подсистема со своими отказами. И умение пользоваться подложенным контекстом — само по себе навык, которым модели владеют по-разному: одни держатся текста, другие по нему скользят. Это свойство надо мерить, а не предполагать.
Тупик: выгрузить документы в обучающую выборку
Первый ход почти всегда одинаков: собирают из документов пары «вопрос — ответ», дообучают модель и ждут, что она «выучит документацию». Ход выглядит прямым — не нужна новая инфраструктура, на выходе один артефакт, модель «становится нашей».
Механика его ломает. Из корпуса модель прежде всего впитывает поверхность: словарь, тон, строение абзацев. Поверхность повторяется — значит, усваивается. Содержание не повторяется — значит, усваивается кое-как. Итог: модель говорит голосом вашей документации о том, чего не выучила.
Провал не виден сразу, и это худшая его часть. Проверочные вопросы обычно берут из тех же документов, по которым учили, — модель отвечает на них прилично, отчасти потому, что выучила и форму этих вопросов. На живых вопросах она фантазирует бегло и в фирменном тоне. Чем лучше дообучение поймало голос, тем убедительнее фантазии.
Дальше — обслуживание. Поменялась страница: пересобирай пары, переобучай, прогоняй оценку, раскатывай. Путь обновления знания идёт через весь тренировочный конвейер, тогда как у поиска — через переиндексацию одной страницы.
И спросить не с кого: у веса нет источника. «Откуда это?» — вопрос, на который обученная выборка не отвечает в принципе.
Диагностика без цифр: тест открытой книги
Числа тут не нужны — нужен разбор собственных отказов. Возьмите реальные случаи, где модель ответила неверно, и в каждый вручную подложите фрагмент документа, где живёт правильный ответ.
Стало верным — отказ был про знание: модель умеет пользоваться контекстом, читать было нечего. Стройте поиск.
Осталось кривым — модель игнорирует текст, ломает формат, сливает пункты. Это поведение: дообучайте, но сначала попробуйте просто переписать инструкции — иногда дешевле. Если же модель стабильно отвечает неверно даже с текстом под носом, подозревайте её умение держаться контекста: вопрос к выбору модели, а не к способу подачи знаний.
Дальше четыре вопроса, уточняющие выбор:
- Как часто меняется знание? Живёт понедельно — поиск. Заморожено навсегда — дообучение становится допустимым и для знания.
- Нужна ли доказуемость? Ссылки на источники, права доступа, аудит — свойства хранилища; веса не цитируют.
- Есть ли ресурс на лишний шаг? Поиск добавляет конвейер в каждый запрос, дообучение — тренировочный конвейер и, для открытых весов, собственный сервинг. Считайте оба на своей нагрузке.
- Сколько весят стоячие инструкции? Неизменный пласт правил в каждом промпте — кандидат на перенос в веса.
Зрелые системы обычно сходятся к комбинации: поиск несёт знание, дообучение учит этим знанием пользоваться — цитировать источник, признаваться «в документах этого нет», выдерживать шаблон. Это и есть рабочая роль дообучения внутри RAG-системы.
Оценку такой связки нельзя сводить к точности ответов. Мерить надо и отказ по назначению — видит ли модель, что ответа в документах нет, — и точность цитирования: действительно ли процитированный фрагмент подтверждает сказанное. О том, что мерить у модели, кроме точности, у нас был отдельный материал, и здесь он важнее обычного: дообученная на корпусе модель блестяще проходит тесты на знание и проваливается именно на отказах.
Позиция редакции
Мы считаем саму постановку «дообучение или поиск» вредной: она отправляет инженера выбирать технологию раньше, чем тот понял, какой у него отказ. Наш ответ: знание — в поиск, поведение — в дообучение, а своё место дообучение зарабатывает в основном после того, как поиск уже стоит: оно учит модель пользоваться найденным, а не заменяет поиск.
Мы против дообучения как способа закодировать документы в веса. Это не принципиальный запрет, а инженерный: у способа плохая механика — знание без адреса, обновление через переобучение, фантазии в выученном голосе.
И мы готовы оказаться неправы. Позиция не работает, если одновременно выполняются четыре условия: область замкнута (конечный каталог, фиксированная таксономия), знание заморожено и меняться не будет, доказуемость ответа не нужна, а на шаг поиска нет ресурса — жёсткий потолок задержки, офлайн, устройство без поисковой инфраструктуры. Тогда запоминание фактов дообучением легитимно и дешевле — выбирайте его.
Если хотя бы одно из этих условий у вас не выполняется — сначала тест открытой книги, и уже по его результату всё остальное.