Ещё раз? Серьёзно?
Запускаешь свою локальную модель через llama.cpp, просишь написать что-то оригинальное, а в ответ получаешь бесконечные вариации на тему "Как уже было сказано ранее..." или "Важно отметить, что...". Модель зацикливается, повторяет паттерны, превращает креативную задачу в скучное переливание из пустого в порожнее. Знакомо?
Проблема не в моделях. Проблема в том, как мы выбираем слова. Точнее, в сэмплерах - алгоритмах, которые решают, какое слово будет следующим. Стандартные Top-P и Top-K работают по принципу "выбирай из самых вероятных вариантов". А что если самые вероятные - это как раз те самые заезженные фразы?
Сэмплер - это не магия. Это просто математика, которая решает, какое слово модель напишет следующим. Плохой сэмплер превращает умную модель в заикающегося попугая.
Что ломает Adaptive-P
Новый сэмплер, который появился в PR #6433 llama.cpp, работает иначе. Вместо того чтобы слепо выбирать из топовых кандидатов, он трансформирует распределение вероятностей. Математически это выглядит так:
# Упрощённая суть Adaptive-P
probabilities = model.get_next_token_probs()
# Вместо простого отбора топ-N (Top-K) или топ-по вероятности (Top-P)
# Adaptive-P применяет трансформацию:
transformed = probabilities ** (1 / temperature)
transformed = transformed / transformed.sum() # Нормализация
# Плюс динамическая адаптация параметров
# в зависимости от «креативности» контекста
Звучит сложно? На практике это значит: когда модель начинает повторяться, Adaptive-P искусственно повышает шансы менее вероятных, но более интересных слов. Когда контекст требует точности (например, в коде или фактах), он ведёт себя консервативнее.
Покажи мне разницу!
Допустим, мы просим модель продолжить фразу "В тёмном лесу стоял..."
| Сэмплер | Типичный ответ | Проблема |
|---|---|---|
| Top-P (p=0.9) | ...старый дуб. Дуб был очень старым и большим. | Повторение "старый" → "старым" |
| Top-K (k=40) | ...замок. Замок выглядел мрачным и заброшенным. | Штамп "мрачный и заброшенный" |
| Adaptive-P | ...дом на курьих ножках. Он повернулся к нам скрипящим фасадом. | Неожиданно, креативно, нет повторов |
Разница очевидна. Top-P и Top-K выбирают безопасные, предсказуемые продолжения. Adaptive-P рискует - и выигрывает в креативности.
Зачем мне это собирать самому?
Потому что в основной ветке llama.cpp этого ещё нет. PR #6433 - это pull request, который нужно применить вручную. Да, это лишние телодвижения. Да, это раздражает. Но игра стоит свеч, если ты устал от шаблонных ответов от своих Llama 3.3 или других моделей.
Внимание: если сборка llama.cpp для тебя - тёмный лес, сначала прочитай инструкцию по сборке. Adaptive-P - это продвинутая фича для тех, кто уже дружит с терминалом.
1 Клонируем и переключаемся
# Клонируем репозиторий (если ещё нет)
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# Переключаемся на ветку с Adaptive-P
# Нужен конкретный коммит из PR #6433
git fetch origin pull/6433/head:adaptive-p
git checkout adaptive-p
2 Собираем как обычно
# Для Linux/macOS
make
# Для Windows (CMake)
mkdir build
cd build
cmake ..
cmake --build . --config Release
Если тут всё сломалось - значит, у тебя проблемы с зависимостями. Вернись к базовой сборке, потом возвращайся сюда.
3 Запускаем с новым флагом
./main -m models/llama-3.3-8b-instruct.Q4_K_M.gguf \
-p "Напиши короткий детективный рассказ" \
--sampling-seq adaptive-p \
-n 500 \
--temp 0.8
Ключевой флаг здесь --sampling-seq adaptive-p. Без него будет использоваться стандартный сэмплер (обычно Top-P).
А что с GUI?
Плохие новости: большинство графических оболочек для llama.cpp (включая те, что в топе продвинутых приложений) ещё не поддерживают Adaptive-P. Им нужно обновить свои бэкенды.
Хорошие новости: если ты используешь llama.cpp через API (например, с HomeGenie или другими агентами), можно передать параметр в JSON:
{
"prompt": "Напиши рекламу для нового ИИ-продукта",
"sampling_seq": "adaptive-p",
"temperature": 0.7,
"n_predict": 300
}
Кому это реально нужно?
- Писателям и сценаристам, которые используют LLM для генерации идей. Штампы убивают креативность.
- Разработчикам игр для генерации диалогов NPC. Повторяющиеся реплики ломают immersion.
- Маркетологам, создающим контент. Тысячи текстов "инновационных решений" уже никого не цепляют.
- Исследователям, тестирующим креативные возможности моделей. Стандартные сэмплеры дают заниженные результаты.
- Всем, кто устал читать "В заключение хотелось бы отметить..." в каждом втором ответе модели.
Опасная зона: когда Adaptive-P вреден
Не используй Adaptive-P для:
- Генерации кода. Код требует точности, а не креативности. Здесь лучше Top-P с низкой температурой.
- Фактологических ответов. Если спрашиваешь "столица Франции", Adaptive-P может ответить "Париж, город света и любви, где на каждом углу..." - красиво, но многословно.
- Технической документации. Чёткость и структура важнее оригинальности.
- Когда модель и так галлюцинирует. Adaptive-P может усилить проблему.
Совет: создай два алиаса в shell - один для креативных задач с Adaptive-P, другой для точных задач с Top-P. Переключайся в зависимости от задачи.
Что дальше?
Adaptive-P - не панацея. Это ещё один инструмент в арсенале. Скорее всего, через несколько месяцев он появится в основной ветке llama.cpp, а потом и во всех GUI. Пока что - это фича для ранних адептов.
Попробуй сравнить: один и тот же промпт (возьми, например, промпт для хабра-заголовков) с Adaptive-P и стандартным сэмплером. Разница будет заметна с первых строк.
И да - если после Adaptive-P твоя модель начала выдавать откровенную ерунду, просто верни температуру на 0.1-0.2 ниже. Иногда креативность нужно немного придушить.