简单使用Vanna

简单使用Vanna

1 安装依赖环境

⚠️ 表结构等信息,请参考见“https://blog.youkuaiyun.com/make_progress/article/details/151905155”

安装依赖

pip install vanna
pip install PyMySQL
pip install cryptography
pip install vanna[chromadb,openai,bigquery]

2 构建模型

2.1 自定义CustomVanna

from abc import ABC

from openai import OpenAI
from vanna.base import VannaBase
from vanna.chromadb import ChromaDB_VectorStore


class CustomLLM(VannaBase, ABC):
    """
    自定义虚拟基类大模型
    """

    def __init__(self, config=None):
        # 调用超类
        super().__init__(config)

        if config is None:
            raise ValueError(
                "For LLM, config must be provided with an api_key and model"
            )

        if "base_url" not in config:
            raise ValueError("config must contain a LLM base_url")

        if "api_key" not in config:
            raise ValueError("config must contain a LLM api_key")

        if "model" not in config:
            raise ValueError("config must contain a LLM model")

        # 模型基本信息
        base_url = config["base_url"]
        api_key = config["api_key"]
        model = config["model"]

        # 构建客户端
        self.client = OpenAI(base_url=base_url, api_key=api_key)
        self.model = model

    def system_message(self, message: str) -> any:
        return {"role": "system", "content": message}

    def user_message(self, message: str) -> any:
        return {"role": "user", "content": message}

    def assistant_message(self, message: str) -> any:
        return {"role": "assistant", "content": message}

    def generate_sql(self, question: str, **kwargs) -> str:
        # 调用超类生成sql
        sql = super().generate_sql(question, **kwargs)

        # 用 "_" 替换 "\_"
        sql = sql.replace("\\_", "_")

        return sql

    def submit_prompt(self, prompt, **kwargs) -> str:
        chat_response = self.client.chat.completions.create(
            model=self.model,
            messages=prompt,
        )

        return chat_response.choices[0].message.content


# 继承虚拟基类
class CustomVanna(ChromaDB_VectorStore, CustomLLM):
    def __init__(self, config=None):
        # 注意会使用向量,模型默认是 all-MiniLM-L6-v2
        ChromaDB_VectorStore.__init__(self, config=config)
        CustomLLM.__init__(self, config=config)


# 构建自定义Vanna
vn = CustomVanna(config={
    "base_url": "https://api.moonshot.cn/v1",
    "api_key": "XXXX",
    "model": "kimi-k2-0905-preview"
})

2.2 使用自定义的Vanna

from vanna.flask import VannaFlaskApp

from my.custom_vanna import vn


# 1 连接MySQL数据库
vn.connect_to_mysql(host="192.168.108.147", port=3306, dbname="company_salary", user="root",password="123456")


# 2 训练数据
"""
# 此注释的内容可以不要
# 获取数据的属性信息
df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")

# 把信息模式分解为LLM可以引用的小块
plan = vn.get_training_plan_generic(df_information_schema)
vn.train(plan=plan)
"""

# 添加表结构schema
vn.train(ddl="""
    CREATE TABLE salary_records (
        id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键自增ID',
        employee_id VARCHAR(10) NOT NULL COMMENT '员工编号唯一标识员工',
        name VARCHAR(50) NOT NULL COMMENT '员工姓名',
        department VARCHAR(50) COMMENT '所属部门如技术部、人事部等',
        position VARCHAR(50) COMMENT '职位名称',
        base_salary DECIMAL(10,2) DEFAULT 0.00 COMMENT '基本工资税前基础薪资',
        bonus DECIMAL(10,2) DEFAULT 0.00 COMMENT '奖金、绩效或项目奖励',
        deductions DECIMAL(10,2) DEFAULT 0.00 COMMENT '扣款含社保、公积金、个税等',
        net_salary DECIMAL(10,2) AS (base_salary + bonus - deductions) STORED COMMENT '实发工资自动计算字段',
        pay_date DATE COMMENT '发薪日期通常为每月固定日期',
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工工资记录表存储每位员工的月度工资明细'
""")

# 训练数据说明
vn.train(documentation="数据中包括员工名称、部门名称、职位名称、基本工资等信息")
vn.train(documentation="统计员工的基本工资、奖金等")

# 将示例SQL查询添加到训练数据中,越多越好
vn.train(question="查询单个用户信息", sql="SELECT * FROM salary_records WHERE name = '张伟'")
vn.train(question="统计不同部门人数", sql="SELECT department AS department_name, COUNT(*) AS employee_count FROM salary_records GROUP BY department ORDER BY employee_count DESC;")
vn.train(question="统计不同岗位的金额", sql="SELECT position AS job_position, COUNT(*) AS employee_count, SUM(net_salary) AS total_net_salary, AVG(net_salary) AS average_net_salary, MIN(net_salary) AS min_net_salary, MAX(net_salary) AS max_net_salary FROM salary_records GROUP BY position ORDER BY average_net_salary DESC;")

# 调用问题,visualize=True会使用的token数量
data = vn.ask(question="查询单个用户信息", visualize=False)
# 返回的数据信息是个元组
print(data)

# 用于启动可视化页面,根据自己的情况可以不要
VannaFlaskApp(vn).run()

3 使用截图

⚠️ 有的时候加载不出来下面的页面,关闭网络,再重新打开,就可以了。

(1)简单使用

查询用户孙浩信息

在这里插入图片描述

统计不同岗位的金额
在这里插入图片描述

(2)查看Training Data

在这里插入图片描述

03-11
<think>好的,我现在需要处理用户关于Vanna的问题。首先,用户提到了Vanna,并引用了一个示例代码,说明用户可能想了解如何使用Vanna进行数据库查询。用户的问题可能集中在如何设置和使用Vanna,特别是如何快速开始。 首先,我需要回忆Vanna的基本信息。Vanna是一个Python库,用于通过自然语言生成SQL查询。它默认使用OpenAI的LLM和在线向量库,所以用户不需要自己配置这些,只需要提供API密钥和模型名称即可。用户提供的示例代码显示,只需五行代码就能连接数据库并提问,这可能让用户觉得入门简单。 接下来,我需要确保回答符合用户的要求。用户希望回答结构清晰,分步骤解决问题,并保证真实可靠。根据用户提供的引用,Vanna的默认设置确实支持使用其在线服务,无需额外配置。因此,我需要详细说明安装、初始化、连接数据库和提问的步骤,每个步骤给出代码示例,并解释参数的作用,比如model和api_key的来源。 另外,用户要求生成相关问题,我需要考虑用户可能进一步询问的内容。例如,Vanna支持的数据库类型,如何自定义模型,处理复杂查询的方法,以及本地部署的可能性。这些问题都是用户在使用Vanna过程中可能遇到的后续问题。 需要注意的是,回答中所有行内数学表达式必须用$...$,但这里可能用不上。不过如果有涉及公式的地方,比如性能分析中的时间复杂度,可能需要使用,但当前问题主要涉及代码和步骤,可能不需要数学表达式。但独立公式需要$$...$$,同样可能不适用。 另外,用户提到“使用中文回答”,所以整个回答必须用中文,并且引用标识要自然添加。在引用用户提供的示例时,需要在末尾加上[^1]。例如,在说明Vanna默认支持在线LLM服务时,引用该部分。 最后,生成的相关问题需要围绕Vanna使用场景、配置、扩展功能等方面,帮助用户深入了解。例如,支持哪些数据库、自定义模型、处理复杂查询、本地部署等。这些问题应该能引导用户进一步探索Vanna的功能。 总结回答结构: 1. 简要介绍Vanna及其用途。 2. 分步骤说明如何使用Vanna,包括安装、初始化、连接数据库、提问。 3. 每个步骤给出代码示例和解释。 4. 生成相关问题,覆盖用户可能关心的扩展内容。 需要确保代码示例正确,特别是用户提供的示例中连接SQLite数据库的URL是否正确,是否需要本地文件还是支持远程连接。根据引用内容,示例中使用的是https URL,可能Vanna支持远程SQLite连接,或者是否有其他数据库的支持方式。需要确认这一点,避免给出错误信息。例如,可能用户需要先下载数据库文件到本地,或者Vanna确实支持远程SQLite连接。在回答中应指出连接方式,比如使用connect_to_sqlite函数并传入路径或URL。 另外,用户可能对API密钥和模型名称的来源有疑问,需要说明如何获取这些信息,例如在Vanna的注册流程中获取模型名称,而API密钥来自OpenAI。或者Vanna是否提供自己的API密钥?根据引用内容,示例中的api_key可能是Vanna的API key还是OpenAI的?需要明确。根据引用中的描述,“默认情况下,Vanna支持使用其在线LLM服务(对接OpenAI)”,可能意味着用户需要提供OpenAI的API key,而model_name可能是Vanna特定的模型名称。或者,Vanna可能提供自己的服务,用户需要在其平台注册获取model和api_key。这点可能需要进一步确认,但根据示例中的代码,model和api_key是创建VannaDefault实例的参数,可能用户需要在Vanna的平台注册账户,获取这些凭证,而Vanna的后端对接了OpenAI。因此,在回答中需要提示用户需要注册Vanna并获取相应的model名称和API key,或者如果直接使用OpenAI的API key,需要说明。 此外,可能存在的错误点是用户是否必须使用SQLite,或者是否支持其他数据库如PostgreSQL、MySQL等。根据引用中的connect_to_sqlite函数,可能Vanna默认支持SQLite,但可能还有其他连接方法。需要指出Vanna可能支持其他数据库,但示例中使用的是SQLite,用户可以根据文档连接其他类型。 在生成的问题中,可以包括如何连接到其他数据库,如何处理更复杂的查询,是否支持本地部署LLM等,这些都是用户可能感兴趣的点。 最后,确保回答中没有使用Markdown格式,所有代码块用三个反引号包围,并正确标注语言python。同时,检查LaTeX语法是否正确,但当前问题可能不涉及数学公式,所以可能不需要使用。</think>### 关于Vanna使用说明 Vanna是一个基于自然语言生成SQL查询的Python库,默认集成了OpenAI的大语言模型(LLM)和在线向量库,无需额外配置即可快速使用。以下是基础使用方法: --- #### **1. 安装与初始化** 安装Vanna库并初始化模型: ```python pip install vanna ``` ```python import vanna from vanna.remote import VannaDefault # 初始化模型(需注册获取model_name和api_key) vn = VannaDefault(model="your_model_name", api_key="your_api_key") ``` --- #### **2. 连接数据库** 通过URL或本地路径连接数据库(示例为SQLite): ```python # 连接远程SQLite数据库(或本地路径如'./Chinook.sqlite') vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite') ``` --- #### **3. 通过自然语言提问** 直接输入问题生成SQL并返回结果: ```python # 提问并获取答案 response = vn.ask("What are the top 10 albums by sales?") print(response) ``` --- #### **4. 核心流程** 1. **自然语言解析**:Vanna将问题转换为SQL查询(依赖LLM)[^1]。 2. **数据库执行**:自动执行生成的SQL并返回结果。 3. **结果优化**:支持通过后续提问修正查询逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值