В API OpenAI
завезли новую фичу — Predicted Outputs. Удивительно, что они сделали это первыми — а то вот кэширование дольше всех добавляли 🥺
Predicted Outputs позволяют существенно ускорить написание ответа в ситуациях, где большая часть генерируемого текста уже известна. Два самых популярных сценария использования — это редактирование кода (где нужно всего пару строк подправить посередине) и переписывание текста.
Работает это с помощью speculative decoding, на пальцах выглядит так:
0. Вспомним, что LLM обладают следующим свойством: они могут «прочитать» много текста за один проход, при этом сделав предсказания для каждого из слов (какое должно идти за ним); но генерация происходит по одному слову за раз (после чего берётся предсказание от последнего слова и приклеивается к исходному тексту)
1. В некоторых задачах мы наперёд знаем большую часть текста ответа. Берём и приклеиваем её ко входу, как будто бы это уже часть ответа (делается под капотом на серверах OpenAI, но текст ответа присылаете вы, см.
документацию)
2. Модель делает все предсказания для текста ответа за раз. Это делается быстро, так как не нужно ждать генерации второго слова для получения третьего.
3. Начинается сравнение «что предсказала модель» и «что было написано в ответе». Первое слово и там, и там совпадает, второе тоже.. а вот, скажем, двадцатое — нет. В случае переписывания текста это может быть началом нового абзаца, или изменением имени персонажа в истории
4. Тогда первые 19 слов ответа подклеиваются к настоящему (а не подложенному) ответу. LLM как бы провалидировала, что эти токены и вправду должны использоваться, но сделала это кратно быстрее, чем если бы генерировала сама с нуля.
5. Затем LLM продолжает предсказывать сама, уже по одному слову за раз.
6. В какой-то момент предсказания снова могут начать сходиться с подложенным текстом — и процедура повторится. Сотрудник OpenAI
написал, что это происходит, если последние 32 токена совпадают с подложенным ответом. Тогда возвращаемся на пункт 2, приклеиваем оставшуюся часть ответа, сравниваем, итд.
Ускорение происходит за счёт того, что мы можем сразу подхватывать большие токенов, не генерируя их, а лишь «проверяя», что LLM бы выдала их сама — всё за счёт свойства из пункта 0.
Компания Factory провела своё тестирование перед релизом на задачах, связанных с внесением изменений в код. Они брали файлы от 100 до более чем 3000 строк кода (Python, JS, Go, C++), давали текстовое описание, что нужно изменить, и замеряли скорость ответа.
GPT-4o в таком режиме работает даже быстрее, чем Claude 3 Haiku, маленькая и шустрая модель. Модель OpenAI — единственная, кто стабильно укладывается в 30 секунд на ответ, хотя вот, например, свежий Sonnet в среднем тратит более 73 секунд.
По идее, уже сегодня, край завтра в каких-нибудь Cursor и его аналогах вы должны заметить ускорение... или нет, если там под капотом уже добавили промпты, которые заставляют генерировать только отдельные куски, которые уже потом вклеиваются в код.