Vanna.AI
官方文档
个人理解
Vanna本身是python的一个第三方库,定义上是耦合市面上已有的大模型(LLM)与用户数据库,主要作用是增强大模型对数据库的查询效果,通过对
的使用,在向量库中存储已有的(数据库中的数据结构等)和后续加入的(人为训练的数据)查询问题,并且按照DDL、Document、SQL三种类型在向量库中进行分类存储,还包含一种SQL/Question类型,这种类型格式为{“question”:“年龄大于5随的人”,“sql”:“select
name
from
user
where age>5;”},在进行交互查询时,Vanna在向量库中匹配最倾向的DDL、Document、SQL类型数据,生成prompt,将其交由LLM进行解析,生成相应的sql查询语句,使用SQL语句对集成的数据库进行准确查询,之后由Vanna进行数据处理以及输出,用户对输出数据进行判断并选择是否将其更新入向量库。
附上官网数据流图
过程中可选用多种向量库、LLM、Database进行组合,并且Vanna也支持很多的选择。
快速开始
- 使用官方mock数据- 安装库包
pip intall vanna
- 实现demoimport vannafrom vanna.remote import VannaDefaultvn = VannaDefault(model='chinook', api_key=vanna.get_api_key('[email protected]'))vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')vn.ask("What are the top 10 albums by sales?")from vanna.flask import VannaFlaskAppVannaFlask(vn).run()
功能介绍
Vanna框架使用可分为两大部分,1、模型训练Train,2、提问Ask
相应的功能为
vn.train、vn.ask
vn就是我们实例化的类,不是哪个和影子玩拳击的那位
- vn.train 使用方式整理1. DDL statements:主要告诉模型那些表、那些列、那些数据可以用1.
vn.train(ddl="CREATE TABLE my_table (id INT,name TEXT,age INT)")
2. Documentation strings: 设计数据库之外的一些文档、业务什么的数据1.vn.train(documentation="我们都是一家人,你给我便宜五块")
3. SQL: 经典中的经典,sql灭杀一切,最准确的训练1.vn.train(sql="select `name` from `user` where `age`>13")
4. Question-SQL Pairs:我理解就是问答,提出问题,给出sql答案1.vn.train(quesion="这些孩子的平均年龄是多少?",sql="select AVG(age) from user")
5. Training Plan:可以处理一小部分的数据库信息给到LLM,很适合进行大批量数据的初次训练啥的1.# 从 INFORMATION_SCHEMA.COLUMNS 表中检索所有列的信息df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")plan = vn.get_training_plan_generic(df_information_schema)vn.train(plan=plan)
- vn.ask1. 这个使用起来更简单1.
vn.ask("谁是最帅的男人?")
- ask的组成函数较多、- vn.generat_sql(question:str,allow_llm_to_see_data:Bool) - 生成提出问题的 sql回答,allow_llm_to_see_data是否允许LLM查看数据- 组成功能也挺多 - get_similar_question_sql()- get_related_ddl()- get_related_documentation()- get_sql_pormpt()- submit_pormpt()- vn.run_sql() - 对连接的数据库进行sql查询- vn.generate_plotly_code()- vn.get_plotly_figure()
定制化
基类是VannaBase,在定制化时可以通过继承基类来进行功能创建,或者使用继承了基类的另两个类ChromaDB_VectorStore, OpenAI_Chat
from vanna.openai.openai_chat import OpenAI_Chat
from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore
classMyVanna(ChromaDB_VectorStore, OpenAI_Chat):def__init__(self, config=None):
ChromaDB_VectorStore.__init__(self, config=config)
OpenAI_Chat.__init__(self, config=config)
vn = MyVanna(config={'api_key':'sk-...','model':'gpt-4-...'})
同继承类,可覆盖可重写可新建
VannaBase类定义了官方文档中所有的API功能,子类ChromaDB_VectorStore, OpenAI_Cha重写了部分功能,可以按需重写
基类介绍
依照官方示例风格,实例化的Vanna对象定义为vn
基类定义的方法中,主要依照具体功能进行规范命名
- vn.get_… 获取一些数据- vn.get_plotly_figure(plotly_code,df,drak_mode) 从数据框架和情节代码中获取情节图形。- plotly_code : 生成Plotly图形的代码,df:DataFrame 类型数据-
fig = vn.get_plotly_figure( plotly_code="fig = px.bar(df, x='name', y='salary')", df=df)fig.show()
- get_related_ddl(question,**kwargs) 获取与问题参数相关的ddl信息 --> list- get_related_documentation(question,**kwargs) 获取与问题参数相关的documentation信息 -->list- get_similar_question_sql(question,**kwargs) 此方法用于获取类似的问题及其相应的SQL陈述 --> list- get_sql_prompt(inital_propmt,question,question_sql_list,ddl_list,doc_list,**kwargs) 此方法用于LLM生成SQL的提示。-vn.get_sql_prompt( question="What are the top 10 customers by sales?", question_sql_list=[{"question":"What are the top 10 customers by sales?","sql":"SELECT * FROM customers ORDER BY sales DESC LIMIT 10"}], ddl_list=["CREATE TABLE customers (id INT, name TEXT, sales DECIMAL)"], doc_list=["The customers table contains information about customers and their sales."],)
- get_training_data() 获取训练数据 -->DataFrame- get_training_plan_generic(df) 用于生成训练计划 - vn.add_… 在检索层增加一些内容- add_ddl(ddl,**kwargs) 添加ddl信息到训练数据- add_documentation(documentation,**kwargs) 添加documentation信息到训练数据- add_question_sql(quesion,sql,**kwargs) 添加问题与问题相应的sql查询语句到训练数据
- vn.generate_… 根据模型中的信息,利用LLM生成一些东西- generate_followup_question(question,sql,df,n_questions,**kwargs) --> list- 返回可以继续提问的问题列表,n_questions控制数量- generate_questions(**kwargs)–>list, 生成可以提问的问题- generate_sql(question,allow_llm_to_see_data=False,**kwargs) 使用LLM生成问题的sql语句- 内部会自动运行的方法有- get_similar_question_sql()- get_related_ddl()- get_related_documentation()- get_sql_propmt()- submit_propmt(propmt,**kwargs) 向LLM提交提示-
vn.submit_prompt([ vn.system_message("The user will give you SQL and you will try to guess what the business question this query is answering. Return just the question without any additional explanation. Do not reference the table name in the question."), vn.user_message("What are the top 10 customers by sales?"),])
- generate_summary(question,df,**kwargs) 生成LLm所处处内容的摘要 - vn.run_… 运行sql语句
- vn.remove_… 从检索层删除一些东西- remove_training_data(id,**kwargs)- id来源于训练操作回参
- vn.connect_… 链接不同的数据库- 部分- connect_to_mysql()-
vn.connect_to_mysql(host='my-host', dbname='my-db', user='my-user', password='my-password', port=123)
- connect_to_oracle()-vn.connect_to_oracle(dsn='my-dsn', user='my-user', password='my-password')
- connect_to_sqlite()-vn.connect_to_sqlite('my-database.sqlite')
- connect_to_mssql()-vn.connect_to_mssql(odbc_conn_str='DRIVER={ODBC Driver 17 for SQL Server};SERVER=myserver;DATABASE=mydatabase;UID=myuser;PWD=mypassword')# You can use the ODBC connection string here
- vn.update_… 更新一些内容
- vn.set_… 设置内容
- other- extract_sql()- 从LLM响应中提取SQL查询- extract_sql(llm_response)- is_sql_valid()- 检查SQL查询是否有效。这通常用于检查我们是否应该运行SQL查询。默认情况下,它会检查SQL查询是否是SELECT声明。- is_sql_valid(sql)-
vn.is_sql_valid("SELECT * FROM customers")
- should_generate_chart()- 检查是否应为给定的数据框架生成图表。默认情况下,它会检查DataFrame是否有多行并且是否有数字列。您可以重写此方法来自定义生成图表的逻辑。- should_generate_chart(df)
,它会检查SQL查询是否是SELECT声明。
- is_sql_valid(sql)
- ```python
vn.is_sql_valid("SELECT * FROM customers")
```
- should_generate_chart()- 检查是否应为给定的数据框架生成图表。默认情况下,它会检查DataFrame是否有多行并且是否有数字列。您可以重写此方法来自定义生成图表的逻辑。- should_generate_chart(df)
版权归原作者 够格GOUGE 所有, 如有侵权,请联系我们删除。