Главная дилемма: RAG или Fine-tuning?
Когда компании или разработчику требуется заставить нейросеть отвечать по своим документам, регламентам или авторскому стилю, возникает путаница между двумя принципиально разными подходами:
- RAG (Поиск по базе знаний): Документы не вшиваются в веса нейросети. Они индексируются в векторной базе данных. При каждом вопросе система находит нужные абзацы и подставляет их в контекст модели.
- Fine-Tuning (Дообучение через LoRA): Веса нейросети физически корректируются на обучающем датасете. Модель навсегда перенимает стиль, терминологию или структуру ответов.
Сравнение подходов к адаптации нейросетей
| Критерий | RAG (База знаний) | LoRA Fine-Tuning (Дообучение) | Полный Fine-Tuning |
|---|---|---|---|
| Главная цель | Точные факты из файлов, регламентов и прайсов | Стиль текста, тон, формат вывода, редкий синтаксис | Глубокое понимание нового языка с нуля |
| Сложность настройки | 10 минут (без программирования) | 1-2 часа (подготовка JSONL и скрипт) | Недели работы команды ML-инженеров |
| Стоимость и железо | Бесплатно (любой ПК / CPU) | 1 видеокарта от 8 ГБ VRAM | Кластер серверов от $10 000 |
| Обновление данных | Мгновенно (загрузить новый PDF) | Требует повторного обучения | Требует полного переобучения |
| Галлюцинации | Минимальные (ссылки на источники) | Возможны | Возможны |
Сценарий 1: Настройка RAG-базы знаний за 10 минут (AnythingLLM)
Если ваша задача — заставить ИИ отвечать на вопросы сотрудников по 500 страницам регламентов или договоров, используйте AnythingLLM.

Шаг 1. Установка и выбор компонентов
- Скачайте приложение AnythingLLM (или запустите его в Docker).
- В настройках укажите:
- LLM Provider: Ollama (модель
llama3.3:8bилиdeepseek-r1:14b). - Embedding Engine:
nomic-embed-text(локальная легковесная модель эмбеддингов). - Vector Database: Встроенная
LanceDB(работает быстро и не требует отдельного сервера).
- LLM Provider: Ollama (модель
Шаг 2. Загрузка документов
- Перетащите в рабочую область файлы (
.pdf,.docx,.txt, выгрузки.csv). - Программа автоматически разобьет текст на чанки по 512 токенов и рассчитает векторные представления.
- Теперь в чате модель будет отвечать со ссылкой на точные страницы исходных документов.
Сценарий 2: Дообучение модели через LoRA (Unsloth)
Если вам нужно обучить модель писать тексты в авторском стиле, генерировать код на редком фреймворке или отвечать по строгому корпоративному скрипту продаж, применяется метод LoRA (Low-Rank Adaptation).
Шаг 1. Подготовка датасета в формате JSONL
Создайте файл dataset.jsonl, где каждая строка представляет собой валидный JSON-объект с полями instruction, input и output.

{"instruction": "Как согласовать командировочные расходы?", "input": "Сумма 45 000 руб, поездка в Казань", "output": "1. Заполните заявку в 1С:ЗУП за 5 рабочих дней.\n2. Приложите бронь отеля.\n3. Согласование проводит руководитель отдела."}
{"instruction": "Напиши приветственное письмо новому партнеру", "input": "Компания СтройГрупп", "output": "Уважаемые коллеги из СтройГрупп! Рады приветствовать вас..."}
Шаг 2. Запуск дообучения через библиотеку Unsloth
Фреймворк Unsloth ускоряет обучение в 2–5 раз и сокращает потребление видеопамяти на 70%.
from unsloth import FastLanguageModel
import torch
from trl import SFTTrainer
from transformers import TrainingArguments
from datasets import load_dataset
# 1. Загрузка базовой модели в 4-битном квантовании
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Llama-3.3-8B-Instruct-bnb-4bit",
max_seq_length=2048,
load_in_4bit=True,
)
# 2. Настройка параметров LoRA адаптеров
model = FastLanguageModel.get_peft_model(
model,
r=16,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
lora_alpha=16,
lora_dropout=0,
bias="none",
)
# 3. Загрузка данных и запуск тренера
dataset = load_dataset("json", data_files="dataset.jsonl", split="train")
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset,
dataset_text_field="output",
max_seq_length=2048,
args=TrainingArguments(
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
warmup_steps=10,
max_steps=300,
learning_rate=2e-4,
fp16=not torch.cuda.is_bf16_supported(),
bf16=torch.cuda.is_bf16_supported(),
logging_steps=10,
output_dir="outputs",
),
)
trainer.train()
# 4. Сохранение и экспорт в GGUF для Ollama
model.save_pretrained_gguf("custom_model_q4", tokenizer, quantization_method="q4_k_m")

График функции потерь (Loss) должен плавно снижаться с 2.0+ до значений около 0.4–0.6. Это означает, что модель успешно усвоила закономерности ваших данных без эффекта переобучения (overfitting).
Шаг 3. Оценка и сравнение результатов

После интеграции адаптера модель перестает давать абстрактные общие ответы и начинает отвечать в строгом соответствии с корпоративными регламентами компании.
4 правила подготовки качественного датасета
- Качество важнее объема: 300 идеально вычитанных примеров дадут лучший результат, чем 10 000 зашумленных строк из сырых переписок.
- Разнообразие формулировок: На каждый типовой вопрос напишите 3–4 варианта синонимичных запросов (краткий, вежливый, с опечатками).
- Удаление конфиденциальных данных (PII): Обязательно вычистите из обучающего корпуса номера паспортов, реальные пароли и банковские реквизиты.
- Контроль переобучения: Не ставьте более 3–5 эпох обучения на маленьком датасете, иначе модель начнет дословно зубрить ответы и потеряет способность к обобщению.
Что изучить дальше
- Как запустить обученную модель — в гайде Локальный запуск нейросетей.
- Как развернуть reasoning-модель — в статье Запуск DeepSeek R1.
- Как автоматизировать пайплайны обработки данных — в статье Автоматизация в n8n с ИИ.
- Все практические инструкции собраны в разделе «Как сделать».