当前位置:   article > 正文

VannaAI 介绍及使用 - 第三篇_python vanna

python vanna

Vanna的多样化使用

前言

前面两篇,对Vanna的一些原理和基本使用进行的总结,本篇将根据Vanna提供的多样化配置进行体验尝试,并共同来探索一下Vanna源码,有不正之处请友友们指正。

先做一些说明:

1.我本地目前使用的是 python3.12版本,Vanna是0.5.5版本,不同版本的包可能源码会有些许区别,但主体是一致的。

2.因为Vanna默认是使用chatGPT3.5,我自己本地测试连接其他LLM是通过代理服务实现的,有条件的可以自己部署大模型尝试,本文仅作为自主体验的记录,仅供参考。

3.本篇会先对Vanna一些常用的源码进行说明, 并在此基础上进行一些改造尝试,有误之处请大家多多指正,抱拳抱拳~

一、自定义测试

1.大模型准备 

这里需要先推荐一个代理服务的使用教程链接KIMI AI Free 服务

 我本地试验是用的自己的云服务器,通过链接中的教程,部署了kimi服务。

 2.自定义初始化配置

  1. from vanna.openai import OpenAI_Chat
  2. from vanna.vannadb import VannaDB_VectorStore
  3. from openai import OpenAI
  4. # 使用自己的vanna模型及api key
  5. MY_VANNA_MODEL = "my_vanna_model"
  6. MY_VANNA_API_KEY = "my_vanna_api_key"
  7. # 使用自己的llm模型及所需配置
  8. refresh_token='refresh_token'
  9. my_llm_base_url='http://127.0.0.1:8000/v1' #IP和端口号改为你自己的,我这里实际用的我的云服务器的地址
  10. my_llm_name='kimi'
  11. # 初始化客户端
  12. client = OpenAI(
  13. api_key=refresh_token,
  14. base_url=my_llm_base_url,
  15. default_headers={"Authorization": f"Bearer {refresh_token}", "Content-Type": "application/json"}
  16. )
  17. class MyVanna(VannaDB_VectorStore, OpenAI_Chat):
  18. def __init__(self, client=None, config=None):
  19. VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)
  20. OpenAI_Chat.__init__(self, client=client, config=config)
  21. # 使用自定义的大模型及vanna提供的向量库
  22. vn = MyVanna(client=client, config={"model": my_llm_name, })

有朋友肯定会问,为什么我这里的初始化这么复杂,官网的初始化代码很简单嘛,这里做一些说明:

  1. 我这里使用的是openai的自定义配置,但是呢实际我是去请求我云服务器的kimi服务,他们的请求体是差不多的,所以可以直接套用,但是呢要将所需的参数都提前定义,一个是Vanna的apikey和model,在Vanna官网根据自己的账号获取,还有一个就是kimi大模型服务需要的token,接口url和model。
  2. 这里我比官网多了一个client客户端的初始化,实际Vanna源码中也是有client初始化的代码,但是我这里自定义了一个,满足需要就行了,client的作用主要就是传递相关参数,这里会用到的就是api_key,base_url,default_headers,为了方便测试,这里就提前定义好。

3. 数据库连接

以下是数据库连接方法,这里以mysql为例。Vanna还提供其他的数据库连接方式,都是以connect_to_数据库的方式命名。

  1. # 初始化数据库连接
  2. vn.connect_to_mysql(host="localhost", dbname="test", user="root", password="123456", port=3306)

 4.提问验证

其实这个时候就可以问问题了,我先问个‘你是谁’看看,然后执行。

vn.ask(question="你是谁")

 回答结果:

 连接成功啦,回答也是OK的,最后一行报错是因为当前kimi的回答无法作为sql去执行,这个没关系,我们换一个能生成sql的问题。

vn.ask(question="请帮我查一下student_info表score大于92的数据")

回答结果:

可以看到kimi是正常生成了sql的,并且Vanna通过sql也从数据库查到了数据,并让kimi生成相应的图形代码,展示出了图形。(这里我是提前准备了数据库的测试数据的,第二篇文章有建表语句和插入数据语句) 

5.训练数据 

刚才我们的提问是很详细具体的,我们加入一些训练数据,以实现能满足多样化的提问。

  1. 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='存储学生基本信息及成绩';")
  2. vn.train(question="请查询student_info表中score大于90的数据", sql="SELECT * FROM student_info WHERE score > 90;")
  3. vn.train(question='请查询分数小于85的省份', sql="SELECT DISTINCT province FROM student_info WHERE score < 85;")
  4. #自己再加一些样例

然后我们再继续进行一些数据相关的问题。这里我就不做过多演示了,小伙伴们可以自己多多尝试。

vn.ask(question="请统计各省份的分数情况")

 从输出的内容我们看到除了生成的sql,查询到的数据,以及图表和代码,最前面还有一大堆东西,这些就是prompt提示词,这个我把它提取出来格式化一下。

  1. prompt = [{'role': 'system',
  2. #你是一位SQL专家,请帮助生成一个SQL查询来回答这个问题。
  3. 'content': "You are a SQL expert. Please help to generate a SQL query to answer the question. "
  4. # 你的回答应该仅仅基于给定的上下文,并遵循回答指南和格式说明。
  5. "Your response should ONLY be based on the given context and follow the response guidelines and format instructions."
  6. # 我们的ddl建表语句
  7. " \n===Tables \nCREATE TABLE student_info "
  8. "(id INT NOT NULL AUTO_INCREMENT COMMENT '唯一标识符',"
  9. "name VARCHAR(100) NOT NULL COMMENT '学生姓名',"
  10. "age INT NOT NULL COMMENT '年龄',"
  11. "province VARCHAR(100) NOT NULL COMMENT '省份',"
  12. "score DECIMAL(5,2) NOT NULL COMMENT '分数',"
  13. "PRIMARY KEY (id)) "
  14. "ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='存储学生基本信息及成绩';"
  15. # 回答指南
  16. # 如果提供的上下文足够,针对问题生成一个有效的SQL查询,无需任何解释。
  17. # 如果提供的上下文几乎足够,但需要了解特定列中的特定字符串知识,请生成一个中间SQL查询以查找该列中的不同字符串。在查询前加上注释,标记为intermediate_sql。
  18. # 如果提供的上下文不足,请解释为什么无法生成查询。
  19. # 请使用最相关的表。
  20. # 如果问题之前已经被提出并回答过,请完全按照之前的答案重复回答。
  21. "\n\n===Response Guidelines "
  22. "\n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. "
  23. "\n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column,"
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/959931
推荐阅读
相关标签
  

闽ICP备14008679号