jevchat: чат-бот, который собирает ответ по одному символу через модель Jev

jevchat: чат-бот, который собирает ответ по одному символу через модель Jev

Автор опубликовал на GitHub проект jevchat, чат-бот поверх модели Jev, устроенный иначе, чем обычные языковые модели. На каждом шаге jevchat задаёт Jev один и тот же вопрос: какой символ должен идти дальше, если учитывать вопрос пользователя и уже написанную часть ответа. Jev в ответ выдаёт вероятность для каждого варианта из выбранного алфавита (включая опцию «остановиться»), сэмплер вытягивает следующий символ из этого распределения, символ дописывается к ответу, и цикл повторяется, пока не выпадет символ остановки.

В проекте несколько алфавитов (в том числе усечённые списки токенов) и несколько стратегий сэмплирования. Стратегия choice задаёт один вопрос сразу по всему алфавиту. Стратегия bisect сортирует алфавит и сужает его серией вопросов «раньше/позже», по умолчанию, до групп по 20 символов, и только внутри такой группы задаёт один вопрос выбора. Стратегия buckets делит алфавит на много вопросов с опцией «другое», по словам автора, это единственная стратегия, способная работать с алфавитом больше 255 символов. Стратегия refine сначала прогоняет buckets, затем задаёт вопрос по победителям и пересчитывает итоговое распределение, по данным автора, это удваивает вероятность, приходящуюся на правильный символ, и примерно в 19 раз повышает разрешение словаря по сравнению с одним buckets.

Отдельно автор описывает два способа предъявлять Jev варианты ответа. В режиме symbol модели показывают сами символы-кандидаты («a», «i», « the» и т.д.), и ей приходится мысленно присоединять вариант к уже написанному тексту, прежде чем его оценивать. В режиме hypothesis, который используется по умолчанию, Jev вместо этого сразу видит готовые варианты продолжения текста целиком, присоединение уже сделано за неё. По словам автора, это самое крупное отдельное улучшение проекта: на алфавитах из отдельных символов оно примерно утраивает точность попадания в правильный символ с первой попытки и удваивает долю вероятности, приходящуюся на верный символ, при этом требуя меньше входных токенов, чем вариант symbol с его опциональными описаниями.

jevchat также умеет держать несколько параллельных вариантов ответа (лучевой поиск) вместо сборки по одному символу; при ширине луча больше 1 температура, top_p и top_k перестают применяться, потому что варианты в этом режиме ранжируются по вероятности, а не сэмплируются из распределения. Во время генерации в интерфейсе показывается панель с метриками в реальном времени: скорость генерации в символах и знаках в секунду, время одного обращения к API в миллисекундах и несколько верхних по вероятности символов на последнем шаге, видно, из какого распределения сэмплер тянет следующий символ. Первое нажатие Ctrl-C останавливает генерацию, дожидаясь ответа на уже отправленный запрос, и сохраняет частичный ответ; повторное нажатие прерывает работу немедленно.

Сам автор называет проект экспериментом ради интереса: стоимость такого способа генерации он описывает как «практически неудобную», а получающиеся ответы, «уморительными», хотя ни одного примера ответа в тексте не приводит. Он также пишет, что весь проект, «эксперимент, ускоренный с помощью Claude»: он описал алгоритмы сэмплирования и стратегии, а реализовала их модель. Тестовый набор проекта, 158 офлайн-тестов без обращения к сети и без API-ключа, проверяющих цикл генерации через подставной клиент и мок HTTP-транспорта.

Ключевые факты

  • jevchat, чат-бот-обёртка над моделью Jev, которая на каждом шаге спрашивает у неё вероятность следующего символа ответа и сэмплирует его из этого распределения, пока не выпадет символ остановки.
  • Доступны разные алфавиты (включая усечённые списки токенов) и стратегии сэмплирования: choice (один вопрос по всему алфавиту), bisect (сужение группами по умолчанию по 20 символов), buckets (единственная стратегия для алфавитов больше 255 символов) и refine (buckets плюс пересчёт, по словам автора, вдвое выше вероятность правильного символа и рост разрешения словаря примерно в 19 раз).
  • Показ Jev вариантов ответа целиком (режим hypothesis, по умолчанию) вместо отдельных символов-кандидатов (режим symbol) автор называет главным улучшением проекта: примерно втрое выше точность первого попадания и вдвое больше вероятностной массы на правильном символе на алфавитах из отдельных символов.
  • Поддерживается лучевой поиск (несколько параллельных вариантов ответа), при котором температура и top_p/top_k перестают действовать, живой счётчик скорости генерации и двухступенчатая отмена по Ctrl-C, первое нажатие сохраняет частичный ответ, второе прерывает немедленно.
  • Автор описывает проект как шуточный, «ускоренный с помощью Claude» эксперимент с «практически неудобной» стоимостью; код покрыт 158 офлайн-тестами без обращения к реальному API.

Почему это важно

jevchat переворачивает обычную схему обращения к языковой модели: вместо стандартной генерации токенов через логиты автор превращает каждый шаг ответа в отдельный вопрос модели Jev с несколькими вариантами и явной вероятностью для каждого. Проект наглядно показывает, насколько сильно формат постановки вопроса модели влияет на качество: простая смена способа предъявления вариантов (готовый текст целиком вместо голого символа) дала, по словам автора, кратный прирост точности без изменения самой модели.

Кому это важно

Разработчикам, которые строят инструменты поверх моделей без доступа к логитам или к обычному API генерации текста, а не только к отдельным вопросам с ограниченным набором ответов. Также интересно всем, кто изучает, как формулировка запроса и представление вариантов ответа (символ против готовой гипотезы) меняют качество результата модели.

Как это применить

Проект, открытый исходный код на GitHub, устанавливается через poetry (poetry install), ключ API кладётся в файл .env рядом с pyproject.toml. Доступны интерактивный чат (poetry run jevchat), разовый вопрос (jevchat ask), список алфавитов (jevchat alphabets) и сравнение режимов (jevchat bench). Стратегия и алфавит задаются флагами -s/--strategy и -a/--alphabet, способ предъявления вариантов, флагом -p/--presentation, ширина луча, флагом -b, температура, флагом -t. В интерактивном чате есть команды /help, /alphabet, /temp, /stop-bias, /reset, /stats, /exit.

Можно ли доверять

Все цифры и оценки (кратный прирост точности, удвоение вероятности, рост разрешения словаря), самоотчёт автора проекта, без независимой проверки, внешнего бенчмарка или опубликованных примеров ответов. Что именно представляет собой модель Jev, в тексте не поясняется, а заявленные «уморительные» результаты не сопровождаются ни одним конкретным примером. 158 офлайн-тестов проверяют логику самого кода (подставной клиент, мок HTTP-транспорта), а не качество генерируемых моделью ответов.

Риски и подводные камни

Подход требует отдельного обращения к API на каждый символ (а для некоторых стратегий, на несколько символов сразу), поэтому стоимость и задержка растут быстрее, чем при обычной генерации текста; сам автор прямо называет её «практически неудобной». Поскольку модель Jev нигде не идентифицирована, результаты нельзя воспроизвести без доступа именно к ней, а заявленные автором улучшения нельзя проверить сторонними средствами.

«Оценивай грамматику и орфографию по всей строке целиком, а не по одному варианту самому по себе.»

— из прежней версии инструкций проекта для Jev в режиме symbol (по словам автора, сейчас формулировка уже другая)