本地部署vanna ai+通过http请求调用vanna
本地部署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.json
if not data or 'question' not in data:
return jsonify({"error":"query question is required"}),400
question = 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 here
print("开始执行请求")
# 执行请求
# 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查询语句
。