sqlwrite
把 AI 直接集成进 SQLite 内核,用自然语言替代 SQL 查询
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
把 AI 直接集成进 SQLite 内核,用自然语言替代 SQL 查询
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下:你的产品经理想查"过去三个月每个销售区域的营收排名",她不会写 SQL,也不想打扰你——直接问 AI 就行。SQLwrite 就是让这个场景成真的项目。
数据库是互联网的"地基",但 SQL 语言的学习门槛不低。非技术背景的人想要查询数据,往往面临两个选择:要么学习 SQL(耗时且容易出错),要么找工程师帮忙(排队等待,降低效率)。
行业一直在尝试解决这个"自然语言转 SQL"(Text-to-SQL)问题。传统方案通常是把查询逻辑放在应用层,用规则或小型模型去解析用户意图。但这些方案有一个根本缺陷:数据库不知道自己里面有什么——只能靠猜测。
SQLwrite 的思路完全不一样:把 AI 直接塞进数据库内核,让它成为数据库的一部分。
SQLwrite 的作者是 Emery Berger,马萨诸塞大学阿默斯特分校(UMass Amherst)的计算机科学教授。他的研究方向涵盖程序设计语言、运行时系统与性能优化,在 PL(程序设计语言)领域颇具影响力——他也是 Heap Layers、Hoard 等经典内存分配器的作者。
Berger 教授的风格向来追求"极简但极致":不堆砌功能,而是找到那个最小、最优雅的切入点。SQLwrite 正是这一理念的体现——不需要改造数据库,不需要训练模型,直接在 SQLite 上加载一个扩展,就能用自然语言操作数据。
SQLwrite 实现了 SQLite 的一个扩展(Extension),用户通过 SQLite 的 .load sqlwrite 命令加载后,就可以用 select ask('...') 的语法向数据库发问:
sqlite> .load sqlwrite
sqlite> select ask('show me total invoiced for all artists');
2328.6
[SQLwrite] translation to SQL: SELECT SUM(Total) AS total_invoiced FROM Invoice;
[SQLwrite] indexing suggestions to improve the performance for this query:
(1): CREATE INDEX idx_invoice_total ON Invoice (Total);
系统会自动:
SELECT * FROM users WHERE age > 30SELECT ... FROM Orders JOIN Customers ON ...SELECT SUM(Total) FROM Invoice GROUP BY RegionSQLwrite 内置了自动重试逻辑:当查询结果为空(RETRY_ON_EMPTY_RESULTS)或结果数量异常多时,会自动调整 prompt 重新生成 SQL,最多重试 5 次。这是一个务实的工程选择,因为 LLM 生成 SQL 存在随机性,重试能显著提升成功率。
SQLwrite 采用插件式扩展架构,核心是 SQLite 扩展 + 可插拔 LLM 后端:
┌─────────────────────────────────────────────┐
│ SQLite Shell (sqlwrite-bin) │
├─────────────────────────────────────────────┤
│ sqlwrite.cpp (扩展入口) │
│ ┌──────────────┐ ┌──────────────────────┐ │
│ │ ask() 函数 │ → │ LLM Backend │ │
│ │ (SQL 函数) │ │ (llm_backend.hpp) │ │
│ └──────────────┘ │ ┌──────────────────┐ │ │
│ │ │ OpenAI (GPT-4) │ │ │
│ │ │ AWS Bedrock │ │ │
│ │ │ (Claude 3 Sonnet) │ │ │
│ │ └──────────────────┘ │ │
│ └──────────────────────┘ │
├─────────────────────────────────────────────┤
│ aistream.hpp (流式响应封装) │
│ openai.hpp (OpenAI SDK封装) │
│ json.hpp (nlohmann/json) │
│ fmt (格式化) │
└─────────────────────────────────────────────┘
llm_backend.hpp 定义了抽象的 Backend 接口,支持两种 Provider:
| Provider | 模型 | API |
|---|---|---|
| OpenAI | gpt-4o / gpt-3.5-turbo | OpenAI Chat Completions API |
| AWS Bedrock | Claude 3 Sonnet | AWS SigV4 签名认证 |
Backend 通过 detect_provider() 自动检测环境变量(OPENAI_API_KEY 或 AWS_ACCESS_KEY_ID),无需额外配置即可切换。
SQLwrite 的 prompt 策略非常直接:把数据库 Schema(通过 SQLite PRAGMA 获取表结构)+ 用户自然语言查询一起发给 LLM。相比复杂的 few-shot 示例,这种简洁的方式在实践中效果相当不错。
项目使用 CMake 作为构建系统,依赖极简:
libcurl(HTTP 通信)OpenSSL(AWS SigV4 签名)sqlite3(数据库内核)nlohmann/json(JSON 解析,头文件单文件)fmt(格式化)这是 SQLwrite 最大的局限——没有 OpenAI API Key 或 AWS 凭证,项目完全无法工作。这意味着:
LLM 生成的 SQL 可能包含语法错误或逻辑错误。SQLwrite 的重试机制能部分缓解,但无法根治。
仅限 SQLite,MySQL、PostgreSQL 等用户暂时无法使用。
需要从源码编译安装,无 Docker 镜像,部署门槛对非技术用户不友好。
SQLwrite 的核心创新不是用了哪个模型,而是重新定义了 LLM 和数据库的关系。
传统方案是"AI 在数据库之外观察数据",而 SQLwrite 做到了"AI 在数据库内部理解数据"。这意味着 AI 能访问到精确的 Schema 信息、现有的索引状态,而不只是"大概知道表名叫什么"。
这一思路对 AI Native 数据库的发展具有参考价值。随着 LLM API 成本下降和本地部署模型(如 Llama 3 + ollama)的成熟,未来这类"数据库内置 AI"方案可能会变得更加实用。
环境要求:Linux/macOS(Windows 需 WSL2),C++ 编译器,CMake,libcurl-dev,libssl-dev
安装步骤:
# 克隆并编译
git clone https://github.com/plasma-umass/sqlwrite.git
cd sqlwrite
cmake -B build && cmake --build build
# 配置 API Key
export OPENAI_API_KEY=sk-... # 或配置 AWS 凭证
# 使用
cd build
LD_LIBRARY_PATH=. ./sqlwrite-bin my_database.db
sqlite> .load sqlwrite
sqlite> select ask('show me all artists');