Hacker News 中文摘要

RSS订阅

25行Python实现Jev -- Jev in 25 Lines of Python

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

正文

所有人跟他们的妈都在聊 Jev。Jev 这个,Jev 那个。Twitter 上人人都为 Jev 疯狂,说它是大语言模型和 AI 范式的新前沿。我们不太认同。所以这里就是 25 行 Python 写出来的 Jev。

我叫 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,并跑在旧硬件上;用本地模型做提示路由,按查表、推理、实现等类型分发给不同模型,也是可能的扩展方向。
  • 简单例子确实让原理更容易理解,说明教学价值也是这类文章被讨论的原因之一。