realZachi/pg-jev
Ask your Postgres tables questions in plain language. A PostgreSQL extension powered by TypeSafe's Jev.
pg-jev — PostgreSQL 内部的自然语言查询
pg-jev 是一个 PostgreSQL 扩展,让您可以使用由名为 Jev (来自 TypeSafe) 的 AI 模型驱动的自然语言条件,来筛选、排序和分类数据表中的行。您无需编写 WHERE age > 40 AND country = 'France',而是可以编写 WHERE jev(people, 'the name is European')。
功能说明
它新增了 SQL 函数,可根据您以自然语言编写的条件来判断每一行:
jev(row, 'condition')— 返回 true/false,可用于WHERE子句jev_prob(row, 'condition')— 返回该行符合条件的概率 (0–1)jev_choice(row, 'question', options)— 从列表中选择最可能的选项 (例如:哪个团队应该处理此工单)jev_score(row, 'question', levels)— 在有序量表上对行进行排名 (例如:此产品的奢华程度)
由于这些是普通的 SQL 函数,它们可以与其他所有功能组合使用:joins、GROUP BY、ORDER BY、LIMIT 以及其他 WHERE 谓词。
运作原理
- 当您在数据表上调用
jev()时,扩展会启动 read-ahead:它会以物理顺序串流读取数据表,并对行进行批处理。 - 每一行会被打包成 每 API 请求 20 行 的单一共享状态,每行对应一个是非题。模型会平行评估所有 20 个问题,这分摊了每个请求的开销 (每批 20 行约 175 个 token,而单行约 435 个)。
- 多个请求通过持久的 HTTPS 连接并发执行。一旦回答了足够的行数,
LIMIT就会停止 read-ahead,且同一个WHERE中的较便宜谓词会先执行,因此被拒绝的行永远不会发送到 API。 - 回答会针对该会话的 行内容和问题进行缓存,因此重新执行查询或按概率排序在第二次执行时几乎是免费的。
在 2,000 行的数据表上测量:第一次执行约 3.5 秒,API 成本约 $0.012;第二次执行约 50 毫秒 (缓存);在新条件下执行 LIMIT 3 约 0.6 秒。
关键设计选择
- 无索引、无嵌入、无向量列 — 设计上就是全表扫描;执行器询问的每一行都会发送到 API。
- 批次大小 20 是一个刻意的准确度权衡:根据基准测试,1–20 行的批次准确率为 100%,但 40 行的批次降至 92–98%,80 行的批次降至 77–94%。
- 校准概率,而非生成文本 — 模型为每一行返回一个概率,因此模糊的情况会落在 0.5 附近,您可以调整阈值。
- 本地服务器支持 —
jev.api_url可以指向本地的 Jev 兼容服务器,因此数据永远不会离开您的网络,也没有按行计费的问题。
安装与需求
需要 PostgreSQL 14–17 以及 plpython3u、超级用户权限和 TypeSafe API 密钥。无法提供超级用户或 plpython3u 的托管主机 (如 Supabase、Neon、RDS) 无法执行此功能。可通过 PGXN、源代码、Docker 或自动化设置的 AI 代理技能进行安装。
注意事项
- 行内容会发送到第三方 API (除非您运行本地服务器) — 请勿在无法共享的数据上使用。
- 回答缓存存在于每个后端会话中,并会随着唯一的行/问题对而增加;
jev_cache_clear()可重置它。 plpython3u是一种不受信任的语言,因此函数会以服务器的操作系统权限执行。- 针对共享部署设有支出限制 (
jev.max_rows_per_statement,jev.max_chars_per_statement)。
总结
pg-jev 是自然语言与 SQL 之间实用且设计精良的桥梁 — 当您想要根据 意义 (情绪、类别、语气) 而非精确值来筛选或排序数据,并且愿意支付少量的每行 API 成本并接受全表扫描时,它非常有用。
相关
- 项目
- 项目
- 项目
- 项目
- 项目