16个AI函数装进DuckDB,在SQL里就能调大模型
你正在 DuckDB 里查一批用户反馈。你想给每条反馈打个标签(投诉 / 建议 / 咨询),再提取关键信息,最后问问"最近用户在抱怨什么"。
正常的做法:导出 CSV → Python →调 LLM API → 写 prompt → 解析结果 → 导回数据库。三个工具、五次切换、一堆胶水代码。
duckdb-ai 的思路不一样:这些操作,全在 SQL 里完成。
LOAD ai;
-- 给反馈打标签
SELECT id, text, ai_classify(text, '投诉, 建议, 咨询')
FROM user_feedback;
-- 提取关键信息
SELECT id, ai_extract(text, 'product, issue, sentiment')
FROM user_feedback;
-- 直接问数据库问题,它生成 SQL 并执行
SELECT * FROM ai_query_data('最近一周投诉最多的产品是什么?');
没有 Python 脚本,没有 API 调用封装,没有中间格式转换。SQL 查询,LLM 计算,结果直接落表。
● ● ●
这是什么
duckdb-ai 是 DuckDB 的社区扩展,由 Leonardo Vida 开发,7 月 2 日刚刚合入 community-extensions。MIT 协议,C++ 编写。
一句话概括:把大模型的能力变成 DuckDB 的 SQL 函数。
它提供了 16 个 ai_* 函数,覆盖了四个维度:
| 类别 | 函数 | 做什么 |
|---|---|---|
| 文本任务 | `ai_complete`, `ai_summarize`, `ai_classify`, `ai_extract`, `ai_translate`, `ai_redact`, `ai_filter` | 补全、摘要、分类、提取、翻译、脱敏、过滤 |
| 结构化输出 | `ai_complete_json`, `ai_complete_record`, `ai_extract_record` | JSON Schema 校验,直接投射到 DuckDB 列 |
| 嵌入 & 相似度 | `ai_embed`, `ai_similarity`, `ai_rerank` | 向量嵌入(自动分批)、余弦相似度、重排序 |
| SQL 生成 | `ai_sql`, `ai_query_data` | 自然语言 → 只读 SELECT,解析器验证后才执行 |
外加 ai_usage() 查看用量和成本,ai_agg() 和 ai_summarize_agg() 做聚合级别的 AI 计算。
● ● ●
怎么工作
核心思路很简单:扩展在 DuckDB 的查询执行引擎里注册了一批标量函数和聚合函数。每个函数调用时,扩展把输入发给配置好的 LLM provider,拿回结果,返回给查询。
Provider 的选择通过 DuckDB 的 Secret 机制管理,不是硬编码在 SQL 参数里:
-- 本地 Ollama(免费,数据不出机器)
SET duckdb_ai_provider = 'ollama';
SET duckdb_ai_model = 'gemma4:e4b';
-- 或者用 OpenAI,密钥存 Secret
CREATE SECRET openai_ai (
TYPE duckdb_ai,
AI_PROVIDER 'openai',
API_KEY 'sk-...',
MODEL 'gpt-4o-mini'
);
支持的 provider 有 10+ 个:Ollama、OpenAI、Azure OpenAI、Anthropic、Gemini、Mistral、DeepSeek、OpenRouter、Databricks、Snowflake Cortex、Z.ai,以及任何 OpenAI 兼容的本地服务器(vLLM、LiteLLM 等)。
扩展本身加载时不发任何网络请求 —— 只有执行 ai_* 函数时才会连接 provider。
● ● ●
几个值得注意的设计
1. 结构化输出直接落表
ai_complete_record 和 ai_extract_record 会按你提供的 JSON Schema 校验模型输出,然后自动展开成 DuckDB 的 STRUCT 列。这意味着你可以写:
SELECT ai_extract_record(
review_text,
schema := '{"type":"object","properties":{"sentiment":{"type":"string"},"score":{"type":"integer"}}}'
) FROM reviews;
结果直接是 {sentiment: 'positive', score: 8},不需要手动 JSON 解析。
2. 嵌入自动分批
ai_embed 不会逐行调 API —— 它会按 chunk 自动攒批,一次请求处理多条数据。这在处理大量文本嵌入时能省不少 API 开销。
3. SQL 生成有安全门
ai_sql 和 ai_query_data 生成的 SQL 必须通过 DuckDB 的解析器验证才会执行,而且只允许 SELECT 语句。你问"删掉所有订单",它不会执行 DROP TABLE。
这不是 prompt 里说"请只生成 SELECT"—— 是代码层的硬约束。
● ● ●
性能与可控性
扩展内置了一套并发和节流机制:
- 并发上限(
duckdb_ai_max_concurrency) - 请求速率控制(
duckdb_ai_requests_per_minute) - Token 速率预算(
duckdb_ai_tokens_per_minute) - 失败重试 + 退避
- 可选的响应缓存和 provider 端 prompt 缓存
还有网络出口白名单(duckdb_ai_allowed_domains),防止意外调用不该调的服务。
用量追踪也很直接:
SELECT * FROM ai_usage(); -- 返回每次调用的 provider、model、tokens、估计成本、缓存命中、重试次数
● ● ●
当前状态
刚合入 community-extensions,还不能 INSTALL ai。 我试了一下:
D INSTALL ai FROM community; -- HTTP 404: extension not yet published
PR 是 7 月 2 日中午合的(#2169),社区的构建流水线还没把二进制推到 CDN。按 community-extensions 的正常节奏,应该 1-2 天内可安装。
在此之前可以从源码构建(需要 C++ toolchain + CMake + ninja):
git clone https://github.com/leonardovida/duckdb-ai.git cd duckdb-ai GEN=ninja make release
目前版本 0.3.1,代码库非常新(7 月 1 日创建),但迭代速度很快 —— 两天发了三个版本。
● ● ●
跟 pgvector / PostgresML 比
DuckDB 的 AI 扩展不是第一个"在数据库里跑 AI"的尝试,但定位很不同:
| 维度 | duckdb-ai | pgvector | PostgresML |
|---|---|---|---|
| 定位 | 分析型,嵌入查询流 | OLTP + 向量搜索 | ML 训练+推理平台 |
| AI 范围 | 文本 + 嵌入 + SQL 生成 | 仅向量存储/搜索 | 完整 ML 流水线 |
| Provider | 10+ LLM provider | N/A(存向量) | 自托管模型 |
| 部署复杂度 | 一个扩展文件 | 一个扩展 | 完整服务栈 |
| 适用场景 | 批量文本处理、临时分析 | 生产级向量检索 | 模型训练+在线推理 |
duckdb-ai 的优势在于分析场景的零摩擦:你不需要把数据导出到 Python,不需要写 API 封装,不需要管理另一个服务。它适合"跑一次分析"或"做一批文本处理"的场景。
劣势也很明显:它不是为高并发在线服务设计的。DuckDB 本身是 OLAP 引擎,不适合嵌入到 API 服务的请求路径里。
● ● ●
局限
- 01还不可安装:
INSTALL ai FROM community目前 404,需要等构建流水线跑通。 - 02v0.3.1,早期阶段:两天前创建的 repo,API 可能会变。
- 03非官方扩展:一个维护者的社区项目,不是 DuckDB Labs 出品。稳定性取决于维护者的持续投入。
- 04LLM 延迟:每个
ai_*调用都是一次网络请求。查询 1000 行 = 1000 次 API 调用。虽然做了并发控制,但延迟是跑不掉的。 - 05不支持 WASM:
excluded_platforms: wasm_mvp;wasm_eh;wasm_threads—— browser 里的 DuckDB-WASM 用不了。 - 06依赖外部 LLM 成本:本地用 Ollama 免费,但云 provider 按 token 计费。
ai_usage()可以追踪,但成本是你自己的。
● ● ●
为什么值得关注
DuckDB 这两年的扩展策略很明确:让社区往这个"小分析引擎"里塞各种能力。从 Iceberg 到 Delta Lake,从 Spatial 到 Lance,现在是 AI。
这个方向的价值在于降低分析工作的上下文切换成本。一个分析师处理文本数据的典型流程是:SQL 查数据 → Python 调 LLM → 回写数据库 → 再查。每次切换都丢 context。
duckdb-ai 把这个流程压缩成一个 SQL 查询。不需要换工具,不需要写胶水代码。
当然,这不意味着"AI in SQL"是银弹。复杂 prompt 工程、多步推理、agent 循环 —— 这些还是 Python 更适合。但对于"给 5000 条评论分类""提取订单里的关键信息""批量生成摘要"这类操作,SQL 一站式确实比到处切工具舒服。
等社区构建流水线把二进制推上去,试试 INSTALL ai FROM community 能不能跑通。值得盯着。
链接:
- 仓库: github.com/leonardovida/duckdb-ai
- 社区扩展 PR: github.com/duckdb/community-extensions/pull/2169
- 扩展描述: github.com/duckdb/community-extensions/blob/main/extensions/ai/description.yml