Jevchat — чат-модель на основе Jev decision model

· 2 мин чтения
llm sampling chat python cli
📂 Исходный код на GitHub

Превращает Jev decision model от TypeSafe в чат-модель с посимвольной генерацией и различными стратегиями сэмплирования

Jevchat — чат-модель на основе Jev decision model

Jevchat

jevchat — это Python-утилита, которая превращает decision model Jev от TypeSafe в полноценный чат-модель. Вместо обычного автодополнения текста она генерирует ответ посимвольно: на каждом шаге задаёт Jev вопрос: «Какой символ дальше?» — получает вероятности для каждого варианта из алфавита, сэмплирует следующий символ и повторяет, пока не будет получен STOP.

Идея проекта — эксперимент ради удовольствия. Стоимость генерации неоправданно высокая, но результаты забавные.

Установка и запуск

poetry install

API-ключ Jev нужно положить в файл .env рядом с pyproject.toml:

api_key="..."

Также принимаются переменные окружения JEV_API_KEY и TYPESAFE_API_KEY. Значения в .env приоритетнее.

Базовые команды:

poetry run jevchat                          # интерактивный чат
poetry run jevchat ask "do people need water?"  # одиночный вопрос
poetry run jevchat alphabets                # список доступных алфавитов
poetry run jevchat bench                    # сравнение всех режимов

Ответ отображается в реальном времени с панелью статистики: символы/сек, символы/сек, миллисекунды на запрос, время генерации. Можно наблюдать, как сэмплер рисует следующий символ из распределения вероятностей.

Ctrl-C останавливает генерацию (первый раз — дожидается завершения текущего запроса и сохраняет частичный ответ, второй — прерывает немедленно).

Стратегии сэмплирования

Ключевая идея — комбинировать способ получения распределения (-s/--strategy) с набором вариантов (-a/--alphabet).

choice (по умолчанию)

Задаёт один вопрос по всему алфавиту. Jev возвращает вероятность для каждого символа.

poetry run jevchat -s choice ask "how many eyes do people have?"

С флагом --ensemble N отправляет N перестановок одного вопроса параллельно и усредняет результаты — компенсируя позиционное смещение модели.

bisect

Сортирует алфавит и задаёт бинарные вопросы (раньше/позже), пока группа не сузится, затем делает финальный выбор внутри неё.

poetry run jevchat -s bisect ask "how many eyes do people have?"
poetry run jevchat -s bisect --bisect-cutoff 32 --no-bisect-swap ask "..."

buckets

Разбивает алфавит на группы, каждая с экранированием OTHER. Единственная стратегия, работающая с алфавитами >255 символов.

poetry run jevchat -a words1k -s buckets ask "what colour is snow?"

refine

Комбинация: buckets, затем уточняющий вопрос по победителям, затем rescoring nucleus. Удваивает вероятность правильного символа и увеличивает разрешение словаря примерно в 19 раз.

poetry run jevchat -a words1k -s refine ask "where do fish live?"

Алфавиты

Алфавит Описание Размер
lower26 a-z + пробел 27
ascii полный ASCII 95
tokens целые токены ~300
words1k 1000 слов 1001
bpe2k BPE-токены (2K) 2048
bpe5k BPE-токены (5K) 5120
poetry run jevchat -a lower26 -t 0 ask "what is 2+2?"
poetry run jevchat -a ascii -t 0 ask "what is 2+2?"
poetry run jevchat -a tokens -t 0 ask "do people need water?"

Алфавиты words1k, bpe2k, bpe5k превышают 255 вариантов и требуют стратегию buckets.

Presentation modes

Два варианта того, что именно Jev оценивает:

  • symbol — опции символы (по умолчанию): 'a', 'i', ' the'. Модель должна сама «додумать» контекст при сопоставлении.
  • hypothesis — опции уже готовые тексты. Jev оценивает полностью сформированные строки, что значительно повышает точность: top-1 утраивается, вероятность правильного символа удваивается.
poetry run jevchat -p hypothesis --window 40 ask "what colour is snow?"
poetry run jevchat -p symbol ask "what colour is snow?"

Beam search

Вместо жёткого посимвольного выбора можно держать несколько кандидатов одновременно:

poetry run jevchat -b 3 ask "what is the opposite of hot?"

При ширине >1 отключаются temperature, top_p, top_k — лучи ранжируются по вероятности.

Комбинации

Стратегии, алфавиты и параметры свободно комбинируются:

poetry run jevchat -a tokens -s bisect --bisect-cutoff 20 ask "do people need water?"
poetry run jevchat -a ascii -s choice --ensemble 12 -t 0.2 --repetition-penalty 1.0 \
    ask "what colour is grass?"

Тесты

158 тестов, все оффлайн — эмуляция API-клиента и httpx.MockTransport. API-ключ не нужен.

poetry run pytest

jevchat bench — единственная команда, реально обращаемая к API.

Источник: https://github.com/kyle-pena-nlp/jevchat/