SQLBot:智能问数系统初体验
最近在 GitHub 上看到了 DataEase 开源的 SQLBot,一个基于大模型和 RAG 的智能问数系统:用自然语言提问,它自动生成 SQL、执行查询,结果既能出表格也会自动生成图表。实际体验下来感觉还挺实用,下面分享下我的初体验,顺带分析一下它的执行流程和提示词。
项目相关链接:
环境搭建
SQLBot 的部署非常简单,用 Docker 直接起:
# 创建目录
mkdir -p /opt/sqlbot
cd /opt/sqlbot
# 下载 docker-compose.yaml
curl -o docker-compose.yaml https://raw.githubusercontent.com/dataease/SQLBot/main/docker-compose.yaml
# 启动服务
docker compose up -d
SQLBot 把依赖的服务都打包到一起了,因此只跑 SQLBot 一个容器也行:
docker run -d \
--name sqlbot \
--restart unless-stopped \
-p 8000:8000 \
-p 8001:8001 \
-v ./data/sqlbot/excel:/opt/sqlbot/data/excel \
-v ./data/sqlbot/file:/opt/sqlbot/data/file \
-v ./data/sqlbot/images:/opt/sqlbot/images \
-v ./data/sqlbot/logs:/opt/sqlbot/app/logs \
-v ./data/postgresql:/var/lib/postgresql/data \
--privileged=true \
dataease/sqlbot
启动后的界面:

演示
根据自然语言描述生成 SQL 并执行,结果既可以用表格展示,也会自动生成合适的图表:

执行过程
SQLBot 的整体流程大致如下:
匹配术语 → 匹配 SQL 示例 → 匹配数据表(Schema)→ 生成 SQL → 执行 SQL → 生成图表结构
生成 SQL 时发给大模型的提示词结构:
system: 系统提示词
human: 规则与基础示例
ai: AI确认
human: 数据库与表结构信息
ai: AI确认
如果有匹配到术语:
human: 参考术语
ai: AI确认
如果匹配到SQL示例:
human: 参考SQL示例
ai: AI确认
对话历史
本次提问
可以看到提示词是分阶段、逐段确认的,术语和 SQL 示例是按需注入的(匹配到才加)。大模型会生成 SQL 与合适的图表类型,SQLBot 负责 SQL 的执行,之后再让大模型生成图表配置:
system: 系统提示词
human: 规则与基础示例
ai: AI确认
对话历史
本次提问
这里的「本次提问」包含用户提问、生成的 SQL、表结构、图表类型,大模型返回图表的坐标轴、系列等信息。
提示词见:SQLBot/backend/templates/template.yaml at main · dataease/SQLBot
术语、SQL 示例匹配
术语和 SQL 示例的匹配都是精确子串召回 + 向量相似度召回的双路召回混合检索,命中后将结果拼成提示词作为上下文。本质上是 RAG,融合策略是取并集,而不是 打分重排。
术语匹配:
- 子串匹配:用户问题中必须完整包含某个术语词才命中(大小写不敏感),这是单向包含。
- 向量相似度匹配:使用 pgvector,嵌入模型是本地中文模型
shibing624/text2vec-base-chinese,相似度用余弦相似度。
术语还可以配置同义词,匹配后一并召回。
SQL 示例匹配:
- 子串匹配是双向的:既命中「问题包含示例问句」,也命中「示例问句包含问题」,这样问题很短、示例很长时也能召回。
- 向量匹配同样使用 pgvector。
总结
NL2QL 还是比较实用的,技术实现上并不是很难。但要让 AI 写出满足需求的 SQL,关键在于数据侧的建设:
- 需要建设数据仓库,完善数据元信息。对于字段,不仅要有名称等,还需要有指标定义、计算口径等。
- 还需要知道指标关系、业务上下文等,让 AI 有分析路径。
- 还需要控制 AI 的数据权限、调用边界。
传统的数仓分层是 ODS、DWD、DWS、ADS,而面向 AI 的能力则可以按语义层、知识层、上下文层、AI 服务层来划分。