本地部署vanna ai
①
准备python环境,推荐最新的python12、13版本
②
安装vanna库
我这里安装的python环境是python312
进入目录python312/Scripts,在该目录下的命令行窗口中输入以下命令:pip jinstall vanna
pip install vanna
③
配置向量库
这里我选用的向量库为qdrant,并在Linux环境下通过docker进行安装
配置linux环境以及在linux环境下安装docker的教程可自行查找
在完成docker配置的linux环境中,运行qdrant容器,命令如下
docker run -d --name qdrant_server -v $(pwd)/qdrant_storage:/qdrant/storage -p 6333:6333 qdrant/qdrant
④
获取线上大模型的base_url
和api_key
这里,我选择使用线上大语言模型通义千问
。新用户可以通过其官方平台注册账号,免费体验该模型。
获取通义千问
模型的base_url
和api_key
可以参考以下官方文档:
https://help.aliyun.com/zh/model-studio/user-guide/first-api-call-to-qwen
⑤
编写vanna调用代码
vanna使用python编写,这里我选择pycharm作为开发环境,以下是完整的python程序:将获取到的api_key填入以下对应的参数中
from vanna.base import VannaBase
from vanna.qdrant import Qdrant_VectorStore
from qdrant_client import QdrantClient
from vanna.qianwen import QianWenAI_Chat# 创建Vanna实例
class MyVanna(Qdrant_VectorStore, MyCustomLLM):def __init__(self, config=None):Qdrant_VectorStore.__init__(self, config=config)QianWenAI_Chat.__init__(self, config=config)# 配置参数
config = {"client": QdrantClient(host="8.134.216.171", port=6333),"api_key": "sk-yVx6P2nKH4YHT7BfwFTMJLT3IEKrglpQ7OzNjhWulDUrUXLa","model": "https://api.moonshot.cn/v1"
}# 实例化Vanna
vn = MyVanna(config=config)# 连接MySQL数据库
vn.connect_to_mysql(host="8.134.204.169",dbname="sales_visit", # 替换为你的数据库名称user="root", # 替换为你的数据库用户名password="root", # 替换为你的数据库密码port=3306 # 数据库的运行端口,mysql默认运行在3306端口
)# 启动Vanna的Flask应用
from vanna.flask import VannaFlaskApp
app = VannaFlaskApp(vn)
app.run()
⑥
运行访问localhost:8084,就可以看到的vanna的前端操作界面了
⑦
添加训练数据
有三种类型的数据DDL
(数据库表结构)、Documentation
(说明文档)、SQL
(可执行sql语句),可以按照自己的需求添加训练数据
与vanna实例相关的api接口
vn是vanna的实例对象,vn.generate_sql("What are the top 10 customers by sales?")
用于生成sql语句,vn.run_sql("SELECT * FROM my_table")
用于执行sql语句。
通过http请求调用vanna的功能
通过 HTTP 请求,既可以调用线上官方的 Vanna 功能,也可以调用本地部署的 Vanna 功能。
以下是一个例子:
from urllib import request
from flask import Flask, jsonify, request
from vanna.remote import VannaDefault# 初始化Flask应用
app = Flask(__name__)@app.route('/ask', methods=['POST'])
def deal_ask():print("进入请求处理")# 获取请求中的查询需求data = request.jsonif not data or 'question' not in data:return jsonify({"error":"query question is required"}),400question = data['question']print(question)# vn=init_app()vn = VannaDefault(model='rik', api_key='2a307e03229f40ef9621073b41ed1701')vn.connect_to_mysql(host="8.134.233.232",dbname="sale_visit", # 替换为你的数据库名称user="root", # 替换为你的数据库用户名password="root",port=3306) # Connect to your database hereprint("开始执行请求")# 执行请求# result = vn.ask(question)result = vn.generate_sql(question)print("请求执行完毕")# print("这是result[1]")# print(result[1])# print("这是result[2]")# print(result[2])# 返回结果return jsonify({"result": result})# 启动Flask应用
if __name__ == '__main__':app.run(host='0.0.0.0', port=3000)
可以在postman中发送请求进行测试,
url -X POST http://localhost:3000/ask \-H "Content-Type: application/json" \-d '{"question": "查询最近一周的销售数据"}'
后端收到请求后,将会返回一条sql查询语句
。