1. 基本介绍
vanna作为先进灵活的text2sql转换服务,能够在页面上灵活添加训练的DDL和SQL语句,提供 RAG "model",vanna官方提供支持openai、Ollma等LLM模型,但在国内希望本地部署,使用自己的元数据信息不外泄,因此本文帮助实现vanna+本地的QWEN模型实现本地访问。
2. 实现步骤
2.1部署Qwen通义千问的qwen-7B-Chat模型
#模型下载
from modelscope
import snapshot_download
model_dir = snapshot_download('qwen/Qwen-14B',cache_dir='./model')
#下载Qwen仓库代码
!git clone https://github.com/QwenLM/Qwen.git
然后编辑openai_api.py,设置checkpoint_path= '/mnt/workspace/model/qwen/Qwen-7B-Chat'
替换前 替换后
文件替换完成后,就可以启动LLM服务
然后安装依赖包:pip install -r requirements.txt
注意:安装完毕后检查下transformers的版本,最好保持在pip install transformers==4.30.2
python ./openai_api.py
2.2部署vanna服务
pip install 'vanna[chromadb,openai]'
pip install pymysql
下载vanna-flask版本的服务
git clone https://github.com/vanna-ai/vanna-flask.git
#使用自定义的llm服务接口
from vanna.remote import VannaDefault
from vanna.openai.openai_chat import OpenAI_Chat
from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore
from vanna.flask import VannaFlaskApp
from openai import OpenAI
import pandas as pd
import pymysql
client = OpenAI(
api_key="...",
base_url="http://127.0.0.1:8000/v1/",
default_headers = {"x-foo": "true"}
)
class MyVanna(ChromaDB_VectorStore,OpenAI_Chat):
def __init__(self,client=None,config=None):
ChromaDB_VectorStore.__init__(self,config=config)
OpenAI_Chat.__init__(self,client=client,config=config)
vn = MyVanna(client=client,config={"model": "Qwen-7B",}) #chatglm2-6b
vn.max_tokens = 800
vn.temperature = 0.5
#vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')
修改app.py中的代码 :
注释掉:load_dotenv()
然后修改vn的初始化逻辑,替换上面的代码:
修改启动端口:增加port=18888
启动vanna python ./app.py,输出本地的地址:http://127.0.0.1:18888
2.3内网穿透部署,提供公网访问地址
由于使用的是阿里的PAI训练机,本地地址无法在公网上访问极度不方便,因此就用到内网穿透的功能,可以使用ngrok或natapp。
ngrok方式:
from pyngrok import ngrok
ngrok.set_auth_token("") #设置访问ngrok的认证token,这个token需要在ngrok上注册个人账号后会生成的
ngrok_tunnel = ngrok.connect(18888) #建立通道,该命令执行后,会自动生成一个公网的域名地址,可以在公网上访问
这段代码加入到app.run()前面。
由于ngrok服务是国外的,经常被墙,可能在国内北方地区能够访问,南方地区就不能访问,因此可以使用国内的内网穿透服务natapp
natapp方式:
同样,需在natapp上注册账号获取token,并建立一个隧道服务。这个隧道直接绑定到内网服务的端口上的,并且可以设置代理地址访问时是否需要认证登录使用,保障安全。
在内网机器上下载linux版的natapp软件
wget https://cdn.natapp.cn/assets/downloads/clients/2_4_0/natapp_linux_amd64/natapp
并设置可执行权限
chmod 755 natapp
然后执行:
./natapp -authtoken=24dfff7012ce9095
注意:每次启动生成的公网域名地址是不同的。
开启您的Text2SQL之旅吧。
3.问题记录
在chromadb包里还有个自动去公网下载资源的地方,若网络不好则会下载失败,这个主要用于存储用户自定义训练信息的向量存储。
File "/opt/conda/lib/python3.10/site-packages/chromadb/utils/embedding_functions.py", line 514, in model
return self.ort.InferenceSession(
File "/opt/conda/lib/python3.10/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 419, in __init__
self._create_inference_session(providers, provider_options, disabled_optimizers)
File "/opt/conda/lib/python3.10/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 472, in _create_inference_session
sess = C.InferenceSession(session_options, self._model_path, True, self._read_config_from_model)
onnxruntime.capi.onnxruntime_pybind11_state.InvalidProtobuf: [ONNXRuntimeError] : 7 : INVALID_PROTOBUF : Load model from /root/.cache/chroma/onnx_models/all-MiniLM-L6-v2/onnx/model.onnx failed:Protobuf parsing failed.
wget https://chroma-onnx-models.s3.amazonaws.com/all-MiniLM-L6-v2/onnx.tar.gz
vi /opt/conda/lib/python3.10/site-packages/chromadb/utils/embedding_functions.py
把MODEL_DOWNLOAD_URL的地址换成本地的地址:
file:///mnt/workspace/vanna-flask/onnx.tar.gz