Настройка локальной LLM: контекст, квантование, API и RAG

Как настроить локальную языковую модель: размер контекста, квантование, слои на GPU, сэмплирование, chat template, OpenAI-совместимый API, RAG и безопасность.

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

Ниже — настройки, которые чаще всего дают заметную разницу.

Контекст

Что это. Окно, в которое помещаются системная инструкция, история диалога, документы и ответ модели. Измеряется в токенах: примерно 1 токен на 2–4 символа русского текста.

Почему не «чем больше, тем лучше». KV-кэш растёт вместе с контекстом. На 32k–128k он может занять больше памяти, чем сами веса. Кроме того, модели хуже используют середину длинного контекста: важное лучше класть в начало и конец.

Как задать.

  • Ollama: PARAMETER num_ctx 16384 в Modelfile или параметр в API.
  • LM Studio: поле Context Length в настройках загрузки.
  • llama.cpp: -c 16384 или --ctx-size.
  • vLLM: --max-model-len.

Сколько ставить. Для чата хватает 8k. Для работы с документами — 16–32k. Ставить 128k «на всякий случай» не стоит: память уйдёт, скорость упадёт.

Расширение контекста. Некоторые модели обучены на 32k и расширяются до 128k через RoPE scaling или YaRN. Это работает, но качество на дальних токенах может быть ниже. Проверяйте на своих документах.

Совет

Если документ не помещается, не увеличивайте контекст до предела. Разбейте текст на части и используйте RAG: так дешевле по памяти и точнее по смыслу.

Квантование

Квантование уменьшает точность весов, чтобы модель занимала меньше памяти.

ТипРазмерКачествоКомментарий
FP16/BF162 байта/параметрЭталонДля серверов с большим VRAM
Q8_0~1 байтПочти без потерьЕсли памяти хватает
Q6_K~0,8 байтаОчень близко к Q8Хороший выбор
Q5_K_M~0,7 байтаНебольшая потеряБаланс
Q4_K_M~0,55 байтаРабочее качествоСтандарт для дома
Q3_K_M~0,45 байтаЗаметная потеряКогда иначе не влезает
Q2_K~0,35 байтаСильная деградацияКрайний случай

imatrix. Калибровка на текстах улучшает качество кванта. Файлы с imatrix в названии обычно лучше обычных Q4.

AWQ / GPTQ / EXL2. Кванты для GPU. Могут быть быстрее GGUF в vLLM или ExLlama, но требуют совместимого движка и иногда калибровочного датасета.

KV-кэш. Его тоже можно квантовать: q8_0 обычно безопасно, q4_0 экономит больше, но может ухудшить длинные ответы. В llama.cpp — --cache-type-k и --cache-type-v, в Ollama — OLLAMA_KV_CACHE_TYPE.

GPU, слои и потоки

Слои на GPU. В llama.cpp -ngl 99 означает «все слои». Если не хватает памяти, уменьшайте. В LM Studio есть ползунок GPU Offload.

Flash attention. Ускоряет внимание и снижает расход памяти. Включайте, если движок и GPU поддерживают.

Батч. Увеличение -b и -ub повышает скорость обработки промпта, но требует памяти. Для одного пользователя большие значения не нужны.

Потоки CPU. Для гибридного режима ставьте число физических ядер, а не потоков. В llama.cpp — -t.

mmap. По умолчанию модель отображается в память, а не загружается целиком. Это ускоряет старт, но может мешать при нехватке RAM. --no-mmap иногда помогает, иногда вредит — измеряйте.

Параметры генерации

ПараметрЧто делаетТипичные значения
temperatureСлучайность0.2–0.4 для фактов, 0.7–0.9 для текстов
top_pОтсечение хвоста вероятностей0.9–0.95
top_kОграничение выбора20–50
min_pОтсечение маловероятных токенов0.02–0.1
repeat_penaltyШтраф за повторы1.05–1.15
max_tokensДлина ответа512–4096

Не крутите всё сразу. Начните с temperature и top_p, остальное оставьте по умолчанию. Для кода и извлечения данных температура ближе к нулю, для черновиков — выше.

Стоп-последовательности. Если модель продолжает диалог за пользователя, добавьте стоп-токены шаблона. Это частая проблема самодельных сборок.

Chat template

Модели Instruct обучены на конкретном формате: системная роль, пользователь, ассистент, служебные токены. Если движок подставляет не тот шаблон, качество падает даже у хорошей модели.

  • В Ollama шаблон обычно берётся из модели.
  • В llama.cpp можно указать --chat-template или файл .jinja.
  • В LM Studio шаблон выбирается в настройках.

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

Системная инструкция

Короткая и конкретная инструкция работает лучше длинной. Укажите:

  • роль и аудиторию;
  • язык ответа;
  • формат (список, таблица, JSON);
  • ограничения (не выдумывать, помечать неуверенность);
  • что делать при нехватке данных.

Ты помощник редактора. Отвечай по-русски, кратко. Если данных не хватает, напиши «нужно уточнить» и перечисли вопросы. Не добавляй факты, которых нет в тексте.

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

API и интеграции

Ollama

Сервер по умолчанию: http://127.0.0.1:11434.

curl http://127.0.0.1:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3:8b",
    "messages": [{"role": "user", "content": "Сократи текст до 300 знаков"}],
    "temperature": 0.3
  }'

OpenAI-совместимый endpoint позволяет подключить клиенты, которые не знают про Ollama.

llama-server

llama-server -m model.gguf -c 16384 -ngl 99 --host 127.0.0.1 --port 8080

API: http://127.0.0.1:8080/v1. Есть встроенный веб-чат.

LM Studio

Включите локальный сервер, укажите http://127.0.0.1:1234/v1, при необходимости — API-токен.

Python

from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:11434/v1", api_key="ollama")
resp = client.chat.completions.create(
    model="qwen3:8b",
    messages=[{"role": "user", "content": "Привет"}],
    temperature=0.3,
)
print(resp.choices[0].message.content)

Ключ может быть любым: локальный сервер его не проверяет, если не настроена авторизация.

Доступ с других устройств

Если модель нужна на ноутбуке, телефоне или в локальной сети, не открывайте порт напрямую в интернет. Схема:

  1. Сервер слушает 127.0.0.1.
  2. Reverse proxy (Caddy, Nginx) принимает HTTPS.
  3. Авторизация по токену или basic auth.
  4. Файрвол разрешает только нужные адреса.

Пример Caddy:

llm.example.com {
    reverse_proxy 127.0.0.1:11434
    basic_auth {
        user $2a$14$...
    }
}

Пароль в примере — заглушка. Сгенерируйте свой хеш. Для команды лучше отдельный шлюз с лимитами и логами.

Важно

Открытый в интернет Ollama без авторизации — это не «личный сервер», а бесплатный API для всех. Сканеры находят такие порты за часы.

RAG: ответы по своим документам

Модель не знает ваши файлы. RAG добавляет к вопросу найденные фрагменты.

Пайплайн:

  1. Разбор — PDF, DOCX, HTML, таблицы.
  2. Чанкинг — деление на фрагменты 300–800 токенов с перекрытием.
  3. Эмбеддинги — модель вроде BGE-M3 или multilingual-e5.
  4. Индекс — векторная база: Qdrant, Chroma, LanceDB, pgvector.
  5. Поиск — top-k фрагментов по косинусной близости.
  6. Переранжирование — опционально, реранкером.
  7. Генерация — модель отвечает только по найденным фрагментам.
  8. Цитаты — просите указывать источник и страницу.

Что важно:

  • Чанки должны быть осмысленными, а не разрезать предложение посередине.
  • Храните метаданные: файл, раздел, дату.
  • Ограничивайте ответ: «если в источниках нет ответа, скажи об этом».
  • Проверяйте, что поиск действительно находит нужное, до жалоб на модель.
  • Для таблиц и сканов нужен отдельный парсер, иначе качество упадёт.

Готовые решения: Open WebUI, AnythingLLM, RAGFlow, LlamaIndex, LangChain. Для первого прототипа хватит Open WebUI с Ollama.

Дообучение: когда нужно

Порядок такой: промпт → RAG → fine-tuning. Дообучение помогает, когда нужен устойчивый стиль, формат или поведение, а не новые знания.

  • LoRA — небольшие адаптеры, обучаются на одном GPU.
  • QLoRA — обучение в 4-битном кванте, ещё экономнее.
  • Full fine-tuning — дорого и редко оправдано дома.

Для обучения нужны пары «инструкция → ответ» в одном формате. 500–2000 качественных примеров часто полезнее 50 тысяч случайных. Проверяйте на отложенной выборке, иначе модель просто запомнит ответы.

Мониторинг

  • Скорость генерации — токены в секунду.
  • Скорость промпта — сколько времени уходит на обработку контекста.
  • VRAM — не упирается ли в предел.
  • Температура GPU — троттлинг убивает скорость.
  • Длина контекста — не растёт ли она бесконечно в диалоге.
  • Ошибки — таймауты, обрывы, пустые ответы.

Ведите простой лог: модель, квант, контекст, время, число токенов. Через неделю станет понятно, где узкое место.

Безопасность

  • Сетевой доступ. Только localhost или прокси с авторизацией.
  • Данные. Локально — не значит безопасно: логи, история и индексы хранятся на диске.
  • Prompt injection. Документ может содержать инструкцию «игнорируй правила». Для RAG отделяйте текст источника от инструкций и не давайте модели лишних инструментов.
  • Агенты. Ограничьте файловую систему, запретите сеть и опасные команды, требуйте подтверждения.
  • Секреты. Не кладите ключи в промпты и логи. Используйте переменные окружения и отдельные файлы.
  • Лицензии. Проверьте условия модели и эмбеддингов.
  • Резервные копии. Перед экспериментами с fine-tuning и RAG сохраните конфиги и индексы.

Чек-лист настройки

  • [ ] Контекст соответствует задаче, а не максимуму.
  • [ ] Квант выбран под доступную память.
  • [ ] Модель действительно считается на GPU.
  • [ ] Chat template совпадает с моделью.
  • [ ] Температура и top_p заданы осознанно.
  • [ ] Сервер слушает localhost или защищён прокси.
  • [ ] Для документов настроен RAG с проверкой поиска.
  • [ ] Есть лог запросов и метрик.
  • [ ] Понятно, какие данные нельзя отправлять в модель.

Если всё это сделано, локальная модель становится предсказуемым инструментом, а не экспериментом на вечер.

Редакция НейроСеть. Инструкции проверены на практике. Характеристики моделей и требования к железу меняются — сверяйтесь с документацией проекта и карточкой модели. Если заметили ошибку — напишите нам.

Другие гайды раздела