所有人都在谈论杰夫(Jev),推特上到处是它的消息,称其是大语言模型与 AI 范式的新前沿。我们并不这样认为,因此用 25 行 Python 展示 Jev。先加载模型,通过 llamacpp 从通义千问(Qwen)/Qwen3-0.6B-GGUF 获取权重,设置 nctx 为 512。接着加载提示并定义选项,将邮件分类为合法、垃圾或钓鱼,构造对话格式的输入。
正文
所有人跟他们的妈都在聊 Jev。Jev 这个,Jev 那个。Twitter 上人人都为 Jev 疯狂,说它是大语言模型和 AI 范式的新前沿。我们不太认同。所以这里就是 25 行 Python 写出来的 Jev。

加载模型。
```
/// script
requires-python = ">=3.12"
dependencies = ["huggingface-hub", "llama-cpp-python", "numpy"]
///
import numpy from llama_cpp import Llama
其实你可以用 https://huggingface.co/models?library=gguf 上任何 GGUF 模型
model = Llama.frompretrained( repoid="Qwen/Qwen3-0.6B-GGUF", filename="Qwen3-0.6B-Q80.gguf", nctx=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 揉成概率。
``` logits = model.scores[model.ntokens - 1] tokenids = [model.tokenize(text=label.encode(), addbos=False)[0] for label in labels] choicelogits = numpy.asarray([logits[tokenid] for tokenid in tokenids]) logprobs = choicelogits - 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!
对,我们知道。
- 我们没管它叫「系统一决策模型」。
- 我们没调 API。
- 我们没造一堆合成数据。
- 我们没用「校准决策强化学习」(RLCD)去训练模型、校准决策和概率(哪怕这些概率并不总是准的)。
但是,没错。这就是 Jev。
- 它做分类:拿到一个带选项的提示,输出概率。
- 它快。
- 它跑在本地。
- 你不把数据发到任何别的地方。
而我们就喜欢不把你的数据发到别的地方。来看看 NobodyWho。
(注:这是一篇恶搞博客。想看更好、更完整的 Jev 开源实现,见 OpenJev、openjev-sglang 和 OpenJev on DiffusionGemma。)
评论
讨论整体偏质疑:多数人认为这篇“用少量代码做出类似 Jev 的分类器”的演示回避了延迟、算力、错误率、格式稳定性和输出质量等关键对比,且结尾自认戏仿;少数人认为简化思路仍有启发,尤其是结构化输出、词元约束和模型路由。分歧主轴是:极简分类器究竟是可用的工程替代,还是只证明了玩具级可行性。
认为缺少与 Jev 的延迟、算力、错误率和基准对比
- 只讲原理不够,必须给出延迟、算力、错误率、输出能否被应用解析,以及有意义的基准;例如能否在 200 毫秒内同时处理 45 个问题、畸形输出是否为零。(较多人)
- “快”是相对概念,若不说明和 Jev 相比快多少,甚至慢一个数量级,就不能称快。(较多人) > 如果相对 Jev 慢了一百倍,就不该叫它“快”。(@onion2k)
认为这只是像 Jev,不是 Jev
- 真正让 Jev 获得关注的是输出质量足够好;用几行代码调库搭出的东西即使流程相似,输出也可能毫无价值。(较多人)
- 把大量底层库抽象算进“少量代码”的标题党令人反感。(较多人)
- 对 Jev 作者不得不解释“一百个做得更好的小细节加起来为何构成更好产品”表示同情。(少数人) > 你搭出来的是类似 Jev 的东西,而不是 Jev;Jev 走红恰恰因为输出足够好。(@shawabawa3)
认为文章结尾自认戏仿,标题就该标明玩笑
- 既然文末说是戏仿,Hacker News 标题就应说明这是玩笑,否则容易误导读者。(少数人)
认为直接从聊天模型取对数概率做标签不可靠
- 聊天模型被训练来输出散文,直接看首词元概率会被它“本来想说的话”稀释;更稳妥的是结构化输出,直接生成预定义的多词元标签,并可给推理预算或让模型输出概率,但不应过度依赖概率。(较多人) > 直接盯着对数概率很别扭,因为聊天模型本来是想写散文的。(@sigmoid10)
认为缺少类型与格式保证
- 需要词元级约束,把输出限制在预定义词元池或 JSON Schema 内;这能避免格式畸形,但不等于消除幻觉。(较多人) > 保证类型不代表模型不会幻觉,不过这是另一个话题。(@pjankiewicz)
认为分类器不该一概排斥推理
- 速度和成本是明显理由,但要不要推理是取舍,不能默认分类任务就不需要推理。(少数人) > 不理解为什么分类器就不该要“推理”,这难道不是取舍吗?(@brap)
有价值的补充
- antirez 指出,大语言模型的掩码注意力意味着把选项放在正文之前,模型已经知道要找什么,并能用更多词元建立针对任务的状态;系统提示里加几个例子有助于校准,重复问题也有帮助。
- 结构化输出比只看首词元概率更稳:让模型直接生成“合法/垃圾/钓鱼”这类多词元标签,背后机制相近,但避免模型其实想说“钓鱼可能性大,所以选第三项”却让第一项在首词元概率最高。
- 小模型也有空间:Qwen 3.5 0.8B 在基础图像分类和问答(含 OCR)上表现不错,输出结构化 JSON,在 Mac 上单次约 250 毫秒,准确率尚可。
- 有人已托管类似 26B 参数的 Jev 风格演示,提供类型安全 API,并跑在旧硬件上;用本地模型做提示路由,按查表、推理、实现等类型分发给不同模型,也是可能的扩展方向。
- 简单例子确实让原理更容易理解,说明教学价值也是这类文章被讨论的原因之一。