赞
踩
Vanna的多样化使用
前面两篇,对Vanna的一些原理和基本使用进行的总结,本篇将根据Vanna提供的多样化配置进行体验尝试,并共同来探索一下Vanna源码,有不正之处请友友们指正。
先做一些说明:
1.我本地目前使用的是 python3.12版本,Vanna是0.5.5版本,不同版本的包可能源码会有些许区别,但主体是一致的。
2.因为Vanna默认是使用chatGPT3.5,我自己本地测试连接其他LLM是通过代理服务实现的,有条件的可以自己部署大模型尝试,本文仅作为自主体验的记录,仅供参考。
3.本篇会先对Vanna一些常用的源码进行说明, 并在此基础上进行一些改造尝试,有误之处请大家多多指正,抱拳抱拳~
这里需要先推荐一个代理服务的使用教程链接KIMI AI Free 服务
我本地试验是用的自己的云服务器,通过链接中的教程,部署了kimi服务。
- from vanna.openai import OpenAI_Chat
- from vanna.vannadb import VannaDB_VectorStore
- from openai import OpenAI
-
- # 使用自己的vanna模型及api key
- MY_VANNA_MODEL = "my_vanna_model"
- MY_VANNA_API_KEY = "my_vanna_api_key"
-
- # 使用自己的llm模型及所需配置
- refresh_token='refresh_token'
- my_llm_base_url='http://127.0.0.1:8000/v1' #IP和端口号改为你自己的,我这里实际用的我的云服务器的地址
- my_llm_name='kimi'
-
- # 初始化客户端
- client = OpenAI(
- api_key=refresh_token,
- base_url=my_llm_base_url,
- default_headers={"Authorization": f"Bearer {refresh_token}", "Content-Type": "application/json"}
- )
-
- class MyVanna(VannaDB_VectorStore, OpenAI_Chat):
- def __init__(self, client=None, config=None):
- VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)
- OpenAI_Chat.__init__(self, client=client, config=config)
-
- # 使用自定义的大模型及vanna提供的向量库
- vn = MyVanna(client=client, config={"model": my_llm_name, })

有朋友肯定会问,为什么我这里的初始化这么复杂,官网的初始化代码很简单嘛,这里做一些说明:
以下是数据库连接方法,这里以mysql为例。Vanna还提供其他的数据库连接方式,都是以connect_to_数据库的方式命名。
- # 初始化数据库连接
- vn.connect_to_mysql(host="localhost", dbname="test", user="root", password="123456", port=3306)
其实这个时候就可以问问题了,我先问个‘你是谁’看看,然后执行。
vn.ask(question="你是谁")
回答结果:
连接成功啦,回答也是OK的,最后一行报错是因为当前kimi的回答无法作为sql去执行,这个没关系,我们换一个能生成sql的问题。
vn.ask(question="请帮我查一下student_info表score大于92的数据")
回答结果:
可以看到kimi是正常生成了sql的,并且Vanna通过sql也从数据库查到了数据,并让kimi生成相应的图形代码,展示出了图形。(这里我是提前准备了数据库的测试数据的,第二篇文章有建表语句和插入数据语句)
刚才我们的提问是很详细具体的,我们加入一些训练数据,以实现能满足多样化的提问。
- vn.train(ddl="CREATE TABLE student_info (id INT NOT NULL AUTO_INCREMENT COMMENT '唯一标识符',name VARCHAR(100) NOT NULL COMMENT '学生姓名',age INT NOT NULL COMMENT '年龄',province VARCHAR(100) NOT NULL COMMENT '省份',score DECIMAL(5,2) NOT NULL COMMENT '分数',PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='存储学生基本信息及成绩';")
-
- vn.train(question="请查询student_info表中score大于90的数据", sql="SELECT * FROM student_info WHERE score > 90;")
- vn.train(question='请查询分数小于85的省份', sql="SELECT DISTINCT province FROM student_info WHERE score < 85;")
- #自己再加一些样例
然后我们再继续进行一些数据相关的问题。这里我就不做过多演示了,小伙伴们可以自己多多尝试。
vn.ask(question="请统计各省份的分数情况")
从输出的内容我们看到除了生成的sql,查询到的数据,以及图表和代码,最前面还有一大堆东西,这些就是prompt提示词,这个我把它提取出来格式化一下。
- prompt = [{'role': 'system',
- #你是一位SQL专家,请帮助生成一个SQL查询来回答这个问题。
- 'content': "You are a SQL expert. Please help to generate a SQL query to answer the question. "
- # 你的回答应该仅仅基于给定的上下文,并遵循回答指南和格式说明。
- "Your response should ONLY be based on the given context and follow the response guidelines and format instructions."
- # 我们的ddl建表语句
- " \n===Tables \nCREATE TABLE student_info "
- "(id INT NOT NULL AUTO_INCREMENT COMMENT '唯一标识符',"
- "name VARCHAR(100) NOT NULL COMMENT '学生姓名',"
- "age INT NOT NULL COMMENT '年龄',"
- "province VARCHAR(100) NOT NULL COMMENT '省份',"
- "score DECIMAL(5,2) NOT NULL COMMENT '分数',"
- "PRIMARY KEY (id)) "
- "ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='存储学生基本信息及成绩';"
- # 回答指南
- # 如果提供的上下文足够,针对问题生成一个有效的SQL查询,无需任何解释。
- # 如果提供的上下文几乎足够,但需要了解特定列中的特定字符串知识,请生成一个中间SQL查询以查找该列中的不同字符串。在查询前加上注释,标记为intermediate_sql。
- # 如果提供的上下文不足,请解释为什么无法生成查询。
- # 请使用最相关的表。
- # 如果问题之前已经被提出并回答过,请完全按照之前的答案重复回答。
- "\n\n===Response Guidelines "
- "\n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. "
- "\n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column,"

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。