Text2SQL的应用
基本原理剖析
Text2SQL 的实现就是基于 RAG 技术 ,根据 Query 内容,从数据库中查询与 Query 有关的表 DDL 信息,然后将检索到的表 DDL 一起嵌入到预设的 Prompt 模板中,将 Prompt 和 Query 输入到 LLM 中,以生成最终的 SQL。
整体的流程图如下(分为5个阶段):

第一步,元数据索引构建。
基于企业的业务库准备 AI 元数据,通过将数据库中的表结构、字段说明、约束关系等元数据经过 Vector Embedding 模型进行向量化处理,构建高效的语义检索体系,包括向量索引和 KV 索引。它们将被用来辅助后续的表召回过程。
第二步,信息提取。
通过语言大模型对输入 Query 进行信息提取,提取的内容主要包括 Query 句式(骨架)抽取、目标字段抽取、条件字段抽取、表名抽取。
第三步,表和样例召回。
将目标字段、条件字段、表名的抽取内容通过文本模型向量化后,基于第一步中准备的 AI 向量数据库进行向量相似性检索,结合表召回策略以及排序规则,得到召回的表名信息,以获得 Query 中涉及的所有表 DDL 信息。同时,将 Query 句式(骨架)抽取的内容通过文本模型向量化,与样例向量库数据集进行逐一相似度比对,结合样例召回策略,获取最终填充 Prompt 模版的样例。
第四步,Prompt 动态组装。
将步骤三中得到的表 DDL 信息、样例信息按照模版进行 Prompt 生成组装。
第五步,SQL 生成与输出。
将第四步中得到的 Prompt 和原始的 Query 一起输入大模型,并进行 SQL 语句生成,将生成的 SQL 语句返回给数据库执行,完成一次问答的流程闭环。
Text-to-SQL 项目介绍和对比
以下是几个 Text-to-SQL 项目,涵盖开源方案和商业 API 集成方式:
1. 基于 OpenAI / GPT 的 Text2SQL 方案(支持其他类Openai接口)
-
LangChain SQLDatabaseChain
- 通过
SQLDatabaseChain或SQLDatabaseSequentialChain直接调用 OpenAI 的 GPT 系列模型(如gpt-3.5-turbo或gpt-4)生成 SQL。 - 支持动态 schema 解析,适用于 MySQL、PostgreSQL 等数据库。
- 示例代码:
from langchain.llms import OpenAI from langchain_experimental.sql import SQLDatabaseChain from langchain.utilities import SQLDatabase db = SQLDatabase.from_uri("sqlite:///mydatabase.db") llm = OpenAI(temperature=0) db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True) result = db_chain.run("查询销售额最高的产品") - 优点:简单易用,适合快速对接 GPT API。
- 缺点:依赖 OpenAI 接口,可能涉及数据隐私问题,效果取决于接口大模型的能力。
- 通过
-
Vanna (https://github.com/vanna-ai/vanna)
- 提供 Python 库,支持 OpenAI、Anthropic Claude 等大模型,可本地部署或云端调用。
- 支持 RAG(检索增强生成),结合向量数据库优化 SQL 生成。
- 示例代码:
import vanna as vn vn.set_api_key("your_vanna_key") # 申请 API Key vn.connect_to_sqlite("mydatabase.db") sql = vn.generate_sql("查询销售额最高的产品") - 优点:支持多模型切换,提供 Web UI 交互界面,开源可以本地部署。
- 缺点:云端服务部分功能需付费。
2. 开源微调模型(可本地部署)
-
SQLCoder(Defog.ai) (https://github.com/defog-ai/sqlcoder)
- 基于 StarCoder 微调,性能接近 GPT-4,支持 PostgreSQL、MySQL 等。
- 可本地运行,避免数据外传。
- 示例代码:
from transformers import AutoTokenizer, AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("defog/sqlcoder") tokenizer = AutoTokenizer.from_pretrained("defog/sqlcoder") inputs = tokenizer("查询销售额最高的产品", return_tensors="pt") outputs = model.generate(**inputs) print(tokenizer.decode(outputs[0])) - 优点:开源免费,性能强。
- 缺点:需较高 GPU 资源(如 A100)。
-
DB-GPT-Hub (https://github.com/eosphoros-ai/DB-GPT-Hub)
- 支持 LLaMA-2、CodeLlama 等模型微调,适配 Spider、BIRD 等数据集。
- 提供完整训练-推理流程,适合企业定制化需求。
- 优点:可私有化部署,支持 LoRA 低资源微调。
- 缺点:需自行训练模型。
3. 商业 API 方案
- Google Cloud’s Text-to-SQL(实验性)
- 集成 BigQuery,支持自然语言转 SQL。
- Microsoft Semantic Kernel + Azure OpenAI
- 结合 Azure 数据库服务,提供企业级 Text2SQL 方案。
对比总结
| 方案 | 开源 | 依赖大模型 API | 本地部署 | 适用场景 |
|---|---|---|---|---|
| LangChain + OpenAI | ❌/✅ | ✅(GPT-4等) | ❌/✅ | 快速原型开发 |
| Vanna | ✅(部分功能付费) | ✅(多模型) | ✅ | 企业级 RAG 方案 |
| SQLCoder | ✅ | ❌ | ✅ | 高性能本地化需求 |
| DB-GPT-Hub | ✅ | ❌ | ✅ | 定制化微调 |
推荐选择:
- 快速尝试:用 LangChain + OpenAI 或 Vanna。
- 数据安全优先:用 SQLCoder 或 DB-GPT-Hub 本地部署。
- 企业级应用:结合 RAG(如 Vanna)或微调(如 DB-GPT-Hub)。
附上更全的主流技术方案对比:
| 名称 | 描述 | 优点 | 缺点 |
|---|---|---|---|
| Chat2db | 人工智能驱动的数据管理平台,支持多种数据库 | 支持多种数据库,提供7B开源模型 | 需要集成多种数据库,可能存在兼容性问题 |
| SQL Chat | 基于聊天的SQL客户端,使用自然语言与数据库通信 | 支持多种数据库系统,用户友好 | 可能需要额外的配置来适应特定的数据库 |
| Vanna | 开源Python RAG框架,整合上下文和领域知识文档训练模型 | 支持自定义可视化UI,灵活度高 | 需要专业知识来训练和维护模型 |
| Dataherald | 自然语言到SQL引擎,用于企业级问答 | 模块化设计,易于扩展和维护 | 需要业务用户适应自然语言到SQL的转换 |
| WrenAI | 文本到SQL解决方案,无需编写SQL即可查询数据 | 易于使用,安全可靠,高度准确 | 需要用户适应自然语言查询的方式 |
| SuperSonic | 腾讯音乐开发的模型知识库和语义解析器 | 强大的语义解析能力,支持多种数据库 | 可能需要专业的知识来理解和使用 |
| Awesome Text 2SQL | 精选教程资源库,包含LMs、Text2SQL等方面的模型 | 提供丰富的学习资源和模型 | 主要作为资源库,可能需要额外的开发工作来集成实际应用中 |
| DuckDB-NSQL | 为DuckDB SQL分析任务构建的Text 2SQL LL M | 帮助用户利用DuckDB的全部功能 | 特定于DuckDB,可能不适用于其他数据库系统 |
| Langchain | 在SQL数据库上构建问答链代理的应用框架 | 支持构建问答链代理,运行生成的查询并从错误中恢复 | 需要一定的技术背景来构建和维护问答系统 |