Vanna.AI 学习记录

Vanna.AI

官方文档

https://vanna.ai/docs/

个人理解

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
    
    • 实现demo

      import vanna
      from vanna.remote import VannaDefault
      vn = VannaDefault(model='chinook', api_key=vanna.get_api_key('my-email@example.com'))
      vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')
      vn.ask("What are the top 10 albums by sales?")
      
      from vanna.flask import VannaFlaskApp
      VannaFlask(vn).run()
      

功能介绍

Vanna框架使用可分为两大部分,1、模型训练Train,2、提问Ask

相应的功能为

vn.train、vn.ask

vn就是我们实例化的类,不是哪个和影子玩拳击的那位

  1. 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)
        
  2. vn.ask

    1. 这个使用起来更简单

      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

class MyVanna(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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值