Всем привет, меня зовут Сергей Прощаев, и в этой статье расскажу про эксперимент, который я давно хотел провести честно, а не на слайдах.
Ситуация, думаю, знакома многим: вы подняли локальную модель для внутренних задач — и первый же вопрос про ваш домен она уверенно завалила. У нас она придумала несуществующий код ответа эквайера, сослалась на регламент, которого никогда не было, и сделала это настолько убедительно, что джун из соседней команды чуть не понёс её ответ в тикет. Базовая модель не знает вашего домена — и знать не может. Вопрос в другом: как именно её этому научить и какой ценой.
Работаю Tech Lead и руководителем направления Java | Kotlin разработки в FinTech & E‑commerce и преподаю на курсах разработки и архитектуры в OTUS.
Способов по сути три: промпт с контекстом, RAG и дообучение. Вокруг каждого — свой лагерь евангелистов, и споры между ними в 2026 году напоминают мне старые холивары про монолит и микросервисы. Поэтому я взял одну задачу, одну видеокарту и один вечер (ладно, два) и прогнал все три подхода на одних и тех же вопросах. Ниже — что получилось, с цифрами, граблями и выводами, которые местами меня самого удивили.

Условия эксперимента
Чтобы сравнение было честным, зафиксировал вводные.
Домен. Внутренняя документация платёжного направления: около 120 страниц регламентов — коды ответов эквайеров, правила ретраев по каждому типу отказа, маршрутизация платежей между провайдерами, лимиты и исключения. Идеальный кандидат: в интернете этого нет, в претрейне модели — тем более, а терминология наша, доморощенная, местами противоречащая общепринятой.
Модель. Qwen3-8B в актуальной редакции — на июль 2026 это, на мой вкус, лучший баланс качества и требований к железу среди открытых моделей, которые реально дообучать дома. Модель поддерживает контекст до 128K токенов (расширение родного окна через YaRN), что важно для первого подхода.
Железо. Одна RTX 4090 с 24 ГБ VRAM. Никаких кластеров — принципиально.
Метрика. Составил 30 вопросов трёх типов: фактические («какой ретрай‑интервал для кода отказа X»), синтетические («почему платёж с признаком Y ушёл на провайдера Z, хотя лимит исчерпан») и форматные («оформи разбор инцидента по нашему шаблону»). Ответы оценивал сам плюс попросил коллегу‑эксперта, не знавшего, какой подход отвечал. Сразу оговорюсь: 30 вопросов — это не бенчмарк, это разведка боем. Но для понимания характера каждого подхода хватило с запасом.
Прежде чем идти по раундам, полезно увидеть все три маршрута целиком — чем они отличаются на уровне механики, показано на рис. 2.

Главное, что стоит вынести из этой схемы: промпт и RAG подкладывают знания в момент запроса и не трогают саму модель, а дообучение меняет её веса. Отсюда растут все различия, которые мы увидим дальше — в стоимости обновления знаний, в устойчивости терминологии и в характере ошибок.
Раунд 1: промпт. Дёшево, сердито и до первого большого документа
Начал с самого честного бейзлайна: системный промпт с инструкциями, пара few‑shot примеров и весь регламент целиком в контекст. При 128K токенов мои 120 страниц влезли, хоть и впритык.
И знаете что? Работает лучше, чем принято рассказывать на конференциях. По всем 30 вопросам промпт набрал 20 верных ответов, а на чисто фактических — 8 из 10. Мне как‑то попалась информация, что современные базовые модели с хорошим промптом закрывают до 60–70% задач, под которые команды ещё полтора года назад запускали дообучение, — и мой мини‑тест это скорее подтверждает.
Но дальше вылезли три проблемы.
Первая: несмотря на длинный контекст, проявился известный эффект Lost in the Middle — информацию из середины большого контекста модель использовала заметно хуже. На вопросах по средним разделам документа она подхватывала похожий пункт из соседней главы.
Вторая — латентность и цена: прогонять 100K токенов контекста на каждый чих — это секунды ожидания и прожорливость по памяти, для чат‑бота поддержки уже больно.
Третья — масштабирование: у меня 120 страниц, а у соседней команды — 2000, и туда этот фокус не влезет никак.
Мой вердикт: промпт — обязательная стартовая точка. Если он решает задачу — остановитесь, вы сэкономили недели. Но для живой базы знаний это временное жильё.
Раунд 2: RAG. Точность с пруфами и новый класс головной боли
Дальше собрал классический RAG: нарезка регламентов на чанки по 500 токенов с перекрытием — для моего корпуса это оказалось разумным компромиссом между полнотой фрагмента и точностью поиска, — эмбеддинги bge‑m3 (мультиязычная модель, уверенно работающая с русскими текстами), индекс в Qdrant. В контекст шли top-5 найденных фрагментов: после нескольких прогонов остановился на этой цифре, потому что дальнейшее расширение выдачи уже начинало ухудшать ответы из‑за разрастания контекста. Ничего экзотического — ровно тот стек, который в 2026-м стал дефолтом примерно везде.
Код ретривера умещается в несколько строк (Python):
from qdrant_client import QdrantClient from sentence_transformers import SentenceTransformer encoder = SentenceTransformer("BAAI/bge-m3") client = QdrantClient(path="./payments_kb") def retrieve(question: str, top_k: int = 5) -> list[str]: vector = encoder.encode(question) hits = client.query_points( collection_name="regulations", query=vector, limit=top_k, ) return [hit.payload["text"] for hit in hits.points]
Для краткости в примере опущены нормализация эмбеддингов, настройки GPU и работа с метаданными; код приведён для клиента Qdrant 1.x — между версиями API может немного отличаться.
На фактических вопросах RAG выдал лучший результат раунда: 9 из 10, причём с указанием конкретного пункта регламента — для аудита и разборов инцидентов это бесценно. Обновление знаний — просто переиндексация документа, минута времени. Когда через неделю у нас реально поменялись лимиты по одному провайдеру, RAG узнал об этом раньше, чем я успел допить кофе.
А вот на синтетических вопросах начались приключения. Вопрос «почему платёж ушёл на провайдера Z» требует сопоставить три раздела из разных документов — а ретривер принёс два релевантных чанка и один про смежный, но другой сценарий. Модель честно собрала из этого правдоподобную ерунду. Помню, как однажды мы дебажили похожую историю в проде почти день: все компоненты по отдельности работали, а система в целом врала. С RAG отладка хотя бы прозрачна — видно, что именно нашлось и почему ответ такой, — но сам класс ошибок «ретривер промахнулся» никуда не девается, и лечится он уже тюнингом поиска: гибридный поиск, реранкер, работа с нарезкой.
И ещё одно наблюдение: нашу внутреннюю терминологию RAG так и не выучил. Он ей пользуется, пока термин лежит в найденном чанке, но стоит спросить своими словами — и модель съезжает на общепринятые формулировки, которые у нас означают другое.
Раунд 3: QLoRA. Модель начинает говорить на нашем языке
Третий подход — то, ради чего всё затевалось. Дообучение методом QLoRA: базовая модель квантуется в 4 бита, поверх замороженных весов обучается компактный LoRA‑адаптер. Именно эта связка позволяет уместить обучение адаптера поверх 8B модели в одну потребительскую видеокарту — в моей конфигурации даже с запасом: пик потребления не дошёл и до половины VRAM.
Отдельно скажу про инструменты, потому что здесь за последние месяцы всё изменилось. В марте 2026 команда Unsloth выпустила Unsloth Studio — открытый веб‑интерфейс, в котором дообучение запускается вообще без кода: выбрал модель, загрузил датасет, выставил гиперпараметры мышкой, наблюдаешь за loss‑кривой в браузере. Поддерживается больше пятисот моделей, обучение в 4-bit идёт примерно вдвое быстрее ванильных реализаций и заметно экономнее по памяти. Я, честно говоря, шёл к этому эксперименту с готовым Python‑скриптом, а в итоге весь прогон сделал в Studio и скрипт так и не открыл. Похожую нишу закрывает и H2O LLM Studio — тоже GUI, тоже без кода; кому что ближе по интерфейсу.
Самой дорогой частью оказалось не обучение, а датасет. Из регламентов я сгенерировал старшей моделью около 800 пар вопрос‑ответ, а потом два часа вычищал их руками — и выбросил примерно каждую пятую. Как и предполагал, генератор охотно плодит вопросы про то, что в тексте написано явно, и почти не создаёт вопросов «на стык» разделов. Пришлось дописывать такие самому. Правило, которое я для себя вывел: час, вложенный в чистку датасета, даёт больше, чем любые игры с гиперпараметрами. Для справки приведу конфигурацию адаптера, к которой пришёл (YAML):
# Параметры QLoRA-адаптера load_in_4bit: true lora_r: 16 lora_alpha: 16 lora_dropout: 0.05 # target_modules указаны для архитектуры Qwen3 target_modules: [q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj] learning_rate: 2.0e-4 num_train_epochs: 3 per_device_train_batch_size: 2 gradient_accumulation_steps: 4 max_seq_length: 2048
Само обучение в моей конфигурации заняло около 40 минут. Результат на выходе — адаптер весом пару сотен мегабайт, который цепляется к базовой модели в Ollama или vLLM.
Что изменилось. Модель заговорила на нашем языке: термины, аббревиатуры, структура ответа по внутреннему шаблону разбора инцидентов — всё стало родным без единого примера в промпте. Форматные вопросы — 10 из 10, и это тот результат, которого я не смог добиться ни промптом, ни RAG стабильно. На синтетических вопросах дообученная модель тоже прибавила: она стала устойчивее воспроизводить связи между разделами, которые я руками заложил в датасет.
А теперь ложка дёгтя, и большая. На вопросе про те самые обновлённые лимиты провайдера модель уверенно ответила старыми цифрами — теми, что были в датасете. Дообучение заморозило знания на момент обучения, и никакого «пункта регламента» в подтверждение оно предъявить не может. Важно понимать: это не значит, что QLoRA «хуже знает факты». Модель просто воспроизводит то, что было зафиксировано в датасете на момент обучения, тогда как RAG при каждом запросе получает актуальные документы — дообучение отвечает за поведение, а не за свежесть данных. Но практический вывод от этого не меняется: в этой ситуации я бы не рискнул отдавать такой модели фактические вопросы без подстраховки.
Сводим результаты
Критерий |
Промпт |
RAG |
QLoRA |
|---|---|---|---|
Фактические вопросы (10) |
8 |
9 |
7 |
Синтез между разделами (10) |
6 |
5 |
8 |
Формат и терминология (10) |
6 |
5 |
10 |
Обновление знаний |
мгновенно |
минуты |
новый цикл обучения |
Ссылки на источник |
нет |
да |
нет |
Стоимость входа |
минимальная |
средняя |
датасет + обучение |
Цифры по моим 30 вопросам — ориентир, не истина; на вашем домене расклад может сдвинуться. Но характер каждого подхода они передают точно.
История, которая расставила всё по местам
Когда я сомневался, стоит ли вообще возиться с дообучением маленькой модели, мне попалось исследование команды Predibase — LoRA Land. Ребята дообучили методом 4-bit LoRA 310 моделей на 31 задаче и показали, что тюнингованные модели обходят свои базовые версии в среднем на 34 пункта, а GPT-4 — на 10 пунктов. Важная оговорка: речь о наборе узких задач из самого исследования — классификация, извлечение, узкая генерация, — а не о том, что LoRA «всегда лучше GPT-4». Каждое обучение обошлось в среднем меньше чем в 8 долларов, а 25 дообученных Mistral-7B они крутили на одной A100 через LoRAX — сервер, который держит сотни адаптеров поверх одних общих базовых весов и подгружает нужный на лету.
Меня в этой истории зацепила даже не экономика, а сама архитектурная идея: не одна модель, которая знает всё, а семейство дешёвых специализированных адаптеров на общем фундаменте. К июлю 2026 этот паттерн стал, пожалуй, главным коммерческим аргументом за дообучение: старшей моделью генерируем эталонные ответы на узкой задаче, дистиллируем их в маленькую открытую модель — и снимаем порядок стоимости инференса там, где базовая модель и так почти справлялась.
Так что выбирать? Карта решений
Сформулирую то, к чему пришёл сам и что вижу у сильных команд: вопрос «промпт, RAG или дообучение» поставлен неверно. Это не конкуренты, а слои, и порядок их подключения показан на рис. 3.

Ключевая мысль этой карты: двигайтесь сверху вниз и останавливайтесь на первом «да». Дообучение стоит в конце маршрута не потому, что оно плохое, а потому, что оно отвечает на другой вопрос: RAG меняет информацию, доступную модели в момент инференса, а дообучение — то, как модель себя ведёт. А зрелые продовые системы 2026 года всё чаще совмещают оба слоя: адаптер держит терминологию и формат, ретривер приносит свежие факты с пруфами.
Где мои выводы не работают
Честные ограничения, куда без них.
Во‑первых, 30 вопросов и один домен — это эксперимент выходного дня, а не исследование; я проверял характер подходов, а не их абсолютные проценты, и о статистической значимости здесь говорить не приходится.
Во‑вторых, 8B модель: на моделях сильно меньше дообучение даёт больший прирост, на фронтирных API‑моделях экономика другая.
В‑третьих, мой домен статичен процентов на девяносто — если у вас база знаний обновляется ежедневно, чаша весов сдвигается к RAG радикально.
В‑четвёртых, я сознательно не усложнял пайплайны: в RAG не было гибридного поиска и реранкера (а именно с них стоит начинать тюнинг, если ретривер промахивается), а из методов дообучения я взял только SFT через QLoRA, не трогая DPO и GRPO — это уже отдельная история про выравнивание поведения.
И в‑пятых, no‑code инструменты снимают порог входа, но не снимают ответственность: за качество датасета и за оценку результата всё равно отвечаете вы, кнопка «обучить» это не изменит.
Что можно сделать уже сегодня
Если у вас есть локальная модель и домен, который она не знает, — не спорьте в чате, какой подход правильный, а повторите мой эксперимент на своих данных. Вечер‑другой, одна видеокарта, тридцать вопросов.
Промпт покажет бейзлайн, RAG закроет факты, а QLoRA в Unsloth Studio или H2O LLM Studio можно запустить, не написав ни строчки кода, — и своими глазами увидеть, как модель начинает говорить на языке вашей команды. Самое ценное в таком прогоне — не итоговая таблица, а понимание, где именно в вашей задаче лежит боль: в фактах, в поиске или в поведении модели.

Когда локальная модель знает общие вещи, но путается в ваших терминах и уверенно выдумывает ответы, важно понять, что именно исправлять: контекст, поиск по документам или поведение самой модели.
На открытых уроках разберём, как без кода дообучить модель методом QLoRA и повысить точность помощника, работающего с внутренними документами. Это поможет выбрать подход под свою задачу и собрать систему, которой можно доверять.
5 августа, 20:00. «Сделайте модель своей: дообучение LLM методом QLoRA без кода». Записаться
18 августа, 19:00. «AI-ассистент на ваших документах: почему он врёт и что с этим делать». Записаться
Больше бесплатных уроков — в дайджесте мероприятий на август.