Prompt Compression
Сжатие промптов сокращает входные данные LLM, удаляя малоинформативные токены или компактно кодируя контекст. Это снижает стоимость и задержку, сохраняя качество ответов.
Сжатие запросов сокращает входные данные для большой языковой модели (LLM), сохраняя информацию, необходимую модели для ответа. Благодаря этому запрос использует меньше токенов, обрабатывается быстрее и помещается в контекстное окно. Методы варьируются от удаления предсказуемых слов небольшой языковой моделью до обобщения длинной истории и обучения компактных эмбеддингов, заменяющих целые фрагменты текста. Сжатие особенно эффективно, если запросы длинные и отправляются часто: например, в конвейерах генерации с дополненной выборкой (RAG), вставляющих множество найденных документов, у ИИ-агентов, история которых растёт с каждым шагом, и в приложениях с длинными инструкциями и примерами. Провайдеры выставляют счёт за каждый входной токен, а вычислительная нагрузка механизма внимания растёт вместе с длиной входа. Поэтому сжатие запроса вдвое примерно вдвое снижает стоимость входных данных и уменьшает задержку инференса.
Принцип работы сжатия запросов#
Жёсткое сжатие запросов преобразует текст в более короткий текст, который может обработать любая LLM, в том числе закрытая модель, доступная через API. В большинстве методов небольшая языковая модель оценивает каждый токен и удаляет токены, которые ей легко предсказать, поскольку в них меньше всего информации. Selective Context применяет эту идею к словам и фразам, а LLMLingua от Microsoft добавляет контроллер бюджета, назначающий разные коэффициенты сжатия инструкции, примерам и вопросу, а также итеративное прореживание токенов. Это обеспечивает сжатие до 20 раз с незначительной потерей качества. В LLMLingua-2 сжатие формулируется как классификация токенов с помощью двунаправленного кодировщика, например XLM-RoBERTa, обученного на примерах сжатия, полученных от более крупной LLM. Метод работает в 3–6 раз быстрее предыдущих и ускоряет сквозную обработку в 1,6–2,9 раза при сжатии в 2–5 раз. Абстрактивные методы вместо этого просят модель обобщить контекст: сжатие получается сильнее, но могут потеряться подробности, необходимые для ответа на вопрос.
Мягкое сжатие запросов преобразует текст в несколько обучаемых эмбеддингов, которые модель читает вместо исходных токенов. Токены gist обучают LLaMA-7B и FLAN-T5-XXL сжимать инструкцию до нескольких специальных токенов, обеспечивая сжатие до 26 раз и сокращение количества FLOP до 40%. Для этих методов нужен доступ к весам модели, поэтому их можно применять к моделям с открытым исходным кодом.
Основу сжатия на уровне токенов можно реализовать всего в нескольких строках на PyTorch. В этом примере GPT-2 с 124 миллионами параметров из Hugging Face Transformers вычисляет самоинформацию каждого токена — отрицательный логарифм вероятности токена при условии всех предшествующих токенов — и сохраняет более неожиданные токены:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
prompt = (
"The quarterly maintenance report states that, as of the end of the quarter, a total of three conveyor "
"belts on line 4 were found to have worn bearings, and all of them were replaced on March 12 by the night shift."
)
ids = tokenizer(prompt, return_tensors="pt").input_ids[0]
# Self-information of each token, -log p(token | preceding tokens), under a small language model
with torch.no_grad():
logits = model(ids[None]).logits[0, :-1]
info = -logits.log_softmax(-1).gather(1, ids[1:, None]).squeeze(1)
# Keep the first token and the more surprising half of the rest, in their original order
keep = torch.cat([torch.tensor([True]), info > info.median()])
compressed = tokenizer.decode(ids[keep])
print(f"{len(ids)} -> {keep.sum().item()} tokens: {compressed}")Выводится 46 -> 23 tokens: The quarterly maintenance report states, a three convey on line 4 found worn bearings all replaced on March 12 by night shift. Факты сохраняются, в том числе строка 4, изношенные подшипники, 12 марта и ночная смена, а предсказуемые слова-паразиты, например «по состоянию на конец квартала», исчезают. Фрагмент «convey», оставшийся от «conveyor belts» («конвейерные ленты»), — типичный артефакт удаления отдельных токенов. Поэтому некоторые методы удаляют целые слова или фразы.
Сжатие изображений#
Визуально-языковые модели превращают каждое изображение в сотни визуальных токенов, многие из которых избыточны. FastV удаляет половину токенов изображения после второго слоя и сокращает количество FLOP на 45% для LLaVA-1.5-13B без потери качества; объединение токенов применяет похожую идею внутри визуальных трансформеров. Детектор объектов тоже может сжимать изображения: Ultralytics YOLO26 преобразует фотографию в Results.summary() — список с названием класса, уверенностью и координатами рамки для каждого объекта. Поэтому конвейер с LLM, которому нужно знать только наличие объектов и их расположение, может отправлять несколько десятков токенов на объект вместо изображения, для описания которого потребовались бы сотни или даже более тысячи токенов.
Сжатие запросов и родственные методы#
- Кэширование запросов: Сохраняет вычисленные моделью состояния для повторяющегося префикса запроса, чтобы не пересчитывать их. Длина запроса не меняется; оба метода хорошо сочетаются: переменную часть запроса можно сжимать, а фиксированную — кэшировать.
- Сжатие KV-кэша: Удаляет или квантует состояния ключей и значений внутри модели во время генерации. Сжатие запросов выполняется до того, как модель увидит входные данные.
- Проектирование запросов: Люди вручную составляют понятные и краткие запросы. Сжатие выполняется автоматически и применяется к содержимому, которое никто не редактирует, например к найденным документам.
- Управление контекстом: Более широкая практика выбора того, что поступает в контекст модели на каждом шаге. Сжатие — один из её инструментов наряду с поиском и фильтрацией.
- Обогащение запросов: Добавляет в запрос найденный или сгенерированный контекст. Часто конвейеры сначала обогащают запрос, а затем сжимают результат.
Примеры применения в реальных условиях#
- Конвейеры RAG: Найденные фрагменты сжимаются перед генерацией. Это позволяет поместить в заданный бюджет больше источников и сосредоточить модель на предложениях, отвечающих на вопрос.
- История агентов: Агенты для программирования и исследований сокращают свою историю, когда контекст заполняется, заменяя старые результаты инструментов и ходы диалога кратким изложением, поскольку точность падает, когда длинный контекст заполняется устаревшей информацией.
- Запросы с примерами: Длинные списки разобранных примеров хорошо сжимаются. Контроллер бюджета LLMLingua сначала удаляет целые примеры, отсортированные по перплексии, а затем прореживает отдельные токены, сохраняя в настройках по умолчанию из статьи 85% инструкции и 90% вопроса.










