Jev与DuckDB:在SQL中用自然语言条件
DataHot 速览
TypeSafe AI于2026年9月15日发布Jev模型,它返回带概率的类型化答案而非文本段落,支持是/否、选项和评分三类问题。发布一周内,社区为DuckDB开发了扩展,可用自然语言条件对CSV、Parquet或表进行过滤、分类和打分,约1000行数据耗时约10秒。Jev报告端到端延迟70-500毫秒,输入token价格0.042美元/百万。文章介绍了Jev的机制、DuckDB扩展的工作方式及相关讨论。
为什么值得关注:把LLM式语义判断以类型化、可SQL集成的形式落地到DuckDB分析流程,为数据从业者提供了在数仓内做文本分类和过滤的新路径,并涉及成本、延迟与准确性的工程权衡。
译文
AI 逐段翻译Geertjan Wielenga, Gábor Szárnyas 2026-09-29 | 8 分钟
TL;DR:TypeSafe AI 于 2026 年 9 月 15 日发布了 Jev,一个返回类型化答案而非文本的模型。在十天内,多个社区扩展让你可以用自然语言条件对 DuckDB 行进行过滤、分类和评分。本文介绍 Jev 是什么、这些扩展如何工作,以及关于它们的文章和视频。
假设你有一个包含 50,000 条支持工单的 Parquet 文件,想知道哪些客户在生气。一个 LIKE 模式 找不到这一点。通常的选择是标注数据并训练一个分类器,或者将每一行发送给聊天 LLM 并解析它返回的文本。第一种需要前期投入工作。第二种速度慢,且每行成本更高。
2026 年 9 月 15 日,TypeSafe AI 推出了 Jev,一个用类型化值和概率而不是一段文字来回答这类问题的模型。一周内,Hamilton Ulmer 在 X 上发帖称他构建了一个 DuckDB 扩展,可以在大约十秒内对任意 CSV、Parquet 文件或表中的约 1,000 行进行分类。接下来几天出现了其他 DuckDB 扩展。
本文介绍 Jev 是什么、这些扩展如何工作,以及在哪里可以阅读更多内容。
Jev 是什么
Jev 就是 TypeSafe 所称的 System One 模型:你向它发送一个状态和一组问题,它返回带有校准概率的类型化答案。它从不生成句子。在 发布文章中,创始人 Diogo Almeida(曾在 OpenAI 从事 ChatGPT 背后的研究)将其描述为由前沿智能支持的函数调用。这个名字指的是卡尼曼的快速 System 1 思维,以及经济学家 William Stanley Jevons。
有三种问题类型,每种都对应 SQL 已有的东西:
| Jev 类型 | 它返回什么 | SQL 对应物 |
|---|---|---|
| Noul | 带有概率的是/否判断 | 一个 BOOLEAN 谓词,位于 WHERE |
| Choice | 从固定列表中选择一个选项(最多 255 个) | 一个 ENUM 列,你可以 GROUP BY |
| Score | 有序评分标准上的一个位置 | 一个有序值,你可以 ORDER BY |
TypeSafe 宣称端到端延迟为 70–500 毫秒,每百万输入 token 费用为 0.042 美元,输出 token 免费。请求中的所有问题都会并行评估,因此对一行提出五个问题所花的时间比只问一个多不了多少。发布文章将“对大数据进行 map-reduce”列为目标用例,这正是人们使用 DuckDB 所做的那类工作。
如需独立背景资料,The New Stack 的发布报道涵盖了这轮 4000 万美元的种子轮融资。LangChain 关于用 Jev 构建 harness 的文章展示了它如何融入智能体循环。Hyperstack 的深度剖析在一个开放模型上复现了评分机制,并对照 LangChain 的基准检查了 TypeSafe 的速度声明。请注意,标题中的 190 倍加速数字来自 TypeSafe 自己的工作流评估。
pg-jev 与 DuckDB 移植版
第一个 SQL 集成是针对 Postgres 的。9 月 17 日,Zachi 在 X 上发布了 pg-jev:一个 jev() 函数,可将自然语言条件转换为 WHERE 子句,无需索引,也无需嵌入。他的演示在大约一秒内判断了 129 行,费用不到十分之一美分,你可以在 pg-jev 在线演示中的模拟表上试用。源代码在 GitHub 上。四天后,Actian 聘用了他。
DuckDB 移植版在几天内相继出现。与原版最接近的是 judoaseeta/duckdb-jev,它保留了 pg-jev 的函数名。
安装
除了 jev 社区扩展之外,大多数扩展尚未通过社区扩展仓库分发,因此你需要自行构建它们,并作为未签名扩展加载。在本文其余部分,我们将使用 jev 社区扩展。要安装并加载它,请运行:
INSTALL jevFROMcommunity;LOAD jev; jev 社区扩展目前仅在 DuckDB v1.5.5 中可用。然后设置你的 TypeSafe API 密钥,你可以在注册并充值账户后从 TypeSafe 控制台获取:
SETjev_api_key='...';该扩展必须针对你所运行的确切 DuckDB 版本和平台构建。
一个示例
警告 本文中的所有扩展都会将行内容发送到第三方 API。请勿在你不被允许共享的数据上使用它们。
让我们从使用 person 表进行过滤开始,该表来自 LDBC SF0.1 数据集。
-- Filter: a boolean predicateCREATETABLEpersonASFROM'https://blobs.duckdb.org/data/ldbc-sf0.1-person.parquet';SELECTid,firstName,lastNameFROMpersonWHEREjev(person,'the name is European')LIMIT5;┌────────────────┬───────────┬──────────┐
│ id │ firstName │ lastName │
│ int64 │ varchar │ varchar │
├────────────────┼───────────┼──────────┤
│ 1129 │ Carmen │ Lepland │
│ 10995116278700 │ Joseph │ Anderson │
│ 28587302322727 │ Steve │ Moore │
│ 30786325578904 │ Giuseppe │ Donati │
│ 6597069766983 │ A. C. │ Bos │
└────────────────┴───────────┴──────────┘
在工单系统中,你可以按如下方式对工单进行排名、分类或评分:
-- Rank: a probability you can sort onSELECTsubject,jev_prob(tickets,'the customer is angry')ASpFROMticketsORDERBYpDESCLIMIT20;-- Classify: one of a fixed set of labelsSELECTjev_choice(tickets,'which team should handle this?',['billing','technical','security','sales'])ASteam,count(*)FROMticketsGROUPBY1;-- Score: a position on an ordered rubricSELECTname,jev_score(products,'how luxurious is this product?',['budget','mid-range','premium','luxury'])ASluxuryFROMproductsORDERBYluxuryDESC;因为 jev() 返回布尔值,所以它能与 SQL 的其他部分配合使用。如果你在同一个 age > 40,它会先运行,被它拒绝的行永远不会发送到 API。一个 WHERE 子句中添加一个更廉价的条件,例如 LIMIT 会提前停止扫描,而 jev_max_rows_per_statement 会限制支出。
视频 “I Tested Jev with DuckDB. It's 1.8x Faster Than Haiku.” 演示了在 DuckDB 中使用自然语言 SQL 查询,并将 Jev 的速度与 Claude Haiku 进行比较。1.8 倍这个数字来自一次测试。
DuckDB 扩展
几个人独立构建了这些扩展,他们在批处理、缓存和输出类型方面做出了不同选择。
| 扩展 | 侧重点 | 值得注意的细节 |
|---|---|---|
| judoaseeta/duckdb-jev | pg-jev 的移植版 | 相同的 jev、jev_prob、jev_choice、jev_score API,外加一个按行内容作为键的进程级缓存 |
| recodelabs/duck-jev | 自然语言 WHERE 子句 | 按问题对行进行分组,对重复项只判断一次,跨线程运行批次,并共享一个数据库作用域缓存 |
| prasanthj/duckdb-jev | 吞吐量和生产控制 | 每个请求最多打包 1,000 个判断,跨 DuckDB 数据块流式处理,通过 jev_usage() |
| 报告用量 | 类型化结果 | 添加了 jev_choice、jev_score、jev_noul 和 jev_ask。一个 choice 的选项会变成 ENUM 列类型 |
DuckDB 以最多 2,048 行的块将行传递给扩展,这适合批处理 API 调用。recodelabs 扩展按问题和选项对每个块进行分组,跳过相同的行,并通过 jev_concurrency 个线程将其余行分批发送。它使用指数退避重试 429 和 5xx 错误。
批处理对速度有很大影响。prasanthj 扩展报告称,100 行嵌套 JSON 以每批 25 行发送时中位耗时为 0.211 秒,而一次一行则为 16.8 秒。一次 2,049 行的运行耗时不到一秒。作者指出,这些计时来自一次在合成数据上的本地运行。不过,更大的批次可能会牺牲准确性:pg-jev 的文档报告称,每请求超过大约 20–25 行后准确性会下降,因此请在你自己的数据上测试批次大小。
Colliber 的版本直接使用 Jev 的类型化输出。选项值预先定义,因此结果可以是 DuckDB 的 ENUM,而不是需要解析的文本。prasanthj 构建可以评估嵌套 JSON、STRUCT、LIST 和 ARRAY 值,而无需将其导出到 Python。
在 Hamilton Ulmer 的帖子下的一些回复指出,一旦训练成本被摊销,经过微调的 ModernBERT 仍然更便宜,而且将分类视为嵌入检索在 CPU 上可以达到约每秒 20,000 行。当你没有标注数据且有一个新问题要问时,Jev 最有意义。对于高吞吐量的固定分类任务,训练好的模型可能更便宜、更快速。
结论
Jev 返回一个 BOOLEAN、一个 ENUM 或一个序数分数,而 DuckDB 可以对这三者进行过滤、分组和排序。借助这些扩展,你可以用英语编写条件,并将其与连接、GROUP BY 和窗口函数一起使用。
Jev 处于候补名单后的早期访问阶段,这些扩展才发布几天且未经签名,大多数性能数字来自其作者本人。请从一个小的、非敏感的样本开始,关注你的使用计数器,并在信任这些标签之前与基线进行比较。如果你用 Jev 和 DuckDB 构建了某些东西,扩展作者欢迎在其代码仓库上提交 issue 和 pull request。
延伸阅读
- Introducing System One Models & Jev(TypeSafe AI 的发布帖)
- TypeSafe 推出 Jev,因为顺序 LLM“对计算机完全无用”(The New Stack)
- What Is Jev? A Guide to TypeSafe AI's System One Model(LangChain 博客)
- Jev: TypeSafe AI's First System One Decision Model(Hyperstack)
- I Tested Jev with DuckDB. It's 1.8x Faster Than Haiku.(YouTube)
- Calling Jev from SQL(YouTube)
- pg-jev 发布帖 和 现场演示(Zachi)
- Hamilton Ulmer 的 DuckDB 扩展帖子(X)
这篇内容对你有用吗?
反馈只用于改善内容筛选,不等同于收藏