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

news2025/1/18 21:07:32

      自从两年前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.coloradmin.cn/o/2256094.html

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

相关文章

【UE5 C++课程系列笔记】07——使用定时器实现倒计时效果

使用定时器实现如下倒计时效果 效果 步骤 1. 新建一个Actor类,这里命名为“CountDownTimerActor” 2. 在头文件中先定义倒计时时间和更新剩余时间的函数方法 前向声明一个文本渲染组件 3. 在源文件中引入文本渲染组件 创建文本渲染组件并进行一些设置 实现Update…

synchronized的特性

1.互斥 对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。 就比如synchronized修饰代码块时,一个线程进入该代码块就会进行“加锁”。 退出代码块时会进行“解锁”。 当其他线程想要访问被加锁的代码块时,就会阻塞等待。 阻塞等待…

STM32之SDIO通讯接口和SD卡(九)

STM32F407 系列文章 - SDIO-To-SD Card(九) 目录 前言 一、SDIO接口 二、SD卡 三、实现程序 1.SD卡结构体参数说明 2.头文件定义 3.函数sd_init() 4.函数HAL_SD_MspInit() 5.函数get_sd_card_info() 6.函数get_sd_card_state() 7.函数sd_read…

Vue 提供了Transition,可以帮助你制作基于状态变化的过渡和动画

官方文档&#xff1a;https://cn.vuejs.org/guide/built-ins/transition.html Transition​ Vue 提供了两个内置组件&#xff0c;可以帮助你制作基于状态变化的过渡和动画&#xff1a; <Transition> 会在一个元素或组件进入和离开 DOM 时应用动画。本章节会介绍如何使用…

04 创建一个属于爬虫的主虚拟环境

文章目录 回顾conda常用指令创建一个爬虫虚拟主环境Win R 调出终端查看当前conda的虚拟环境创建 spider_base 的虚拟环境安装完成查看环境是否存在 为 pycharm 配置创建的爬虫主虚拟环境选一个盘符来存储之后学习所写的爬虫文件用 pycharm 打开创建的文件夹pycharm 配置解释器…

鸿蒙UI开发——渐变色效果

1、概 述 ArkTs可以通过颜色渐变接口&#xff0c;设置组件的背景颜色渐变效果&#xff0c;实现在两个或多个指定的颜色之间进行平稳的过渡。 目前提供三种渐变类型&#xff1a;线性渐变、角度渐变、径向渐变。 我们在鸿蒙UI布局实战 —— 个人中心页面开发中&#xff0c;默认…

渗透测试--数据库攻击

这篇文章瘾小生其实想了很久&#xff0c;到底是放在何处&#xff0c;最终还是想着单拎出来总结&#xff0c;因为数据库攻击对我们而言非常重要&#xff0c;而且内容众多。本篇文章将讲述在各位获取数据库权限的情况下&#xff0c;各个数据库会被如何滥用&#xff0c;以及能够滥…

Java——异常机制(上)

1 异常机制本质 (异常在Java里面是对象) (抛出异常&#xff1a;执行一个方法时&#xff0c;如果发生异常&#xff0c;则这个方法生成代表该异常的一个对象&#xff0c;停止当前执行路径&#xff0c;并把异常对象提交给JRE) 工作中&#xff0c;程序遇到的情况不可能完美。比如…

Idea Spring Initializr没有 Java 8选项解决办法

问题描述 在使用IDEA中的Spring Initializr创建新项目时&#xff0c;Java 版本近可选择Java17,21 。不能选择Java8;SpringBoot 版本也只有 3.x 问题原因 Spring 官方&#xff08; https://start.spring.io/&#xff09;不再提供旧版本的初始化配置 解决方案 方案 1 使用阿里…

npm发布插件到私有仓库保姆级教程

在开发项目的过程中&#xff0c;我们经常需要安装插件依赖&#xff0c;那么怎么把自己开发的组件封装成一个插件&#xff0c;并发布到npm 插件市场或者上传到私有仓库里面呢&#xff1f;今天总结下自己发布插件到私有仓库的记录&#xff1a; 一、创建组件 执行命令创建一个空…

渗透测试---burpsuite(5)web网页端抓包与APP渗透测试

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人与泷羽sec团队一律不承担一切后果 视频地址&#xff1a;泷羽---bp&…

关闭windows11的“热门搜索”

win10搜索栏热门搜索怎么关闭&#xff1f;win10搜索栏热门搜索关闭方法分享_搜索_onecdll-GitCode 开源社区 注册表地址是&#xff1a;计算机\HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\ 最后效果如下&#xff1a;

【MySQL】视图详解

视图详解 一、视图的概念二、视图的常用操作2.1创建视图2.2查询视图2.3修改视图2.4 删除视图2.5向视图中插入数据 三、视图的检查选项3.1 cascaded&#xff08;级联 &#xff09;3.2 local(本地) 四、视图的作用 一、视图的概念 视图&#xff08;View&#xff09;是一种虚拟存…

数据结构 (22)哈夫曼树及其应用

前言 哈夫曼树&#xff08;Huffman Tree&#xff09;&#xff0c;又称最优二叉树或最优树&#xff0c;是一种特殊的二叉树结构&#xff0c;其带权路径长度&#xff08;WPL&#xff09;最短。 一、哈夫曼树的基本概念 定义&#xff1a;给定N个权值作为N个叶子结点&#xff0c;构…

Jenkins 的HTTP Request 插件为什么不能配置Basic认证了

本篇遇到的问题 还是因为Jenkins需要及其所在的OS需要升级&#xff0c;升级策略是在一台新服务器上安装和配置最新版本的Jenkins&#xff0c; 当前的最新版本是&#xff1a; 2.479.2 LTS。 如果需要这个版本的话可以在官方站点下载&#xff0c;也可以到如下地址下载&#xff1…

1.1 Beginner Level学习之“创建 ROS msg 和 srv”(第十节)

学习大纲&#xff1a; 1. msg 和 srv msg 文件是描述 ROS 消息字段的简单文本文件。它们用于为不同语言生成消息的源代码。srv 文件则描述了一个服务&#xff0c;包括两部分&#xff1a;请求和响应。Srv 文件用于生成服务的源代码。msg 文件存储在包的 msg 目录中。srv 文件存…

ubuntu中使用ffmpeg库进行api调用开发

一般情况下&#xff0c;熟悉了ffmpeg的命令行操作&#xff0c;把他当成一个工具来进行编解码啥的问题不大&#xff0c;不过如果要把功能集成进自己的软件中&#xff0c;还是要调用ffmpeg的api才行。 ffmpeg的源码和外带的模块有点太多了&#xff0c;直接用官网别人编译好的库就…

deepsort复现报错TypeError: tuple indices must be integers or slices, not tuple 解决

deepsort复现中遇到的TypeError: tuple indices must be integers or slices, not tuple问题的解决-CSDN博客 以上为参考教程。 复现的时候出现这个报错&#xff0c;搞了好久试了好多方法&#xff0c;包括降 scikit-learn版本&#xff0c;都不行&#xff0c;最后终于找到这个博…

Rigol DP711自动控制--SCPI命令

通过串口的SCPI命令来控制通道输入输出 也可以用UltraSigma UI来发送SCPI 物理连接&#xff1a; Pin2_2, Pin3_3, Pin5_5 串口命令控制&#xff1a; 命令&#xff1a;9600&#xff0c; 8bit, None SCPI CMD(Standard Commands for Programmable Instruments) OUTPut CH1, On…

【Java Web】Tomcat 快速入门

通常&#xff0c;为了让 Java 开发的应用程序&#xff08;app&#xff09;能够在服务器上正常运行&#xff0c;必须安装 Java 运行时环境&#xff08;JRE&#xff09;。JRE 主要支持 Java SE&#xff0c;而如果要运行 Java EE 应用&#xff0c;则需要更多的支持&#xff0c;比如…