NL2SQL简单使用

NL2SQL简单使用

1 简介

将自然语言转化为SQL或者叫Text转SQL可称为NL2SQL(Natural Language to SQL) 。NL2SQL的核心作用是降低数据库查询的技术门槛,让非技术用户能用日常语言直接获取数据。 它通过自动将自然语言问题转换为SQL查询,极大地提升数据访问和决策的效率。开源比较出名的NL2SQL框架有很多,例如:Chat2DB、Vanna、WrenAI、sqlchat等。

(1)Chat2DB

Chat2DB是国产的开源项目,可支持MySQL, PostgreSQL, H2, Oracle, SQLServer, SQLite, MariaDB, ClickHouse, DM, Presto, DB2, OceanBase, Hive, KingBase, MongoDB, Redis, Snowflake等数据库。优点是具有可视化页面,可快速搭建。不足之处是开源版本可以使用的功能较少,不过功能基本够用了。不太合适进行定制开发。它具有三个版本,开源版本和收费版本(2个)。Docker安装相对容易。

# Github地址
https://github.com/CodePhiliaX/Chat2DB

# 官网文档地址
https://chat2db-ai.com/resources/docs/start-guide/about-chat2db

(2)Vanna

Vanna是一个专为NL2SQL任务设计的Python RAG(Retrieval-Augmented Generation))框架,用于SQL生成和相关功能,它的核心作用是让开发者能够基于自己的数据库 schema 和业务上下文,快速、安全地训练和部署一个高度定制化且准确的文本转SQL生成应用。优点是方便定制化。

# Github地址
https://github.com/vanna-ai/vanna

# 官网文档地址
https://vanna.ai/docs/

(3)WrenAI

WrenAI是一个GenBI智能体,可以在几秒钟内使用自然语言查询数据库,获得准确的SQL(文本到SQL)、图表(文本到图表)和AI生成的深度洞察。支持的数据库有Athena (Trino)、Redshift、BigQuery、DuckDB、PostgreSQL、MySQL、Microsoft SQL Server、ClickHouse、Oracle、Trino、Snowflake。优点是具有可视化页面。也具有三个版本。开源版本和收费版本(2个)。使用Docker安装的组件比较多,不太好安装,放弃。

# Github地址
https://github.com/Canner/WrenAI

# 官网文档地址
https://docs.getwren.ai/oss/overview/introduction

(4)sqlchat

Sqlchat很久没更新了。

# Github地址
https://github.com/sqlchat/sqlchat

2 创建数据库

2.1 创建MySQL容器

docker run -itd \
-p 3306:3306 \
-v /home/mysql/conf:/etc/mysql/conf.d \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysqldb \
mysql:8.0.29

⚠️ 连接出错“Public Key Retrieval is not allowed”的解决方法,设置“allowPublicKeyRetrieval”为true。

使用工具连接时

在这里插入图片描述

使用代码连接时

jdbc:mysql://localhost:3306/your_database?allowPublicKeyRetrieval=true

2.2 创建表结构

-- 创建数据库
CREATE DATABASE IF NOT EXISTS company_salary CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 使用数据库
USE company_salary;

-- 工资表
CREATE TABLE salary_records (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键,自增ID',
    employee_id VARCHAR(10) NOT NULL COMMENT '员工编号,唯一标识员工',
    name VARCHAR(50) NOT NULL COMMENT '员工姓名',
    department VARCHAR(50) COMMENT '所属部门,如技术部、人事部等',
    position VARCHAR(50) COMMENT '职位名称',
    base_salary DECIMAL(10,2) DEFAULT 0.00 COMMENT '基本工资,税前基础薪资',
    bonus DECIMAL(10,2) DEFAULT 0.00 COMMENT '奖金,绩效或项目奖励',
    deductions DECIMAL(10,2) DEFAULT 0.00 COMMENT '扣款,含社保、公积金、个税等',
    net_salary DECIMAL(10,2) AS (base_salary + bonus - deductions) STORED COMMENT '实发工资,自动计算字段',
    pay_date DATE COMMENT '发薪日期,通常为每月固定日期',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工工资记录表,存储每位员工的月度工资明细';

2.3 添加数据

-- 选择数据库
USE company_salary;

-- 添加数据库
INSERT INTO salary_records 
(employee_id, name, department, position, base_salary, bonus, deductions, pay_date) VALUES
('EMP0001', '张伟', '技术部', '前端开发工程师', 8500.00, 1200.00, 950.00, '2025-08-05'),
('EMP0002', '李娜', '技术部', '前端开发工程师', 6000.00, 800.00, 700.00, '2025-08-05'),
('EMP0003', '王强', '技术部', '前端开发工程师', 9500.00, 1500.00, 1100.00, '2025-08-05'),
('EMP0004', '陈静', '技术部', '算法工程师', 7000.00, 900.00, 800.00, '2025-08-05'),
('EMP0005', '刘洋', '技术部', '算法工程师', 5500.00, 2000.00, 600.00, '2025-08-05'),
('EMP0006', '赵敏', '技术部', '算法工程师', 6800.00, 1100.00, 750.00, '2025-08-05'),
('EMP0007', '孙浩', '技术部', '算法工程师', 10000.00, 1800.00, 1300.00, '2025-08-05'),
('EMP0008', '周琳', '销售部', '销售经理', 7500.00, 1000.00, 850.00, '2025-08-05'),
('EMP0009', '吴磊', '销售部', '销售经理', 8000.00, 2500.00, 1000.00, '2025-08-05'),
('EMP0010', '徐婷', '销售部', '销售经理', 9000.00, 1300.00, 950.00, '2025-08-05'),
('EMP0011', '黄峰', '销售部', '销售经理', 7500.00, 900.00, 780.00, '2025-08-05'),
('EMP0012', '何娟', '销售部', '销售经理', 8200.00, 1100.00, 880.00, '2025-08-05'),
('EMP0013', '马超', '销售部', '销售经理', 8800.00, 3000.00, 1100.00, '2025-08-05'),
('EMP0014', '高翔', '销售部', '销售经理', 10500.00, 1600.00, 1200.00, '2025-08-05'),
('EMP0015', '林雪', '技术部', '后端开发工程师', 7800.00, 1300.00, 820.00, '2025-08-05'),
('EMP0016', '邓杰', '技术部', '后端开发工程师', 6200.00, 950.00, 680.00, '2025-08-05'),
('EMP0017', '罗丹', '技术部', '后端开发工程师', 9500.00, 1800.00, 980.00, '2025-08-05'),
('EMP0018', '谢鹏', '技术部', '后端开发工程师', 9200.00, 1400.00, 1020.00, '2025-08-05'),
('EMP0019', '宋佳', '技术部', '后端开发工程师', 5800.00, 700.00, 600.00, '2025-08-05'),
('EMP0020', '程明', '技术部', '后端开发工程师', 8000.00, 1200.00, 850.00, '2025-08-05'),
('EMP0021', '朱莉', '市场部', '项目经理', 6500.00, 1000.00, 720.00, '2025-08-05'),
('EMP0022', '韩磊', '市场部', '项目经理', 8300.00, 1100.00, 900.00, '2025-08-05'),
('EMP0023', '唐敏', '市场部', '项目经理', 5900.00, 750.00, 680.00, '2025-08-05'),
('EMP0024', '冯伟', '市场部', '项目经理', 5600.00, 1800.00, 620.00, '2025-08-05'),
('EMP0025', '许静', '人事部', 'HR经理', 8800.00, 1400.00, 930.00, '2025-08-05'),
('EMP0026', '丁浩', '人事部', 'HR经理', 15000.00, 2500.00, 1800.00, '2025-08-05'),
('EMP0027', '江雪', '财务部', '会计', 7100.00, 920.00, 790.00, '2025-08-05'),
('EMP0028', '白洋', '财务部', '会计', 6000.00, 880.00, 660.00, '2025-08-05'),
('EMP0029', '夏婷', '财务部', '会计', 6300.00, 950.00, 700.00, '2025-08-05'),
('EMP0030', '尹杰', '财务部', '会计', 5500.00, 600.00, 580.00, '2025-08-05');

2.4 数据结果

在这里插入图片描述

3 Chat2DB简单使用

3.1 安装容器

使用Docker安装软件系统。

docker run -itd \
--name=chat2db \
-p 10824:10824 \
-v /home/chat2db:/root/.chat2db \
chat2db/chat2db:0.3.7

3.2 简单使用

访问服务地址(192.168.108.147是我的服务器地址)

http://192.168.108.147:10824/

登录Chat2DB

默认的账号和密码都是:chat2db

在这里插入图片描述

设置连接数据库的基本信息

在这里插入图片描述

设置大模型信息
(Text2sql.assets/image-20250920195914192.png)
在这里插入图片描述

可能是我没配置好一直报错

在这里插入图片描述

07-01
将自然语言转换为 SQL 查询语句(Natural Language to SQL Conversion)是一项涉及自然语言处理(NLP)、机器学习和数据库技术的交叉任务。其目标是通过理解用户的自然语言问题,自动生成对应的 SQL 查询语句以从结构化数据库中提取信息。 ### 常见的自然语言到 SQL 转换技术 #### 1. 基于模板的方法 这种方法依赖于预定义的查询模板和规则匹配。用户输入的自然语言被解析后与模板进行匹配,填充相应字段生成 SQL 查询。 - 优点:实现简单、执行速度快。 - 缺点:灵活性差,难以覆盖复杂的查询需求或多样化的表达方式[^3]。 #### 2. 基于语法分析的方法 该方法利用上下文无关文法(CFG)或依存句法分析来解析用户输入,并将其映射到 SQL 查询结构中。 - 使用 NLP 技术识别主语、谓语、宾语等成分。 - 将句法结构转化为数据库模式中的表名、列名和操作符[^2]。 #### 3. 基于深度学习的端到端模型 近年来,随着深度学习的发展,基于 Seq2Seq 模型、Transformer 架构以及预训练语言模型(如 BERT、T5)的方法成为主流。 - 模型输入:自然语言问题 + 数据库 Schema。 - 模型输出:对应的 SQL 查询语句。 - 常用架构: - **Sequence-to-Sequence with Attention** - **Transformer-based models (e.g., SQL-BART, T5-SQL)** - **BERT-based models fine-tuned on SQL datasets (e.g., RAT-SQL, IRNet)** 这类方法在复杂查询任务中表现优异,但需要大量标注数据进行训练[^1]。 #### 4. 基于强化学习的方法 通过模拟用户提问与系统响应的交互过程,使用强化学习优化生成的 SQL 语句质量。 - 利用奖励机制鼓励生成准确的查询。 - 可结合真实数据库反馈提升模型适应性。 #### 5. 混合方法 将上述多种技术相结合,例如: - 使用 BERT 进行意图识别。 - 利用句法分析提取实体和关系。 - 最终通过规则或模板生成 SQL。 这种策略在实际应用中往往能取得较好的平衡效果[^3]。 --- ### 示例代码(基于 Hugging Face Transformers 的 T5 模型) 以下是一个使用 Python 和 Hugging Face Transformers 库进行自然语言转 SQL 的示例: ```python from transformers import T5Tokenizer, T5ForConditionalGeneration # 加载预训练模型和分词器 model_name = "laiwsh/nl2sql-t5-base" tokenizer = T5Tokenizer.from_pretrained(model_name) model = T5ForConditionalGeneration.from_pretrained(model_name) # 输入自然语言问题 question = "列出所有工资高于5000美元的员工姓名" # 编码输入并生成 SQL 查询 input_ids = tokenizer.encode("translate NL to SQL: " + question, return_tensors="pt") outputs = model.generate(input_ids) sql_query = tokenizer.decode(outputs[0], skip_special_tokens=True) print(sql_query) ``` 输出可能为: ```sql SELECT name FROM employees WHERE salary > 5000; ``` --- ### 实现挑战 - **歧义消除**:自然语言中存在多义词、模糊表达等问题。 - **数据库模式理解**:模型必须理解表结构、外键关系等元数据。 - **跨领域泛化能力**:训练数据通常局限于特定领域,如何迁移到新领域仍是难题。 - **性能优化**:在实时系统中快速响应复杂查询。 --- ### 工具与框架推荐 - **HuggingFace Transformers**:支持多种预训练模型用于文本生成。 - **SPaCy / NLTK**:用于句法分析与实体识别。 - **RAT-SQL**:一个专门用于 NL2SQL 的开源项目,基于图神经网络。 - **Google AutoML Tables**:提供低代码/无代码的 NL2SQL 解决方案。 - **Amazon Athena Query Federation**:允许通过自然语言接口访问数据源。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值