ХабрПостыНовостиМегапосты?

Jev за 25 строк на Python

My name is Jev
My name is Jev

Все кому не лень говорят о Jev. Jev тут, Jev там. Все в Twitter только и говорят о Jev, что это следующее достижение больших языковых моделей и парадигмы ИИ. Мы в этом не уверены. Поэтому вот Jev за 25 строк на Python.

Загрузим модель.

# /// script
# requires-python = ">=3.12"
# dependencies = ["huggingface-hub", "llama-cpp-python", "numpy"]
# ///

import numpy
from llama_cpp import Llama

# Really, you can use any GGUF model from https://huggingface.co/models?library=gguf

model = Llama.from_pretrained(
    repo_id="Qwen/Qwen3-0.6B-GGUF",
    filename="Qwen3-0.6B-Q8_0.gguf",
    n_ctx=512,
    logits_all=True,
    verbose=False,
)

Подготовим промпт и укажем варианты.

labels = ["A", "B", "C"]
choices = ["Legitimate", "Spam", "Phishing"]
email = "Payroll asks for your password on a non-company sign-in page."
options = "\n".join(
    f"{label}. {choice}" for label, choice in zip(labels, choices, strict=True)
)
prompt = f"""<|im_start|>system
Choose one option.<|im_end|>
<|im_start|>user
Email: {email}\n\n{options}<|im_end|>
<|im_start|>assistant
<think>\n\n</think>\n\n"""
model.eval(tokens=model.tokenize(text=prompt.encode(), add_bos=False, special=True))

Выжмем из логитов вероятности. (прим. перев.: логиты — сырые, ненормированные оценки для каждого варианта ответа).

logits = model.scores[model.n_tokens - 1]
token_ids = [model.tokenize(text=label.encode(), add_bos=False)[0] for label in labels]
choice_logits = numpy.asarray([logits[token_id] for token_id in token_ids])
logprobs = choice_logits - numpy.logaddexp.reduce(choice_logits)
probabilities = numpy.exp(logprobs)

for name, scores in (
    ("Logits", choice_logits),
    ("Log probabilities", logprobs),
    ("Probabilities", probabilities),
):
    values = numpy.round(scores.astype(float), 3).tolist()
    print(f"{name}:", dict(zip(choices, values, strict=True)))

# Logits: {'Legitimate': 26.254, 'Spam': 27.262, 'Phishing': 29.614}
# Log probabilities: {'Legitimate': -3.482, 'Spam': -2.474, 'Phishing': -0.122}
# Probabilities: {'Legitimate': 0.031, 'Spam': 0.084, 'Phishing': 0.885}

Вот. Это и есть Jev.

Но нет, вы не понимаете Jev!

Да, мы в курсе.

Но да. Это и есть Jev.

А нам нравится никуда не отправлять ваши данные. Попробуйте NobodyWho.

(заметка: это пародийный пост, вот ссылки на более полные открытые реализации Jev: OpenJev, openjev-sglang и OpenJev on DiffusionGemma.)


Всё, что делает NobodyWho, — опенсорс, поставьте нам звезду на GitHub, чтобы поддержать нас ❤️

Опубликовано 22 сентября 2026 года, автор — Duarte O.Carmo

@ARad
24.09.2026 07:30 UTC
Первоисточник

Комментарии

@Robastik
24.09.2026 05:23 UTC
+3

Звезду в Carmo за опенсорс)

@Jiablero
24.09.2026 06:50 UTC
+1

Делал ровно то же самое, получил ускорение на llm классификаторе на gemma 4 e4b в 3.5 раза (input 500-700 токенов/output 150-200 (в generative варианте)) на vllm.

Я бы на месте автора провел тест согласованность выборов модели на одной задаче в генеративном и логит варианте.

Также бы проверил как влияет перестановка вариантов местами в промпте (мой опыт 22% изменений ответов, при смене порядка выдачи вариантов модели на той же e4b). ChatGPT объясняет это instructed обучением, и тяготением к первому выбору, но я пока не осмысливал и не проверял.

@Bardakan
24.09.2026 07:38 UTC
+2

Jev - это llm пустили под нож, чтобы ускорить работу и удешевить токены. А вы в своем примере используете обычную llm, обернутую в python код. Т.е. никакой речи об экономии или быстрой работе нет и быть не может. Тогда в чем посыл вашей статьи?

@wingerv
24.09.2026 08:50 UTC
0

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

24.09.2026 10:41 UTC
0

Для этого делают софтмакс, словарь токенов надо ограничить вариантами выбора, считая все остальное в -бесконечность. Получается нормированное распределение по вариантам ответа. Т.е. сама задача выбора одного (единственного) токена в ограниченном словаре вариантов ответов и делает вероятность предсказания следующего токена распределением по вариантам ответа.