赞
踩
在学习vanna和ollama的过程中写下本文,谨以记录,别无他意。
本文主要介绍了如何在Windows本地安装ollama的大语言模型,并将该模型用在vanna上去做text to sql。
1.进入官网链接:https://ollama.com/
2.点击download,选择Windows版本直接下载即可(理论上来说,是要挂vpn的,不然下载会很慢)
3.下载之后,直接安装就可以了。(理论上来说,环境变量会自动添加,如果后面用不了,大概率是环境变量没配置,自行加上就行了)。
注释
:Ollama并不是大模型,它是一个开源的框架,可以理解为一个为大模型服务的工具,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。
关于大模型,可以根据自己的需求和电脑的配置进行选择。
鉴于本人笔记本电脑内存不多,选择的阿里的qwen2-7b,因为ollama是支持从GGUF导入大模型的。
1.从官网下载:https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-GGUF/files
qwen2-7b有多个不同的版本,区别就是模型性能和精度不一样。其中q
值后面的数字越大,对应的模型精度就越高,但是占用的内存也就越大。还是那句话,根据自己的需求和电脑配置自行选择。
2.模型的相关配置
(因为只是做测试,本文下载的是qwen2-7b-instruct-q2_k.gguf)
下载完成之后,在打算存储模型的地方新建一个文件夹,例如:qwen,然后把模型文件放到这个文件夹下就可以了。
之后,在qwen文件夹下,新建一个文件:Modelfile,并在文件中写入以下内容,./
后对应的就是下载的模型的文件名
FROM ./qwen2-7b-instruct-q2_k.gguf
最后效果就是这样
1.在qwen文件夹直接进入cmd命令行
2.执行创建命令
ollama create Qwen2-7B -f ./Modelfile
如果成功执行,应该会显示transferring model data,like this
这里应该不会运行太久,如果很长时间没反应,直接enter一下看看。最终执行成功的结果会显示success,like this
3.启动
ollama run Qwen2-7B
成功之后,like this
到此,模型就行安装完成了,可以通过ollama list命令查看当前有哪些模型。
理论上来说,都点击这篇文章了,想必是知道Text to Sql的,就不在这里解释了,Vanna就是一个开源的Python RAG(检索增强生成)框架,主要用于SQL生成的。其实Vanna的官方文档写的非常详细并且易懂。官网链接:https://vanna.ai/docs/
都学习大模型了,基本的python操作就不赘述了,自己创建就行了(仅供参考
:本文使用的pycharm 2024以及python 3.12的虚拟环境)
注释
:这里建议创建jupyter项目,操作起来会方便很多
这个在vanna的官方快速操作文档中有介绍,https://vanna.ai/docs/mysql-ollama-chromadb/,选择使用的大模型和向量库,官方会生成需要安装哪些包,然后直接pip安装就行了。like this
本文肯定是选择的Ollama咯,至于向量库,因为都是安装库直接使用,选择的是ChromaDB,也可以用vanna官方推荐的第一个,这个没有太多要求,自行选择。
因为是要做text to SQL,下面还会选择一个数据库,这个也根据需求选择就行了,之后会生成相应的测试代码,拿来直接用就行
安装相关库
%pip install 'vanna[chromadb,ollama,mysql]'
建议加个镜像,会快一点
%pip install 'vanna[chromadb,ollama,mysql]' -i https://pypi.tuna.tsinghua.edu.cn/simple
按照vanna官网的实例代码,like this
from vanna.ollama import Ollama
from vanna.chromadb import ChromaDB_VectorStore
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': 'mistral'})
其中MyVanna这个类以及初始化代码,是官方文档自动生成的代码,同时官方也给出了实例化对象需要的参数,就是模型的名称。
因为已经在本地部署了Ollama的大模型,所以直接实例化来用就行了。
vn = MyVanna(config={'model': 'Qwen2-7B','ollama_host':'http://localhost:11434'})
其中ollama_host是传入的模型地址以及端口,11434就是Ollama的模型端口。
数据库连接方式,官方文档中也有,简单易懂,按照自己数据库配置就行了
vn.connect_to_mysql(host='my-host', dbname='my-db', user='my-user', password='my-password', port=123)
因为要做训练测试,下面是测试的表数据(网上随便找的ddl)
CREATE TABLE IF NOT EXISTS vuser ( `id` INT PRIMARY KEY COMMENT '用户ID', username VARCHAR(50) COMMENT '用户名', email VARCHAR(100) COMMENT '电子邮件', age INT COMMENT '年龄', gender VARCHAR(10) COMMENT '性别(男/女)', city VARCHAR(50) COMMENT '城市' ) COMMENT='用户信息表' CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO vuser (`id`, username, email, age, gender, city) VALUES (1, '张三', 'zhangsan@example.com', 30, '男', '北京'), (2, '李四', 'lisi@example.com', 25, '女', '上海'), (3, '王五', 'wangwu@example.com', 40, '男', '广州'), (4, '赵六', 'zhaoliu@example.com', 35, '女', '深圳'), (5, '小明', 'xiaoming@example.com', 28, '男', '成都'), (6, '小红', 'xiaohong@example.com', 45, '女', '重庆'), (7, '小华', 'xiaohua@example.com', 32, '男', '天津'), (8, '小丽', 'xiaoli@example.com', 27, '女', '南京'), (9, '小李', 'xiaoli2@example.com', 38, '男', '武汉'), (10, '小美', 'xiaomei@example.com', 33, '女', '西安');
vanna官方给出了几个训练模型的方法,对于单个表来说,不改变数据的情况下,对应的方法执行一次就行了
分别就是ddl
,sql
,documentation
,简单来说,就是通过表结构、SQL或者是文本直接训练就行了。
# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships
vn.train(ddl="""
CREATE TABLE IF NOT EXISTS my-table (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT
)
""")
# Sometimes you may want to add documentation about your business terminology or definitions.
vn.train(documentation="我们的业务将 OTIF 分数定义为按时足额交付的订单百分比")
# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.
vn.train(sql="SELECT * FROM my-table WHERE name = 'John Doe'")
按照文档的介绍,进行一个基础的ddl训练。like this
vn.train(ddl="""
CREATE TABLE `vuser` (
`id` int NOT NULL COMMENT '用户ID',
`username` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
`email` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电子邮件',
`age` int DEFAULT NULL COMMENT '年龄',
`gender` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '性别(男/女)',
`city` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '城市',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户信息表';
""")
在训练成功之后,会生成对应唯一id。like this
此时,理论上来说,已经可以Text to SQL了。试一下
vn.ask(question='统计大于20岁的用户数量?')
成功运行之后,可以看到生成了一段SQL,并且直接执行了该SQL,得到一个dataframe结果。到此说明就成功了
除此之外呢,vanna还会根据返回的dataframe结果生成一个可视化图表,所以文章前面建议使用jupyter,查看结果会很方便。like this
Vanna有一个集成flask框架的web界面,理论上来说,在实例化MyVanna类之后,就可以直接访问这个web界面了。
from vanna.flask import VannaFlaskApp
app = VannaFlaskApp(vn)
app.run()
本地访问端口:8084
只是如果没有训练的话,提问会报错,并且没有训练数据。like this
下图为训练后的用户界面,可以直接提问,因为本文只进行了ddl的训练,太复杂的SQL,估计是写不出来的。
同时,也可以查看所有的训练数据。like this
Vanna的整个Text to SQL大概就是这么个过程了。没有太复杂,官方也给出了更简单的示例。可以直接使用Vanna官方的OpenAI:免费的Vanna.AI,网址:https://vanna.ai/account/models
,邮箱注册登录,然后自定义一个模型名称,拿到api key就可以了。详细操作的话,看一下官方文档。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。