大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!
1.什么是 VannaVanna 发音为 /[van-na]/,是一个获得 MIT 许可的开源 Python RAG(RAG,全名为 Retrieval-Augmented Generation ,中文为检索增强生成,其是优化大型语言模型输出的过程,因此它在生成响应之前引用训练数据源之外的权威知识库)框架,用于 SQL 生成和相关功能。
Chat with your SQL database . Accurate Text-to-SQL Generation via LLMs using RAG .Vanna helps you generate and run accurate SQL for your database using LLMs via Retrieval-Augmented Generation
Vanna 的工作过程分为两个简单步骤 , 在数据上训练 RAG“模型”,然后提出问题,这些问题将返回 SQL 查询,这些查询可以设置为在当前数据库上自动运行。核心就是以下两个方法,即 vn.train 和 vn.ask。
vn.train(...):在数据上训练 RAG“模型”,这些方法添加到下面的参考语料库中。vn.ask(...):提出问题,将使用参考语料库生成可在数据库上运行的 SQL 查询。总之,RAG 的本质是训练一个自有模型,该模型存储一些元数据,然后用它来 “提出” 问题。RAG 的特征可以总结为以下几点:
复杂数据集的高精度:Vanna 的能力与您提供的训练数据相关,更多训练数据意味着大型复杂数据集的准确性更高安全且私密:数据库内容不会发送到 LLM 或矢量数据库,SQL 执行发生在本地环境中自学习:如果通过 Jupyter 使用,可以选择在成功执行的查询上 “自动训练” 它,如果是其他界面,可以让界面提示用户提供结果反馈。正确的问题对 SQL 对进行存储以供将来参考,使将来的结果更加准确支持任何 SQL 数据库:允许连接到任何可以使用 Python 连接的 SQL 数据库。同时选择熟悉的前端,如:upyter Notebook、Slackbot、Web APP、Streamlit APP 等等。与 LLM 本身提供的 Fine-Tuning 相比,RAG 有以下特点:
跨 LLMs 可移植如果任何训练数据变得过时,则可以轻松删除训练数据运行比微调便宜得多更面向未来,如果出现更好的 LLMs,可以将其换掉目前 Vanna 在 Github 通过 MIT 协议开源,有超过 2.8k 的 star,是一个值得关注的前端开源项目。
2.如何使用 Vanna2.1 依赖安装首先需要安装相依依赖:
pip install vanna// PIP 是 Python 包或模块的包管理器// 注意:如果使用的是 Python 3.4 或更高版本,则默认包含 PIP 命令然后在 Python 中导入相应的包:
import vannafrom vanna.remote import VannaDefaultVanna 提供了获取 API 密钥的函数,将收到发送到电子邮件的代码。可以保存 API 密钥以供将来使用,这样就不必每次都登录。
api_key = vanna.get_api_key('my-email@example.com')// chinook 是一个公共模型,引用了 Chinook 示例数据库vanna_model_name = 'chinook'// This is the name of the RAG model. This is typically associated with a specific dataset.vn = VannaDefault(model=vanna_model_name, api_key=api_key)// 下面代码连接到 SQLite 数据库,但也可以连接到任何 SQL 数据库。vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')// 下面命令链接到 BigQuery 数据库vn.connect_to_bigquery(project_id='my-project')// 下面命令链接到 postgres 数据库vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')2.2 Vanna训练对于训练来说通常只需一次,除非想添加更多训练数据,否则不要再次训练。
// 信息 schema 查询可能需要根据数据库进行一些调整df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")// 这会将信息模式分解为可供 LLM 引用的小块plan = vn.get_training_plan_generic(df_information_schema)plan// 如果喜欢可以取消注释并运行它来训练// vn.train(plan=plan)是否要运行 vn.train 命令具体取决于用例。下面使用 DDL 语句进行训练 ,DDL 语句包含有关数据库中的表名、列、数据类型和关系的信息。
// 包括DDL训练vn.train(ddl=""" CREATE TABLE IF NOT EXISTS my-table ( id INT PRIMARY KEY, name VARCHAR(100), age INT )""")// 或者vn.add_ddl( ddl="CREATE TABLE employees (id INT, name VARCHAR(255), salary INT)")当然,还可以使用文档进行训练,比如有时可能想要添加有关业务术语或定义的文档。
// 私有文档集训练vn.train(documentation="Our business defines XYZ as ...")当然,开发者还可以将 SQL 查询添加到训练数据中。如果已经有一些查询,这可能很有用,此时只需从编辑器中复制并粘贴这些内容即可开始生成新的 SQL。
vn.train(sql="SELECT name, age FROM my-table WHERE name ='John Doe'")// 或者vn.add_sql( question="What is the average salary of employees?", sql="SELECT AVG(salary) FROM employees")开发者可以随时检查该包能够引用哪些训练数据,比如下面的示例:
training_data = vn.get_training_data()training_data如果存在过时 / 不正确的信息也可以自行删除训练数据:
vn.remove_training_data(id='1-ddl')2.3 文档答疑可以通过下面命令启动答疑界面:
import vannafrom vanna.remote import VannaDefaultvn = 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 artists by sales?')from vanna.flask import VannaFlaskAppVannaFlaskApp(vn).run()// 运行答疑界面此时输入下面的答疑示例:
vn.ask("What are the top 10 customers by sales?")将得到如下的 SQL 语句:
// SQL 生成示例SELECT c.c_name as customer_name, sum(l.l_extendedprice * (1 - l.l_discount)) as total_salesFROM snowflake_sample_data.tpch_sf1.lineitem l join snowflake_sample_data.tpch_sf1.orders o ON l.l_orderkey = o.o_orderkey join snowflake_sample_data.tpch_sf1.customer c ON o.o_custkey = c.c_custkeyGROUP BY customer_nameORDER BY total_sales desc limit 10;如果已连接到数据库,还能获取相应的表格和图表数据:
2.4 本地部署Vanna 还支持本地部署,比如下面的示例代码:
from vanna.openai.openai_chat import OpenAI_Chatfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStoreclass 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-...'})3.本文总结本文主要和大家介绍 Vanna,其是一个获得 MIT 许可的开源 Python RAG(检索增强生成)框架,用于 SQL 生成和相关功能。因为篇幅问题,关于 Vanna 只是做了一个简短的介绍,但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。如果大家有什么疑问欢迎在评论区留言。
参考资料https://github.com/vanna-ai/vanna
https://vanna.ai/docs/
https://vanna.ai/docs/getting-started.html
https://vanna.ai/docs/other-database-openai-vanna-vannadb.html
https://vanna.ai/
https://vanna.ai/docs/vanna.html
https://aws.amazon.com/cn/what-is/retrieval-augmented-generation/
https://vanna.ai/docs/vanna.html