vanna-ai本地部署(qdrant向量库+mysql数据库+qwen-plus llm)

vanna-ai本地部署(qdrant向量库+mysql数据库+qwen-plus llm)

背景

Vanna AI 是一个多功能的数据分析和智能决策平台,旨在帮助企业通过自然语言与数据进行交互。它通过 自动生成 SQL 查询、智能报告、数据可视化等功能,可以大大提高工作效率,并支持 无编程知识的用户 直接与数据进行交互。Vanna AI 非常适合需要大量数据分析和报告生成的企业,特别是在 客户关系管理(CRM)、销售分析、市场研究等领域。
本博客主要展示如何本地部署vanna

着手部署

部署前准备

官方给出有好几种搭配(数据库,向量库,LLM),这里我们选择mysql数据库,向量库使用qdrant,LLM模型使用百炼平台的qwen-plus

qdrant向量库启动(参考https://blog.csdn.net/shizidushu/article/details/141651538)

在win系统上使用wsl拉取镜像并启动

docker pull qdrant/qdrant
docker run -d -p 6333:6333 -p 6334:6334 \
    -v $(pwd)/qdrant_storage:/qdrant/storage:z \
    qdrant/qdrant

启动后就是下面的情况了:
在这里插入图片描述

vanna 安装

接着就根据官网指引开始安装:https://vanna.ai/docs/

pip install 'vanna[qdrant,mysql]'

官方给出的代码:

from vanna.base import VannaBase
from vanna.qdrant import Qdrant_VectorStore
from qdrant_client import QdrantClient
class MyCustomLLM(VannaBase):
  def __init__(self, config=None):
    # Implement here
    pass

  def submit_prompt(self, prompt, **kwargs) -> str:
    # Implement here
    # See an example implementation here: https://github.com/vanna-ai/vanna/blob/main/src/vanna/mistral/mistral.py


class MyVanna(Qdrant_VectorStore, MyCustomLLM):
    def __init__(self, config=None):
        Qdrant_VectorStore.__init__(self, config=config)
        MyCustomLLM.__init__(self, config=config)

vn = MyVanna(config={'client': 'QdrantClient(...)'})

然后我们依据它进行修改
首先是LLM部分

class MyCustomLLM(VannaBase):
    def __init__(self, config=None):
        api_key = config["api_key"]
        model = config["model"]
        self.client = OpenAI(
            api_key=api_key,  # 获取 API 密钥
            base_url=model  # 设置基础 URL
        )

    def submit_prompt(self, messages, model: str='qwen-plus', **kwargs) -> str:
        try:
            # 使用 OpenAI 客户端创建聊天请求
            completion = self.client.chat.completions.create(
                model=model,
                messages=messages
            )

            # 返回响应对象的 JSON 数据
            response =  completion.model_dump_json()
            # 解析 JSON 字符串为字典
            response_dict = json.loads(response)
            # 提取 content 字段
            content = response_dict['choices'][0]['message']['content']
            return content
        except Exception as e:
            # 错误处理
            raise Exception(f"请求失败: {str(e)}")

接着就是MyVanna部分的补充代码

class MyVanna(Qdrant_VectorStore, MyCustomLLM):
    def __init__(self, config=None):
        qdrant_client = QdrantClient(url="这里一般是自己本机地址",
                                     port=6333)
        Qdrant_VectorStore.__init__(self, config={'client':qdrant_client})
        MyCustomLLM.__init__(self, config=config)

    # 实现抽象方法
    def assistant_message(self, message: str):
        """处理 AI 助理消息"""
        return {"role": "assistant", "content": message}

    def system_message(self, message: str):
        """处理系统消息"""
        return {"role": "system", "content": message}

    def user_message(self, message: str):
        """处理用户消息"""
        return {"role": "user", "content": message}

接着就是数据库连接部分(依据自己的实际情况补充即可)

vn.connect_to_mysql(host="", port=3306, dbname='', user='', password='')
vn = MyVanna(config={
"api_key": "自己的apikey", 
"model": "https://dashscope.aliyuncs.com/compatible-mode/v1"})

最后就是数据train和程序启动部分

vn.train(documentation="请注意,在我们公司一般将1作为是,0作为否。")

from vanna.flask import VannaFlaskApp
app = VannaFlaskApp(vn, debug=True, allow_llm_to_see_data=True,
                    title="数据库问答", subtitle="您的私人智能助手",
                    show_training_data=True, suggested_questions=False,
                    sql=True, table=True, csv_download=False, chart=True,
                    redraw_chart=False, auto_fix_sql=False,
                    ask_results_correct=False, followup_questions=False)
app.run()

去localhost:8084地址就可以查看网址。
在这里插入图片描述

### vanna-ai 权限配置教程 对于vanna-ai平台而言,权限管理是保障数据安全和服务稳定的重要组成部分。通常情况下,在部署和使用过程中会涉及到不同层次的访问控制机制。 #### 用户角色划分 为了更好地管理和分配权限,系统内预设了几种常见的用户角色: - **管理员**:拥有最高级别的操作权限,能够创建新用户、调整其他用户的权限设置以及执行全局性的维护工作。 - **开发者**:主要负责应用程序逻辑编写及调试,可以在指定范围内修改代码并提交变更请求。 - **测试人员**:专注于软件质量保证环节中的功能验证部分,有权查看特定项目的源码及其运行状态以便开展有效的单元测试活动。 - **访客/只读用户**:仅能浏览已发布的API接口文档和其他公开资源,无法参与实际开发流程也不具备任何编辑能力[^1]。 #### API Key 管理 当利用第三方服务如OpenAI Client时,则需特别注意API key的安全保管措施。建议采用环境变量的方式存储敏感信息而非硬编码到源文件里;另外定期更换密钥也是一种良好的实践习惯。如果发现有异常登录行为应当立即停用当前key并向官方报告情况寻求进一步指导[^2]。 #### 数据库连接字符串加密处理 考虑到数据库作为核心资产之一的重要性,其对应的连接串务必经过严格的保护手段来防止泄露风险。一种可行的方法是对该部分内容实施AES对称加密算法后再存入配置文件中去。解密过程则交由应用启动阶段完成即可确保每次加载都能获取最新的认证参数而不会暴露在外网环境中造成安全隐患[^3]。 ```python from cryptography.fernet import Fernet def encrypt_db_connection_string(connection_string, key): cipher_suite = Fernet(key) encrypted_data = cipher_suite.encrypt(bytes(connection_string, 'utf-8')) return str(encrypted_data) def decrypt_db_connection_string(encrypted_data, key): cipher_suite = Fernet(key) decrypted_data = cipher_suite.decrypt(eval(encrypted_data)) return decrypted_data.decode('utf-8') ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值