ADG Оставить заявку
Блог Данные и аналитика 5 мин чтения

Llama 3 на русском: переводим helpdesk-бот с Llama 2 без остановки Ollama

Meta выпустила Llama 3 8B и 70B - и русский язык там наконец заработал. Переводим корпоративный helpdesk-бот клиента с Llama 2 на Llama 3 прямо в проде.

Контекст момента

Meta выпустила Llama 3 (8B и 70B) - новое поколение открытых LLM с существенно улучшенным качеством на русском языке

В середине апреля Meta выкатила Llama 3 - и это, пожалуй, первый случай за долгое время, когда опенсорсный релиз LLM вызвал не сдержанный скептицизм, а реальный интерес у людей, которые с этим работают в продакшне. Причин две: во-первых, качество 70B-варианта на многих задачах вплотную подошло к закрытым моделям уровня GPT-4-turbo. Во-вторых - и это для нас было главным - русский язык перестал выглядеть как мучительный побочный эффект.

У нас уже работал один проект на Llama 2: helpdesk-бот для среднего производственного клиента, отвечает на вопросы сотрудников по внутренним регламентам и IT-процедурам. Подняли его весной, описывали общий подход к локальным RAG-стекам. Там же честно отмечали: Llama 2 на русском - терпимо, но не комфортно. Ответы грамматически вменяемые, но ощущение такое, будто бот переводит с английского в реальном времени и не всегда успевает.

После выхода Llama 3 мы прогнали несколько десятков запросов из реального боевого трафика через 70B на тестовом стенде - и разница ощутимая. Не в разы по каким-то метрикам, а качественно: ответы стали читаться как написанные человеком, а не как вывод переводчика. Для helpdesk-сценария это принципиально - если бот отвечает деревянно, люди просто перестают им пользоваться.

Приняли решение мигрировать. Описываем, что это значит в Ollama без остановки сервиса.

Почему 70B, а не 8B

Честный ответ: на русском языке разница между 8B и 70B в нашем сценарии заметна больше, чем на английском. 8B даёт ответы лучше, чем Llama 2 13B, - но 70B на регламентных текстах с отраслевой спецификой держится значительно увереннее. Галлюцинации есть у обеих, но у 70B их меньше, и она реже теряет нить при длинном контексте.

Железо у клиента позволяет: сервер с двумя GPU по 24 GB VRAM, что даёт 48 GB для удержания модели. Llama 3 70B в квантизации Q4_K_M влезает с запасом.

8B оставляем как fallback на случай, если 70B будет перегружена в пиковые моменты - об этом ниже.

Процедура замены в Ollama без даунтайма

Ollama держит модели как именованные объекты. Трюк в том, что можно загрузить новую модель параллельно со старой и переключить сервис без перезапуска.

Шаг первый - загрузка новой модели параллельно со старой:

ollama pull llama3:70b-instruct-q4_K_M

Команда скачивает модель в локальный репозиторий Ollama (~/.ollama/models) без затрагивания уже запущенного инстанса. Пока качается - старый бот продолжает работать на Llama 2.

Шаг второй - прогрев модели:

ollama run llama3:70b-instruct-q4_K_M "Привет"

Первый вызов загружает модель в память GPU. Делаем это до переключения трафика - иначе первый реальный запрос получит тридцать секунд задержки на прогрев.

Шаг третий - smoke-тест на стенде:

Прогнали примерно двадцать типовых запросов из трафика. Смотрели три вещи: отвечает ли в рамках предоставленного контекста, не галлюцинирует ли конкретные пункты регламентов, читается ли ответ по-русски нормально.

Шаг четвёртый - переключение:

У нас Python-сервис на FastAPI как оркестратор, который формирует промпты и обращается к Ollama через HTTP. Переключение - это смена одной константы MODEL_NAME и перезапуск сервиса. Ollama при этом не перезапускается, 70B уже в памяти, простой - секунды.

Шаг пятый - мониторинг первых часов:

Смотрели на время ответа, на количество жалоб в тикетах (у клиента есть кнопка «ответ не помог»), на загрузку GPU. Первые несколько часов держали Llama 2 в памяти Ollama - просто не выгружали. На случай если что-то пойдёт не так.

# выгрузка старой модели после того как убедились
ollama rm llama2:13b-chat-q4_K_M

Что пошло не так

Одна неожиданность: Llama 3 70B чувствительнее к системному промпту. На Llama 2 у нас был простой промпт - «отвечай только по фрагментам, если нет ответа - скажи об этом». Llama 3 70B с тем же промптом начала иногда игнорировать ограничение «только по фрагментам» и добавлять общие рассуждения от себя. Пришлось промпт ужесточить и добавить явный запрет.

Это не баг Llama 3 - скорее следствие того, что модель "умнее" и имеет более выраженное собственное поведение по умолчанию. Инструкцию нужно давать точнее. Потратили полдня на итерации по промпту, прежде чем поведение стало стабильным.

Ещё момент: время генерации выросло. 70B на тех же GPU выдаёт примерно в полтора раза дольше, чем Llama 2 13B. Для helpdesk это приемлемо - люди не ждут мгновенного ответа - но закладывайте это в UX, если у вас интерактивный сценарий.

Где сейчас

Клиент работает на Llama 3 70B третью неделю. Кнопка «ответ не помог» нажимается заметно реже - это субъективный, но реальный сигнал. Промпты ещё доводим.

Интеграция локального LLM-стека в продакшне - это итерационная работа, а не разовая установка. Смена модели - это не просто ollama pull, это тест, промпт-инжиниринг и мониторинг. Хорошая новость: в Ollama это делается без ритуала с даунтаймом.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.