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

    • 通过 SQLDatabaseChainSQLDatabaseSequentialChain 直接调用 OpenAI 的 GPT 系列模型(如 gpt-3.5-turbogpt-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 接口,可能涉及数据隐私问题,效果取决于接口大模型的能力。
  • Vannahttps://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.aihttps://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-Hubhttps://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数据库上构建问答链代理的应用框架 支持构建问答链代理,运行生成的查询并从错误中恢复 需要一定的技术背景来构建和维护问答系统