返回 文章 apply CMS 文章

Jev 与 Python AI SDK:用分类器模型做狭窄决策

Jev 是一个基于 LLM 的通用分类器,Python AI SDK 让你用 evaluate() 快速调用它做狭窄决策。

JevPythonAI SDK分类器
成长分 / 100 68 综合收获、行动、留存与影响

Jev 与 Python AI SDK:用分类器模型做狭窄决策
为什么值得读了解 Jev 这种新型 AI 模型与传统 LLM 和经典分类器的区别。

学习如何用 Python AI SDK 的 evaluate() API 快速集成 Jev。

关键洞察
  1. Jev 是一个通用分类器,将 LLM 转化为无需特定领域训练的分类器。
  2. Jev 便宜、快速,返回结构化 JSON 而非生成文本,答案符合问题中定义的类型和选项。
  3. 官方 API 只有一个 evaluate() 函数,支持 ChoiceQuestion、ScoreQuestion 和 NoulQuestion 三种问题类型。
转成行动

深入阅读

正文与原文对照

原文保真覆盖:全文原文字符:8344

不可能没听说过 Jev。似乎每个人都在以某种方式摆弄它,从用它来做交易决策 (还能出什么岔子呢?) 到用它生成 UI (也许我们真搞出点名堂了!)。

Jev 是一种新型 AI 模型。你向它输入数据,并问它一组多项选择题,它会给出答案以及它对每个答案的置信度。就像任何其他模型一样,Jev 会犯错,而且一定会犯错,但它犯错很快。

归根结底:Jev 是为做出狭窄决策而构建的。它对你的用例来说是否足够准确,这需要你自己测试。

Vercel 的 Python 团队的工作,是让 Python 开发者能轻松摆弄 Jev,以及其他一些事情。所以,请欢迎最新发布的 AI SDK for Python。

用 uv add ai 安装它

以使用新的实验性 evaluate()

API,它直接与 Jev 的神经系统对话。然后创建一个 AI Gateway key,设置 AI_GATEWAY_API_KEY

,并试试这个完整示例:

import asyncio
import aifrom ai.ops import experimental as jev
async def main(): result = await jev.evaluate( ai.get_model("typesafe-ai/jev"), "You're Neil deGrasse Tyson", {"bigger": jev.ChoiceQuestion( instructions="Which is bigger, the Sun or the Earth?", criteria={"Sun": None, "Earth": None}, )}, ) print(result.value["bigger"])
if __name__ == "__main__": asyncio.run(main())

让我们从 Jev 绝对不可能搞错的事情开始。

现在,我想通过几个例子来解释 Jev 是什么,以及如何让它为你所用。一个例子很好,另一个很蠢。问问 Jev 哪个是哪个。让我们玩得开心点!

复制标题链接Jev 五分钟讲解

Jev 是一个通用分类器。

分类器是经典机器学习的基本构件。假设你想要一个垃圾邮件过滤器。你在大量电子邮件上训练一个分类器,每封邮件都标记为垃圾邮件或非垃圾邮件,然后它学会判断新收到的邮件是否看起来像垃圾邮件。

问题是,对于每一个新的分类任务,你都必须收集和标记新数据,然后在其上训练一个新的分类器,为该任务调整其权重。但你知道还有什么有权重吗?大型语言模型!所以 Jev 背后的团队想出了如何将 LLM 变成一个分类器,你不需要为特定领域训练它,因为它已经在广泛的人类知识上训练过了。

虽然它最初是一个 LLM,但 Jev 仍然表现得像一个分类器。它便宜、快速,并且返回结构化的 JSON 而不是生成文本。它的答案符合你在问题中定义的类型和选项。

复制标题链接API

Jev 的官方 API再简单不过了,为了保持这种简单性,我们在 Python AI SDK 中几乎逐字实现了它。

只有一个函数 evaluate()

,以及几个支持类型。该函数接受一个模型、状态(可以是简单字符串或复杂 JSON)和一个问题映射。问题可以是 ChoiceQuestion

(选择一个答案)、ScoreQuestion

(在你定义的量表上对状态评分)或 NoulQuestion

(估计某个陈述为真的概率)的实例。

完整的 API 参考,请让你的代理查阅文档。到目前为止,我们应该对 Jev 是什么以及如何使用它有了很好的了解。是时候看看我们能用它构建什么了!

复制标题链接示例 1:Python 还是英语?

这是一个使用 Jev 的合理示例:字面意义上作为分类器。

大约一年前,我有一个想法,让 Python REPL 变得代理化。我希望它有出色的用户体验,并认为如果 REPL 能判断我输入的是英语还是 Python,而无需我在聊天和代码之间显式切换,那会很酷。

我需要一个分类器,所以我花了两天时间在随机选择的 Python 代码和英语文本上训练自己的分类器。

经过大量的汗水和愚蠢的 Opus 4.1 token 之后,我得出结论,我不够好,无法为 Python 与英语制作一个可靠的分类器。UI 感觉很不稳定:输入 if i

会将其高亮为 Python,if i i

会将其切换为英语,而 if i is

又会将其切换回 Python。看似非常简单的问题,结果却是一个非常难的问题。

让我们看看 Jev 的表现:

这些是 Jev 对“这看起来像英语还是 Python?”的实际响应轨迹。背后的代码并不特别有趣;它基本上就是本文开头的代码片段,只是换了不同的问题。

更有趣的是 Jev 能否解决我的 REPL 问题。虽然它似乎比我手写的分类器表现好得多,但仍然存在差距。例如,"what's" + " up

对 Jev 来说看起来像英语,而对我来说,这很明显是一个部分输入的 Python 表达式。

复制标题链接示例 2:Jev 编写 Python 代码

不如我们退一步,让 Jev 像 LLM 一样生成文本怎么样?Jev 不会写字,所以让它打字的一种方法是让它一个字母一个字母地打。每一步,它从一组字母、标点和空白字符中选择下一个字符。另一种方法是从一个包含 N 个英语单词的词汇表中一次选择一个单词。

当我看到这个时,我立刻知道我必须测试一下 Jev 编写 Python 代码的能力。

我的第一次尝试使用了“字母 + Python 关键字 + 空白字符”的方法,但我很快意识到 Jev 几乎无法用这种方式打出一个 if 语句。唯一能从中得到任何合理结果的方法是让它生成程序的抽象语法树(AST)。

思路如下:

获取用户的提示,并使用 LLM(本例中为 GPT-5.6)将其扩展为给 Jev 的具体指令集。我发现如果没有详细的“计划”,Jev 连基本任务都难以实现。

让 Jev 通过一系列选择来构建 Python AST。每一步,向它展示当前程序,标记正在填充的字段,并提供可能的后续节点,如函数调用、算术运算或变量。每个选项都附带其将生成的代码预览。

将每个选择应用到树上,并将其渲染回 Python。宿主代码处理标点和缩进;Jev 决定程序的整体结构和内容。重复直到 Jev 完成树。

我确实用这种方法让 Jev 生成了语法有效(但仍然大多不正确)的 Python 代码。但如你所见,让分类器完成 LLM 的工作相当具有挑战性。如果你认为你能做得更好,源代码在 GitHub 上。

复制标题链接试试 Jev

两个实验都没有完全达到我的期望,但我仍然对 Jev 感到兴奋。我们才刚刚开始探索这类新型模型的能力!

今天就使用 Python 版 AI SDK 试试,并告诉我们你构建了什么。你只需要 uv add ai 和一个 AI Gateway 密钥。这里有一个可直接复制粘贴给你的编码代理的提示:

使用 Vercel 的 Python 版 AI SDK 为 Jev 创建一个最小化的游乐场。使用 uv(Python 3.12 或更高版本)初始化项目,并用 uv add ai 安装 SDK。使用 ai.get_model("typesafe-ai/jev")。编写 main.py,在循环中逐行读取输入,调用 ai.ops.experimental.evaluate() 并传入 ChoiceQuestion 将每一行分类为 Python 或英语,并打印选择、概率、置信度和延迟。按 Ctrl+C 干净退出。SDK 文档:https://ai-python.dev/docs/reference/ops#experimentalevaluate 提示用户创建 AI Gateway 密钥,并解释如何设置 AI_GATEWAY_API_KEY 环境变量。之后,用户可以运行 uv run python main.py。网关密钥设置文档:https://vercel.com/docs/ai-gateway/authentication-and-byok#quick-start