大语言模型应用Text2SQL本地部署实践初探

      自从两年前OpenAI公司发布ChatGPT后,大模型(Large Language Model,简称LLM)相关技术在国内外可谓百家争鸣,遍地开花,在传统数据挖掘、机器学习和深度学习的基础上,正式宣告进入快速发展的人工智能(Artificial Intelligence,简称AI)2.0时代。

      人工智能的本质上是基于海量数据(包括结构化数据,文本数据,图片数据,音频数据,视频数据等)不断学习和推理,去模仿人类思考、认知、决策和行动。

      我在项目实施工作中,跟数据打交道很多,主要是传统的数据建模和分析,基本都是基于商业产品,比如SAP,Qlik,帆软,永洪等;或者是基于公司的自研产品,大体功能类似但二次开发比较容易。由于这种壁垒,对机器学习和大模型了解甚少,基本停留在了解一些基本概念和关注一些技术新闻方面。最近几年的项目上重复遇到过一些困扰我好久的问题,项目范围内的数据模型搭完后,对数据比较依赖的部门比如财务,审计等会不断涌现出新的数据需求,如何让业务部门的用户快速获取和分析数据为日常工作提供决策支持是一个痛点,以往的大宽表模型和自助式BI分析解决方案不太理想,而学习数据建模由于太过技术性往往让用户望而却步。

      最近通过在B站学习了一些优秀up主的大模型讲解视频,以及阅读了一些技术大拿的博文,受益匪浅。通过了解Text2SQL,帮我开拓了思路,似乎让我找到了解决以上痛点问题的契机。

      Text2SQL也叫NL2SQL(Natural Language To SQL),是一种自然语言生成技术(文字->代码->结果),通过将人类用自然语言提出的数据问题(Text),转化为结构化查询语言(Structured Query Language,简称SQL)代码,然后自动执行生成的代码实现人类和数据的直接对话,持续提升数据分析效率。

      Text2SQL实现的技术路线有很多,本篇主要讲述了基于阿里巴巴开源大模型Qwen,开源框架Vanna,以及Ollama,Mysql,Python3等技术栈的组合来部署实践。由于考虑到企业级数据的安全性,所有组件都是本地化部署,内网可以直接使用。虽然还没延伸考虑数据权限、SQL准确性、复杂场景实现等面临的挑战,但先迈出第一步等于成功了一半,不断学习不断进步,像LLM一样:)

      以下是部署实践的步骤:

1. 准备一个linux虚拟机作为服务器。

我电脑是win11+vmware+centos7.6+Xshell,这里的安装略过,可自行网上搜索教程,安装后的效果:

如果装完的OS是图形化启动,可以通过如下命令设置为命令行启动,节省硬件资源:

systemctl set-default multi-user.target

再通过ifconfig查看ip:

获取到ip后就可以通过Xshell远程连系统了:

2. 安装Python3.11环境。

开源框架Vanna是基于Python的,我们通过Miniconda来安装Python3.11。

下载conda安装脚本:

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

安装:bash Miniconda3-latest-Linux-x86_64.sh

这里输入yes:

使环境变量生效后查看conda版本验证是否安装OK:

source ~/.bashrc

conda --version

安装python3.11

conda create -n py311 python=3.11

激活Python3环境,并查看版本:

conda activate py311

python -V

3. 安装Ollama。

Ollama是开源大模型的管理运行工具,支持很多国内外开源的大模型,包括我们这次要用的qwen2.5.

安装命令:

curl -fsSL https://ollama.com/install.sh | sh

4. 安装大模型。

安装好后通过ollama -v看下版本,考虑到笔记本性能,选择本地安装qwen2.5:3b版本的开源大模型,3b表示3billon也即30亿个模型参数。

qwen2.5:3b

ollama run qwen2.5:3b

安装完后,就可以直接run模型,和模型对话:

5. 安装mysql并模拟准备企业数据。

Mysql的安装此处略过,可以网上搜索教程。我安装的是mysql8.0+客户端工具Dbeaver:

创建一个vanna的数据库并准备三张表:

DDL和写数脚本如下:

CREATE DATABASE `vanna` /*!40100 DEFAULT CHARACTER SET utf16 */ /*!80016 DEFAULT ENCRYPTION='N' */;

-- vanna.DEPT definition

CREATE TABLE `DEPT` (

`DEPTNO` int NOT NULL COMMENT '部门编号',

`DNAME` varchar(14) DEFAULT NULL COMMENT '部门名称',

`LOC` varchar(13) DEFAULT NULL COMMENT '部门地址',

PRIMARY KEY (`DEPTNO`)

) ENGINE=InnoDB DEFAULT CHARSET=utf16 COMMENT='部门';

-- vanna.SALGRADE definition

CREATE TABLE `SALGRADE` (

`GRADE` int DEFAULT NULL COMMENT '工资等级',

`LOSAL` double DEFAULT NULL COMMENT '最低工资',

`HISAL` double DEFAULT NULL COMMENT '最高工资'

) ENGINE=InnoDB DEFAULT CHARSET=utf16 COMMENT='工资等级';

-- vanna.EMP definition

CREATE TABLE `EMP` (

`EMPNO` int NOT NULL COMMENT '员工编号',

`ENAME` varchar(10) DEFAULT NULL COMMENT '员工名称',

`JOB` varchar(9) DEFAULT NULL COMMENT '工作',

`MGR` double DEFAULT NULL COMMENT '直属领导编号',

`HIREDATE` date DEFAULT NULL COMMENT '入职时间',

`SAL` double DEFAULT NULL COMMENT '工资',

`COMM` double DEFAULT NULL COMMENT '奖金',

`DEPTNO` int DEFAULT NULL COMMENT '部门编号',

PRIMARY KEY (`EMPNO`),

KEY `DEPTNO` (`DEPTNO`),

CONSTRAINT `EMP_ibfk_1` FOREIGN KEY (`DEPTNO`) REFERENCES `DEPT` (`DEPTNO`)

) ENGINE=InnoDB DEFAULT CHARSET=utf16 COMMENT='员工';

INSERT INTO vanna.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) VALUES

(7369,'SMITH','CLERK',7902.0,'1980-12-17',800.0,NULL,20),

(7499,'ALLEN','SALESMAN',7698.0,'1981-02-20',1600.0,300.0,30),

(7521,'WARD','SALESMAN',7698.0,'1981-02-22',1250.0,500.0,30),

(7566,'JONES','MANAGER',7839.0,'1981-04-02',2975.0,NULL,20),

(7654,'MARTIN','SALESMAN',7698.0,'1981-09-28',1250.0,1400.0,30),

(7698,'BLAKE','MANAGER',7839.0,'1981-05-01',2850.0,NULL,30),

(7782,'CLARK','MANAGER',7839.0,'1981-06-09',2450.0,NULL,10),

(7788,'SCOTT','ANALYST',7566.0,'1987-07-13',3000.0,NULL,20),

(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000.0,NULL,10),

(7844,'TURNER','SALESMAN',7698.0,'1981-09-08',1500.0,0.0,30),

(7876,'ADAMS','CLERK',7788.0,'1987-07-13',1100.0,NULL,20),

(7900,'JAMES','CLERK',7698.0,'1981-12-03',950.0,NULL,30),

(7902,'FORD','ANALYST',7566.0,'1981-12-03',3000.0,NULL,20),

(7934,'MILLER','CLERK',7782.0,'1982-01-23',1300.0,NULL,10);

INSERT INTO vanna.SALGRADE (GRADE,LOSAL,HISAL) VALUES

(1,700.0,1200.0),

(2,1201.0,1400.0),

(3,1401.0,2000.0),

(4,2001.0,3000.0),

(5,3001.0,9999.0);

INSERT INTO vanna.DEPT (DEPTNO,DNAME,LOC) VALUES

(10,'ACCOUNTING','NEW YORK'),

(20,'RESEARCH','DALLAS'),

(30,'SALES','CHICAGO'),

(40,'OPERATIONS','BOSTON');

6. 安装Vanna。

参照Vanna的github指导:

https://github.com/vanna-ai/vanna

pip install vanna

安装完成后,根据官网介绍,如果使用在线大模型、向量数据库和数据库,几行代码就可以run起来,前提是需要vanna.ai网站申请api key.

https://vanna.ai/docs/app/


 

7. 安装开源向量数据库Chromadb。我们把向量数据库安装到本地,pip install即可,但是安装过程中会有一些问题,建议可以根据报错在在网上搜索答案。

 

8. 装PyCharm,远程连接虚拟机的Python环境。具体安装细节网上自行搜索,我电脑安装后的效果如下:

9. Python代码开发,连接qwen大模型,连接mysql,训练数据,启动vanna。

完整代码如下:

from vanna.ollama import Ollama

from vanna.chromadb import ChromaDB_VectorStore

import pandas as pd

import mysql.connector

from vanna.flask import VannaFlaskApp

class MyVanna(ChromaDB_VectorStore, Ollama):

    def __init__(self, config=None):

        ChromaDB_VectorStore.__init__(self, config=config)

        Ollama.__init__(self, config=config)

#vn = MyVanna(config={'model': 'llama3.2:latest','ollama_host':'http://192.168.112.164:11434'})

vn = MyVanna(config={'model': 'qwen2.5:3b','ollama_host':'http://192.168.112.164:11434'})

def run_sql(sql: str) -> pd.DataFrame:

    cnx = mysql.connector.connect(user='root', password='888888', host='192.168.112.164', database='vanna')

    cursor = cnx.cursor()

    cursor.execute(sql)

    result = cursor.fetchall()

    columns = cursor.column_names

    #print('columns:',columns)

    df = pd.DataFrame(result, columns=columns)

    return df

vn.run_sql = run_sql

vn.run_sql_is_set = True

#给模型训练ddl语句

df_count = vn.run_sql("show tables")

for i in range(0,len(df_count)):

    str = "show create table " + df_count['Tables_in_vanna'].loc[i]

    df = vn.run_sql(str)

    #print(df['Create Table'].loc[df.index[0]])

    vn.train(ddl=df['Create Table'].loc[df.index[0]])

#执行web应用

VannaFlaskApp(vn,allow_llm_to_see_data=True).run()

10. 运行Vanna,测试Text2SQL功能:

可以看到控制台给出了运行的地址,这里的localhost换成虚拟机的ip即可访问:

在Training Data页签可以看到我们代码里添加的DDL训练数据加到向量数据库了。然后通过New Question来向数据库提问题:

由于笔记本性能问题,可能要运行一会才出答案,不得不说大模型也是很烧硬件的。

至此,Text2SQL的本地化部署和实践已完成。下一步有待继续探索真实案例和复杂场景的尝试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell脚本实战案例

文章目录 实战第一坑功能说明脚本实现 实战第一坑 实战第一坑:在Windows系统写了一个脚本,比如上面,随后上传到服务,执行会报错 原因: 解决方案:在linux系统touch文件,并通过vim添加内容&…

Power BI - 批量导入数据

1.简单介绍 假定已经使用Power Automate Desktop(微软的RPA产品,是Power Platform平台的其中一个产品)从福布斯中文网获取了各地区的2024年的财富数据如下, 现在想批量导入数据到Power BI中,分析一下各地区的产业以及财富情况 2.具体说明 …

医疗系统国产数据库高质量发展路径探析

信息工程人员操作数据库 一、国外数据库在医疗系统中的困境 (一)数据分散与难以整合 在美国,分散式医疗服务成为癌症研究数据库优化的巨大障碍。患者先在社区接受肿瘤科医生常规检查,再到学术医疗中心进行尖端治疗,然…

Maven 打包出现问题解决方案

我执行 mvn install 报如下错误 可是我在 web 模块中能正确引用到 common 的类,于是我把 web 引用到的 common 中的类先移动到 web 模块中,然后把 common 模块的类都删掉,然后再次执行 mvn install,结果报错如下: [ERROR] Faile…

微信小程序里的小游戏研发需要什么技术栈

研发小程序里的小游戏通常需要以下技术栈: 前端技术 HTML5 / CSS3:用于构建游戏的界面布局和样式。JavaScript:作为核心编程语言,实现游戏的逻辑和交互。小程序开发框架:如微信小程序的开发框架,了解其 API…

NIO(New IO)和BIO(Blocking IO)的区别

Java中的NIO(New IO)和BIO(Blocking IO)的区别及NIO的核心组件 Java中的NIO(New IO)和BIO(Blocking IO)是两种不同的网络通信模型,各自具有独特的特性和适用场景。下面将…

RabbitMQ延迟消息的实现

RabbitMQ延迟队列的实现 延迟消息是什么延迟消息的实现死信交换机代码实现 延迟消息插件 延迟消息是什么 延迟消息是将消息发送到MQ中,消费者不会立即收到消息,而是过一段时间之后才会收到消息,进行处理。在一些业务中,可以用到延…

HTML5 拖拽 API 深度解析

一、HTML5 拖拽 API 深度解析 1.1 背景与发展 HTML5 的拖拽 API 是为了解决传统拖拽操作复杂而设计的。传统方法依赖鼠标事件和复杂的逻辑计算,而 HTML5 提供了标准化的拖拽事件和数据传递机制,使得开发者能够快速实现从一个元素拖拽到另一个元素的交互…

3D 生成重建017-StyleGaussian用文本或图像对你的3DGS内容进行风格迁移

3D 生成重建017-StyleGaussian用文本或图像对你的3DGS内容进行风格迁移 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文 “StyleGaussian: Instant 3D Style Transfer with Gaussian Splatting” 介绍了一种新颖的3D风格迁移方法 StyleGaussian,该方法通…

如何查看电脑的屏幕刷新率?

1、按一下键盘的 win i 键,打开如下界面,选择【系统】: 2、选择【屏幕】-【高级显示设置】 如下位置,显示屏幕的刷新率:60Hz 如果可以更改,则选择更高的刷新率,有助于电脑使用起来界面更加流…

【JVM】JVM基础教程(一)

目录 初识JVM JVM是什么? JVM的功能 解释、即时编译和运行 内存管理 常见的JVM JVM虚拟机规范 HotSpot的发展历程 JVM的组成 字节码文件详解 应用场景 以正确姿势打开字节码文件 ​编辑字节码文件的组成 基本信息 Magic魔数 主副版本号 常量池 接口…

Linux内核查询CONFIG_xxx配置项的方法

前言: 嵌入式开发中经常会查看运行的内核都打开了哪些编译选项,这里提供2种方法: 查看编译环境的.config文件查看正在运行的Linux文件系统中的 /proc/config.gz 文件 编译环境的.config不赘述,下面主要介绍如何简单使用 /proc/c…

Neo4j (desktop) 使用记录

1. neo4j community 使用 第一次使用Neo4j,根据网上的教程安装并配置了community版本, 在终端使用 neo4j.bat console 可以正常打开网页端 但是, 使用 neo4j start , neo4j stop 时会提示 ‘neo4j’ 时非法指令,无法识别 查明原…

【JAVA】Java高级:数据库监控与调优:SQL调优与执行计划的分析

作为Java开发工程师,理解SQL调优和执行计划的分析是至关重要的。这不仅可以帮助我们提高数据库查询的效率,还能减少系统资源的消耗,提升整体应用的性能。 1. SQL调优的重要性 随着数据量的增加和用户请求的增多,数据库的性能问题…

Web3.0:连接分布式未来的纽带

随着技术的不断进步,Web3.0正逐渐成为人们关注的焦点。作为Web的下一代,Web3.0将引领我们进入一个全新的数字时代,重新定义了我们与互联网的关系 Web3.0,也称为“分布式Web”,是互联网的下一代演进。它不仅是信息的传…

2024年认证杯SPSSPRO杯数学建模C题(第一阶段)云中的海盐解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 C题 云中的海盐 原题再现: 巴黎气候协定提出的目标是:在2100年前,把全球平均气温相对于工业革命以前的气温升幅控制在不超过2摄氏度的水平,并为1.5摄氏度而努力。但事实上,许多之前的…

throw error; 执行不通过怎么返回解决

子页 async save() { if (this.node.type dataSource) { try { await this.$refs.dataFormDataSource.validate(); // 验证通过,执行后续操作 } catch (error) { this.$message.error(数据源参数验证不通过) throw error; return; } } } 调用页面: a…

【Mac】安装Gradle

1、说明 Gradle 运行依赖 JVM,需要先安装JDK,Gradle 与 JDK的版本对应参见:Java Compatibility IDEA的版本也是有要求Gradle版本的,二者版本对应关系参见:Third-Party Software and Licenses 本次 Gradle 安装版本为…

项目代码第2讲:从0实现LoginController.cs,UsersController.cs、User相关的后端接口对应的前端界面

一、User 1、使用数据注解设置主键和外键 设置主键:在User类的U_uid属性上使用[Key]注解。 设置外键:在Order类中,创建一个表示外键的属性(例如UserU_uid),并使用[ForeignKey]注解指定它引用User类的哪个…

使用mtools搭建MongoDB复制集和分片集群

mtools介绍 mtools是一套基于Python实现的MongoDB工具集,其包括MongoDB日志分析、报表生成及简易的数据库安装等功能。它由MongoDB原生的工程师单独发起并做开源维护,目前已经有大量的使用者。 mtools所包含的一些常用组件如下: mlaunch支…