diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index ad1c2a23..00000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -docs.vanna.ai \ No newline at end of file diff --git a/docs/databases.md b/docs/databases.md deleted file mode 100644 index 6924d34c..00000000 --- a/docs/databases.md +++ /dev/null @@ -1,142 +0,0 @@ -# How to use Vanna with various databases - -You can use Vanna with any database that you can connect to via Python. Here are some examples of how to connect to various databases. - -All you have to do is provide Vanna with a function that takes in a SQL query and returns a Pandas DataFrame. Here are some examples of how to do that. - -## **PostgreSQL** - -```python -import pandas as pd -import psycopg2 - -conn_details = {...} # fill this with your connection details -conn_postgres = psycopg2.connect(**conn_details) - -def run_sql_postgres(sql: str) -> pd.DataFrame: - df = pd.read_sql_query(sql, conn_postgres) - return df - -vn.run_sql = run_sql_postgres -``` - -## **Snowflake** - -We have a built-in function for Snowflake, so you don't need to write your own. - -```python -vn.connect_to_snowflake(account='my-account', username='my-username', password='my-password', database='my-database') -``` - -```python -import pandas as pd -from snowflake.connector.pandas_tools import pd_read_sql -from snowflake.connector import connect - -conn_details = {...} # fill this with your connection details -conn_snowflake = connect(**conn_details) - -def run_sql_snowflake(sql: str) -> pd.DataFrame: - df = pd_read_sql(sql, conn_snowflake) - return df - -vn.run_sql = run_sql_snowflake -``` - -## **Google BigQuery** - -```python -from google.cloud import bigquery -import pandas as pd - -project_id = 'your-project-id' # replace with your Project ID -client_bigquery = bigquery.Client(project=project_id) - -def run_sql_bigquery(sql: str) -> pd.DataFrame: - df = client_bigquery.query(sql).to_dataframe() - return df - -vn.run_sql = run_sql_bigquery -``` - -## **Amazon Athena** - -```python -import pandas as pd -from pyathena import connect - -conn_details = {...} # fill this with your connection details -conn_athena = connect(**conn_details) - -def run_sql_athena(sql: str) -> pd.DataFrame: - df = pd.read_sql(sql, conn_athena) - return df - -vn.run_sql = run_sql_athena -``` - -## **Amazon Redshift** - -```python -import pandas as pd -import psycopg2 - -conn_details = {...} # fill this with your connection details -conn_redshift = psycopg2.connect(**conn_details) - -def run_sql_redshift(sql: str) -> pd.DataFrame: - df = pd.read_sql_query(sql, conn_redshift) - return df - -vn.run_sql = run_sql_redshift -``` - -Sure, here is an example for Google Cloud SQL using the MySQL connector: - -## **Google Cloud SQL (MySQL)** - -```python -import pandas as pd -import mysql.connector - -conn_details = {...} # fill this with your connection details -conn_google_cloud_sql = mysql.connector.connect(**conn_details) - -def run_sql_google_cloud_sql(sql: str) -> pd.DataFrame: - df = pd.read_sql(sql, conn_google_cloud_sql) - return df -``` - -Note: Google Cloud SQL supports MySQL, PostgreSQL, and SQL Server. The above example uses MySQL. If you are using PostgreSQL or SQL Server, you should use the appropriate connector. - -## **SQLite** - -```python -import sqlite3 -import pandas as pd - -db_path = 'path_to_your_db' # replace with your SQLite DB path -conn_sqlite = sqlite3.connect(db_path) - -def run_sql_sqlite(sql: str) -> pd.DataFrame: - df = pd.read_sql_query(sql, conn_sqlite) - return df - -vn.run_sql = run_sql_sqlite -``` - -## **Microsoft SQL Server** - -```python -import pandas as pd -import pyodbc - -conn_details = {...} # fill this with your connection details -conn_sql_server = pyodbc.connect(**conn_details) - -def run_sql_sql_server(sql: str) -> pd.DataFrame: - df = pd.read_sql(sql, conn_sql_server) - return df - -vn.run_sql = run_sql_sql_server -``` diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 02d2fc63..00000000 --- a/docs/index.md +++ /dev/null @@ -1,239 +0,0 @@ -# Vanna.AI - Personalized AI SQL Agent - -**Let Vanna.AI write your nasty SQL for you**. Vanna is a Python based AI SQL agent trained on your schema that writes complex SQL in seconds. `pip install vanna` to get started now. - - - -## An example - -A business user asks you **"who are the top 2 customers in each region?"**. Right in the middle of lunch. And they need it for a presentation this afternoon. 😡😡😡 - -### The old way 😡 😫 💩 -Simple question to ask, not so fun to answer. You spend over an hour a) finding the tables, b) figuring out out the joins, c) look up the syntax for ranking, d) putting this into a CTE, e) filtering by rank, and f) choosing the correct metrics. Finally, you come up with this ugly mess - - -```sql -with ranked_customers as (SELECT c.c_name as customer_name, - r.r_name as region_name, - row_number() OVER (PARTITION BY r.r_name - ORDER BY sum(l.l_quantity * l.l_extendedprice) desc) as rank - FROM snowflake_sample_data.tpch_sf1.customer c join snowflake_sample_data.tpch_sf1.orders o - ON c.c_custkey = o.o_custkey join snowflake_sample_data.tpch_sf1.lineitem l - ON o.o_orderkey = l.l_orderkey join snowflake_sample_data.tpch_sf1.nation n - ON c.c_nationkey = n.n_nationkey join snowflake_sample_data.tpch_sf1.region r - ON n.n_regionkey = r.r_regionkey - GROUP BY customer_name, region_name) -SELECT region_name, - customer_name -FROM ranked_customers -WHERE rank <= 2; -``` - -And you had to skip your lunch. **HANGRY!** - -### The Vanna way 😍 🌟 🚀 -With Vanna, you train up a custom model on your data warehouse, and simply enter this in your Jupyter Notebook - - -```python -import vanna as vn -vn.set_model('your-model') -vn.ask('who are the top 2 customers in each region?') -``` - -Vanna generates that nasty SQL above for you, runs it (locally & securely) and gives you back a Dataframe in seconds: - -| region_name | customer_name | total_sales | -| ----------- | ------------- | ----------- | -| ASIA | Customer#000000001 | 68127.72 | -| ASIA | Customer#000000002 | 65898.69 | -... - -And you ate your lunch in peace. **YUMMY!** - -## How Vanna works -Vanna works in two easy steps - train a model on your data, and then ask questions. - -1. **Train a model on your data**. -2. **Ask questions**. - -When you ask a question, we utilize a custom model for your dataset to generate SQL, as seen below. Your model performance and accuracy depends on the quality and quantity of training data you use to train your model. -how-vanna-works - - - -## Why Vanna? - -1. **High accuracy on complex datasets.** - - Vanna’s capabilities are tied to the training data you give it - - More training data means better accuracy for large and complex datasets -2. **Secure and private.** - - Your database contents are never sent to Vanna’s servers - - We only see the bare minimum - schemas & queries. -3. **Isolated, custom model.** - - You train a custom model specific to your database and your schema. - - Nobody else can use your model or view your model’s training data unless you choose to add members to your model or make it public - - We use a combination of third-party foundational models (OpenAI, Google) and our own LLM. -4. **Self learning.** - - As you use Vanna more, your model continuously improves as we augment your training data -5. **Supports many databases.** - - We have out-of-the-box support Snowflake, BigQuery, Postgres - - You can easily make a connector for any [database](https://docs.vanna.ai/databases/) -6. **Pretrained models.** - - If you’re a data provider you can publish your models for anyone to use - - As part of our roadmap, we are in the process of pre-training models for common datasets (Google Ads, Facebook ads, etc) -7. **Choose your front end.** - - Start in a Jupyter Notebook. - - Expose to business users via Slackbot, web app, Streamlit app, or Excel plugin. - - Even integrate in your web app for customers. - -## Getting started -You can start by [automatically training Vanna (currently works for Snowflake)](https://docs.vanna.ai/notebooks/vn-train/) or add manual training data. - -### Train with DDL Statements -If you prefer to manually train, you do not need to connect to a database. You can use the train function with other parmaeters like ddl - - -```python -vn.train(ddl=""" - CREATE TABLE IF NOT EXISTS my-table ( - id INT PRIMARY KEY, - name VARCHAR(100), - age INT - ) -""") -``` - -### Train with Documentation -Sometimes you may want to add documentation about your business terminology or definitions. - -```python -vn.train(documentation="Our business defines OTIF score as the percentage of orders that are delivered on time and in full") -``` - -### Train with SQL -You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL. - -```python -vn.train(sql="SELECT * FROM my-table WHERE name = 'John Doe'") -``` - - - -## Asking questions -```python -vn.ask("What are the top 10 customers by sales?") -``` - - SELECT c.c_name as customer_name, - sum(l.l_extendedprice * (1 - l.l_discount)) as total_sales - FROM 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_custkey - GROUP BY customer_name - ORDER BY total_sales desc limit 10; - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CUSTOMER_NAMETOTAL_SALES
0Customer#0001435006757566.0218
1Customer#0000952576294115.3340
2Customer#0000871156184649.5176
3Customer#0001311136080943.8305
4Customer#0001343806075141.9635
5Customer#0001038346059770.3232
6Customer#0000696826057779.0348
7Customer#0001020226039653.6335
8Customer#0000985876027021.5855
9Customer#0000646605905659.6159
-
- - - - -![png](notebooks/vn-ask_files/vn-ask_10_2.png) - - - - -AI-generated follow-up questions: - -* What is the country name for each of the top 10 customers by sales? -* How many orders does each of the top 10 customers by sales have? -* What is the total revenue for each of the top 10 customers by sales? -* What are the customer names and total sales for customers in the United States? -* Which customers in Africa have returned the most parts with a gross value? -* What are the total sales for the top 3 customers? -* What are the customer names and total sales for the top 5 customers? -* What are the total sales for customers in Europe? -* How many customers are there in each country? - -## More resources - - [Full Documentation](https://docs.vanna.ai) - - [Website](https://vanna.ai) - - [Slack channel for support](https://join.slack.com/t/vanna-ai/shared_invite/zt-1unu0ipog-iE33QCoimQiBDxf2o7h97w) - - [LinkedIn](https://www.linkedin.com/company/vanna-ai/) diff --git a/docs/intro-to-vanna.md b/docs/intro-to-vanna.md deleted file mode 100644 index d935082e..00000000 --- a/docs/intro-to-vanna.md +++ /dev/null @@ -1,64 +0,0 @@ -# Intro to Vanna: A Python-based AI SQL co-pilot - -**TLDR**: We help data people that know Python write SQL faster using AI. [See our starter notebook here](notebooks/vn-ask.md). - -## The deluge of data - -We are bathing in an ocean of data, sitting in Snowflake or BigQuery, that is brimming with potential insights. Yet only a small fraction of people in an enterprise have the two skills required to harness the data — - -1. A solid comprehension of advanced SQL, and -2. A comprehensive knowledge of the data structure & schema - -## The burden of being data-savvy - -Since you are reading this, chances are you are one of those fortunate few (data analysts, data scientists, data engineers, etc) with those abilities. It’s an invaluable skill, but you also get hit tons requests requiring you to write complex SQL queries. Annoying! - -## Introducing Vanna, the SQL co-pilot - -Vanna, at its core, is a co-pilot to Python & SQL savvy data people to to streamline the process of writing custom SQL on your company’s data warehouse using AI and LLMs. Most of our users use our Python package directly via Jupyter Notebooks ([starter notebook here](notebooks/vn-ask.md)) — - -```python -sql = vn.generate_sql(question='What are the top 10 customers by Sales?') -print(sql) -``` - -And here are the results — - -```sql -SELECT customer_name, - total_sales -FROM (SELECT c.c_name as customer_name, - sum(l.l_extendedprice * (1 - l.l_discount)) as total_sales, - row_number() OVER (ORDER BY sum(l.l_extendedprice * (1 - l.l_discount)) desc) as rank - FROM 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_custkey - GROUP BY customer_name) -WHERE rank <= 10; -``` - -## Getting started with Vanna in a Notebook - -Vanna is super easy to get started with — - -1. **Grab an API key** directly through the notebook -2. **Train a custom model** on some past queries from your data warehouse -3. **Ask questions in plain English** and get back SQL that you can run in your workflow - -Check out the full starter notebook here. - -Vanna is built with a privacy-first and security-first design — **your data never leaves your environment**. - -## Using Vanna with a Streamlit front end - -[Streamlit](https://streamlit.io/) is an open source pure Python front end. We have built an UI for Vanna on top of Streamlit, that you can either use directly (eg our hosted version), and that you can clone, download, optionally modify, and self host. - -If you choose to self host it, you can run Vanna with a UI without any data leaving your environment. - -![Image](https://miro.medium.com/v2/resize:fit:640/format:webp/1*PmScp647UWIaxUatib_4SQ.png) - -[Check out the Streamlit UI here](https://github.com/vanna-ai/vanna-streamlit). - -## Conclusion - -Vanna is a powerful tool for data people that know Python to write SQL faster using AI. It's easy to get started with, and you can even use it with a Streamlit front end for a more interactive experience. Best of all, it's built with a privacy-first and security-first design, so your data never leaves your environment. Give it a try and see how it can streamline your SQL writing process. \ No newline at end of file diff --git a/docs/onboarding.md b/docs/onboarding.md deleted file mode 100644 index 8f15aa78..00000000 --- a/docs/onboarding.md +++ /dev/null @@ -1,30 +0,0 @@ -## What do I need to do to use **Vanna.AI**? -Vanna.AI uses a combination of documentation and historical question and SQL pairs to generate SQL from natural language. - -### Step 1: Train **Vanna.AI** -- Give **Vanna.AI** sample SQL -- **Vanna.AI** will try to guess the question -- Verify the question is correct -```mermaid -flowchart LR - Generate[vn.generate_question] - Question[Question] - Verify{Is the question correct?} - SQL --> Generate - Generate --> Question - Question --> Verify - Verify -- Yes --> Store[vn.store_sql] - Verify -- No --> Update[Update the Question] - Update --> Store - -``` - -### Step 2: Ask **Vanna.AI** a Question -```mermaid -flowchart LR - Question[Question] - Generate[vn.generate_sql] - SQL[SQL] - Question --> Generate - Generate --> SQL -``` diff --git a/docs/reference.md b/docs/reference.md deleted file mode 100644 index fc4459af..00000000 --- a/docs/reference.md +++ /dev/null @@ -1,4 +0,0 @@ -# Vanna Package Full Reference -::: vanna - options: - show_source: false \ No newline at end of file diff --git a/docs/sidebar.py b/docs/sidebar.py deleted file mode 100644 index f6923a38..00000000 --- a/docs/sidebar.py +++ /dev/null @@ -1,130 +0,0 @@ -import yaml -import sys -import nbformat -from nbconvert import HTMLExporter - -# Get the yaml file path from the command line -file_path = sys.argv[1] - -# Get the directory to search for the .ipynb files from the command line -notebook_dir = sys.argv[2] - -# Get the output directory from the command line -output_dir = sys.argv[3] - -def generate_html(sidebar_data, current_path: str): - html = '' - return html - -def generate_header(notebook_name: str) -> str: - return f""" - - - Run Using Colab - - - - Open in GitHub - -""" - -# Read YAML data from a file -def read_yaml_file(file_path): - with open(file_path, 'r') as file: - yaml_data = file.read() - return yaml_data - -yaml_data = read_yaml_file(file_path) - -# Parse YAML data -sidebar_data = yaml.safe_load(yaml_data) - -# Get a list of all .ipynb files in the directory -import os -notebook_files = [file for file in os.listdir(notebook_dir) if file.endswith('.ipynb')] - -def is_runnable(notebook_name: str, sidebar_data: dict) -> bool: - # Check if the notebook is runnable - for entry in sidebar_data: - if 'link' in entry: - if entry['link'] == f'{notebook_name}.html': - return entry.get('runnable', 'true') == 'true' - - if 'sub_entries' in entry: - for sub_entry in entry['sub_entries']: - if sub_entry['link'] == f'{notebook_name}.html': - return sub_entry.get('runnable', 'true') == 'true' - - return False - -def get_title_from_sidebar_data(notebook_name: str, sidebar_data: dict) -> str: - # Check if the notebook is runnable - for entry in sidebar_data: - if 'link' in entry: - if entry['link'] == f'{notebook_name}.html': - return entry['title'] - - if 'sub_entries' in entry: - for sub_entry in entry['sub_entries']: - if sub_entry['link'] == f'{notebook_name}.html': - return sub_entry['title'] - - return '' - -for notebook_file in notebook_files: - # Get just the file name without the extension - notebook_name = os.path.splitext(notebook_file)[0] - - # Get the full path to the notebook - notebook_file_path = os.path.join(notebook_dir, notebook_file) - - # Generate HTML code - html_code = generate_html(sidebar_data, f'{notebook_name}.html') - - # Read notebook file - current_notebook = nbformat.read(notebook_file_path, as_version=4) - - html_exporter = HTMLExporter(template_name='nb-theme') - - (body, resources) = html_exporter.from_notebook_node(current_notebook) - - notebook_title = get_title_from_sidebar_data(notebook_name, sidebar_data) - - # Write body to file - with open(os.path.join(output_dir, f'{notebook_name}.html'), 'w') as file: - # From sidebar_data, see if there is a matching entry for the current notebook - if is_runnable(notebook_name, sidebar_data): - file.write(body.replace('nb_title', f"Vanna Docs: {notebook_title}").replace('', html_code).replace('', generate_header(notebook_name))) - else: - file.write(body.replace('nb_title', f"Vanna Docs: {notebook_title}").replace('', html_code)) - - diff --git a/docs/sidebar.yaml b/docs/sidebar.yaml deleted file mode 100644 index 5c669302..00000000 --- a/docs/sidebar.yaml +++ /dev/null @@ -1,77 +0,0 @@ -- title: How It Works - link: index.html - runnable: false - svg_text: |- - - -- title: Getting Started - link: getting-started.html - svg_text: |- - - -- title: Train Vanna - svg_text: |- - - sub_entries: - - title: Snowflake - link: vn-train.html - svg_text: |- - - - - title: Other Databases - link: manual-train.html - svg_text: |- - - -- title: User Interfaces - svg_text: |- - - sub_entries: - - title: Streamlit - link: streamlit.html - runnable: false - svg_text: |- - - - - title: Slack - link: slack.html - runnable: false - svg_text: |- - - -- title: Databases - link: databases.html - svg_text: |- - - -- title: Running Locally - link: snowflake-openai-standard-chromadb.html - svg_text: |- - - -- title: API Reference - link: vanna.html - svg_text: |- - diff --git a/docs/streamlit.md b/docs/streamlit.md deleted file mode 100644 index 2b80b17a..00000000 --- a/docs/streamlit.md +++ /dev/null @@ -1,13 +0,0 @@ -# Use **Vanna.AI** with Streamlit - -## App - - -## Code -[https://github.com/vanna-ai/vanna-streamlit](https://github.com/vanna-ai/vanna-streamlit) - - \ No newline at end of file diff --git a/docs/support.md b/docs/support.md deleted file mode 100644 index 46599246..00000000 --- a/docs/support.md +++ /dev/null @@ -1,5 +0,0 @@ -# Getting Support - -E-mail us at [support@vanna.ai](mailto:support@vanna.ai) - -[Join our Slack](https://join.slack.com/t/vanna-ai/shared_invite/zt-1unu0ipog-iE33QCoimQiBDxf2o7h97w) \ No newline at end of file diff --git a/docs/vanna/types.html b/docs/vanna/types.html deleted file mode 100644 index e6772780..00000000 --- a/docs/vanna/types.html +++ /dev/null @@ -1,1717 +0,0 @@ - - - - - - - vanna.types API documentation - - - - - - - - - - -
-
-

-vanna.types

- - - - - -
-
-
-
@dataclass
- - class - Status: - - -
- - - - -
-
- - Status(success: bool, message: str) - - -
- - - - -
-
-
- success: bool - - -
- - - - -
-
-
- message: str - - -
- - - - -
-
-
-
-
@dataclass
- - class - QuestionList: - - -
- - - - -
-
- - QuestionList(questions: List[vanna.types.FullQuestionDocument]) - - -
- - - - -
-
-
- questions: List[vanna.types.FullQuestionDocument] - - -
- - - - -
-
-
-
-
@dataclass
- - class - FullQuestionDocument: - - -
- - - - -
-
- - FullQuestionDocument( id: vanna.types.QuestionId, question: vanna.types.Question, answer: vanna.types.SQLAnswer | None, data: vanna.types.DataResult | None, plotly: vanna.types.PlotlyResult | None) - - -
- - - - -
-
- - - - - -
-
-
- question: vanna.types.Question - - -
- - - - -
-
-
- answer: vanna.types.SQLAnswer | None - - -
- - - - -
-
-
- data: vanna.types.DataResult | None - - -
- - - - -
-
-
- plotly: vanna.types.PlotlyResult | None - - -
- - - - -
-
-
-
-
@dataclass
- - class - QuestionSQLPair: - - -
- - - - -
-
- - QuestionSQLPair(question: str, sql: str) - - -
- - - - -
-
-
- question: str - - -
- - - - -
-
-
- sql: str - - -
- - - - -
-
-
-
-
@dataclass
- - class - Organization: - - -
- - - - -
-
- - Organization( name: str, user: str | None, connection: vanna.types.Connection | None) - - -
- - - - -
-
-
- name: str - - -
- - - - -
-
-
- user: str | None - - -
- - - - -
-
-
- connection: vanna.types.Connection | None - - -
- - - - -
-
-
-
-
@dataclass
- - class - QuestionId: - - -
- - - - -
-
- - QuestionId(id: str) - - -
- - - - -
-
-
- id: str - - -
- - - - -
-
-
-
-
@dataclass
- - class - Question: - - -
- - - - -
-
- - Question(question: str) - - -
- - - - -
-
-
- question: str - - -
- - - - -
-
-
-
-
@dataclass
- - class - QuestionCategory: - - -
- - - - -
-
- - QuestionCategory(question: str, category: str) - - -
- - - - -
-
-
- question: str - - -
- - - - -
-
-
- category: str - - -
- - - - -
-
-
- NO_SQL_GENERATED = -'No SQL Generated' - - -
- - - - -
-
-
- SQL_UNABLE_TO_RUN = -'SQL Unable to Run' - - -
- - - - -
-
-
- BOOTSTRAP_TRAINING_QUERY = -'Bootstrap Training Query' - - -
- - - - -
-
-
- ASSUMED_CORRECT = -'Assumed Correct' - - -
- - - - -
-
-
- FLAGGED_FOR_REVIEW = -'Flagged for Review' - - -
- - - - -
-
-
- REVIEWED_AND_APPROVED = -'Reviewed and Approved' - - -
- - - - -
-
-
- REVIEWED_AND_REJECTED = -'Reviewed and Rejected' - - -
- - - - -
-
-
- REVIEWED_AND_UPDATED = -'Reviewed and Updated' - - -
- - - - -
-
-
-
-
@dataclass
- - class - AccuracyStats: - - -
- - - - -
-
- - AccuracyStats(num_questions: int, data: Dict[str, int]) - - -
- - - - -
-
-
- num_questions: int - - -
- - - - -
-
-
- data: Dict[str, int] - - -
- - - - -
-
-
-
-
@dataclass
- - class - Followup: - - -
- - - - -
-
- - Followup(followup: str) - - -
- - - - -
-
-
- followup: str - - -
- - - - -
-
-
-
-
@dataclass
- - class - QuestionEmbedding: - - -
- - - - -
-
- - QuestionEmbedding(question: vanna.types.Question, embedding: List[float]) - - -
- - - - -
-
-
- question: vanna.types.Question - - -
- - - - -
-
-
- embedding: List[float] - - -
- - - - -
-
-
-
-
@dataclass
- - class - Connection: - - -
- - - - -
-
-
-
@dataclass
- - class - SQLAnswer: - - -
- - - - -
-
- - SQLAnswer(raw_answer: str, prefix: str, postfix: str, sql: str) - - -
- - - - -
-
-
- raw_answer: str - - -
- - - - -
-
-
- prefix: str - - -
- - - - -
-
-
- postfix: str - - -
- - - - -
-
-
- sql: str - - -
- - - - -
-
-
-
-
@dataclass
- - class - Explanation: - - -
- - - - -
-
- - Explanation(explanation: str) - - -
- - - - -
-
-
- explanation: str - - -
- - - - -
-
-
-
-
@dataclass
- - class - DataResult: - - -
- - - - -
-
- - DataResult( question: str | None, sql: str | None, table_markdown: str, error: str | None, correction_attempts: int) - - -
- - - - -
-
-
- question: str | None - - -
- - - - -
-
-
- sql: str | None - - -
- - - - -
-
-
- table_markdown: str - - -
- - - - -
-
-
- error: str | None - - -
- - - - -
-
-
- correction_attempts: int - - -
- - - - -
-
-
-
-
@dataclass
- - class - PlotlyResult: - - -
- - - - -
-
- - PlotlyResult(plotly_code: str) - - -
- - - - -
-
-
- plotly_code: str - - -
- - - - -
-
-
-
-
@dataclass
- - class - WarehouseDefinition: - - -
- - - - -
-
- - WarehouseDefinition(name: str, tables: List[vanna.types.TableDefinition]) - - -
- - - - -
-
-
- name: str - - -
- - - - -
-
-
- tables: List[vanna.types.TableDefinition] - - -
- - - - -
-
-
-
-
@dataclass
- - class - TableDefinition: - - -
- - - - -
-
- - TableDefinition( schema_name: str, table_name: str, ddl: str | None, columns: List[vanna.types.ColumnDefinition]) - - -
- - - - -
-
-
- schema_name: str - - -
- - - - -
-
-
- table_name: str - - -
- - - - -
-
-
- ddl: str | None - - -
- - - - -
-
-
- columns: List[vanna.types.ColumnDefinition] - - -
- - - - -
-
-
-
-
@dataclass
- - class - ColumnDefinition: - - -
- - - - -
-
- - ColumnDefinition( name: str, type: str, is_primary_key: bool, is_foreign_key: bool, foreign_key_table: str, foreign_key_column: str) - - -
- - - - -
-
-
- name: str - - -
- - - - -
-
-
- type: str - - -
- - - - -
-
-
- is_primary_key: bool - - -
- - - - -
-
-
- is_foreign_key: bool - - -
- - - - -
-
-
- foreign_key_table: str - - -
- - - - -
-
-
- foreign_key_column: str - - -
- - - - -
-
-
-
-
@dataclass
- - class - Diagram: - - -
- - - - -
-
- - Diagram(raw: str, mermaid_code: str) - - -
- - - - -
-
-
- raw: str - - -
- - - - -
-
-
- mermaid_code: str - - -
- - - - -
-
-
- - \ No newline at end of file diff --git a/docs/workflow.md b/docs/workflow.md deleted file mode 100644 index af69ca5b..00000000 --- a/docs/workflow.md +++ /dev/null @@ -1,19 +0,0 @@ -# What's the Workflow? -```mermaid -flowchart TD - DB[(Known Correct Question-SQL)] - Try[Try to Use DDL/Documentation] - SQL(SQL) - Check{Is the SQL correct?} - Generate[fa:fa-circle-question Use Examples to Generate] - DB --> Find - Question[fa:fa-circle-question Question] --> Find{fa:fa-magnifying-glass Do we have similar questions?} - Find -- Yes --> Generate - Find -- No --> Try - Generate --> SQL - Try --> SQL - SQL --> Check - Check -- Yes --> DB - Check -- No --> Analyst[fa:fa-glasses Analyst Writes the SQL] - Analyst -- Adds --> DB -``` \ No newline at end of file diff --git a/nb-theme/conf.json b/nb-theme/conf.json deleted file mode 100644 index 68fdf836..00000000 --- a/nb-theme/conf.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "base_template": "lab", - "mimetypes": { - "text/html": true - }, - "preprocessors": { - "100-pygments": { - "type": "nbconvert.preprocessors.CSSHTMLHeaderPreprocessor", - "enabled": true - } - } -} diff --git a/nb-theme/index.html.j2 b/nb-theme/index.html.j2 deleted file mode 100644 index afe9c414..00000000 --- a/nb-theme/index.html.j2 +++ /dev/null @@ -1,189 +0,0 @@ -{%- extends 'lab/base.html.j2' -%} -{% from 'mathjax.html.j2' import mathjax %} -{% from 'jupyter_widgets.html.j2' import jupyter_widgets %} - -{%- block header -%} - - - -{%- block html_head -%} - - - - - - - - -{% set ga_id = "G-1YZ053XQJ4" %} - - -nb_title - - - -{%- block html_head_js -%} -{%- block html_head_js_requirejs -%} - -{%- endblock html_head_js_requirejs -%} -{%- endblock html_head_js -%} - -{% block jupyter_widgets %} - {%- if "widgets" in nb.metadata -%} - {{ jupyter_widgets(resources.jupyter_widgets_base_url, resources.html_manager_semver_range) }} - {%- endif -%} -{% endblock jupyter_widgets %} - -{% block extra_css %} -{% endblock extra_css %} - -{% for css in resources.inlining.css -%} - -{% endfor %} - -{% block notebook_css %} -{{ resources.include_css("static/index.css") }} -{% if resources.theme == 'dark' %} - {{ resources.include_css("static/theme-dark.css") }} -{% else %} - {{ resources.include_css("static/theme-light.css") }} -{% endif %} - - -{{ resources.include_css("static/custom_theme.css") }} -{% endblock notebook_css %} - -{{ mathjax() }} - -{%- block html_head_css -%} -{%- endblock html_head_css -%} - -{%- endblock html_head -%} - - - - - - - -{%- endblock header -%} - -{%- block body_header -%} -{% if resources.theme == 'dark' %} - -{% else %} - -{% endif %} - - - - - - -
- -{%- endblock body_header -%} - - -{% block body_footer %} -
- -{% endblock body_footer %} - -{% block footer %} -{% block footer_js %} -{% endblock footer_js %} - -{% endblock footer %} diff --git a/nb-theme/static/custom_theme.css b/nb-theme/static/custom_theme.css deleted file mode 100644 index 73b192a6..00000000 --- a/nb-theme/static/custom_theme.css +++ /dev/null @@ -1,3 +0,0 @@ -.jp-InputPrompt { - font-size: 0.7rem; -} diff --git a/notebooks/Chinook.sqlite b/notebooks/Chinook.sqlite deleted file mode 100644 index b559c739..00000000 Binary files a/notebooks/Chinook.sqlite and /dev/null differ diff --git a/notebooks/app.ipynb b/notebooks/app.ipynb deleted file mode 100644 index f1f4a2f4..00000000 --- a/notebooks/app.ipynb +++ /dev/null @@ -1,48 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install vanna\n", - "import vanna\n", - "from vanna.remote import VannaDefault\n", - "vn = VannaDefault(model='chinook', api_key=vanna.get_api_key('my-email@example.com'))\n", - "vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')\n", - "vn.ask(\"What are the top 10 albums by sales?\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from vanna.flask import VannaFlaskApp\n", - "VannaFlaskApp(vn).run()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Here's what you'll get\n", - "![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/bigquery-mistral-chromadb.ipynb b/notebooks/bigquery-mistral-chromadb.ipynb deleted file mode 100644 index fedab11d..00000000 --- a/notebooks/bigquery-mistral-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "a4b4564c-96e3-553f-bd3a-fd78ff2c05fe", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Mistral via Mistral API, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "a01f90bd-2a30-54e9-b224-6e41192bc874", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "ab7feb46-14af-52ba-a67c-ed97203abb1b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "604afb48-6829-54a6-b55b-447e57aad294", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,mistralai,bigquery]'"}, {"id": "3a68caf5-fa2e-5ee9-9bbb-7b85ea07a5ea", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "0a4dc6a1-8cfc-53ae-a9fb-4eca76807451", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, Mistral):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "78dc2876-5e25-5595-8657-889186a4f19e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-mistral-marqo.ipynb b/notebooks/bigquery-mistral-marqo.ipynb deleted file mode 100644 index 942e6b23..00000000 --- a/notebooks/bigquery-mistral-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "fda9bc52-4501-5569-953e-0f1ebff8b5eb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Mistral via Mistral API, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "ba570f08-fcb8-5fa8-967b-7c3e400d610d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "0ef5320d-f0cc-57b8-993e-f938ff50b6ba", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "fedb304d-43d5-5d20-9a58-9967908a4dc5", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,mistralai,bigquery]'"}, {"id": "696e9c9c-d724-56db-9a06-10a66dc15b0a", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.marqo.marqo import Marqo\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "de83d46a-6116-5978-8b9a-f0f586a583bd", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, Mistral):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "52c90850-edce-5fb6-b8ba-2de30efc619c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-mistral-other-vectordb.ipynb b/notebooks/bigquery-mistral-other-vectordb.ipynb deleted file mode 100644 index 76f48f7a..00000000 --- a/notebooks/bigquery-mistral-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "95ac2fed-f042-5ddb-8a43-6055e0eb437b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Mistral via Mistral API, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "a90edad1-d1a3-5c7c-83fb-e4455e43ea8c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "88901dbc-14f4-5279-a59f-268e126a26f9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "81efadca-5a5f-5a99-8133-b7fa84f17803", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[mistralai,bigquery]'"}, {"id": "d54a05e2-de07-56c0-b57f-0bf2d42e559c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "edc45a16-5782-5d88-9f4a-c405c1f79dea", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, Mistral):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "89b583a2-ac5f-50c9-8a61-e79820b496dc", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-mistral-vannadb.ipynb b/notebooks/bigquery-mistral-vannadb.ipynb deleted file mode 100644 index 029371cf..00000000 --- a/notebooks/bigquery-mistral-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "5320f104-0de6-5010-91da-eb74229e24f2", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Mistral via Mistral API, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "c9785756-74dc-5b62-9326-f3fcab07ba39", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "bcf9504b-741a-5a51-9a38-9fced9141eb4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "81efadca-5a5f-5a99-8133-b7fa84f17803", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[mistralai,bigquery]'"}, {"id": "88b7ebec-d4f9-53aa-8f06-7c27055d16b0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.vannadb.vannadb_vector import VannaDB_VectorStore\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "2aa3c756-d1ad-5b3c-a161-5bad6f77d594", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, Mistral):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "4f630912-bd43-5809-83f5-57ab755d866b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-azure-chromadb.ipynb b/notebooks/bigquery-openai-azure-chromadb.ipynb deleted file mode 100644 index f3843e1b..00000000 --- a/notebooks/bigquery-openai-azure-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "f439e467-8402-5423-9822-318c50b4831c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Azure OpenAI, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "28490bf2-fdd2-54f5-985d-7de2b28c383e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "6021c0fd-69f9-5099-8a33-221bb2265f9f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "290f762c-bf5d-5c45-b58c-a95a645231f8", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,openai,bigquery]'"}, {"id": "f6088c74-bfc7-5808-bd52-b2468267a3aa", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "895d74e6-b5e9-58f3-b58b-07c8e9d28707", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "ca6141ce-3c4f-5c8c-941e-b2317523c6d9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-azure-marqo.ipynb b/notebooks/bigquery-openai-azure-marqo.ipynb deleted file mode 100644 index a2554e99..00000000 --- a/notebooks/bigquery-openai-azure-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "724c58f8-dd5b-5cb7-a57d-e5feb8a34241", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Azure OpenAI, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "a1de0c40-6cae-5533-b5da-d1c009288950", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "3b154ef8-82dd-5861-b2b4-ae900175e86c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "e679caf9-0f53-5826-b5a3-d407c7b11d0a", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,openai,bigquery]'"}, {"id": "6873a728-88db-5cf5-8a57-6355069c8a61", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "aa425412-56b4-5b29-8f25-d0bb982b7446", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, OpenAI_Chat):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "4a9f4b28-dd69-5b6e-a94e-31632801d4dd", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-azure-other-vectordb.ipynb b/notebooks/bigquery-openai-azure-other-vectordb.ipynb deleted file mode 100644 index dc6c26ce..00000000 --- a/notebooks/bigquery-openai-azure-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "35185a9e-35a3-56fe-b403-fe55f23a645e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Azure OpenAI, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "ae9f6a12-733a-59e3-8ea5-6e747247433c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "4042d182-e243-5d76-a804-54a96b57e635", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "85007695-f172-57f7-8dd4-6f7db27f2633", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,bigquery]'"}, {"id": "19782e02-3b88-533a-a9cd-f73a7d88e153", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.base import VannaBase\n"}, {"id": "1a1f7fff-3055-51d2-a91d-bf03f4f94bc8", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, OpenAI_Chat):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "e94317d7-0847-5b36-a5fe-98fce6b4cdf5", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-azure-vannadb.ipynb b/notebooks/bigquery-openai-azure-vannadb.ipynb deleted file mode 100644 index a427e62b..00000000 --- a/notebooks/bigquery-openai-azure-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "fac5b46f-4116-58e0-889d-969818e7888b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Azure OpenAI, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "909723d5-4778-5fc6-a3c2-1a0753650a1f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "05520bfd-6608-5f27-bac1-90b3d0818583", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "85007695-f172-57f7-8dd4-6f7db27f2633", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,bigquery]'"}, {"id": "031a7573-71e2-5c65-873c-124e3158003d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.vannadb.vannadb_vector import VannaDB_VectorStore\n"}, {"id": "9fd5a61a-c40c-5577-80bb-3c8fbf26dc21", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "0f88339d-d782-54b0-a52e-337e3b45025c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-standard-chromadb.ipynb b/notebooks/bigquery-openai-standard-chromadb.ipynb deleted file mode 100644 index cfd6a89b..00000000 --- a/notebooks/bigquery-openai-standard-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "774bf429-d57a-589e-a818-f746cfbd1333", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using OpenAI, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "c034094a-80ae-5404-9716-f09b9c785fdd", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "bf62ded0-0c0b-5b96-b2e6-e7a773044ed7", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "290f762c-bf5d-5c45-b58c-a95a645231f8", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,openai,bigquery]'"}, {"id": "93b5ab2b-834b-5b86-8d47-c9beda8b3544", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "28a8d8a1-669f-5f8b-82c4-73a0eb221d64", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "cc68d0ec-288a-5204-ad57-4013e8a83d94", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-standard-marqo.ipynb b/notebooks/bigquery-openai-standard-marqo.ipynb deleted file mode 100644 index 164535aa..00000000 --- a/notebooks/bigquery-openai-standard-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "3e94b5c0-cfeb-5434-bfa1-23663e220b37", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using OpenAI, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "64d7f2aa-9641-5fba-b399-5f39b8ce0499", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "6063fe15-d88f-5654-8712-20bb3bc48fc4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "e679caf9-0f53-5826-b5a3-d407c7b11d0a", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,openai,bigquery]'"}, {"id": "dc8ae8d1-d08e-5a8c-a806-09ba465d7761", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "3ce3c4db-08c1-5d0a-86df-2f7b35b82bc2", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, OpenAI_Chat):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "8d3a813e-4be9-501b-9b84-8f2a0573134b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-standard-other-vectordb.ipynb b/notebooks/bigquery-openai-standard-other-vectordb.ipynb deleted file mode 100644 index fd15a798..00000000 --- a/notebooks/bigquery-openai-standard-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "e613d63a-b713-506f-8fb3-41b2c0a8e863", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using OpenAI, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "60917c76-36c7-55b7-b1c4-5c82915d0d08", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "2c95993b-0824-50f4-8d2e-2418fedfc8fc", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "85007695-f172-57f7-8dd4-6f7db27f2633", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,bigquery]'"}, {"id": "fe1b5686-8226-53d5-b42b-a29cdb088cad", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.base import VannaBase\n"}, {"id": "45f49779-04b9-574f-b573-4f0afb619e7e", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, OpenAI_Chat):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "5cec3bae-2ed2-5067-b91a-a276222ed14c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-standard-vannadb.ipynb b/notebooks/bigquery-openai-standard-vannadb.ipynb deleted file mode 100644 index 4fb536ad..00000000 --- a/notebooks/bigquery-openai-standard-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "2475ecc1-295b-55a3-86b7-9b851bec073e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using OpenAI, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "3229453a-a3f6-5835-bf6b-e921f8abddbc", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "09614309-a454-5268-911a-11f1690c25e6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "85007695-f172-57f7-8dd4-6f7db27f2633", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,bigquery]'"}, {"id": "4ff1aaee-1154-5859-b8c3-93ac3c31595d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.vannadb.vannadb_vector import VannaDB_VectorStore\n"}, {"id": "1fc13242-ce0f-53e5-832e-ff33197d2eef", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "2ee87b26-d9b8-5dfc-8d15-fefa0dfe9dd9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-vanna-chromadb.ipynb b/notebooks/bigquery-openai-vanna-chromadb.ipynb deleted file mode 100644 index bae34f4f..00000000 --- a/notebooks/bigquery-openai-vanna-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "525bec9c-32bd-5fc9-b211-7909d17a700e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using OpenAI via Vanna.AI (Recommended), ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "93465ae8-5642-5cd8-abe5-20cce04e1c4f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "4990aff0-c5b5-569d-b61c-c0adb1bc5aa9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "93b3d255-1a25-5088-af9e-25168efe4f8a", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,bigquery]'"}, {"id": "c1e5ad61-57c7-5b64-920b-6f5b435df5e3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "3225927e-ae19-5159-a112-8dac5a3cda22", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "4c98f876-a482-5f6a-bf47-0e3cd8a48576", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-vanna-marqo.ipynb b/notebooks/bigquery-openai-vanna-marqo.ipynb deleted file mode 100644 index 99a91e13..00000000 --- a/notebooks/bigquery-openai-vanna-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "8fadb025-65e0-5133-964e-2e7db62399c5", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using OpenAI via Vanna.AI (Recommended), Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "0a0afd1f-06be-5e48-b6ff-44530dec901d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "fc5d67c6-97b4-5469-880b-8585e7b48226", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "3a44bfd8-bc08-51dd-a131-54b24aa974a2", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,bigquery]'"}, {"id": "a1877af9-e758-52a4-8f21-3d7b2e0c904f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.marqo.marqo import Marqo\n"}, {"id": "b0e1d67a-58fd-5bcd-b2a2-a13317fda343", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n\nvn = MyVanna()\n"}, {"id": "685bf2fd-182d-5ff3-a967-5448289b03f9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-vanna-other-vectordb.ipynb b/notebooks/bigquery-openai-vanna-other-vectordb.ipynb deleted file mode 100644 index decdecf5..00000000 --- a/notebooks/bigquery-openai-vanna-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "987b3c74-035d-562b-9288-167f1a027019", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using OpenAI via Vanna.AI (Recommended), Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "8468a145-ef33-5a52-b9dd-f0f5280b0e99", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "4d924c82-d069-5d4b-bc4a-8985f20e4507", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "c6271b0c-191a-5055-aa85-aadb291fd909", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[bigquery]'"}, {"id": "35e4b991-0e84-561d-8c1e-979bb4252ec9", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\n"}, {"id": "57fbc78c-6a54-5f06-98d8-69f315a380b4", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "440a5dca-cfbd-5324-9b0e-b5535f958261", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-openai-vanna-vannadb.ipynb b/notebooks/bigquery-openai-vanna-vannadb.ipynb deleted file mode 100644 index 78ba400e..00000000 --- a/notebooks/bigquery-openai-vanna-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "67a26e9c-c6fb-56bc-a8f2-fdcb5294e46e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using OpenAI via Vanna.AI (Recommended), Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "07242f18-8018-5856-96bd-02f96b0dd5cc", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "09614309-a454-5268-911a-11f1690c25e6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "c6271b0c-191a-5055-aa85-aadb291fd909", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[bigquery]'"}, {"id": "6160c274-caf4-537e-9a02-f6a1d7022a2c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "import vanna\nfrom vanna.remote import VannaDefault"}, {"id": "cc6152fc-02df-5490-9920-896b5565b3d0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "api_key = vanna.get_api_key('my-email@example.com')\n\nvanna_model_name = # Put a unique name here\nvn = VannaDefault(model=vanna_model_name, api_key=api_key)\n"}, {"id": "e09c4dc9-c4e9-55a5-8a2d-2f8f547c5005", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-other-llm-chromadb.ipynb b/notebooks/bigquery-other-llm-chromadb.ipynb deleted file mode 100644 index 0ec687f3..00000000 --- a/notebooks/bigquery-other-llm-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "670a54ff-01bf-5be5-bbd3-b8f7b39b67c8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Other LLM, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "94a97b34-d9b6-56f6-a3ba-3881ab640c9f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "c5ec0ab5-b97e-5327-93ed-1bcf19f4e280", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "93b3d255-1a25-5088-af9e-25168efe4f8a", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,bigquery]'"}, {"id": "a70195e6-7c1f-519f-8413-4ad4e6b3570d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "ad2c6517-9727-56fb-befe-a4108859aa3b", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(ChromaDB_VectorStore, MyCustomLLM):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "9a355699-8711-5dc4-9c9c-83cf70a2a5c8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-other-llm-marqo.ipynb b/notebooks/bigquery-other-llm-marqo.ipynb deleted file mode 100644 index 50a6355f..00000000 --- a/notebooks/bigquery-other-llm-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "317a612f-84c0-5133-85f1-83088d93d709", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Other LLM, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "0c856b13-a416-54c7-bee1-22b1644680c0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "804cbc6a-08b9-562e-8376-7876ec24b3de", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "3a44bfd8-bc08-51dd-a131-54b24aa974a2", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,bigquery]'"}, {"id": "2e26545c-6029-5c62-b146-105086c10f6d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "c1812db9-f2e2-5e21-98c1-d00397d25f65", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(Marqo, MyCustomLLM):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "03740443-3607-5a15-bc0b-13ab455d65c8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-other-llm-other-vectordb.ipynb b/notebooks/bigquery-other-llm-other-vectordb.ipynb deleted file mode 100644 index 3247f454..00000000 --- a/notebooks/bigquery-other-llm-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "329a34b6-ac61-5e7f-bd53-4dea75316751", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Other LLM, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "46ab4cb5-529f-5357-b72a-b6d215937d54", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "075ce30c-1025-5b09-b870-888aca19466b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "c6271b0c-191a-5055-aa85-aadb291fd909", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[bigquery]'"}, {"id": "35e4b991-0e84-561d-8c1e-979bb4252ec9", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\n"}, {"id": "2ff3ca97-cb35-56c7-9263-a3613e4ce005", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(MyCustomVectorDB, MyCustomLLM):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "c92861d0-6776-53eb-9a5d-ccb56d1b0218", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/bigquery-other-llm-vannadb.ipynb b/notebooks/bigquery-other-llm-vannadb.ipynb deleted file mode 100644 index 55255d39..00000000 --- a/notebooks/bigquery-other-llm-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "dab5efa9-fc30-5f4d-ae12-aca6cf81438d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for BigQuery using Other LLM, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "29381975-fd85-523b-9ede-7dd7b9b69cc0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "e533ec83-bcaf-5683-b16f-788617340378", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "c6271b0c-191a-5055-aa85-aadb291fd909", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[bigquery]'"}, {"id": "bfe31937-16c5-5ecb-9aea-0cc1b2aec53c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.vannadb.vannadb_vector import VannaDB_VectorStore\nfrom vanna.base import VannaBase\n"}, {"id": "8ac7e323-be70-5fee-9d96-69868af0ff99", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(VannaDB_VectorStore, MyCustomLLM):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "908bbd2d-b1e8-5d98-bbc1-82d0d3c93cfa", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "45b52fa3-74ea-5bb0-82e5-518731dbe674", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_bigquery(project_id='my-project')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/configure.ipynb b/notebooks/configure.ipynb deleted file mode 100644 index 709d82cf..00000000 --- a/notebooks/configure.ipynb +++ /dev/null @@ -1,18 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/connect-to-bigquery.ipynb b/notebooks/connect-to-bigquery.ipynb deleted file mode 100644 index 39463a2e..00000000 --- a/notebooks/connect-to-bigquery.ipynb +++ /dev/null @@ -1,93 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# How to use Vanna with BigQuery" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import vanna as vn" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## **When Running on GCP**\n", - "If you're running on a machine hosted on GCP, you likely already have credentials so you just have to specify the project" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.connect_to_bigquery(\n", - " project_id=\"myprojectid\"\n", - ")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## **When Running on Google Colab**\n", - "Use colab auth to authenticate with your google account and then specify the project" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from google.colab import auth\n", - "auth.authenticate_user()\n", - "\n", - "vn.connect_to_bigquery(\n", - " project_id=\"myprojectid\"\n", - ")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Using a Credentials File\n", - "You should only do this if you're running on a local machine and not on GCP or Colab" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.connect_to_bigquery(\n", - " project_id=\"myprojectid\",\n", - " cred_file_path=\"path/to/credentials.json\",\n", - ")" - ] - } - ], - "metadata": { - "language_info": { - "name": "python" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/connect-to-postgres.ipynb b/notebooks/connect-to-postgres.ipynb deleted file mode 100644 index cc4450ad..00000000 --- a/notebooks/connect-to-postgres.ipynb +++ /dev/null @@ -1,52 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# How to use Vanna with Postgres" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import vanna as vn" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## **PostgreSQL**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.connect_to_postgres(\n", - " host=\"hh-pgsql-public.ebi.ac.uk\",\n", - " dbname=\"pfmegrnargs\",\n", - " user=\"reader\",\n", - " password=\"abcd1234\",\n", - " port=5432\n", - ")" - ] - } - ], - "metadata": { - "language_info": { - "name": "python" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/connect-to-snowflake.ipynb b/notebooks/connect-to-snowflake.ipynb deleted file mode 100644 index 5657ccd5..00000000 --- a/notebooks/connect-to-snowflake.ipynb +++ /dev/null @@ -1,48 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# How to use Vanna with Snowflake" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import vanna as vn" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## **Snowflake**\n", - "\n", - "We have a built-in function for Snowflake, so you don't need to write your own.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.connect_to_snowflake(account='my-account', username='my-username', password='my-password', database='my-database')\n" - ] - } - ], - "metadata": { - "language_info": { - "name": "python" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/databases.ipynb b/notebooks/databases.ipynb deleted file mode 100644 index 3f0c8fcb..00000000 --- a/notebooks/databases.ipynb +++ /dev/null @@ -1,176 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# How to use Vanna with various databases\n", - "\n", - "You can use Vanna with any database that you can connect to via Python. Here are some examples of how to connect to various databases.\n", - "\n", - "All you have to do is provide Vanna with a function that takes in a SQL query and returns a Pandas DataFrame. Here are some examples of how to do that." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import vanna as vn" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## **PostgreSQL**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import psycopg2\n", - "\n", - "conn_details = {...} # fill this with your connection details\n", - "conn_postgres = psycopg2.connect(**conn_details)\n", - "\n", - "def run_sql_postgres(sql: str) -> pd.DataFrame:\n", - " df = pd.read_sql_query(sql, conn_postgres)\n", - " return df\n", - "\n", - "vn.run_sql = run_sql_postgres" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## **Snowflake**\n", - "\n", - "We have a built-in function for Snowflake, so you don't need to write your own.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.connect_to_snowflake(account='my-account', username='my-username', password='my-password', database='my-database')\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## **Google BigQuery**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from google.cloud import bigquery\n", - "import pandas as pd\n", - "\n", - "project_id = 'your-project-id' # replace with your Project ID\n", - "client_bigquery = bigquery.Client(project=project_id)\n", - "\n", - "def run_sql_bigquery(sql: str) -> pd.DataFrame:\n", - " df = client_bigquery.query(sql).to_dataframe()\n", - " return df\n", - "\n", - "vn.run_sql = run_sql_bigquery" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## **Amazon Athena**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "from pyathena import connect\n", - "\n", - "conn_details = {...} # fill this with your connection details\n", - "conn_athena = connect(**conn_details)\n", - "\n", - "def run_sql_athena(sql: str) -> pd.DataFrame:\n", - " df = pd.read_sql(sql, conn_athena)\n", - " return df\n", - "\n", - "vn.run_sql = run_sql_athena" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## **Amazon Redshift**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import psycopg2\n", - "\n", - "conn_details = {...} # fill this with your connection details\n", - "conn_redshift = psycopg2.connect(**conn_details)\n", - "\n", - "def run_sql_redshift(sql: str) -> pd.DataFrame:\n", - " df = pd.read_sql_query(sql, conn_redshift)\n", - " return df\n", - "\n", - "vn.run_sql = run_sql_redshift" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# **Others**\n", - "\n", - "You can follow a similar pattern to the others for your database. You just have to provide a `vn.run_sql` function that takes in a SQL query and returns a Pandas DataFrame." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "language_info": { - "name": "python" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/getting-started.ipynb b/notebooks/getting-started.ipynb deleted file mode 100644 index e28a8276..00000000 --- a/notebooks/getting-started.ipynb +++ /dev/null @@ -1,292 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Getting Started with Vanna\n", - "This notebook shows how to use Vanna to ask questions from a database using sample data" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Install and Import Vanna" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install vanna" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import vanna\n", - "from vanna.remote import VannaDefault" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Log In to Vanna\n", - "Vanna provides a function to get an API key. You'll get a code sent to your e-mail.\n", - "You can save your API key for future usage so that you don't have to log in every time." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "api_key = vanna.get_api_key('my-email@example.com')" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Set Model\n", - "`chinook` is a public model that refers to the [Chinook sample database](https://www.sqlitetutorial.net/sqlite-sample-database/)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vanna_model_name = 'chinook' # This is the name of the RAG model. This is typically associated with a specific dataset.\n", - "vn = VannaDefault(model=vanna_model_name, api_key=api_key)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Connect to the Database\n", - "Here we're connecting to a SQLite database but you can connect to any SQL database." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Ask Questions\n", - "Now we're going to use `vn.ask` to ask questions and it'll generate SQL, run the SQL, show the table, and generate a chart" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT a.name,\n", - " sum(il.quantity) as totalsales\n", - "FROM artist a\n", - " INNER JOIN album al\n", - " ON a.artistid = al.artistid\n", - " INNER JOIN track t\n", - " ON al.albumid = t.albumid\n", - " INNER JOIN invoiceline il\n", - " ON t.trackid = il.trackid\n", - "GROUP BY a.name\n", - "ORDER BY totalsales desc limit 5;\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Nametotalsales
0Iron Maiden140
1U2107
2Metallica91
3Led Zeppelin87
4Os Paralamas Do Sucesso45
\n", - "
" - ], - "text/plain": [ - " Name totalsales\n", - "0 Iron Maiden 140\n", - "1 U2 107\n", - "2 Metallica 91\n", - "3 Led Zeppelin 87\n", - "4 Os Paralamas Do Sucesso 45" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAPoCAYAAABkvZZOAAAgAElEQVR4XuzdC7h1V1kf+vcFuUi4REggXBSQgiGIgiAVBMSIRQpVERTr8QBVS70cpBdEaAH1gKhV2mKxaL1SpIUoSgHFEjWIYgkEL6gxagDhICkmXMKdgHnPM+JceWbWt/a35l63b665fvN5ePLtPeccc4zfO/b28b/HGjPDQYAAAQIECBAgQIAAAQIECBAgQIAAAQJ7KZB72WudJkCAAAECBAgQIECAAAECBAgQIECAAIEQ8JoEBAgQIECAAAECBAgQIECAAAECBAgQ2FMBAe+eFk63CRAgQIAAAQIECBAgQIAAAQIECBAgIOA1BwgQIECAAAECBAgQIECAAAECBAgQILCnAgLePS2cbhMgQIAAAQIECBAgQIAAAQIECBAgQEDAaw4QIECAAAECBAgQIECAAAECBAgQIEBgTwUEvHtaON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNccIECAAAECBAgQIECAAAECBAgQIECAwJ4KCHj3tHC6TYAAAQIECBAgQIAAAQIECBAgQIAAAQGvOUCAAAECBAgQIECAAAECBAgQIECAAIE9FRDw7mnhdJsAAQIECBAgQIAAAQIECBAgQIAAAQICXnOAAAECBAgQIECAAAECBAgQIECAAAECeyog4N3Twuk2AQIECBAgQIAAAQIECBAgQIAAAQIEBLzmAAECBAgQIECAAAECBAgQIECAAAECBPZUQMC7p4XTbQIECBAgQIAAAQIECBAgQIAAAQIECAh4zQECBAgQIECAAAECBAgQIECAAAECBAjsqYCAd08Lp9sECBAgQIAAAQIECBAgQIAAAQIECBAQ8JoDBAgQIECAAAECBAgQIECAAAECBAgQ2FMBAe+eFk63CRAgQIAAAQIECBAgQIAAAQIECBAgIOA1BwgQIECAAAECBAgQIECAAAECBAgQILCnAgLePS2cbhMgQIAAAQIECBAgQIAAAQIECBAgQEDAaw4QIECAAAECBAgQIECAAAECBAgQIEBgTwUEvHtaON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNccIECAAAECBAgQIECAAAECBAgQIECAwJ4KCHj3tHC6TYAAAQIECBAgQIAAAQIECBAgQIAAAQGvOUCAAAECBAgQIECAAAECBAgQIECAAIE9FRDw7mnhdJsAAQIECBAgQIAAAQIECBAgQIAAAQICXnOAAAECBAgQIECAAAECBAgQIECAAAECeyog4N3Twuk2AQIECBAgQIAAAQIECBAgQIAAAQIEBLzmAAECBAgQIECAAAECBAgQIECAAAECBPZUQMC7p4XTbQIECBAgQIAAAQIECBAgQIAAAQIECAh4zQECBAgQIECAAAECBAgQIECAAAECBAjsqYCAd08Lp9sECBAgQIAAAQIECBAgQIAAAQIECBAQ8JoDBAgQIECAAAECBAgQIECAAAECBAgQ2FMBAe+eFk63CRAgQIAAAQIECBAgQIAAAQIECBAgIOA1BwgQIECAAAECBAgQIECAAAECBAgQILCnAgLePS2cbhMgQIAAAQIECBAgQIAAAQIECBAgQEDAaw4QIECAAAECBAgQIECAAAECBAgQIEBgTwUEvHtaON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNccIECAAAECBAgQIECAAAECBAgQIECAwJ4KCHj3tHC6TYAAAQIECBAgQIAAAQIECBAgQIAAAQGvOUCAAAECBAgQIECAAAECBAgQIECAAIE9FRDw7mnhdJsAAQIECBAgQIAAAQIECBAgQIAAAQICXnOAAAECBAgQIECAAAECBAgQIECAAAECeyog4N3Twuk2AQIECBAgQIAAAQIECBAgQIAAAQIEBLzmAAECBAgQIECAAAECBAgQIECAAAECBPZUQMC7p4XTbQIECBAgQIAAAQIECBAgQIAAAQIECAh4zQECBAgQIECAAAECBAgQIECAAAECBAjsqYCAd08Lp9sECBAgQIAAAQIECBAgQIAAAQIECBAQ8JoDBAgQIECAAAECBAgQIECAAAECBAgQ2FMBAe+eFk63CRAgQIAAAQIECBAgQIAAAQIECBAgIOA1BwgQIECAAAECBAgQIECAAAECBAgQILCnAgLePS2cbhMgQIAAAQIECBAgQIAAAQIECBAgQEDAaw4QIECAAAECBAgQIECAAAECBAgQIEBgTwUEvHtaON0mQIAAAQIECBAgQIAAAQIECBAgQICAgNccIECAAAECBAgQIECAAAECBAgQIECAwJ4KCHj3tHC6TYAAAQIECBAgQIAAAQIECBAgQIAAAQGvOUCAAAECBAgQIECAAAECBAgQIECAAIE9FRDw7mnhdJsAAQIECBAg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QIAAAQIECBAgQIAAAQIECBAgMDYBAe/YKqI/BAgQIECAAAECBAgQIECAAAECBAgQGCgg4B0I5TICBAgQIECAAAECBAgQIECAAAECBAiMTUDAO7aK6A8BAgQIECBAgAABAgQIECBAgAABAgQGCgh4B0K5jAABAgQIECBAgAABAgQIECBAgAABAmMTEPCOrSL6Q4AAAQIECBAgQIAAAQIECBAgQIAAgYECAt6BUC4jQIAAAQIECBAgQIAAAQIECBAgQIDA2AQEvGOriP4QIECAAAECBAgQIECAAAECBAgQIEBgoICAdyCUywgQIECAAAECBAgQIECAAAECBAgQIDA2AQHv2CqiPwQIECBAgAABAgQIECBAgAABAgQIEBgoIOAdCOUyAgQIECBAgAABAgQIECBAgAABAgQIjE1AwDu2iugPAQIECBAgQIAAAQIECBAgQIAAAQIEBgoIeAdCuYwAAQIECBAgQIAAAQIECBAgQIAAAQJjExDwjq0i+kOAAAECBAgQIECAAAECBAgQIECAAIGBAgLegVAuI0CAAAECBAgQIECAAAECBAgQIECAwNgEBLxjq4j+ECBAgAABAgQIECBAgAABAgQIECBAYKCAgHcglMsIECBAgAABAgQIECBAgAABAgQIECAwNgEB79gqoj8ECBAgQIAAAQIECBAgQIAAAQIECBAYKCDgHQjlMgIECBAgQIAAAQIECBAgQIAAAQIECIxNQMA7toroDwECBAgQIECAAAECBAgQIECAAAECBAYKCHgHQrmMAAECBAgQIECAAAECBAgQIECAAAECYxMQ8I6tIvpDgAABAgQIECBAgAABAgQIECBAgACBgQIC3oFQLiNAgAABAgQIECBAgAABAgQIECBAgMDYBAS8Y6uI/hAgQIAAAQIECBAgQIAAAQIECBAgQGCggIB3IJTLCBAgQIAAAQIECBAgQIAAAQIECBAgMDYBAe/YKqI/BAgQIECAAAECBAgQIECAAAECBAgQGCgg4B0I5TICBAgQIECAAAECBAgQIECAAAECBAiMTUDAO7aK6A8BAgQIECBAgAABAgQIECBAgAABAgQGCgh4B0K5jAABAgQIECBAgAABAgQIECBAgAABAmMTEPCOrSL6Q4AAAQIECBAgQIAAAQIECBAgQIAAgYECAt6BUC4jQIAAAQIECBAgQIAAAQIECBAgQIDA2AQEvGOriP4QIECAAAECBAgQIECAAAECBAgQIEBgoICAdyCUywgQIECAAAECBAgQIECAAAECBAgQIDA2AQHv2CqiPwQIECBAgAABAgQIECBAgAABAgQIEBgoIOAdCOUyAgQIECBAgAABAgQIECBAgAABAgQIjE1AwDu2iugPAQIECBAgQIAAAQIECBAgQIAAAQIEBgoIeAdCuYwAAQIECBAgQIAAAQIECBAgQIAAAQJjExDwjq0i+kOAAAECBAgQIECAAAECBAgQIECAAIGBAgLegVAuI0CAAAECBAgQIECAAAECBAgQIECAwNgEBLxjq4j+ECBAgAABAgQIECBAgAABAgQIECBAYKCAgHcglMsIECBAgAABAgQIECBAgAABAgQIECAwNgEB79gqoj8ECBAgQIAAAQIECBAgQIAAAQIECBAYKCDgHQjlMgIECBAgQIAAAQIECBAgQIAAAQIECIxNQMA7toroDwECBAgQIECAAAECBAgQIECAAAECBAYKCHgHQrmMAAECBAgQIECAAAECBAgQIECAAAECYxMQ8I6tIvpDgAABAgQIECBAgAABAgQIECBAgACBgQIC3oFQLiNAgAABAgQIECBAgAABAgQIECBAgMDYBAS8Y6uI/hAgQIAAAQIECBAgQIAAAQIECBAgQGCggIB3IJTLCBAgQIAAAQIECBAgQIAAAQIECBAgMDYBAe/YKqI/BAgQIECAAAECBAgQIECAAAECBAgQGCgg4B0I5TICBAgQIECAAAECBAgQIECAAAECBAiMTUDAO7aK6A8BAgQIECBAgAABAgQIECBAgAABAgQGCgh4B0K5jAABAgQIECBAgAABAgQIECBAgAABAmMTEPCOrSL6Q4AAAQIECBAgQIAAAQIECBAgQIAAgYECAt6BUC4jQIAAAQIECBAgQIAAAQIECBAgQIDA2AQEvGOriP4QIECAAAECBAgQIECAAAECBAgQIEBgoICAdyCUywgQIECAAAECBAgQIECAAAECBAgQIDA2AQHv2CqiPwQIECBAgAABAgQIECBAgAABAgQIEBgoIOAdCOUyAgQIECBAgAABAgQIECBAgAABAgQIjE1AwDu2iugPAQIECBAgQIAAAQIECBAgQIAAAQIEBgoIeAdCuYwAAQIECBAgQIAAAQIECBAgQIAAAQJjExDwjq0i+kOAAAECBAgQIECAAAECBAgQIECAAIGBAgLegVAuI0CAAAECBAgQIECAAAECBAgQIECAwNgEBLxjq4j+ECBAgAABAgQIECBAgAABAgQIECBAYKCAgHcglMsIECBAgAABAgQIECBAgAABAgQIECAwNgEB79gqoj8ECBAgQIAAAQIECBAgQIAAAQIECBAYKCDgHQjlMgIECBAgQIAAAQIECBAgQIAAAQIECIxNQMA7toroDwECBAgQIECAAAECBAgQIECAAAECBAYKCHgHQrmMAAECBAgQIECAAAECBAgQIECAAAECYxMQ8I6tIvpDgAABAgQIECBAgAABAgQIECBAgACBgQIC3oFQLiNAgAABAgQIECBAgAABAgQIECBAgMDYBAS8Y6uI/hAgQIAAAQIECBAgQIAAAQIECBAgQGCggIB3IJTLCBAgQIAAAQIECBAgQIAAAQIECBAgMDYBAe/YKqI/BAgQIECAAAECBAgQIECAAAECBAgQGCgg4B0I5TICBAgQIECAAAECBAgQIECAAAECBAiMTUDAO7aK6A8BAgQIECBAgAABAgQIECBAgAABAgQGCgh4B0K5jAABAgQIECBAgAABAgQIECBAgAABAmMTEPCOrSL6Q4AAAQIECBAgQIAAAQIECBAgQIAAgYECAt6BUC4jQIAAAQIECBAgQIAAAQIECBAgQIDA2AQEvGOriP4QIECAAAECBAgQIECAAAECBAgQIEBgoICAdyCUywgQIECAAAECBAgQIECAAAECBAgQIDA2AQHv2CqiPwQIECBAgAABAgQIECBAgAABAgQIEBgoIOAdCOUyAgQIECBAgAABAgQIECBAgAABAgQIjE1AwDu2iugPAQIECBAgQIAAAQIECBAgQIAAAQIEBgoIeAdCuYwAAQIECBAgQIAAAQIECBAgQIAAAQJjExDwjq0i+kOAAAECBAgQIECAAAECBAgQIECAAIGBAgLegVAuI0CAAAECBAgQIECAAAECBAgQIECAwNgEBLxjq4j+ECBAgAABAgQIECBAgAABAgQIECBAYKCAgHcglMsIECBAgAABAgQIECBAgAABAgQIECAwNgEB79gqoj8ECBAgQIAAAQIECBAgQIAAAQIECBAYKCDgHQjlMgIECBAgQIAAAQIECBAgQIAAAQIECIxNQMA7toroDwECBAgQIECAAAECBAgQIECAAAECBAYKCHgHQrmM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5ySfmop5WVU9e0+Fdff/STJaNXylqm57QBawh4cIeLdS37MJECBAgAABAgQIECBAgAABAgQIEJiFQHcfl+SCqZgnVdUZ6xXW3U9I8ubp2p9U1eO3cgEC3q3U92wCBAgQIECAAAECBAgQIECAAAECBGYhsOYE73Oq6oVrC+vumya5ZOnFbcdW1UVbuQAB71bqezYBAgQIECBAgAABAgQIECBAgAABArMR6O4R3o72DZcluX1VXbNcXHf/ZZJHTN+dX1X32OriBbxbvQOeT4AAAQIECBAgQIAAAQIECBAgQIDALAS6+5Qkr5yKuTTJ+PzWJLdL8hdJ7jldG31771BVIwje0iHg3VJ+DydAgAABAgQIECBAgAABAgQIECBAYE4C3f3SJL+xVFMnWc5Rr0vykKr6wBzqFvDOYRfUQIAAAQIECBAgQIAAAQIECBAgQIDAbAS6++Qkr0hyxJqiPpzkMVV18VyKFfDOZSfUQYAAAQIECBAgQIAAAQIECBAgQIDArAS6+6QkD0xyVZL3bPUL1dbDEfDO6k9GMQQIECBAgAABAgQIECBAgAABAgQIEFhdQMC7upWZBAgQIECAAAECBAgQIECAAAECBAgQmJWAgHdW26EYAgQIECBAgAABAgQIECBAgAABAgQIrC4g4F3dykwCBAgQIECAAAECBAgQIECAAAECBAjMSkDAO6vtUAwBAgQIECBAgAABAgQIECBAgAABAgRWFxDwrm5lJgECBAgQIECAAAECBAgQIECAAAECBGYlIOCd1XYohgABAgQIECBAgAABAgQIECBAgAABAqsLCHhXtzKTAAECBAgQIECAAAECBAgQIECAAAECsxIQ8M5qOxRDgAABAgQIECBAgAABAgQIECBAgACB1QUEvKtbmUmAAAECBAgQIECAAAECBAgQIECAAIFZCQh4Z7UdiiFAgAABAgQIECBAgAABAgQIECBAgMDqAgLe1a3MJECAAAECBAgQIECAAAECBAgQIECAwKwEBLyz2g7FECBAgAABAgQIECBAgAABAgQIECBAYHUBAe/qVmYSIECAAAECBAgQIECAAAECBAgQIEBgVgIC3llth2IIECBAgAABAgQIECBAgAABAgQIECCwuoCAd3UrMwkQIECAAAECBAgQIECAAAECBAgQIDArAQHvrLZDMQQIECBAgAABAgQIECBAgAABAgQIEFhdQMC7upWZBAgQIECAAAECBAgQIECAAAECBAgQmJWAgHdW26EYAgQIECBAgAABAgQIECBAgAABAgQIrC4g4F3dykwCBAgQIECAAAECBAgQIECAAAECBAjMSkDAO6vtUAwBAgQIECBAgAABAgQIECBAgAABAgRWFxDwrm5lJgECBAgQIECAAAECBAgQIECAAAECBGYlIOCd1XYohgABAgQIECBAgAABAgQIECBAgAABAqsLCHhXtzKTAAECBAgQIECAAAECBAgQIECAAAECsxIQ8M5qOxRDgAABAgQIECBAgAABAgQIECBAgACB1QUEvKtbmUmAAAECBAgQIECAAAECBAgQIECAAIFZCQh4Z7UdiiFAgAABAgQIECBAgAABAgQIECBAgMDqAgLe1a3MJECAAAECBAgQIECAAAECBAgQIECAwKwEBLyz2g7FECBAgAABAgQIECBAgAABAgQIECBAYHUBAe/qVmYSIECAAAECBAgQIECAAAECBAgQIEBgVgIC3llth2IIECBAgAABAgQIECBAgAABAgQIECCwuoCAd3UrMwkQIECAAAECBAgQIECAAAECBAgQIDArAQHvrLZDMQQIECBAgAABAgQIECBAgAABAgQIEFhdQMC7upWZBAgQIECAAAECBAgQIECAAAECBAgQmJWAgHdW26EYAgQIECBAgMC8BLr7kUletVTVlVV1wlZW2d0/l+QNUw3XVtWtt7IezyZAgAABAgQIECCwlQIC3q3U92wCBAgQIECAwMwFuvvcJPddU+YTq+pNm1l6d98+yReme44Q+ZZ7un93n5LklYvrVbVp/6bt7iuTfO9076Or6pLNXKd7ESBAgAABAgQIENhsgU37x/BmF+Z+BAgQIECAAAECWyvQ3YcmuSrJTdZUcl5VnbiZ1XX3nZJcNN3z6qr6ni0KeL+RZKx7jB+sqi9u5jrdiwABAgQIECBAgMBmCwh4N1vU/QgQIECAAAECO0Sgu09N8uJ1ltNJDquqazZrqRsMeMfp3vtPz/5GVb1/E+sQ8G4WpvsQIECAAAECBAgcEAEB7wFh9hACBAgQIECAwPYT6O5xonacrB3j95I8Nckh0+f/VFUv2qxVbSTg3axnrnef7hbw7k9g9yZAgAABAgQIENh0AQHvppO6IQECBAgQIEBg+wt09w8kWW5PcHSSNyb58Wl1n6uqRfi7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/+kXn0nyv6rqmtXu8P9mTS+OOzHJuNdo+TBeGvehqhptH/Y5unu0chhh762TjPYRH6iqcbrXIECAAAECBAgQIDAbAQHvbLZCIQQIECBAgAABAgQIECBAgAABAgQIENiYgIB3Y15mEyBAgAABAgQIECBAgAABAgQIECBAYDYCAt7ZbIVCCBAgQIAAAQIECBAgQIAAAQIECBAgsDEBAe/GvMwmQIAAAQIECBAgQIAAAQIECBAgQIDAbAQEvLPZCoUQIECAAAECBAgQIECAAAECBAgQIEBgYwIC3o15mU2AAAECBAgQIECAAAECBAgQIECAAIHZCAh4Z7MVCiFAgAABAgQIECBAgAABAgQIECBAgMDGBAS8G/MymwABAgQIECBAgAABAgQIECBAgAABArMREPDOZisUQoAAAQIECBAgQIAAAQIECBAgQIAAgY0JCHg35mU2AQIECBAgQIAAAQIECBAgQIAAAQIEZiMg4J3NViiEAAECBAgQIECAAAECBAgQIECAAAECGxMQ8G7My2wCBAgQIECAAAECBAgQIECAAAECBAjMRkDAO5utUAgBAgQIECBAgAABAgQIECBAgAABAgQ2JiDg3ZiX2QQIECBAgAABAgQIECBAgAABAgQIEJiNgIB3NluhEAIECBAgQIAAAQIECBAgQIAAAQIECGxMQMC7MS+zCRAgQIAAAQIECBAgQIAAAQIECBAgMBsBAe9stkIhBAgQIECAAAECBAgQIECAAAECBAgQ2JiAgHdjXmYTIECAAAECBAgQIECAAAECBAgQIEBgNgIC3tlshUIIECBAgAABAgQIECBAgAABAgQIECCwMQEB78a8zCZAgAABAgQIECBAgAABAgQIECBAgMBsBAS8s9kKhRAgQIAAAQIECBAgQIAAAQIECBAgQGBjAgLejXmZTYAAAQIECBAgQIAAAQIECBAgQIAAgdkICHhnsxUKIUCAAAECBAgQIECAAAECBAgQIECAwMYE/i+/XtiHNCgW7gAAAABJRU5ErkJggg==", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "AI-generated follow-up questions:\n", - "\n", - "* What is the total sales for each artist?\n", - "* What are the top-selling albums for each artist?\n", - "* Which genre has the highest sales?\n", - "* What is the total sales for each genre?\n", - "* What are the sales trends over the years?\n", - "* How many albums are there in the database?\n", - "* Who are the top-selling artists in each genre?\n", - "* What are the top-selling tracks?\n", - "* What is the average sales per artist?\n", - "* How does the sales distribution vary across different genres?\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vn.ask(\"What are the top 5 artists by sales?\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Now try your own question\n", - "\n", - "For reference, these are the tables in the database\n", - "\n", - "\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.ask()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Launch the User Interface\n", - "![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from vanna.flask import VannaFlaskApp\n", - "app = VannaFlaskApp(vn)\n", - "app.run()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.2" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/index.ipynb b/notebooks/index.ipynb deleted file mode 100644 index c7c9ea9f..00000000 --- a/notebooks/index.ipynb +++ /dev/null @@ -1,63 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## How Vanna works\n", - "Vanna works in two easy steps - train a RAG \"model\" on your data, and then ask questions which will return SQL queries that can be set up to automatically run on your database.\n", - "\n", - "1. `vn.train(...)`: Train a RAG \"model\" on your data. These methods add to the reference corpus below. \n", - "2. `vn.ask(...)`: Ask questions. This will use the reference corpus to generate SQL queries that can be run on your database.\n", - "\n", - "![](/blog/img/how-it-works.png)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Video Walkthrough\n", - "This video is slightly dated and we'll be updating it soon." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/local.ipynb b/notebooks/local.ipynb deleted file mode 100644 index 61d7f0af..00000000 --- a/notebooks/local.ipynb +++ /dev/null @@ -1,374 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Using Vanna with a Local Context Database\n", - "Generally it's a lot easier to get started with Vanna using our hosted service. However, if you want to run Vanna locally, you can do so by running a local context database using ChromaDB. This notebook will walk you through the steps to do so." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install 'vanna[chromadb,snowflake,openai]'" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from vanna.local import LocalContext_OpenAI" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Configure OpenAI API Key\n", - "If you're using Azure OpenAI there are some additional parameters to specify beyond the API Key" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Use the regular OpenAI API\n", - "vn = LocalContext_OpenAI({\"api_key\": \"sk-...\"})\n", - "\n", - "# Use the Azure OpenAI API\n", - "vn = LocalContext_OpenAI(config={\n", - " \"api_type\": \"azure\",\n", - " \"api_base\": \"https://...\",\n", - " \"api_version\": \"2023-05-15\",\n", - " \"engine\": \"YOUR_ENGINE_HERE\",\n", - " \"api_key\": \"sk-...\"\n", - "})" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Train using a Sample SQL Query\n", - "The easiest way to get started is to just paste in one SQL query and let Vanna train on it. This will create a new context database and train a model on it. You can then use that model to generate SQL queries." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using model gpt-3.5-turbo for 147.5 tokens (approx)\n", - "Question generated with sql: What are the top 5 customers in terms of total sales? \n", - "Adding SQL...\n" - ] - } - ], - "source": [ - "vn.train(sql=\"\"\"\n", - "SELECT c.c_name as customer_name,\n", - " sum(l.l_extendedprice * (1 - l.l_discount)) as total_sales\n", - "FROM snowflake_sample_data.tpch_sf1.lineitem l join snowflake_sample_data.tpch_sf1.orders o\n", - " ON l.l_orderkey = o.o_orderkey join snowflake_sample_data.tpch_sf1.customer c\n", - " ON o.o_custkey = c.c_custkey\n", - "GROUP BY customer_name\n", - "ORDER BY total_sales desc limit 5;\n", - "\"\"\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Connect to the Database\n", - "This is the database that will be used to run the generated SQL queries against. Here we're connecting to Snowflake." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.connect_to_snowflake(account='my-account', username='my-username', password='my-password', database='my-database')" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Begin Asking Questions\n", - "There is an automatic feedback loop here so when you ask a question that results in SQL that can execute, it will automatically be added to the context database and used to train the model." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Number of requested results 10 is greater than number of elements in index 1, updating n_results = 1\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using model gpt-3.5-turbo for 167.0 tokens (approx)\n", - "SELECT c.c_name as customer_name,\n", - " sum(l.l_extendedprice * (1 - l.l_discount)) as total_sales\n", - "FROM snowflake_sample_data.tpch_sf1.lineitem l join snowflake_sample_data.tpch_sf1.orders o\n", - " ON l.l_orderkey = o.o_orderkey join snowflake_sample_data.tpch_sf1.customer c\n", - " ON o.o_custkey = c.c_custkey\n", - "GROUP BY customer_name\n", - "ORDER BY total_sales desc limit 10;\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
CUSTOMER_NAMETOTAL_SALES
0Customer#0001435006757566.0218
1Customer#0000952576294115.3340
2Customer#0000871156184649.5176
3Customer#0001311136080943.8305
4Customer#0001343806075141.9635
5Customer#0001038346059770.3232
6Customer#0000696826057779.0348
7Customer#0001020226039653.6335
8Customer#0000985876027021.5855
9Customer#0000646605905659.6159
\n", - "
" - ], - "text/plain": [ - " CUSTOMER_NAME TOTAL_SALES\n", - "0 Customer#000143500 6757566.0218\n", - "1 Customer#000095257 6294115.3340\n", - "2 Customer#000087115 6184649.5176\n", - "3 Customer#000131113 6080943.8305\n", - "4 Customer#000134380 6075141.9635\n", - "5 Customer#000103834 6059770.3232\n", - "6 Customer#000069682 6057779.0348\n", - "7 Customer#000102022 6039653.6335\n", - "8 Customer#000098587 6027021.5855\n", - "9 Customer#000064660 5905659.6159" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using model gpt-3.5-turbo for 259.25 tokens (approx)\n", - "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", - "To disable this warning, you can either:\n", - "\t- Avoid using `tokenizers` before the fork if possible\n", - "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" - ] - }, - { - "data": { - "image/png": "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QAABBBBAAAEEEEAAAQQQQAABBBBAAAECXuYAAggggAACCCCAAAIIIIAAAggggAACCCBgUwECXpsOHN1GAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQIeJkDCCCAAAIIIIAAAggggAACCCCAAAIIIICATQUIeG06cHQbAQQQQAABBBBAAAEEEEAAAQQQQAABBBAg4GUOIIAAAggggAACCCCAAAIIIIAAAggggAACNhUg4LXpwNFtBBBAAAEEEEAAAQQQQAABBBBAAAEEEECAgJc5gAACCCCAAAIIIIAAAggggAACCCCAAAII2FSAgNemA0e3EUAAAQQQQAABBBBAAAEEEEAAAQQQQAABAl7mAAIIIIAAAggggAACCCCAAAIIIIAAAgggYFMBAl6bDhzdRgABBBBAAAEEEEAAAQQQQAABBBBAAAEECHiZAwgggAACCCCAAAIIIIAAAggggAACCCCAgE0FCHhtOnB0GwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQIOBlDiCAAAIIIIAAAggggAACCCCAAAIIIIAAAjYVIOC16cDRbQQQQAABBBBAAAEEEEAAAQQQQAABBBBAgICXOYAAAggggAACCCCAAAIIIIAAAggggAACCNhUgIDXpgNHtxFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQJe5gACCCCAAAIIIIAAAggggAACCCCAAAIIIGBTAQJemw4c3UYAAQTuh0DRosUkd548xqkvXbosS5csuh/diNPnrFq1ujyU9iHD4PDhw7J508Y47cHFI4AAAggggAACCCCAAAJxXYCA180MiBcvnhQsWCikc+P27duye/eukLZpp8YSJUok1arXNLp85cplWf37qhh1X0OmWo/VkfLlK0rChAnljz/WyaKFC+SP9evkzp07MWo7mIPLV6goderUkwwZM0natGmNPhw9ekT27dsre3bvkk0bN8jVq1eDaZpjEIgogUVLVkjefPmNPt26dUty58gSUf0LVWceSptWypQpJ0WKFpW8efNJunTp5fz5c3L0yBE5cuSwHDiwX3bu2C6XLl0K1Sn9bmfvgaOi36m6HTt2VCpXLOv3seyIAAIIIIAAAggggAACCCAQ+wQIeN2M6WN16sk3Y8aFfLSbNW0o69etDXm7dmiwVeuX5YO+/WIcCnV5+x3p+HoniR8/vtvL1mB13tzZ8mq7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eG06cHQbAQQQQAABBBBAAAEEEEAAAQQQQAABBBAg4GUOIIAAAggggAACCCCAAAIIIIAAAggggAACNhUg4LXpwNFtBBBAAAEEEEAAAQQQQAABBBBAAAEEEECAgJc5gAACCCCAAAIIIIAAAggggAACCCCAAAII2FSAgNemA0e3EUAAAQQQQAABBBBAAAEEEEAAAQQQQAABAl7mAAIIIIAAAggggAACCCCAAAIIIIAAAgggYFMBAl6bDhzdRgABBBBAAAEEEEAAAQQQQAABBBBAAAEECHiZAwgggAACCCCAAAIIIIAAAggggAACCCCAgE0FCHhtOnB0GwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQIOBlDiCAAAIIIIAAAggggAACCCCAAAIIIIAAAjYVIOC16cDRbQQQQAABBBBAAAEEEEAAAQQQQAABBBBAgICXOYAAAggggAACCCCAAAIIIIAAAggggAACCNhUgIDXpgNHtxFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQJe5gACCCCAAAIIIIAAAggggAACCCCAAAIIIGBTAQJemw4c3UYAAQQQQAABBBBAAAEEEEAAAQQQQAABBAh4mQMIIIAAAggggAACCCCAAAIIIIAAAggggIBNBQh4bTpwdBsBBBBAAAEEEEAAAQQQQAABBBBAAAEEECDgZQ4ggAACCCCAAAIIIIAAAggggAACCCCAAAI2FSDgtenA0W0EEEAAAQQQQAABBBBAAAEEEEAAAQQQQICAlzmAAAIIIIAAAggggAACCCCAAAIIIIAAAgjYVICA16YDR7cRQAABBBBAAAEEEEAAAQQQQAABBBBAAAECXuYAAggggAACCCCAAAIIIIAAAggggAACCCBgUwECXpsOHN1GAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQIeJkDCCCAAAIIIIAAAggggAACCCCAAAIIIICATQUIeG06cHQbAQQQQAABBBBAAAEEEEAAAQQQQAABBBAg4GUOIIAAAggggAACCCCAAAIIIIAAAggggAACNhUg4LXpwNFtBBBAAAEEEEAAAQQQQAABBBBAAAEEEECAgJc5gAACCCCAAAIIIIAAAggggAACCCCAAAII2FSAgNemA0e3EUAAAQQQQAABBBBAAAEEEEAAAQQQQAABAl7mAAIIIIAAAggggAACCCCAAAIIIIAAAggg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owAJ3mCcVcaEAAIIIIAAAggggAACCCCAAAIIIIAAArYQIMFri2lmkAgggAACCCCAAAIIIIAAAggggAACCCAQjAIkeINxVhkTAggggAACCCCAAAIIIIAAAggggAACCNhCgASvLaaZQSKAAAIIIIAAAggggAACCCCAAAIIIIBAMAqQ4A3GWWVMCCCAAAIIIIAAAggggAACCCCAAAIIIGALARK8tphmBokAAggggAACCCCAAAIIIIAAAggggAACwShAgjcYZ5UxIYAAAggggAACCCCAAAIIIIAAAggggIAtBEjw2mKaGSQCCCCAAAIIIIAAAggggAACCCCAAAIIBKMACd5gnFXGhAACCCCAAAIIIIAAAggggAACCCCAAAK2ECDBa4tpZpAIIIAAAggggAACCCCAAAIIIIAAAgggEIwCJHiDcVYZEwIIIIAAAggggAACCCCAAAIIIIAAAgjYQoAEry2mmUEigAACCCCAAAIIIIAAAggggAACCCCAQDAKkOANxlllTAgggAACCCCAAAIIIIAAAggggAACCCBgCwESvLaYZgaJAAIIIIAAAggggAACCCCAAAIIIIAAAsEoQII3GGeVMSGAAAIIIIAAAggggAACCCCAAAIIIICALQRI8NpimhkkAggggAACCCCAAAIIIIAAAggggAACCASjAAneYJxVxoQAAggggAACCCCAAAIIIIAAAggggAACthAgwWuLaWaQCCCAAAIIIIAAAggggAACCCCAAAIIIBCMAiR4g3FWGRMCCCCAAAIIIIAAAggggAACCCCAAAII2EKABK8tpplBIoAAAggggAACCCCAAAIIIIAAAggggEAwCvwPX4dIeV2zus4AAAAASUVORK5CYII=", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vn.ask(\"What are the top 10 customers by sales?\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Training Plan\n", - "A training plan is a great way to extract metadata from your database to use for training. You specify which databases and schemas to filter on and it will attempt to retrieve past queries from the query history as well as the table and column names from the information schema." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Trying query history\n", - "Using model gpt-3.5-turbo for 147.25 tokens (approx)\n", - "Using model gpt-3.5-turbo for 168.25 tokens (approx)\n", - "Using model gpt-3.5-turbo for 147.0 tokens (approx)\n", - "Using model gpt-3.5-turbo for 147.25 tokens (approx)\n", - "Trying INFORMATION_SCHEMA.DATABASES\n", - "Trying INFORMATION_SCHEMA.COLUMNS for SNOWFLAKE_SAMPLE_DATA\n" - ] - }, - { - "data": { - "text/plain": [ - "Train on SQL: What are the top 10 customers based on their total sales?\n", - "Train on SQL: What are the top 10 countries with the highest total sales?\n", - "Train on SQL: What are the top 5 customers based on their total sales?\n", - "Train on SQL: What are the top 15 customers based on their total sales?\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 CUSTOMER\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 SUPPLIER\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 LINEITEM\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 PARTSUPP\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 PART\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 ORDERS\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 REGION\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 NATION" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "training_plan = vn.get_training_plan_snowflake(filter_databases=['SNOWFLAKE_SAMPLE_DATA'], filter_schemas=['TPCH_SF1'])\n", - "training_plan" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "vn.train(plan=training_plan)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Ask More Questions!\n", - "Now that you have a fuly trained model, you can continue asking questions and it will continue to learn and improve." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.ask()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.2" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/manual-train.ipynb b/notebooks/manual-train.ipynb deleted file mode 100644 index cfbac36a..00000000 --- a/notebooks/manual-train.ipynb +++ /dev/null @@ -1,400 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Manually Training Vanna\n", - "This notebook shows how to manually train Vanna. If you prefer to automatically train Vanna, see [here](vn-train.html)\n", - "\n", - "# Install Vanna\n", - "First we install Vanna from [PyPI](https://pypi.org/project/vanna/) and import it.\n", - "Here, we'll also install the Snowflake connector. If you're using a different database, you'll need to install the appropriate connector." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install vanna" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import vanna as vn" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Login\n", - "Creating a login and getting an API key is as easy as entering your email (after you run this cell) and entering the code we send to you. Check your Spam folder if you don't see the code." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "api_key = vn.get_api_key('my-email@example.com')\n", - "vn.set_api_key(api_key)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Set your Model\n", - "You need to choose a globally unique model name. Try using your company name or another unique string. All data from models are isolated - there's no leakage." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "vn.set_model('my-model') # Enter your model name here. This is a globally unique identifier for your model." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Train with DDL Statements\n", - "If you prefer to manually train, you do not need to connect to a database. You can use the train function with other parmaeters like ddl" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.train(ddl=\"\"\"\n", - " CREATE TABLE IF NOT EXISTS my-table (\n", - " id INT PRIMARY KEY,\n", - " name VARCHAR(100),\n", - " age INT\n", - " )\n", - "\"\"\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Train with Documentation\n", - "Sometimes you may want to add documentation about your business terminology or definitions." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Train with SQL\n", - "You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# View Training Data\n", - "At any time you can see what training data is in your model" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idtraining_data_typequestioncontent
015-docdocumentationNoneThis is a table in the PARTSUPP table.\\n\\nThe ...
111-docdocumentationNoneThis is a table in the CUSTOMER table.\\n\\nThe ...
214-docdocumentationNoneThis is a table in the ORDERS table.\\n\\nThe fo...
31244-sqlsqlWhat are the names of the top 10 customers?SELECT c.c_name as customer_name\\nFROM snowf...
41242-sqlsqlWhat are the top 5 customers in terms of total...SELECT c.c_name AS customer_name, SUM(l.l_quan...
517-docdocumentationNoneThis is a table in the REGION table.\\n\\nThe fo...
616-docdocumentationNoneThis is a table in the PART table.\\n\\nThe foll...
71243-sqlsqlWhat are the top 10 customers with the highest...SELECT c.c_name as customer_name,\\n sum(...
81239-sqlsqlWhat are the top 100 customers based on their ...SELECT c.c_name as customer_name,\\n sum(...
913-docdocumentationNoneThis is a table in the SUPPLIER table.\\n\\nThe ...
101241-sqlsqlWhat are the top 10 customers in terms of tota...SELECT c.c_name as customer_name,\\n sum(...
1112-docdocumentationNoneThis is a table in the LINEITEM table.\\n\\nThe ...
1218-docdocumentationNoneThis is a table in the NATION table.\\n\\nThe fo...
131248-sqlsqlHow many customers are in each country?SELECT n.n_name as country,\\n count(*) a...
141240-sqlsqlWhat is the number of orders placed each week?SELECT date_trunc('week', o_orderdate) as week...
\n", - "
" - ], - "text/plain": [ - " id training_data_type \\\n", - "0 15-doc documentation \n", - "1 11-doc documentation \n", - "2 14-doc documentation \n", - "3 1244-sql sql \n", - "4 1242-sql sql \n", - "5 17-doc documentation \n", - "6 16-doc documentation \n", - "7 1243-sql sql \n", - "8 1239-sql sql \n", - "9 13-doc documentation \n", - "10 1241-sql sql \n", - "11 12-doc documentation \n", - "12 18-doc documentation \n", - "13 1248-sql sql \n", - "14 1240-sql sql \n", - "\n", - " question \\\n", - "0 None \n", - "1 None \n", - "2 None \n", - "3 What are the names of the top 10 customers? \n", - "4 What are the top 5 customers in terms of total... \n", - "5 None \n", - "6 None \n", - "7 What are the top 10 customers with the highest... \n", - "8 What are the top 100 customers based on their ... \n", - "9 None \n", - "10 What are the top 10 customers in terms of tota... \n", - "11 None \n", - "12 None \n", - "13 How many customers are in each country? \n", - "14 What is the number of orders placed each week? \n", - "\n", - " content \n", - "0 This is a table in the PARTSUPP table.\\n\\nThe ... \n", - "1 This is a table in the CUSTOMER table.\\n\\nThe ... \n", - "2 This is a table in the ORDERS table.\\n\\nThe fo... \n", - "3 SELECT c.c_name as customer_name\\nFROM snowf... \n", - "4 SELECT c.c_name AS customer_name, SUM(l.l_quan... \n", - "5 This is a table in the REGION table.\\n\\nThe fo... \n", - "6 This is a table in the PART table.\\n\\nThe foll... \n", - "7 SELECT c.c_name as customer_name,\\n sum(... \n", - "8 SELECT c.c_name as customer_name,\\n sum(... \n", - "9 This is a table in the SUPPLIER table.\\n\\nThe ... \n", - "10 SELECT c.c_name as customer_name,\\n sum(... \n", - "11 This is a table in the LINEITEM table.\\n\\nThe ... \n", - "12 This is a table in the NATION table.\\n\\nThe fo... \n", - "13 SELECT n.n_name as country,\\n count(*) a... \n", - "14 SELECT date_trunc('week', o_orderdate) as week... " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vn.get_training_data()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Removing Training Data\n", - "If you added some training data by mistake, you can remove it. Model performance is directly linked to the quality of the training data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.remove_training_data(id='my-training-data-id')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Asking Questions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.ask()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.2" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/other-database-mistral-chromadb.ipynb b/notebooks/other-database-mistral-chromadb.ipynb deleted file mode 100644 index c63156fa..00000000 --- a/notebooks/other-database-mistral-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "22323c93-597c-5855-a512-939a14abf9e5", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Mistral via Mistral API, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "6ae2763b-0004-5c7a-b3ac-a55a75770c34", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "e06c544b-8433-5bbd-b0cf-0b9130f134bf", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "30aef63a-a75b-52bd-8f9c-7fc096e0aba3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,mistralai]'"}, {"id": "3a68caf5-fa2e-5ee9-9bbb-7b85ea07a5ea", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "0a4dc6a1-8cfc-53ae-a9fb-4eca76807451", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, Mistral):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "2d9f1da7-2bcd-5837-b39d-2a5a6c3182b9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-mistral-marqo.ipynb b/notebooks/other-database-mistral-marqo.ipynb deleted file mode 100644 index 17e95db8..00000000 --- a/notebooks/other-database-mistral-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "ca51d95b-179d-5082-896d-247b220d8713", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Mistral via Mistral API, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "8cd881d4-867e-522b-9d09-084e04c93f8a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "75c9a403-0a59-57cb-9d7c-4c6ae11ede15", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "ec51e5b5-fc27-5c00-b1a8-6c9dd188e2f5", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,mistralai]'"}, {"id": "696e9c9c-d724-56db-9a06-10a66dc15b0a", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.marqo.marqo import Marqo\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "de83d46a-6116-5978-8b9a-f0f586a583bd", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, Mistral):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "49d03c21-c228-5a4f-87ac-70555cfbb8f6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-mistral-other-vectordb.ipynb b/notebooks/other-database-mistral-other-vectordb.ipynb deleted file mode 100644 index c7587e4e..00000000 --- a/notebooks/other-database-mistral-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "924358e7-d53d-5554-baff-faa508826010", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Mistral via Mistral API, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "69c22c46-b8d4-5ad1-a81a-f71314449d2a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "94226258-345b-5cae-b6df-88c323f134d6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "22d0fc58-9374-5bda-9414-d80b35fecb42", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[mistralai]'"}, {"id": "d54a05e2-de07-56c0-b57f-0bf2d42e559c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "edc45a16-5782-5d88-9f4a-c405c1f79dea", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, Mistral):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "d8b7a1bc-c87f-5295-b5ea-80a34f34152f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-mistral-vannadb.ipynb b/notebooks/other-database-mistral-vannadb.ipynb deleted file mode 100644 index c19e91d2..00000000 --- a/notebooks/other-database-mistral-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "0e71bc98-8716-580a-b971-496b54f1af8e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Mistral via Mistral API, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "08388fc8-a2a0-51ff-a240-e9c7c1921808", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "3ea06d46-34b7-5339-b787-5c3e207a48f6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "22d0fc58-9374-5bda-9414-d80b35fecb42", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[mistralai]'"}, {"id": "88b7ebec-d4f9-53aa-8f06-7c27055d16b0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.vannadb.vannadb_vector import VannaDB_VectorStore\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "2aa3c756-d1ad-5b3c-a161-5bad6f77d594", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, Mistral):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "fd4f6269-5ffc-59b5-809c-6b8f8737fae0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-azure-chromadb.ipynb b/notebooks/other-database-openai-azure-chromadb.ipynb deleted file mode 100644 index 8f16606b..00000000 --- a/notebooks/other-database-openai-azure-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "92ea27dc-5881-5eb6-93c3-455e04899d35", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Azure OpenAI, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "a30bd540-225c-5ca0-9f80-3628945e8366", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "598f1d53-90e9-5e9c-80c7-e375624cafae", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "d6e3ecc5-3c05-518b-8285-cf9dbf06ec58", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,openai]'"}, {"id": "f6088c74-bfc7-5808-bd52-b2468267a3aa", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "895d74e6-b5e9-58f3-b58b-07c8e9d28707", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "685e53b2-3f8c-5751-a7fe-1ecc1b20c51c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-azure-marqo.ipynb b/notebooks/other-database-openai-azure-marqo.ipynb deleted file mode 100644 index 69f46341..00000000 --- a/notebooks/other-database-openai-azure-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "57d4a531-2711-5199-b845-0b545e6bd26a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Azure OpenAI, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "403b36a4-dcbf-591a-8b34-2cee340d8ae4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "1e2930f2-ae73-5c8c-8631-57cc399965a4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "3d31b251-dcb5-5c7d-b5da-b692698ecdfa", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,openai]'"}, {"id": "6873a728-88db-5cf5-8a57-6355069c8a61", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "aa425412-56b4-5b29-8f25-d0bb982b7446", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, OpenAI_Chat):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "c7fd1c2c-54a3-570b-b0ce-4d57801a780c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-azure-other-vectordb.ipynb b/notebooks/other-database-openai-azure-other-vectordb.ipynb deleted file mode 100644 index 5c036129..00000000 --- a/notebooks/other-database-openai-azure-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "28e43ee2-89a3-5c6e-972c-18e14187ecbc", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Azure OpenAI, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "98bd55a9-8534-57e0-bbf2-790053912d0d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "5307d257-caf4-590b-90ed-98348d2066f1", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "925749d7-7c6c-5599-a063-ad2cad7b52ab", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai]'"}, {"id": "19782e02-3b88-533a-a9cd-f73a7d88e153", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.base import VannaBase\n"}, {"id": "1a1f7fff-3055-51d2-a91d-bf03f4f94bc8", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, OpenAI_Chat):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "ab217063-0367-50df-8dd8-d70857bfc184", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-azure-vannadb.ipynb b/notebooks/other-database-openai-azure-vannadb.ipynb deleted file mode 100644 index fc824ebc..00000000 --- a/notebooks/other-database-openai-azure-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "c84b946c-c10e-5f4d-b0e9-1053cac2d9c0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Azure OpenAI, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "c08f1c4c-ba75-5ac2-882a-ca5ed62a8475", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "c9f0b7cb-f486-57ed-9445-45411e66eb77", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "925749d7-7c6c-5599-a063-ad2cad7b52ab", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai]'"}, {"id": "031a7573-71e2-5c65-873c-124e3158003d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.vannadb.vannadb_vector import VannaDB_VectorStore\n"}, {"id": "9fd5a61a-c40c-5577-80bb-3c8fbf26dc21", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "376806bd-ab6c-5770-a276-0581d8d9d4c6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-standard-chromadb.ipynb b/notebooks/other-database-openai-standard-chromadb.ipynb deleted file mode 100644 index 42845d23..00000000 --- a/notebooks/other-database-openai-standard-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "deeb1a83-b623-52c8-9e9c-8fde4842d65e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using OpenAI, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "b4e86bda-15bf-591d-88bb-fa94a50b50e0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "4e1be90d-831a-592e-8f48-4d6d19b409be", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "d6e3ecc5-3c05-518b-8285-cf9dbf06ec58", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,openai]'"}, {"id": "93b5ab2b-834b-5b86-8d47-c9beda8b3544", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "28a8d8a1-669f-5f8b-82c4-73a0eb221d64", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "41c3b082-bb76-5031-ad58-b9b665824a64", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-standard-marqo.ipynb b/notebooks/other-database-openai-standard-marqo.ipynb deleted file mode 100644 index 3b3acb10..00000000 --- a/notebooks/other-database-openai-standard-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "4fc64584-bab8-5895-a16b-2d54274bc40b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using OpenAI, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "bb1d1e59-d6cf-5ab3-bcbf-8166b0d8f1c3", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "862a7b2b-d7ce-51aa-a02a-08ffe268f8a9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "3d31b251-dcb5-5c7d-b5da-b692698ecdfa", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,openai]'"}, {"id": "dc8ae8d1-d08e-5a8c-a806-09ba465d7761", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "3ce3c4db-08c1-5d0a-86df-2f7b35b82bc2", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, OpenAI_Chat):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "caa8d76c-8e2a-5dc2-8d91-8e7c688f68c4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-standard-other-vectordb.ipynb b/notebooks/other-database-openai-standard-other-vectordb.ipynb deleted file mode 100644 index f676c5f7..00000000 --- a/notebooks/other-database-openai-standard-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "83e6caa0-808d-5e3f-a3bc-dd6055253309", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using OpenAI, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "0dc9e571-d346-5296-9c2b-6288e2e7fdfd", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "02a256fb-5c94-572c-aa70-8d52c604073b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "925749d7-7c6c-5599-a063-ad2cad7b52ab", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai]'"}, {"id": "fe1b5686-8226-53d5-b42b-a29cdb088cad", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.base import VannaBase\n"}, {"id": "45f49779-04b9-574f-b573-4f0afb619e7e", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, OpenAI_Chat):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "bf2850f8-fecb-5049-9ba7-113308c4ed90", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-standard-vannadb.ipynb b/notebooks/other-database-openai-standard-vannadb.ipynb deleted file mode 100644 index e8dfbe01..00000000 --- a/notebooks/other-database-openai-standard-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "46dcb449-a2c9-571d-a7ce-d6450eb19571", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using OpenAI, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "db8cee28-61fc-5750-bc66-8a3f8e312e9c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "0c3b4092-39bd-5a07-a8de-4c443475c7b4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "925749d7-7c6c-5599-a063-ad2cad7b52ab", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai]'"}, {"id": "4ff1aaee-1154-5859-b8c3-93ac3c31595d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.vannadb.vannadb_vector import VannaDB_VectorStore\n"}, {"id": "1fc13242-ce0f-53e5-832e-ff33197d2eef", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "a70bb5bf-f6c4-5dd5-b7db-0f572fd7e7e1", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-vanna-chromadb.ipynb b/notebooks/other-database-openai-vanna-chromadb.ipynb deleted file mode 100644 index c8669ca3..00000000 --- a/notebooks/other-database-openai-vanna-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "0137feba-b7f4-52f8-985b-c86be0e0f5bb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using OpenAI via Vanna.AI (Recommended), ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "105b1b11-2b54-59ac-8b07-3fc3536824da", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "2ce897eb-059f-5ca9-bbd1-36aaed7c87cf", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "1a0086e2-0a57-5091-accd-456e4d3e4ad7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb]'"}, {"id": "c1e5ad61-57c7-5b64-920b-6f5b435df5e3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "3225927e-ae19-5159-a112-8dac5a3cda22", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "382f7e7b-7b6a-52ad-ba2c-ead3cd478532", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-vanna-marqo.ipynb b/notebooks/other-database-openai-vanna-marqo.ipynb deleted file mode 100644 index 58c2bbee..00000000 --- a/notebooks/other-database-openai-vanna-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "b3805a05-e5f3-5ea2-9c50-25a1c9a51a75", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using OpenAI via Vanna.AI (Recommended), Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "30b9ca1a-c459-53b6-ba57-d8a6bb5cb9fa", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "aa4a36b4-5201-5e6e-9f0f-89b2e2b8ffc5", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "30f0eccb-7684-5642-98ae-31bee8662133", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo]'"}, {"id": "a1877af9-e758-52a4-8f21-3d7b2e0c904f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.marqo.marqo import Marqo\n"}, {"id": "b0e1d67a-58fd-5bcd-b2a2-a13317fda343", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n\nvn = MyVanna()\n"}, {"id": "fcb94e2b-5b7a-511c-a534-0d2101d835e8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-vanna-other-vectordb.ipynb b/notebooks/other-database-openai-vanna-other-vectordb.ipynb deleted file mode 100644 index 7b14f392..00000000 --- a/notebooks/other-database-openai-vanna-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "dea72209-4768-5f52-ba75-ae7671cc46fe", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using OpenAI via Vanna.AI (Recommended), Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "a35e6042-02e6-5934-b6c7-45abff11bcef", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "31e4174d-4d1d-51db-9a91-37d3ba8a2840", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "b9b77362-c049-5500-b502-08811fcd4dce", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install vanna"}, {"id": "35e4b991-0e84-561d-8c1e-979bb4252ec9", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\n"}, {"id": "57fbc78c-6a54-5f06-98d8-69f315a380b4", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "b7caa979-78ba-5079-872e-d52e3f5a1f98", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-openai-vanna-vannadb.ipynb b/notebooks/other-database-openai-vanna-vannadb.ipynb deleted file mode 100644 index 14646105..00000000 --- a/notebooks/other-database-openai-vanna-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "0f6a628d-5dca-58b1-b690-40302dab9bf2", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using OpenAI via Vanna.AI (Recommended), Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "1a507369-8ade-5a6e-b349-9927657cb37f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "0c3b4092-39bd-5a07-a8de-4c443475c7b4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "b9b77362-c049-5500-b502-08811fcd4dce", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install vanna"}, {"id": "6160c274-caf4-537e-9a02-f6a1d7022a2c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "import vanna\nfrom vanna.remote import VannaDefault"}, {"id": "cc6152fc-02df-5490-9920-896b5565b3d0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "api_key = vanna.get_api_key('my-email@example.com')\n\nvanna_model_name = # Put a unique name here\nvn = VannaDefault(model=vanna_model_name, api_key=api_key)\n"}, {"id": "ea19ce1f-4ffe-5c38-a41b-5dcca9db90dd", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-other-llm-chromadb.ipynb b/notebooks/other-database-other-llm-chromadb.ipynb deleted file mode 100644 index e742a27a..00000000 --- a/notebooks/other-database-other-llm-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "7b709983-57b5-5bc7-940a-bcbf832468c6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Other LLM, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "b348bb01-4210-561c-bbd9-759bb6a11099", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "5cd05dbb-a269-5efa-baa4-1a292b9a4d8c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "1a0086e2-0a57-5091-accd-456e4d3e4ad7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb]'"}, {"id": "a70195e6-7c1f-519f-8413-4ad4e6b3570d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "ad2c6517-9727-56fb-befe-a4108859aa3b", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(ChromaDB_VectorStore, MyCustomLLM):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "2ea1ac60-025d-586c-bfed-18040b53bf11", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-other-llm-marqo.ipynb b/notebooks/other-database-other-llm-marqo.ipynb deleted file mode 100644 index 8a18d350..00000000 --- a/notebooks/other-database-other-llm-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "3a87478b-c54b-5bdd-b94f-e7ea9d43e69a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Other LLM, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "f9acdcfc-f442-571b-9ff3-544bb5a2421e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "cd409d49-fd96-5a72-80f4-ad705ec788b1", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "30f0eccb-7684-5642-98ae-31bee8662133", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo]'"}, {"id": "2e26545c-6029-5c62-b146-105086c10f6d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "c1812db9-f2e2-5e21-98c1-d00397d25f65", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(Marqo, MyCustomLLM):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "500dd444-e813-5de2-9237-67482765eb5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-other-llm-other-vectordb.ipynb b/notebooks/other-database-other-llm-other-vectordb.ipynb deleted file mode 100644 index 207f31c8..00000000 --- a/notebooks/other-database-other-llm-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "d4a7bd4f-e238-5168-8c26-03ab7d9b6ceb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Other LLM, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "6b7aad07-6701-5974-9b5a-c6ed21cc3eca", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "445e8689-7756-5dab-8e76-46f1601ed2b1", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "b9b77362-c049-5500-b502-08811fcd4dce", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install vanna"}, {"id": "35e4b991-0e84-561d-8c1e-979bb4252ec9", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\n"}, {"id": "2ff3ca97-cb35-56c7-9263-a3613e4ce005", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(MyCustomVectorDB, MyCustomLLM):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "856c5fd6-b9d5-5f13-a5c9-44afc99da099", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/other-database-other-llm-vannadb.ipynb b/notebooks/other-database-other-llm-vannadb.ipynb deleted file mode 100644 index 99714187..00000000 --- a/notebooks/other-database-other-llm-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "8b253300-a4e8-5b94-8ef5-958eefde2756", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Other Database using Other LLM, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "638a9f05-ed43-58ab-aa9b-2f88ddc6a370", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "cb07c322-cd04-54d6-9c9a-7d262dec914f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "b9b77362-c049-5500-b502-08811fcd4dce", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install vanna"}, {"id": "bfe31937-16c5-5ecb-9aea-0cc1b2aec53c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.vannadb.vannadb_vector import VannaDB_VectorStore\nfrom vanna.base import VannaBase\n"}, {"id": "8ac7e323-be70-5fee-9d96-69868af0ff99", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(VannaDB_VectorStore, MyCustomLLM):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "5a52b18e-95df-530d-b46e-6d39379cc2e6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "9b30d7e1-f279-5b6a-a620-fc988020efcc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nimport pandas as pd\n\n# There's usually a library for connecting to your type of database. Any SQL database will work here -- you just have to use the right library.\nconn_details = {...} # fill this with your connection details\nconn = ... # fill this with your connection object\n\n# You define a function that takes in a SQL query as a string and returns a pandas dataframe\ndef run_sql(sql: str) -> pd.DataFrame:\n df = pd.read_sql_query(sql, conn)\n return df\n\n# This gives the package a function that it can use to run the SQL\nvn.run_sql = run_sql\nvn.run_sql_is_set = True\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-mistral-chromadb.ipynb b/notebooks/postgres-mistral-chromadb.ipynb deleted file mode 100644 index 9bcb6cf4..00000000 --- a/notebooks/postgres-mistral-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "0f3048c8-acae-5ca8-b441-2e74e9190bc2", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Mistral via Mistral API, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "a03347e7-7aec-59e2-a48b-a8b757da02f7", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "b8762223-46dd-5535-be5b-16e5128ea5c0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "8f8fcaac-414d-5dc4-9d96-2a42ce33b9db", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,mistralai,postgres]'"}, {"id": "3a68caf5-fa2e-5ee9-9bbb-7b85ea07a5ea", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "0a4dc6a1-8cfc-53ae-a9fb-4eca76807451", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, Mistral):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "01a3df8b-cf52-5219-bc5d-dc5e88ebcfca", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-mistral-marqo.ipynb b/notebooks/postgres-mistral-marqo.ipynb deleted file mode 100644 index bacfa9b8..00000000 --- a/notebooks/postgres-mistral-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "aa811fa4-4d25-5b33-9da8-e68a69b87e0a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Mistral via Mistral API, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "369fb3d9-2130-513d-af1f-aa2ac6672dc5", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "695d1031-2ae4-5061-a36d-23e81a133eb0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "f3cf7c8f-f599-519b-8e2e-33106f15963a", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,mistralai,postgres]'"}, {"id": "696e9c9c-d724-56db-9a06-10a66dc15b0a", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.marqo.marqo import Marqo\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "de83d46a-6116-5978-8b9a-f0f586a583bd", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, Mistral):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "0a11ad90-a111-5bc2-b51f-4f6dde012b88", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-mistral-other-vectordb.ipynb b/notebooks/postgres-mistral-other-vectordb.ipynb deleted file mode 100644 index a8070e9c..00000000 --- a/notebooks/postgres-mistral-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "1bf7ca05-0a4b-56c4-8958-79b30e5afc2e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Mistral via Mistral API, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "13f1c9f5-c46b-56da-a35a-83299b1735b6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "e8abf792-ee0c-5975-95ff-67d2b0ddbaba", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "72ba7676-e2d8-5a7e-ac6e-f7578822efb5", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[mistralai,postgres]'"}, {"id": "d54a05e2-de07-56c0-b57f-0bf2d42e559c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "edc45a16-5782-5d88-9f4a-c405c1f79dea", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, Mistral):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "aa447969-8b9a-549f-8d0a-40d583332bb3", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-mistral-vannadb.ipynb b/notebooks/postgres-mistral-vannadb.ipynb deleted file mode 100644 index d0ce0717..00000000 --- a/notebooks/postgres-mistral-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "7eb3f36a-c79b-5c0c-8eb6-4601a6c3c634", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Mistral via Mistral API, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "e0d82a7a-03af-5945-94b5-d9b71c024f01", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "eaaf2b90-2f4f-5c81-ae7b-590fd5be3358", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "72ba7676-e2d8-5a7e-ac6e-f7578822efb5", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[mistralai,postgres]'"}, {"id": "88b7ebec-d4f9-53aa-8f06-7c27055d16b0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.vannadb.vannadb_vector import VannaDB_VectorStore\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "2aa3c756-d1ad-5b3c-a161-5bad6f77d594", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, Mistral):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "566fdbc1-c1ef-533e-98bf-e01f51166dbb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-azure-chromadb.ipynb b/notebooks/postgres-openai-azure-chromadb.ipynb deleted file mode 100644 index 7865e671..00000000 --- a/notebooks/postgres-openai-azure-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "e7cd5976-e784-52c5-be86-b454ffa806c8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Azure OpenAI, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "d69856a3-3ea7-5ca5-8159-040262aa4049", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "8eb5354c-d5fb-5b74-92a2-77b2ced899b0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "30b351fd-e454-5983-b4aa-a522759a1dbe", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,openai,postgres]'"}, {"id": "f6088c74-bfc7-5808-bd52-b2468267a3aa", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "895d74e6-b5e9-58f3-b58b-07c8e9d28707", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "53a3f9ca-429d-5aae-9278-9041a8cfdc5b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-azure-marqo.ipynb b/notebooks/postgres-openai-azure-marqo.ipynb deleted file mode 100644 index 5433eab0..00000000 --- a/notebooks/postgres-openai-azure-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "bd301e2e-9b25-5c91-aebc-1f0c23d76aad", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Azure OpenAI, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "11a49ddb-4573-5a2d-8673-58f553dfdb70", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "24d05cd0-80cc-5664-8a9e-6248fc56ffaa", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "62983037-10e1-53ea-ac40-912d81a2c447", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,openai,postgres]'"}, {"id": "6873a728-88db-5cf5-8a57-6355069c8a61", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "aa425412-56b4-5b29-8f25-d0bb982b7446", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, OpenAI_Chat):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "434c5705-542f-566e-8c40-93fa853bda26", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-azure-other-vectordb.ipynb b/notebooks/postgres-openai-azure-other-vectordb.ipynb deleted file mode 100644 index b1dd2d46..00000000 --- a/notebooks/postgres-openai-azure-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "6c5bdd16-d84b-527f-a805-d01f53e7337c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Azure OpenAI, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "55d62c18-7f8e-53cf-8a60-fb5abd6efee4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "4aafd94a-06eb-51e1-8df7-409c90675dc5", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "5629279e-c760-54d5-8a49-05e0838d3a07", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,postgres]'"}, {"id": "19782e02-3b88-533a-a9cd-f73a7d88e153", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.base import VannaBase\n"}, {"id": "1a1f7fff-3055-51d2-a91d-bf03f4f94bc8", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, OpenAI_Chat):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "1cfc68ef-cda4-5bd3-94c4-b23c2ef2979c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-azure-vannadb.ipynb b/notebooks/postgres-openai-azure-vannadb.ipynb deleted file mode 100644 index 21b62613..00000000 --- a/notebooks/postgres-openai-azure-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "778e258a-8586-5d24-bde4-0a1a6361f6a9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Azure OpenAI, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "b707bd2c-b6fa-517e-944f-1f316438c252", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "59f5454a-9c3a-5ea2-9d20-7a32ca5813b4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "5629279e-c760-54d5-8a49-05e0838d3a07", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,postgres]'"}, {"id": "031a7573-71e2-5c65-873c-124e3158003d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.vannadb.vannadb_vector import VannaDB_VectorStore\n"}, {"id": "9fd5a61a-c40c-5577-80bb-3c8fbf26dc21", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "c75ad4aa-7cff-5533-8867-a7628c0697c7", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-standard-chromadb.ipynb b/notebooks/postgres-openai-standard-chromadb.ipynb deleted file mode 100644 index c94330e8..00000000 --- a/notebooks/postgres-openai-standard-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "95b3f23b-49e5-5f79-bedc-f3e5dea0f14f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using OpenAI, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "a552e618-fefd-5a0d-8005-c47323ee0a3a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "65fe6254-dbf1-59dc-91c6-fad08e3b05ff", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "30b351fd-e454-5983-b4aa-a522759a1dbe", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,openai,postgres]'"}, {"id": "93b5ab2b-834b-5b86-8d47-c9beda8b3544", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "28a8d8a1-669f-5f8b-82c4-73a0eb221d64", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "a103cf57-1d4c-5e2b-a73b-72a6827a9281", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-standard-marqo.ipynb b/notebooks/postgres-openai-standard-marqo.ipynb deleted file mode 100644 index 5e969bb7..00000000 --- a/notebooks/postgres-openai-standard-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "82494868-ca31-5a5b-aa10-f5ebf57091af", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using OpenAI, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "095e6e97-1391-5e97-8901-e7cc282058c6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "02dcf380-b5e4-518f-97e7-50dde2f89dca", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "62983037-10e1-53ea-ac40-912d81a2c447", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,openai,postgres]'"}, {"id": "dc8ae8d1-d08e-5a8c-a806-09ba465d7761", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "3ce3c4db-08c1-5d0a-86df-2f7b35b82bc2", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, OpenAI_Chat):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "d49d158b-aea7-5bd6-b2ea-854067b49f9d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-standard-other-vectordb.ipynb b/notebooks/postgres-openai-standard-other-vectordb.ipynb deleted file mode 100644 index e60380bc..00000000 --- a/notebooks/postgres-openai-standard-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "ad6a7ca6-de11-5e6c-accf-b908b3b5f536", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using OpenAI, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "cc22b65c-c118-568d-95b5-320743ba50ce", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "3ce03f11-0930-5754-a09e-dd673300f806", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "5629279e-c760-54d5-8a49-05e0838d3a07", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,postgres]'"}, {"id": "fe1b5686-8226-53d5-b42b-a29cdb088cad", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.base import VannaBase\n"}, {"id": "45f49779-04b9-574f-b573-4f0afb619e7e", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, OpenAI_Chat):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "0b5cbed2-eaf8-57d9-ba43-3fd4d4c7ce6d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-standard-vannadb.ipynb b/notebooks/postgres-openai-standard-vannadb.ipynb deleted file mode 100644 index 9fbe816a..00000000 --- a/notebooks/postgres-openai-standard-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "bd885f8c-8938-5a71-826f-6c4000c70508", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using OpenAI, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "23336edb-af5c-5cee-a11a-da2a8355603f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "ea6ba7f8-b88b-5281-b2ff-3bf99ac5a721", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "5629279e-c760-54d5-8a49-05e0838d3a07", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,postgres]'"}, {"id": "4ff1aaee-1154-5859-b8c3-93ac3c31595d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.vannadb.vannadb_vector import VannaDB_VectorStore\n"}, {"id": "1fc13242-ce0f-53e5-832e-ff33197d2eef", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "0dc7642e-3c68-5436-8510-390fd86789e0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-vanna-chromadb.ipynb b/notebooks/postgres-openai-vanna-chromadb.ipynb deleted file mode 100644 index 612aab84..00000000 --- a/notebooks/postgres-openai-vanna-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "df07813d-72a1-5452-8dc9-f6894538a24b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using OpenAI via Vanna.AI (Recommended), ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "75fcde7a-5d87-565f-81e2-8270d4b4be99", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "b013b6eb-ae18-5d49-995a-c462458c0904", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "3642397b-e00d-58d8-8500-e501ec0f7e4e", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,postgres]'"}, {"id": "c1e5ad61-57c7-5b64-920b-6f5b435df5e3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "3225927e-ae19-5159-a112-8dac5a3cda22", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "3652dfbf-c249-51b4-9dc3-f4c7c11326de", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-vanna-marqo.ipynb b/notebooks/postgres-openai-vanna-marqo.ipynb deleted file mode 100644 index 449dd310..00000000 --- a/notebooks/postgres-openai-vanna-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "351a9c1a-ccd5-571d-8d48-cd42b3cfa2d3", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using OpenAI via Vanna.AI (Recommended), Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "c9208da9-f260-5e4f-9713-1f0f7f0ed03b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "c4b953fc-fa5a-5907-8ed5-756efdb2e6ba", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "2f878a3b-afef-5bb3-9a04-195b941368dc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,postgres]'"}, {"id": "a1877af9-e758-52a4-8f21-3d7b2e0c904f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.marqo.marqo import Marqo\n"}, {"id": "b0e1d67a-58fd-5bcd-b2a2-a13317fda343", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n\nvn = MyVanna()\n"}, {"id": "ee8dd1b9-a113-5bca-a151-66ae4844d037", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-vanna-other-vectordb.ipynb b/notebooks/postgres-openai-vanna-other-vectordb.ipynb deleted file mode 100644 index fe6d158d..00000000 --- a/notebooks/postgres-openai-vanna-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "c6b9a340-0204-5267-b461-47450cdb8a2d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using OpenAI via Vanna.AI (Recommended), Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "502499f2-8200-5bdf-bc7d-4bd15b1e7f63", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "adec8661-7621-5bfe-a9aa-762ff25e5846", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "bdef8f4c-bd17-56af-8840-6452768ea0f3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[postgres]'"}, {"id": "35e4b991-0e84-561d-8c1e-979bb4252ec9", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\n"}, {"id": "57fbc78c-6a54-5f06-98d8-69f315a380b4", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "fbe025c2-7491-5831-93bf-24edd0a41f1d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-openai-vanna-vannadb.ipynb b/notebooks/postgres-openai-vanna-vannadb.ipynb deleted file mode 100644 index 2080b769..00000000 --- a/notebooks/postgres-openai-vanna-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "ff3e46c3-5735-53fe-86ba-dd1ca947e4ba", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using OpenAI via Vanna.AI (Recommended), Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "c263c951-b756-57eb-a66a-ef636ff0a696", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "ea6ba7f8-b88b-5281-b2ff-3bf99ac5a721", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "bdef8f4c-bd17-56af-8840-6452768ea0f3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[postgres]'"}, {"id": "6160c274-caf4-537e-9a02-f6a1d7022a2c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "import vanna\nfrom vanna.remote import VannaDefault"}, {"id": "cc6152fc-02df-5490-9920-896b5565b3d0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "api_key = vanna.get_api_key('my-email@example.com')\n\nvanna_model_name = # Put a unique name here\nvn = VannaDefault(model=vanna_model_name, api_key=api_key)\n"}, {"id": "f4fe34ed-796a-5dc8-bd05-0e2013c73558", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-other-llm-chromadb.ipynb b/notebooks/postgres-other-llm-chromadb.ipynb deleted file mode 100644 index b4571ebb..00000000 --- a/notebooks/postgres-other-llm-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "30e88248-26ea-53ad-93a6-9b3d5da41033", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Other LLM, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "0dc3de1e-d806-5f7c-86aa-f0a764bbb64c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "58e05bbe-f915-5ff5-abb9-e039319e458e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "3642397b-e00d-58d8-8500-e501ec0f7e4e", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,postgres]'"}, {"id": "a70195e6-7c1f-519f-8413-4ad4e6b3570d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "ad2c6517-9727-56fb-befe-a4108859aa3b", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(ChromaDB_VectorStore, MyCustomLLM):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "218818b3-2737-5f6a-a345-dd682b617c49", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-other-llm-marqo.ipynb b/notebooks/postgres-other-llm-marqo.ipynb deleted file mode 100644 index 9ab9303a..00000000 --- a/notebooks/postgres-other-llm-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "47e6700f-2fb1-5518-bd4f-d8f1ab43e77e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Other LLM, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "bf373d88-64a8-5f57-9f12-1238aba1bdfc", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "dd109030-882d-50b1-a642-608c68e204d7", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "2f878a3b-afef-5bb3-9a04-195b941368dc", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,postgres]'"}, {"id": "2e26545c-6029-5c62-b146-105086c10f6d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "c1812db9-f2e2-5e21-98c1-d00397d25f65", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(Marqo, MyCustomLLM):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "bc4b70b8-16d3-5ddb-a8d4-081b71fd4670", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-other-llm-other-vectordb.ipynb b/notebooks/postgres-other-llm-other-vectordb.ipynb deleted file mode 100644 index 93074de0..00000000 --- a/notebooks/postgres-other-llm-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "3a23b994-dde6-5290-a4ae-5c0fbc8143d0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Other LLM, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "1a323199-007a-5773-aab8-b6510f11824b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "4ce94f6b-39db-5297-af88-8ae081327b78", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "bdef8f4c-bd17-56af-8840-6452768ea0f3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[postgres]'"}, {"id": "35e4b991-0e84-561d-8c1e-979bb4252ec9", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\n"}, {"id": "2ff3ca97-cb35-56c7-9263-a3613e4ce005", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(MyCustomVectorDB, MyCustomLLM):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "ede6c438-aa86-5587-96f5-f8cfebc39dae", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/postgres-other-llm-vannadb.ipynb b/notebooks/postgres-other-llm-vannadb.ipynb deleted file mode 100644 index e7c3c13c..00000000 --- a/notebooks/postgres-other-llm-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "cd757483-4d52-5a68-94b5-0244087a9cdb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Postgres using Other LLM, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "2ba202ba-7325-523a-9717-cb7730ea4253", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "a34d3625-80b0-5424-a34e-81d174b7619e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "bdef8f4c-bd17-56af-8840-6452768ea0f3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[postgres]'"}, {"id": "bfe31937-16c5-5ecb-9aea-0cc1b2aec53c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.vannadb.vannadb_vector import VannaDB_VectorStore\nfrom vanna.base import VannaBase\n"}, {"id": "8ac7e323-be70-5fee-9d96-69868af0ff99", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(VannaDB_VectorStore, MyCustomLLM):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "b7091121-9564-582b-bbc5-a131426fe27e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "38707ef4-8063-5170-873a-45e63c1928a7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/slack.ipynb b/notebooks/slack.ipynb deleted file mode 100644 index 4663122a..00000000 --- a/notebooks/slack.ipynb +++ /dev/null @@ -1,42 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Using Vanna with Slack" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"\"" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Source Code\n", - "https://github.com/vanna-ai/vanna-slack" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "language_info": { - "name": "python" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/snowflake-mistral-chromadb.ipynb b/notebooks/snowflake-mistral-chromadb.ipynb deleted file mode 100644 index bdf1360a..00000000 --- a/notebooks/snowflake-mistral-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "581af781-64b0-5419-b34c-f423e998b939", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Mistral via Mistral API, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "028bcaab-c1fe-57d7-ad3d-eae62574637b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "cfd53a0e-d75a-504c-86d2-24e092fb7965", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "678cedb3-98fb-53c0-8cfd-c8663ea21113", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,mistralai,snowflake]'"}, {"id": "3a68caf5-fa2e-5ee9-9bbb-7b85ea07a5ea", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "0a4dc6a1-8cfc-53ae-a9fb-4eca76807451", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, Mistral):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "2794e104-456a-59ff-9642-f076a5b322c0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-mistral-marqo.ipynb b/notebooks/snowflake-mistral-marqo.ipynb deleted file mode 100644 index 249b1caf..00000000 --- a/notebooks/snowflake-mistral-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "dc380e10-5a07-55b0-b4ff-4c3064aab9e0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Mistral via Mistral API, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "be9a2065-77c5-5ae6-90a4-d388c26f1808", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "85967ce2-512f-5941-8c76-457f873e62cd", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "784da0a2-a431-504f-ac94-72367ca7493e", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,mistralai,snowflake]'"}, {"id": "696e9c9c-d724-56db-9a06-10a66dc15b0a", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.marqo.marqo import Marqo\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "de83d46a-6116-5978-8b9a-f0f586a583bd", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, Mistral):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "be6ebd32-b312-5ec1-b77e-a7691af20606", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-mistral-other-vectordb.ipynb b/notebooks/snowflake-mistral-other-vectordb.ipynb deleted file mode 100644 index 8e77a2a7..00000000 --- a/notebooks/snowflake-mistral-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "bb27d995-aa3f-5004-9976-87e64a33a9d0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Mistral via Mistral API, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "59581b59-5760-589b-b8b8-423389281910", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "ca149400-a8ed-56d7-9da0-833d08e8bbac", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "037d295c-00dd-5d10-9d2f-0e2b81de13d0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[mistralai,snowflake]'"}, {"id": "d54a05e2-de07-56c0-b57f-0bf2d42e559c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "edc45a16-5782-5d88-9f4a-c405c1f79dea", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, Mistral):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "a62badb0-91ba-56ee-ba75-78259258c42c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-mistral-vannadb.ipynb b/notebooks/snowflake-mistral-vannadb.ipynb deleted file mode 100644 index a6e39bee..00000000 --- a/notebooks/snowflake-mistral-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "331570b7-be75-5d5f-8cff-7e4570addec8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Mistral via Mistral API, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "30ca42f3-0e6c-5e60-a359-503a87213bf2", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "f705ed90-989d-59df-9927-e9d515b6f9f5", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "037d295c-00dd-5d10-9d2f-0e2b81de13d0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[mistralai,snowflake]'"}, {"id": "88b7ebec-d4f9-53aa-8f06-7c27055d16b0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.vannadb.vannadb_vector import VannaDB_VectorStore\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "2aa3c756-d1ad-5b3c-a161-5bad6f77d594", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, Mistral):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "1c76a8a7-517a-59c9-83f4-13bd1c0dd817", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-azure-chromadb.ipynb b/notebooks/snowflake-openai-azure-chromadb.ipynb deleted file mode 100644 index 1b36a137..00000000 --- a/notebooks/snowflake-openai-azure-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "6287c685-ff0c-5a75-a58f-fd9d47b14fc3", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Azure OpenAI, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "7c603f36-8039-502a-983d-bf98a618b27a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "4923d0fe-58f3-52de-8739-2a55b399f5f8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "216dcd51-21ea-5740-a271-269aa81f38e3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,openai,snowflake]'"}, {"id": "f6088c74-bfc7-5808-bd52-b2468267a3aa", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "895d74e6-b5e9-58f3-b58b-07c8e9d28707", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "417fd988-6411-5519-8590-3ecf36dddcbf", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-azure-marqo.ipynb b/notebooks/snowflake-openai-azure-marqo.ipynb deleted file mode 100644 index 75ad2788..00000000 --- a/notebooks/snowflake-openai-azure-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "ea82563f-1e40-530f-b1c1-b49a1ac0f125", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Azure OpenAI, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "4aa821af-2cc8-5a11-b109-361e5b3baf55", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "3702212c-6d62-527d-8717-bb696f9ec2ed", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "792a0a6f-671d-59b0-aed2-fd6606acef80", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,openai,snowflake]'"}, {"id": "6873a728-88db-5cf5-8a57-6355069c8a61", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "aa425412-56b4-5b29-8f25-d0bb982b7446", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, OpenAI_Chat):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "74c50644-a49b-5433-8130-5041ffe24967", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-azure-other-vectordb.ipynb b/notebooks/snowflake-openai-azure-other-vectordb.ipynb deleted file mode 100644 index 81be22d3..00000000 --- a/notebooks/snowflake-openai-azure-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "6aac9f07-876b-5289-9f4e-7524132617ad", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Azure OpenAI, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "1124d018-1c19-5e7e-9bc5-0ef3f2d34a44", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "0952250a-a0b8-57bf-bf8c-09849612f91d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "0f72722e-743a-5317-9c08-564f18d4f8ef", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,snowflake]'"}, {"id": "19782e02-3b88-533a-a9cd-f73a7d88e153", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.base import VannaBase\n"}, {"id": "1a1f7fff-3055-51d2-a91d-bf03f4f94bc8", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, OpenAI_Chat):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "e4e214e3-26d6-542f-bc24-3331af9dcd0b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-azure-vannadb.ipynb b/notebooks/snowflake-openai-azure-vannadb.ipynb deleted file mode 100644 index 879e02c3..00000000 --- a/notebooks/snowflake-openai-azure-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "813e792b-6025-521d-acaf-cc20cbd83c99", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Azure OpenAI, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "2e6e05ce-2c8b-524e-9478-07968ff24fe5", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "d605113c-0491-54b5-aa59-f2e311dff1ec", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "0f72722e-743a-5317-9c08-564f18d4f8ef", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,snowflake]'"}, {"id": "031a7573-71e2-5c65-873c-124e3158003d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.vannadb.vannadb_vector import VannaDB_VectorStore\n"}, {"id": "9fd5a61a-c40c-5577-80bb-3c8fbf26dc21", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "88718a8f-d88c-5f49-acc1-017db9623d5d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-standard-chromadb.ipynb b/notebooks/snowflake-openai-standard-chromadb.ipynb deleted file mode 100644 index d6306dfa..00000000 --- a/notebooks/snowflake-openai-standard-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "75481477-4412-582b-aba7-52183e26f37c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using OpenAI, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "339703f1-d6cd-5c0f-8ac1-c221f0798512", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "b176ff21-c8d5-5333-abe1-50847ddd26b8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "216dcd51-21ea-5740-a271-269aa81f38e3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,openai,snowflake]'"}, {"id": "93b5ab2b-834b-5b86-8d47-c9beda8b3544", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "28a8d8a1-669f-5f8b-82c4-73a0eb221d64", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "2365dba5-22ad-598b-9be6-259df26e2f09", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-standard-marqo.ipynb b/notebooks/snowflake-openai-standard-marqo.ipynb deleted file mode 100644 index 5db3df4c..00000000 --- a/notebooks/snowflake-openai-standard-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "66a6659a-5332-5d82-9036-3b8d8c3ff05c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using OpenAI, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "65d93a64-34d2-53ad-9bcd-f50890404297", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "acf1fb3b-d375-55e9-b86b-4391f9ce7659", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "792a0a6f-671d-59b0-aed2-fd6606acef80", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,openai,snowflake]'"}, {"id": "dc8ae8d1-d08e-5a8c-a806-09ba465d7761", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "3ce3c4db-08c1-5d0a-86df-2f7b35b82bc2", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, OpenAI_Chat):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "88e7ec95-c208-5973-9be7-cc666e48caa8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-standard-other-vectordb.ipynb b/notebooks/snowflake-openai-standard-other-vectordb.ipynb deleted file mode 100644 index f8a6247f..00000000 --- a/notebooks/snowflake-openai-standard-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "a53aec8f-5a05-50f3-9209-7bbf1dca9e6f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using OpenAI, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "4486c1b3-6c3e-530c-8386-50ca4b3f99e8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "4854f259-7176-51d2-8b79-46b6f7bd61f4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "0f72722e-743a-5317-9c08-564f18d4f8ef", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,snowflake]'"}, {"id": "fe1b5686-8226-53d5-b42b-a29cdb088cad", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.base import VannaBase\n"}, {"id": "45f49779-04b9-574f-b573-4f0afb619e7e", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, OpenAI_Chat):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "01e305ed-7f1b-5f22-8459-ff7a200cb877", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-standard-vannadb.ipynb b/notebooks/snowflake-openai-standard-vannadb.ipynb deleted file mode 100644 index d6e70fe7..00000000 --- a/notebooks/snowflake-openai-standard-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "f13605be-e49c-5be3-87bc-2a90efb57306", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using OpenAI, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "e2b2b876-72a0-5854-9177-5ad9bcc29ef7", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "f95c3155-2705-5a3f-b76c-8a56037f9090", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "0f72722e-743a-5317-9c08-564f18d4f8ef", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai,snowflake]'"}, {"id": "4ff1aaee-1154-5859-b8c3-93ac3c31595d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.vannadb.vannadb_vector import VannaDB_VectorStore\n"}, {"id": "1fc13242-ce0f-53e5-832e-ff33197d2eef", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "efa4625c-5082-5bce-a2e0-ee025f74349f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-vanna-chromadb.ipynb b/notebooks/snowflake-openai-vanna-chromadb.ipynb deleted file mode 100644 index adb00201..00000000 --- a/notebooks/snowflake-openai-vanna-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "e493593c-e8c4-5cdd-bdb8-e5d8bb39b0c6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using OpenAI via Vanna.AI (Recommended), ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "21979433-946d-5051-90ef-4b087189e318", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "21bab113-7c3d-5f1d-a64d-fe68315482f2", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "b20231ea-3913-5a89-8c43-2e14b2173112", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,snowflake]'"}, {"id": "c1e5ad61-57c7-5b64-920b-6f5b435df5e3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "3225927e-ae19-5159-a112-8dac5a3cda22", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "0400e80c-8ad9-5be8-9dc1-f7cce1f481c4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-vanna-marqo.ipynb b/notebooks/snowflake-openai-vanna-marqo.ipynb deleted file mode 100644 index 9d67ea89..00000000 --- a/notebooks/snowflake-openai-vanna-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "89fd2ba0-45a4-5e18-b00c-20d30d963c5e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using OpenAI via Vanna.AI (Recommended), Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "ee4afbb6-cc60-578b-bba5-10f44e347353", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "d2174c43-def5-5e58-b9b6-2abbf9f9c1e5", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "19c92e55-83d0-5678-9b07-769285f5859f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,snowflake]'"}, {"id": "a1877af9-e758-52a4-8f21-3d7b2e0c904f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.marqo.marqo import Marqo\n"}, {"id": "b0e1d67a-58fd-5bcd-b2a2-a13317fda343", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n\nvn = MyVanna()\n"}, {"id": "b053dbc0-1213-50f7-b9d2-24553f8a2833", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-vanna-other-vectordb.ipynb b/notebooks/snowflake-openai-vanna-other-vectordb.ipynb deleted file mode 100644 index 15b02b8c..00000000 --- a/notebooks/snowflake-openai-vanna-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "42212054-35d6-56f3-be8e-47af265d9df9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using OpenAI via Vanna.AI (Recommended), Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "c38dad5b-51c7-5b49-9e21-6dbace6b923c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "4bd85a70-8b95-53e5-94c0-7d2bbbf45c58", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "188e4729-c712-598c-a264-482bcf0f552c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[snowflake]'"}, {"id": "35e4b991-0e84-561d-8c1e-979bb4252ec9", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\n"}, {"id": "57fbc78c-6a54-5f06-98d8-69f315a380b4", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "d09181c1-38f7-55cf-bd4c-263547a53638", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-openai-vanna-vannadb.ipynb b/notebooks/snowflake-openai-vanna-vannadb.ipynb deleted file mode 100644 index 5664727a..00000000 --- a/notebooks/snowflake-openai-vanna-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "94653bec-534d-5627-9309-0f5d8df292eb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using OpenAI via Vanna.AI (Recommended), Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "e3e271b5-29aa-5174-b69e-2260293a6c0a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "f95c3155-2705-5a3f-b76c-8a56037f9090", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "188e4729-c712-598c-a264-482bcf0f552c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[snowflake]'"}, {"id": "6160c274-caf4-537e-9a02-f6a1d7022a2c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "import vanna\nfrom vanna.remote import VannaDefault"}, {"id": "cc6152fc-02df-5490-9920-896b5565b3d0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "api_key = vanna.get_api_key('my-email@example.com')\n\nvanna_model_name = # Put a unique name here\nvn = VannaDefault(model=vanna_model_name, api_key=api_key)\n"}, {"id": "d83aac74-4060-5941-a26a-82ee3dab3b68", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-other-llm-chromadb.ipynb b/notebooks/snowflake-other-llm-chromadb.ipynb deleted file mode 100644 index 84a75034..00000000 --- a/notebooks/snowflake-other-llm-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "f755ebca-fde7-5eb1-802d-2c830e0b6282", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Other LLM, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "0ceeb6ff-3607-5b14-9238-000548eb8fcd", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "a6775d4d-7265-5e53-b5ae-3cfa855b66cb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "b20231ea-3913-5a89-8c43-2e14b2173112", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,snowflake]'"}, {"id": "a70195e6-7c1f-519f-8413-4ad4e6b3570d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "ad2c6517-9727-56fb-befe-a4108859aa3b", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(ChromaDB_VectorStore, MyCustomLLM):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "a28c2e35-58f8-5e33-abb4-78fdd8e3fea1", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-other-llm-marqo.ipynb b/notebooks/snowflake-other-llm-marqo.ipynb deleted file mode 100644 index 76541921..00000000 --- a/notebooks/snowflake-other-llm-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "6b2a5e56-05a4-5866-ba96-3dd081faf78a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Other LLM, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "aef88a00-30a8-567a-8b2d-f6e2abdbca26", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "53b28366-9f79-5e70-bd2b-38bafaefff1c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "19c92e55-83d0-5678-9b07-769285f5859f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,snowflake]'"}, {"id": "2e26545c-6029-5c62-b146-105086c10f6d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "c1812db9-f2e2-5e21-98c1-d00397d25f65", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(Marqo, MyCustomLLM):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "748349d2-6d3d-5523-a80c-36abf0e61f7f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-other-llm-other-vectordb.ipynb b/notebooks/snowflake-other-llm-other-vectordb.ipynb deleted file mode 100644 index e03ae6ae..00000000 --- a/notebooks/snowflake-other-llm-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "cb9146eb-a0a0-5e0f-82b7-59e92f069498", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Other LLM, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "dcd9d3c5-e561-5d70-a775-f0f40a772553", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "c3cda295-5709-5e62-a60a-842a5fbeea56", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "188e4729-c712-598c-a264-482bcf0f552c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[snowflake]'"}, {"id": "35e4b991-0e84-561d-8c1e-979bb4252ec9", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\n"}, {"id": "2ff3ca97-cb35-56c7-9263-a3613e4ce005", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(MyCustomVectorDB, MyCustomLLM):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "7e889372-8d72-5f74-9e0c-450ae5729a63", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/snowflake-other-llm-vannadb.ipynb b/notebooks/snowflake-other-llm-vannadb.ipynb deleted file mode 100644 index bc0e3d28..00000000 --- a/notebooks/snowflake-other-llm-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "5dcc604a-caa9-5f6d-ab0e-3f417516c076", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for Snowflake using Other LLM, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "aadb008e-18eb-5637-b13d-7a2626e8573d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "f3f996e3-860c-5f39-99d0-d5be662724cf", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "188e4729-c712-598c-a264-482bcf0f552c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[snowflake]'"}, {"id": "bfe31937-16c5-5ecb-9aea-0cc1b2aec53c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.vannadb.vannadb_vector import VannaDB_VectorStore\nfrom vanna.base import VannaBase\n"}, {"id": "8ac7e323-be70-5fee-9d96-69868af0ff99", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(VannaDB_VectorStore, MyCustomLLM):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "8d110f9d-8947-5327-ac52-fa41a141f9d8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "392c4dd9-cfbd-5d5d-8346-78041426ee08", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\nvn.connect_to_snowflake(\n account=\"myaccount\",\n username=\"myusername\",\n password=\"mypassword\",\n database=\"mydatabase\",\n role=\"myrole\",\n)\n"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "5d321d01-d66f-5c5e-a3f3-e2d3d4330344", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The information schema query may need some tweaking depending on your database. This is a good starting point.\ndf_information_schema = vn.run_sql(\"SELECT * FROM INFORMATION_SCHEMA.COLUMNS\")\n\n# This will break up the information schema into bite-sized chunks that can be referenced by the LLM\nplan = vn.get_training_plan_generic(df_information_schema)\nplan\n\n# If you like the plan, then uncomment this and run it to train\n# vn.train(plan=plan)\n\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-mistral-chromadb.ipynb b/notebooks/sqlite-mistral-chromadb.ipynb deleted file mode 100644 index 3344b4b8..00000000 --- a/notebooks/sqlite-mistral-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "b901f917-7d1d-5429-b7f3-628b1f239f8d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Mistral via Mistral API, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "540b0186-561a-5cfa-817b-86688e213f3e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "7e4a551e-f854-5476-90ae-bece9174dda0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "30aef63a-a75b-52bd-8f9c-7fc096e0aba3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,mistralai]'"}, {"id": "3a68caf5-fa2e-5ee9-9bbb-7b85ea07a5ea", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "0a4dc6a1-8cfc-53ae-a9fb-4eca76807451", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, Mistral):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "39a0c40c-1efe-5648-91f8-37b92d2c7857", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-mistral-marqo.ipynb b/notebooks/sqlite-mistral-marqo.ipynb deleted file mode 100644 index a6f265b1..00000000 --- a/notebooks/sqlite-mistral-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "a6943a3f-7b29-5bf1-b38e-0435de3c1f13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Mistral via Mistral API, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "13c67deb-266d-5e80-a282-f743005fe2e0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "d76f2144-03ef-5dfa-a0bf-58440ac7799c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "ec51e5b5-fc27-5c00-b1a8-6c9dd188e2f5", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,mistralai]'"}, {"id": "696e9c9c-d724-56db-9a06-10a66dc15b0a", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.marqo.marqo import Marqo\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "de83d46a-6116-5978-8b9a-f0f586a583bd", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, Mistral):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "406dbb57-1a5d-5576-9767-c950b0d9e066", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-mistral-other-vectordb.ipynb b/notebooks/sqlite-mistral-other-vectordb.ipynb deleted file mode 100644 index 92baa9e7..00000000 --- a/notebooks/sqlite-mistral-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "0aeab80e-f7e9-5ae8-967e-72d92129951d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Mistral via Mistral API, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "2ece6ad9-270f-59ff-a4aa-db2654c5eafd", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "a390e116-d2ef-5b0a-b9bf-2453b1edc365", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "22d0fc58-9374-5bda-9414-d80b35fecb42", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[mistralai]'"}, {"id": "d54a05e2-de07-56c0-b57f-0bf2d42e559c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "edc45a16-5782-5d88-9f4a-c405c1f79dea", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, Mistral):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "f2cc6c08-6215-5e88-9856-e88a96dbe9b3", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-mistral-vannadb.ipynb b/notebooks/sqlite-mistral-vannadb.ipynb deleted file mode 100644 index fc65a432..00000000 --- a/notebooks/sqlite-mistral-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "5c6445ea-8f7a-5824-b2df-adc2e1e7f405", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Mistral via Mistral API, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "cd81f971-231c-5588-ade6-ba27ec4cbd26", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "2aa4d769-b9da-5d9c-94b4-7e045e627441", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "22d0fc58-9374-5bda-9414-d80b35fecb42", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[mistralai]'"}, {"id": "88b7ebec-d4f9-53aa-8f06-7c27055d16b0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.vannadb.vannadb_vector import VannaDB_VectorStore\nfrom vanna.mistral.mistral import Mistral\n"}, {"id": "2aa3c756-d1ad-5b3c-a161-5bad6f77d594", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, Mistral):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n Mistral.__init__(self, config={'api_key': MISTRAL_API_KEY, 'model': 'mistral-tiny'})\n\nvn = MyVanna()\n"}, {"id": "91cf6eb7-16d4-5547-bb3d-62f6a7c8aaf8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-azure-chromadb.ipynb b/notebooks/sqlite-openai-azure-chromadb.ipynb deleted file mode 100644 index 5cf30d01..00000000 --- a/notebooks/sqlite-openai-azure-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "262d99dc-b1f5-52a2-b3dd-c959896d40d0", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Azure OpenAI, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "b988d8ae-969c-5d2d-9548-d79ab9566238", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "5fda8cf1-1b74-59c8-beb9-14efb0907167", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "d6e3ecc5-3c05-518b-8285-cf9dbf06ec58", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,openai]'"}, {"id": "f6088c74-bfc7-5808-bd52-b2468267a3aa", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "895d74e6-b5e9-58f3-b58b-07c8e9d28707", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "41fdf81c-3098-56bb-bd9d-8dec18b5936f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-azure-marqo.ipynb b/notebooks/sqlite-openai-azure-marqo.ipynb deleted file mode 100644 index 125c89b4..00000000 --- a/notebooks/sqlite-openai-azure-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "831c5414-60d7-548f-933c-a363ff7d1031", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Azure OpenAI, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "2a2e13d1-9783-58bc-94aa-71e814b971a8", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "0245269a-3f34-545b-b7a1-adaa2bdb5d7e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "3d31b251-dcb5-5c7d-b5da-b692698ecdfa", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,openai]'"}, {"id": "6873a728-88db-5cf5-8a57-6355069c8a61", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "aa425412-56b4-5b29-8f25-d0bb982b7446", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, OpenAI_Chat):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "7c8437de-3e81-5f19-b8f8-792bfd142d84", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-azure-other-vectordb.ipynb b/notebooks/sqlite-openai-azure-other-vectordb.ipynb deleted file mode 100644 index bf86de41..00000000 --- a/notebooks/sqlite-openai-azure-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "48659c68-dbb3-5f89-a750-75a3bd1d4872", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Azure OpenAI, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "ab32bcb2-1993-56d5-886f-8262fde1de35", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "1f1b6446-b752-5a49-b398-ea551f8dd52b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "925749d7-7c6c-5599-a063-ad2cad7b52ab", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai]'"}, {"id": "19782e02-3b88-533a-a9cd-f73a7d88e153", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.base import VannaBase\n"}, {"id": "1a1f7fff-3055-51d2-a91d-bf03f4f94bc8", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, OpenAI_Chat):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "09caf694-5f8f-5e79-be3a-391b8e3e2720", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-azure-vannadb.ipynb b/notebooks/sqlite-openai-azure-vannadb.ipynb deleted file mode 100644 index 13ca5244..00000000 --- a/notebooks/sqlite-openai-azure-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "79b5f2a1-f4ac-5c48-9451-4d4c5e9bbb4d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Azure OpenAI, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "09f17b31-ae67-5c56-a75e-86914502d751", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "fd291717-1477-5963-92eb-38f3d22c33c4", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "925749d7-7c6c-5599-a063-ad2cad7b52ab", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai]'"}, {"id": "031a7573-71e2-5c65-873c-124e3158003d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom openai import AzureOpenAI\nfrom vanna.vannadb.vannadb_vector import VannaDB_VectorStore\n"}, {"id": "9fd5a61a-c40c-5577-80bb-3c8fbf26dc21", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n OpenAI_Chat.__init__(self, client=AzureOpenAI(...), config=config) # Make sure to put your AzureOpenAI client here\n\nvn = MyVanna(config={'model': 'gpt-4-...'})\n"}, {"id": "e0faff99-18ff-52b9-9433-a131c19f9316", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-standard-chromadb.ipynb b/notebooks/sqlite-openai-standard-chromadb.ipynb deleted file mode 100644 index 960f8a7d..00000000 --- a/notebooks/sqlite-openai-standard-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "af8cd30a-415d-5ac9-9511-853d099fca5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using OpenAI, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "110b678c-bd21-5651-9f10-6049f62e5edc", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "9de4d57f-8434-54b0-a7c1-93d21e068296", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "d6e3ecc5-3c05-518b-8285-cf9dbf06ec58", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb,openai]'"}, {"id": "93b5ab2b-834b-5b86-8d47-c9beda8b3544", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "28a8d8a1-669f-5f8b-82c4-73a0eb221d64", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "52ed5f6d-9aac-5fb1-aab6-6c072216e984", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-standard-marqo.ipynb b/notebooks/sqlite-openai-standard-marqo.ipynb deleted file mode 100644 index f1c57684..00000000 --- a/notebooks/sqlite-openai-standard-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "1eaacb62-b6c9-5f78-9feb-8444240b5cbe", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using OpenAI, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "5d155d07-2d90-5dfc-b869-1ca6ba2259b9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "08ce4bc7-9011-5067-b634-ae6f1ef24d7c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "3d31b251-dcb5-5c7d-b5da-b692698ecdfa", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo,openai]'"}, {"id": "dc8ae8d1-d08e-5a8c-a806-09ba465d7761", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "3ce3c4db-08c1-5d0a-86df-2f7b35b82bc2", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo, OpenAI_Chat):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "9298db71-48be-5778-a8d7-87c1859c5464", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-standard-other-vectordb.ipynb b/notebooks/sqlite-openai-standard-other-vectordb.ipynb deleted file mode 100644 index dedd0971..00000000 --- a/notebooks/sqlite-openai-standard-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "8fedd282-2590-569a-93ce-ab6c6a4fa48a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using OpenAI, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "2218e0a1-fa4e-56e9-9926-933c4a92043b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "d90017bc-4501-5f30-8c57-142ae218be4e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "925749d7-7c6c-5599-a063-ad2cad7b52ab", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai]'"}, {"id": "fe1b5686-8226-53d5-b42b-a29cdb088cad", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.base import VannaBase\n"}, {"id": "45f49779-04b9-574f-b573-4f0afb619e7e", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB, OpenAI_Chat):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "4661f143-cd1e-54de-9ac6-c00cce1716fb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-standard-vannadb.ipynb b/notebooks/sqlite-openai-standard-vannadb.ipynb deleted file mode 100644 index 880163d8..00000000 --- a/notebooks/sqlite-openai-standard-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "078f7efe-c23e-5d4c-98ee-a1d3e014992f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using OpenAI, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "3b9fc8e7-75e3-5625-b12b-40759de02591", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "fdaba019-3968-51d4-89c1-cdb4d809ea77", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "925749d7-7c6c-5599-a063-ad2cad7b52ab", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[openai]'"}, {"id": "4ff1aaee-1154-5859-b8c3-93ac3c31595d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.openai.openai_chat import OpenAI_Chat\nfrom vanna.vannadb.vannadb_vector import VannaDB_VectorStore\n"}, {"id": "1fc13242-ce0f-53e5-832e-ff33197d2eef", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(VannaDB_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n OpenAI_Chat.__init__(self, config=config)\n\nvn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})\n"}, {"id": "e3fe733c-d731-5482-b8ec-b63bc608929f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-vanna-chromadb.ipynb b/notebooks/sqlite-openai-vanna-chromadb.ipynb deleted file mode 100644 index 025282b4..00000000 --- a/notebooks/sqlite-openai-vanna-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "9d6519a8-e544-5523-82ce-97784be01264", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using OpenAI via Vanna.AI (Recommended), ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "96bb2afc-e019-52bb-b5ae-575a74d42bd3", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "f96244dc-c42f-5cb8-becc-d03958136056", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "1a0086e2-0a57-5091-accd-456e4d3e4ad7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb]'"}, {"id": "c1e5ad61-57c7-5b64-920b-6f5b435df5e3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "3225927e-ae19-5159-a112-8dac5a3cda22", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(ChromaDB_VectorStore):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "fa16f45e-5782-53b8-9ed7-77dc6b8d7776", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-vanna-marqo.ipynb b/notebooks/sqlite-openai-vanna-marqo.ipynb deleted file mode 100644 index e2614c8e..00000000 --- a/notebooks/sqlite-openai-vanna-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "859cb351-0751-5448-a269-505618a2bc89", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using OpenAI via Vanna.AI (Recommended), Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "af96ca79-ccab-57c3-a8ef-d222d781d4c1", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "d1ab7307-853f-5bf8-a832-452bba751f14", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "30f0eccb-7684-5642-98ae-31bee8662133", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo]'"}, {"id": "a1877af9-e758-52a4-8f21-3d7b2e0c904f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.marqo.marqo import Marqo\n"}, {"id": "b0e1d67a-58fd-5bcd-b2a2-a13317fda343", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\n\nclass MyVanna(Marqo):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n\nvn = MyVanna()\n"}, {"id": "81bacbdb-dc39-5ae8-9ae2-1fc2b2e2380a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-vanna-other-vectordb.ipynb b/notebooks/sqlite-openai-vanna-other-vectordb.ipynb deleted file mode 100644 index 8183cd3b..00000000 --- a/notebooks/sqlite-openai-vanna-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "506bdbf0-9097-5ea8-a3ac-fbbee8ce189c", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using OpenAI via Vanna.AI (Recommended), Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "d0d5c54c-adbb-572b-a2e5-bd708e7d6392", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "5d5bf8e6-1051-5524-a72a-ed51f635cd9a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "b9b77362-c049-5500-b502-08811fcd4dce", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install vanna"}, {"id": "35e4b991-0e84-561d-8c1e-979bb4252ec9", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\n"}, {"id": "57fbc78c-6a54-5f06-98d8-69f315a380b4", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\n\nclass MyVanna(MyCustomVectorDB):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "98da58c3-ed58-51f7-ad99-5c33335bf1bf", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-openai-vanna-vannadb.ipynb b/notebooks/sqlite-openai-vanna-vannadb.ipynb deleted file mode 100644 index 75641d28..00000000 --- a/notebooks/sqlite-openai-vanna-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "3b9016b5-2bfd-5bd2-98e7-8ba4a9dec1be", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using OpenAI via Vanna.AI (Recommended), Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "e5b1e80e-8db4-5085-8d4f-6e34ca21d45e", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "fdaba019-3968-51d4-89c1-cdb4d809ea77", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "b9b77362-c049-5500-b502-08811fcd4dce", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install vanna"}, {"id": "6160c274-caf4-537e-9a02-f6a1d7022a2c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "import vanna\nfrom vanna.remote import VannaDefault"}, {"id": "cc6152fc-02df-5490-9920-896b5565b3d0", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "api_key = vanna.get_api_key('my-email@example.com')\n\nvanna_model_name = # Put a unique name here\nvn = VannaDefault(model=vanna_model_name, api_key=api_key)\n"}, {"id": "1dc0b92f-ba37-55af-87a1-82e88fb6f8b9", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-other-llm-chromadb.ipynb b/notebooks/sqlite-other-llm-chromadb.ipynb deleted file mode 100644 index 2a98dc90..00000000 --- a/notebooks/sqlite-other-llm-chromadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "d3c0d01c-97e4-50e9-8e05-32bbed37f5d3", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Other LLM, ChromaDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "a3b250e1-ea89-548a-ac9d-73350818add5", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "8e191684-d134-527f-b286-03f67c8f961a", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "1a0086e2-0a57-5091-accd-456e4d3e4ad7", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[chromadb]'"}, {"id": "a70195e6-7c1f-519f-8413-4ad4e6b3570d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.chromadb.chromadb_vector import ChromaDB_VectorStore\n"}, {"id": "ad2c6517-9727-56fb-befe-a4108859aa3b", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(ChromaDB_VectorStore, MyCustomLLM):\n def __init__(self, config=None):\n ChromaDB_VectorStore.__init__(self, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "3b731d8f-2b1e-5467-bedf-f49e867a5675", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-other-llm-marqo.ipynb b/notebooks/sqlite-other-llm-marqo.ipynb deleted file mode 100644 index 4bdcfd90..00000000 --- a/notebooks/sqlite-other-llm-marqo.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "5a3d07b2-2583-51d2-a8c1-c0321bfc439b", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Other LLM, Marqo\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "98059112-2f3f-5c56-b579-836d1282aaec", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "7e07cffc-16a2-53f0-933d-44332ed398d2", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "30f0eccb-7684-5642-98ae-31bee8662133", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install 'vanna[marqo]'"}, {"id": "2e26545c-6029-5c62-b146-105086c10f6d", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\nfrom vanna.marqo.marqo import Marqo\n"}, {"id": "c1812db9-f2e2-5e21-98c1-d00397d25f65", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(Marqo, MyCustomLLM):\n def __init__(self, config=None):\n Marqo.__init__(self, config={'marqo_url': MARQO_URL, 'marqo_model': MARQO_MODEL})\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "e3f0e55b-d01b-503f-86ac-8584cc694ce2", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-other-llm-other-vectordb.ipynb b/notebooks/sqlite-other-llm-other-vectordb.ipynb deleted file mode 100644 index 7253864c..00000000 --- a/notebooks/sqlite-other-llm-other-vectordb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "e7a07123-59ae-5e9d-9fc4-8606541246e6", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Other LLM, Other VectorDB\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "f8bf2a61-7dfe-598e-8f6b-d29dc7b440ea", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "51147f2e-bdf1-5d9e-acf5-f079a111d323", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "b9b77362-c049-5500-b502-08811fcd4dce", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install vanna"}, {"id": "35e4b991-0e84-561d-8c1e-979bb4252ec9", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.base import VannaBase\n"}, {"id": "2ff3ca97-cb35-56c7-9263-a3613e4ce005", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomVectorDB(VannaBase):\n def add_ddl(self, ddl: str, **kwargs) -> str:\n # Implement here\n\n def add_documentation(self, doc: str, **kwargs) -> str:\n # Implement here\n\n def add_question_sql(self, question: str, sql: str, **kwargs) -> str:\n # Implement here\n\n def get_related_ddl(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_related_documentation(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_similar_question_sql(self, question: str, **kwargs) -> list:\n # Implement here\n\n def get_training_data(self, **kwargs) -> pd.DataFrame:\n # Implement here\n\n def remove_training_data(id: str, **kwargs) -> bool:\n # Implement here\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(MyCustomVectorDB, MyCustomLLM):\n def __init__(self, config=None):\n MyCustomVectorDB.__init__(self, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "516f3824-ef08-5d81-9c2f-2234f4de4451", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/sqlite-other-llm-vannadb.ipynb b/notebooks/sqlite-other-llm-vannadb.ipynb deleted file mode 100644 index 7857555a..00000000 --- a/notebooks/sqlite-other-llm-vannadb.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"id": "22fc9194-d307-554e-84c7-5c61665bd738", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "# Generating SQL for SQLite using Other LLM, Vanna Hosted Vector DB (Recommended)\nThis notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](getting-started.html)."}, {"id": "ba3c203c-27c0-589c-82e4-c1411f3af28d", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which LLM do you want to use?

\n\n "}, {"id": "1d2cf467-7d3c-5bd4-838e-9d462a6e64cb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Where do you want to store the 'training' data?

\n\n "}, {"id": "ee059407-58ac-50fa-843a-7b876328df13", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Setup"}, {"id": "b9b77362-c049-5500-b502-08811fcd4dce", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "%pip install vanna"}, {"id": "bfe31937-16c5-5ecb-9aea-0cc1b2aec53c", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.vannadb.vannadb_vector import VannaDB_VectorStore\nfrom vanna.base import VannaBase\n"}, {"id": "8ac7e323-be70-5fee-9d96-69868af0ff99", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n\nclass MyCustomLLM(VannaBase):\n def __init__(self, config=None):\n pass\n\n def generate_plotly_code(self, question: str = None, sql: str = None, df_metadata: str = None, **kwargs) -> str:\n # Implement here\n\n def generate_question(self, sql: str, **kwargs) -> str:\n # Implement here\n \n def get_followup_questions_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n \n def get_sql_prompt(self, question: str, question_sql_list: list, ddl_list: list, doc_list: list, **kwargs):\n # Implement here\n\n def submit_prompt(self, prompt, **kwargs) -> str:\n # Implement here\n \n\nclass MyVanna(VannaDB_VectorStore, MyCustomLLM):\n def __init__(self, config=None):\n VannaDB_VectorStore.__init__(self, vanna_model=MY_VANNA_MODEL, vanna_api_key=MY_VANNA_API_KEY, config=config)\n MyCustomLLM.__init__(self, config=config)\n\nvn = MyVanna()\n"}, {"id": "6eeb848a-6db9-5077-b922-cb4b00b10e0f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n

Which database do you want to query?

\n\n "}, {"id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.connect_to_sqlite('my-database.sqlite')"}, {"id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Training\nYou only need to train once. Do not train again unless you want to add more training data."}, {"id": "068a891d-bbab-5462-9767-ebf7211fe423", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\ndf_ddl = vn.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\nfor ddl in df_ddl['sql'].to_list():\n vn.train(ddl=ddl)\n"}, {"id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "\n# The following are methods for adding training data. Make sure you modify the examples to match your database.\n\n# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\nvn.train(ddl=\"\"\"\n CREATE TABLE IF NOT EXISTS my-table (\n id INT PRIMARY KEY,\n name VARCHAR(100),\n age INT\n )\n\"\"\")\n\n# Sometimes you may want to add documentation about your business terminology or definitions.\nvn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n\n# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\nvn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")\n"}, {"id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# At any time you can inspect what training data the package is able to reference\ntraining_data = vn.get_training_data()\ntraining_data"}, {"id": "0dd237e6-ab36-5dd4-9234-e2d25168d50f", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "# You can remove training data if there's obsolete/incorrect information. \nvn.remove_training_data(id='1-ddl')"}, {"id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Asking the AI\nWhenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL."}, {"id": "edb6679e-a102-5efc-b890-81babca8f500", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "vn.ask(question=...)"}, {"id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Launch the User Interface\n![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)"}, {"id": "b87d140b-ef56-5795-b489-46bb11d01459", "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vanna.flask import VannaFlaskApp\napp = VannaFlaskApp(vn)\napp.run()"}, {"id": "29793859-c3c8-50da-994a-c8f6348d6730", "cell_type": "markdown", "execution_count": null, "metadata": {}, "outputs": [], "source": "## Next Steps\nUsing Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the \n- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n- [Flask app](https://github.com/vanna-ai/vanna-flask)\n- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n"}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5"}}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/notebooks/streamlit.ipynb b/notebooks/streamlit.ipynb deleted file mode 100644 index 5f6dc409..00000000 --- a/notebooks/streamlit.ipynb +++ /dev/null @@ -1,30 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "language_info": { - "name": "python" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/vn-ask.ipynb b/notebooks/vn-ask.ipynb deleted file mode 100644 index 618aa3b6..00000000 --- a/notebooks/vn-ask.ipynb +++ /dev/null @@ -1,572 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Vanna AI](https://img.vanna.ai/vanna-ask.svg)\n", - "\n", - "The following notebook goes through the process of asking questions from your data using Vanna AI. Here we use a demo model that is pre-trained on the [TPC-H dataset](https://docs.snowflake.com/en/user-guide/sample-data-tpch.html) that is available in Snowflake.\n", - "\n", - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/vanna-ai/vanna-py/blob/main/notebooks/vn-ask.ipynb)\n", - "\n", - "[![Open in GitHub](https://img.vanna.ai/github.svg)](https://github.com/vanna-ai/vanna-py/blob/main/notebooks/vn-ask.ipynb)\n", - "\n", - "# Install Vanna\n", - "First we install Vanna from [PyPI](https://pypi.org/project/vanna/) and import it.\n", - "Here, we'll also install the Snowflake connector. If you're using a different database, you'll need to install the appropriate connector." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install vanna\n", - "%pip install snowflake-connector-python" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import vanna as vn\n", - "import snowflake.connector" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Login\n", - "Creating a login and getting an API key is as easy as entering your email (after you run this cell) and entering the code we send to you. Check your Spam folder if you don't see the code." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "api_key = vn.get_api_key('my-email@example.com')\n", - "vn.set_api_key(api_key)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Set your Model\n", - "You need to choose a globally unique model name. Try using your company name or another unique string. All data from models are isolated - there's no leakage." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "vn.set_model('tpc') # Enter your model name here. This is a globally unique identifier for your model." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Set Database Connection\n", - "These details are only referenced within your notebook. These database credentials are never sent to Vanna's severs." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "vn.connect_to_snowflake(account='my-account', username='my-username', password='my-password', database='my-database')" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Get Results\n", - "This gets the SQL, gets the dataframe, and prints them both. Note that we use your connection string to execute the SQL on your warehouse from your local instance. Your connection nor your data gets sent to Vanna's servers. For more info on how Vanna works, [see this post](https://medium.com/vanna-ai/how-vanna-works-how-to-train-it-data-security-8d8f2008042)." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT c.c_name as customer_name,\n", - " sum(l.l_extendedprice * (1 - l.l_discount)) as total_sales\n", - "FROM snowflake_sample_data.tpch_sf1.lineitem l join snowflake_sample_data.tpch_sf1.orders o\n", - " ON l.l_orderkey = o.o_orderkey join snowflake_sample_data.tpch_sf1.customer c\n", - " ON o.o_custkey = c.c_custkey\n", - "GROUP BY customer_name\n", - "ORDER BY total_sales desc limit 10;\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
CUSTOMER_NAMETOTAL_SALES
0Customer#0001435006757566.0218
1Customer#0000952576294115.3340
2Customer#0000871156184649.5176
3Customer#0001311136080943.8305
4Customer#0001343806075141.9635
5Customer#0001038346059770.3232
6Customer#0000696826057779.0348
7Customer#0001020226039653.6335
8Customer#0000985876027021.5855
9Customer#0000646605905659.6159
\n", - "
" - ], - "text/plain": [ - " CUSTOMER_NAME TOTAL_SALES\n", - "0 Customer#000143500 6757566.0218\n", - "1 Customer#000095257 6294115.3340\n", - "2 Customer#000087115 6184649.5176\n", - "3 Customer#000131113 6080943.8305\n", - "4 Customer#000134380 6075141.9635\n", - "5 Customer#000103834 6059770.3232\n", - "6 Customer#000069682 6057779.0348\n", - "7 Customer#000102022 6039653.6335\n", - "8 Customer#000098587 6027021.5855\n", - "9 Customer#000064660 5905659.6159" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAPoCAYAAABkvZZOAAAgAElEQVR4XuzdCbhdZXU38PeGhCkBjFQwhEEkYDDMkwIODIKzMn1O/epsxaEtKKKCUkBwaPtZAcU64QBUxRapiopigCLzDEUjg4wqSqGEECQkJN9zjuVK4ObeG961cve++5fn6fPQe/f5n3f/1sblWj09GZg6deqS4g8BAgQIECBAgAABAgQIECBAgAABAgQItE5gwIK3dTVzYAIECBAgQIAAAQIECBAgQIAAAQIECPQFLHg9CAQIECBAgAABAgQIECBAgAABAgQIEGipgAVvSwvn2AQIECBAgAABAgQIECBAgAABAgQIELDg9QwQIECAAAECBAgQIECAAAECBAgQIECgpQIWvC0tnGMTIECAAAECBAgQIECAAAECBAgQIEDAgtczQIAAAQIECBAgQIAAAQIECBAgQIAAgZYKWPC2tHCOTYAAAQIECBAgQIAAAQIECBAgQIAAAQtezwABAgQIECBAgAABAgQIECBAgAABAgRaKmDB29LCOTYBAgQIECBAgAABAgQIECBAgAABAgQseD0DBAgQIECAAAECBAgQIECAAAECBAgQaKmABW9LC+fYBAgQIECAAAECBAgQIECAAAECBAgQsOD1DBAgQIAAAQIECBAgQIAAAQIECBAgQKClAha8LS2cYxMgQIAAAQIECBAgQIAAAQIECBAgQMCC1zNAgAABAgQIECBAgAABAgQIECBAgACBlgpY8La0cI5NgAABAgQIECBAgAABAgQIECBAgAABC17PAAECBAgQIECAAAECBAgQIECAAAECBFoqYMHb0sI5NgECBAgQIECAAAECBAgQIECAAAECBCx4PQMECBAgQIAAAQIECBAgQIAAAQIECBBoqYAFb0sL59gECBAgQIAAAQIECBAgQIAAAQIECBCw4PUMECBAgAABAgQIECBAgAABAgQIECBAoKUCFrwtLZxjEyBAgAABAgQIECBAgAABAgQIECBAwILXM0CAAAECBAgQIECAAAECBAgQIECAAIGWCljwtrRwjk2AAAECBAgQIECAAAECBAgQIECAAAELXs8AAQIECBAgQIAAAQIECBAgQIAAAQIEWipgwdvSwjk2AQIECBAgQIAAAQIECBAgQIAAAQIELHg9AwQIECBAgAABAgQIECBAgAABAgQIEGipgAVvSwvn2AQIECBAgAABAgQIECBAgAABAgQIELDg9QwQIECAAAECBAgQIECAAAECBAgQIECgpQIWvC0tnGMTIECAAAECBAgQIECAAAECBAgQIEDAgtczQIAAAQIECBAgQIAAAQIECBAgQIAAgZYKWPC2tHCOTYAAAQIECBAgQIAAAQIECBAgQIAAAQtezwABAgQIECBAgAABAgQIECBAgAABAgRaKmDB29LCOTYBAgQIECBAgAABAgQIECBAgAABAgQseD0DBAgQIECAAAECBAgQIECAAAECBAgQaKmABW9LC+fYBAgQIECAAAECBAgQIECAAAECBAgQsOD1DBAgQIAAAQIECBAgQIAAAQIECBAgQKClAha8LS2cYxMgQIAAAQIECBAgQIAAAQIECBAgQMCC1zNAgAABAgQIECBAgAABAgQIECBAgACBlgpY8La0cI5NgAABAgQIECBAgAABAgQIECBAgAABC17PAAECBAgQIECAAAECBAgQIECAAAECBFoqYMHb0sI5NgECBAgQIECAAAECBAgQIECAAAECBCx4PQMECBAgQIAAAQIECBAgQIAAAQIECBBoqYAFb0sL59gECBAgQIAAAQIECBAgQIAAAQIECBCw4PUMECBAgAABAgQIECBAgAABAgQIECBAoKUCFrwtLZxjEyBAgAABAgQIECBAgAABAgQIECBAwILXM0CAAAECBAgQIECAAAECBAgQIECAAIGWCljwtrRwjk2AAAECBAgQIECAAAECBAgQIECAAAELXs8AAQIECBAgQIAAAQIECBAgQIAAAQIEWipgwdvSwjk2AQIECBAgQIAAAQIECBAgQIAAAQIELHg9AwQIECBAgAABAgQIECBAgAABAgQIEGipgAVvSwvn2AQIECBAgAABAgQIECBAgAABAgQIELDg9QwQIECAAAECBAgQIECAAAECBAgQIECgpQIWvC0tnGMTIECAAAECBAgQIECAAAECBAgQIEDAgtczQIAAAQIECBAgQIAAAQIECBAgQIAAgZYKWPC2tHCOTYAAAQIECBAgQIAAAQIECBAgQIAAAQtezwABAgQIECBAgAABAgQIECBAgAABAgRaKmDB29LCOTYBAgQIECBAgAABAgQIECBAgAABAgQseD0DBAgQIECAAAECBAgQIECAAAECBAgQaKmABW9LC+fYBAgQIECAAAECBAgQIECAAAECBAgQsOD1DBAgQIAAAQIECBAgQIAAAQIECBAgQKClAha8LS2cYxMgQIAAAQIECBAgQIAAAQIECBAgQMCC1zNAgAABAgQIECBAgAABAgQIECBAgACBlgpY8La0cI5NgAABAgQIECBAgAABAgQIECBAgAABC17PAAECBAgQIECAAAECBAgQIECAAAECBFoqYMHb0sI5NgECBAgQIECAAAECBAgQIECAAAECBCx4PQMECBAgQIAAAQIECBAgQIAAAQIECBBoqYAFb0sL59gECBAgQIAAAQIECBAgQIAAAQIECBCw4PUMECBAgAABAgQIECBAgAABAgQIECBAoKUCFrwtLZxjEyBAgAABAgQIECBAgAABAgQIECBAwILXM0CAAAECBAgQIECAAAECBAgQIECAAIGWCljwtrRwjk2AAAECBAgQIECAAAECBAgQIECAAAELXs8AAQIECBAgQIAAAQIECBAgQIAAAQIEWipgwdvSwjk2AQIECBAgQIAAAQIECBAgQIAAAQIELHg9AwQIECBAgAABAgQIECBAgAABAgQIEGipgAVvSwvn2AQIECBAgAABAgQIECBAgAABAgQIELDg9QwQIECAAAECBAgQIECAAAECBAgQIECgpQIWvC0tnGMTIECAAAECBAgQIECAAAECBAgQIEDAgtczQIAAAQIECBAgQIAAAQIECBAgQIAAgZYKWPC2tHCOTYAAAQIECBAgQIAAAQIECBAgQIAAAQtezwABAgQIECBAgAABAgQIECBAgAABAgRaKmDB29LCOTYBAgQIECBAgAABAgQIECBAgAABAgQseD0DBAgQIECAAAECBAgQIECAAAECBAgQaKmABW9LC+fYBAgQIECAAAECBAgQIECAAAECBAgQsOD1DBAgQIAAAQIECBAgQIAAAQIECBAgQKClAha8LS2cYxMgQIAAAQIECBAgQIAAAQIECBAgQMCC1zNAgAABAgQIECBAgAABAgQIECBAgACBlgpY8La0cI5NgAABAgQIECBAgAABAgQIECBAgAABC17PAAECBAgQIECAAAECBAgQIECAAAECBFoqYMHb0sI5NgECBAgQIECAAAECBAgQIECAAAECBCx4PQMECBAgQIAAAQIECBAgQIAAAQIECBBoqYAFb0sL59gECBAgQIAAAQIECBAgQIAAAQIECBCw4PUMECBAgAABAgQIECBAgAABAgQIECBAoKUCFrwtLZxjEyBAgAABAgQIECBAgAABAgQIECBAwILXM0CAAAECBAgQIECAAAECBAgQIECAAIGWCljwtrRwjk2AAAECBAgQIECAAAECBAgQIECAAAELXs8AAQIECBAgQIAAAQIECBAgQIAAAQIEWipgwdvSwjk2AQIECBAgQIAAAQIECBAgQIAAAQIELHg9AwQIECBAgAABAgQIECBAgAABAgQIEGipgAVvSwvn2AQIECBAgAABAgQIECBAgAABAgQIELDg9QwQIECAAAECBAgQIECAAAECBAgQIECgpQIWvC0tnGMTIECAAAECBAgQIECAAAECBAgQIEDAgtczQIAAAQIECBAgQIAAAQIECBAgQIAAgZYKWPC2tHCOTYAAAQIECBAgQIAAAQIECBAgQIAAAQtezwABAgQIECBAgAABAgQIECBAgAABAgRaKmDB29LCOTYBAgQIECBAgAABAgQIECBAgAABAgQseD0DBAgQIECAAAECBAgQIECAAAECBAgQaKmABW9LC+fYBAgQIECAAAECBAgQIECAAAECBAgQsOD1DBAgQIAAAQIECBAgQIAAAQIECBAgQKClAha8LS2cYxMgQIAAAQIECBAgQIAAAQIECBAgQMCC1zNAgAABAgQIECBAgAABAgQIECBAgACBlgpY8La0cI5NgAABAgQIECBAgAABAgQIECBAgAABC17PAAECBAgQIECAAAECBAgQIECAAAECBFoqYMHb0sI5NgECBAgQIECAAAECBAgQIECAAAECBCx4PQMECBAgQIAAAQIECBAgQIAAAQIECBBoqYAFb0sL59gECBAgQIAAAQIECBAgQIAAAQIECBCw4PUMECBAgAABAgQIECBAgAABAgQIECBAoKUCFrwtLZxjEyBAgAABAgQIECBAgAABAgQIECBAwILXM0CAAAECBAgQIECAAAECBAgQIECAAIGWCljwtrRwjk2AAAECBAgQIECAAAECBAgQIECAAAELXs8AAQIECBAgQIAAAQIECBAgQIAAAQIEWipgwdvSwj3ZY//wrJ+VdZ62zqhffsLx/1y+/rWT+tdPnjy5nHf+xYOvnT377HLoIQcvM2tgYKCcc94FZcqUNfrX3HrrLeWA/V416vd2IQECBAgQIECAAAECBAgQIECAAAECwwtY8HbsCfnVTbeVVVddddR3/bWvfqX8/UcP61//lKlTyzXXzRl87ZIlS8p228wq995zz5B57zzwPeWwjxwx+Lu5c+eWrWZtNur3diEBAgQIECBAgAABAgQIECBAgAABAha8noHHCHz166eUdZ8+bViTNdZYo2y44Ub9a4Zb8PZ+f+YPvlfefeA7hsy7+ro5ZerUqRa8nkACBAgQIECAAAECBAgQIECAAAECSQI+wZsE2+bYb3/nu+W5O+/Sv4V3vuOt5cc/OrP/z4//BG/vZ4sXL+5/KnfevHlL3fI+++5Xjjvh80v9zCd42/xUODsBAgQIECBAgAABAgQIECBAgEATBSx4m1iVMTzTrFlblN739Pb+3HHH7eV5O+84eJrHLnivvOLyst32O/R/d9q3v1k+8P6Dljr1hZdcUaZPX7/c/Yc/lMlTppTVV1+9WPCOYWG9NQECBAgQIECAAAECBAgQIECAwLgUsOAdl2V98jd19uz/LJtu9qx+wGsO2KdccvFFQy54Tzn562X3PfbsL3EXLlxYZs3cpCxYsKB/7c677Fq+ddrp/X/u/SVsRx59rAXvky+JVxIgQIAAAQIECBAgQIAAAQIECBBYpoAFr4djUGCPPfcqve/o7f355S9+UV6y9+5L6Tz2E7y9Be/FF11QPnviF/vXfPWkL5cjjzi8/89n/fTcMnPzzQc/sfvLG26x4PWcESBAgAABAgQIECBAgAABAgQIEEgQsOBNQG1r5GVXXlvWWWfd/vFf/KLdypw5vxx2wXv4hw8tV13zi/LUtdfuf3p35qbPKJvMmFHOnn1+/3Wf/Pgx5fMnnlAseNv6RDg3AQIECBAgQIAAAQIECBAgQIBA0wUseJteoRV0vje+6S3lY8d+sv9ul15ycfk/+7/6Ce/8+E/w9ha8b3rzW8vRx3yif+3xx3267LTTc/t/QduDDz5Ynv2sZ5YlS5YMu+Cdut6MFXSH3oYAAQIECBAgQIAAAQIECBAYK4H/+e1NY/XW3pfAuBew4B33JR75BgcGBsr1c24ukydP7i9kd33uDuU3v7lzVAve3kW9106ZMqX/XbwTJ04svbwTP3d8+dQnju1nDPcJ3nU32XbkA7qCAAECBAgQIECAAAECBAgQaLXA72++qtXnd3gCTRaw4G1ydVbQ2T58+EfLge96b//dfnLWj8o73vbmId95qE/w9i486H2HlIPf94HB1zz88MNl8802LosWLRpxwbvyalNW0F16GwIECBAgQIAAAQIECBAgQGCsBB7+4wNj9dbel8C4F7DgHfclHv4Ge5/avea/flUmTZpUFi9eXLbZcmb/L0cb6s+yFrwTJkwoc268tayyyir9l516yjfKYR/688LXd/B2/CFz+wQIECBAgAABAgQIECBAgAABAmkCFrxptO0IPuFzXyivevU+/cN++1v/Wg495OBlHnxZC97eC3rf39v7Ht/ekniLzWeU+fPnD+ZY8LbjWXBKAgQIECBAgAABAgQIECBAgACB9glY8LavZmEnnjZtvXLRpVf2vzO397UKvcXsggULntSCt/fp3Rfutke563e/Lddee81SGRa8YSUTRIAAAQIECBAgQIAAAQIECBAgQGApAQveDj8Q3/7Od8tzd96lL/DYvxRtWSTDfYJ3OEYL3g4/ZG6dAAECBAgQIECAAAECBAgQIEAgVcCCN5W3ueGzZm1RfnjWz/oH7H2dwqyZm5QlS5YMe2AL3ubW08kIECBAgAABAgQIECBAgAABAgS6KWDB2826l5+dc36Zselm/bs/+qgjyle+9IURJSx4RyRyAQECBAgQIECAAAECBAgQIECAAIEVKmDBu0K5m/FmO+70nPJvp3+vf5j/uffess1Wm4/qYGuttVa59vob+tee/I2vlY8c9sFRve7Rr2i47777ytZbPGtUr3ERAQIECBAgQIAAAQIECBAgQIAAAQIjC1jwjmzkCgIECBAgQIAAAQIECBAgQIAAAQIECDRSwIK3kWVxKAIECBAgQIAAAQIECBAgQIAAAQIECIwsYME7spErCBAgQIAAAQIECBAgQIAAAQIECBAg0EgBC95GlsWhCBAgQIAAAQIECBAgQIAAAQIECBAgMLKABe/IRq4gQIAAAQIECBAgQIAAAQIECBAgQIBAIwUseBtZFociQIAAAQIECBAgQIAAAQIECBAgQIDAyAIWvCMbuYIAAQIECBAgQIAAAQIECBAgQIAAAQKNFLDgbWRZHIoAAQIECBAgQIAAAQIECBAgQIAAAQIjC1jwjmzkCgIECBAgQIAAAQIECBAgQIAAAQIECDRSwIK3kWVxKAIECBAgQIAAAQIECBAgQIAAAQIECIwsYME7spErCBAgQIAAAQIECBAgQIAAAQIECBAg0EgBC95GlsWhCBAgQIAAAQIECBAgQIAAAQIECBAgMLKABe/IRq5oiMCSJUsacpL2HmNgYKC9h3dyAgQIECBAgAABAgQIECBAgACBJwhY8HooWiEwecozyjrTXtCKszb1kPMfuKPcc/fl5ZFF85p6ROciQIAAAQIECBAgQIAAAQIECBBYTgEL3uUEc/mKF+h9cnfq2tuUPV7+kxX/5uPoHe+45Yxy5cXvL48semAc3ZVbIUCAAAECBAgQIECAAAECBAh0W8CCt9v1b8XdW/DGlMmCN8ZRCgECBAgQIECAAAECBAgQIECgSQIWvE2qhrMMKWDBG/NgWPDGOEohQIAAAQIECBAgQIAAAQIECDRJwIK3SdVwFgvexGfAgjcRVzQBAgQIECBAgAABAgQIECBAYIwELHjHCN7bjl7AJ3hHbzXclRa8MY5SCBAgQIAAAQIECBAgQIAAAQJNErDgbVI1nGVIAQvemAfDgjfGUQoBAgQIECBAgAABAgQIECBAoEkCFrxNqoazWPAmPgMWvIm4ogkQIECAAAECBAgQIECAAAECYyRgwTtG8N529AI+wTt6q+GutOCNcZRCgAABAgQIECBAgAABAgQIEGiSgAVvk6rhLEMKWPDGPBgWvDGOUggQIECAAAECBAgQIECAAAECTRKw4G1SNZzFgjfxGbDgTcQVTYAAAQIECBAgQIAAAQIECBAYIwEL3jGC97ajF/AJ3tFbDXelBW+MoxQCBAgQIECAAAECBAgQIECAQJMELHibVA1nGVLAgjfmwbDgjXGUQoAAAQIECBAgQIAAAQIECBBokoAFb5Oq4SwWvInPgAVvIq5oAgQIECBAgAABAgQIECBAgMAYCVjwjhG8tx29gE/wjt5quCsteGMcpRAgQIAAAQIECBAgQIAAAQIEmiRgwdukajjLkAIWvDEPhgVvjKMUAgQIECBAgAABAgQIECBAgECTBCx4m1QNZ7HgTXwGLHgTcUUTIECAAAECBAgQIECAAAECBMZIwIJ3jOC97egFfIJ39FbDXWnBG+MohQABAgQIECBAgAABAgQIECDQJAEL3iZVw1mGFLDgjXkwLHhjHKUQIECAAAECBAgQIECAAAECBJokYMHbpGo4iwVv4jNgwZuIK5oAAQIECBAgQIAAAQIECBAgMEYCFrxjBO9tRy/gE7yjtxruSgveGEcpBAgQIECAAAECBAgQIECAAIEmCVjwNqkazjKkgAVvzINhwRvjKIUAAQIECBAgQIAAAQIECBAg0CQBC94mVcNZLHgTnwEL3kRc0QQIECBAgAABAgQIECBAgACBMRKw4B0jeG87egGf4B291XBXWvDGOEohQIAAAQIECBAgQIAAAQIECDRJwIK3SdVwliEFLHhjHgwL3hhHKQQIECBAgAABAgQIECBAgACBJglY8DapGs5iwZv4DFjwJuKKJkCAAAECBAgQIECAAAECBAiMkYAF7xjBe9vRC/gE7+ithrvSgjfGUQoBAgQIECBAgAABAgQIECBAoEkCFrxNqoazDClgwRvzYFjwxjhKIUCAAAECBAgQIECAAAECBAg0ScCCt0nVcBYL3sRnwII3EVc0AQIECBAgQIAAAQIECBAgQGCMBCx4xwje245ewCd4R2813JUWvDGOUggQIECAAAECBAgQIECAAAECTRKw4G1SNZxlSAEL3pgHw4I3xlEKAQIECBAgQIAAAQIECBAgQKBJAha8TaqGs1jwJj4DFryJuKIJECBAgAABAgQIECBAgAABAmMkYME7RvDedvQCPsE7eqvhrrTgjXGUQoAAAQIECBAgQIAAAQIECBBokoAFb5Oq4SxDCljwxjwYFrwxjlIIECBAgAABAgQIECBAgAABAk0SsOBtUjWcxYI38Rmw4E3EFU2AAAECBAgQIECAAAECBAgQGCMBC94xgve2oxfwCd7RWw13pQVvjKMUAgQIECBAgAABAgQIECBAgECTBCx4m1QNZxlSwII35sGw4I1xlEKAAAECBAgQIECAAAECBAgQaJKABW+TquEsFryJz4AFbyKuaAIECBAgQIAAAQIECBAgQIDAGAlY8I4RvLcdvYBP8I7eargrLXhjHKUQIECAAAECBAgQIECAAAECBJokYMHbpGo4y5ACFrwxD4YFb4yjFAIECBAgQIAAAQIECBAgQIBAkwQseJtUDWex4E18Bix4E3FFEyBAgAABAgQIECBAgAABAgTGSMCCd4zgve3oBXyCd/RWw12ZseDt1WZgYCDmgFIIECBAgAABAgQIECBAgAABAgSWW8CCd7nJvGBFC1jwxohnLHgHJqxaZm55UFlllakxh+xoyjWXHV4WL15oWd7R+rttAgQIECBAgAABAgQIECBQI2DBW6PntStEwII3hjljwTthpdXLXq86r0yesmHMITuacsap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2bRxA+cliSwJhAdYvHS55MyVS4UwQSgTWuITQHiMacGzpFr1mrrX6JMnTyRfbt/E75yX9wD3/+nBs1SIJs3GjhkpC+fP83IyHD4JxCTgSfd/CrxcwSRAAiRAAiRAAiRAAiRAAiRAAh5NIG/efCr2Oy1pEUDOhJB5C9XuBMR+7dalQ9LqoBf3Bl7W3br3ktdee00K+udRcZNpJEACnkuAAq/nzh17TgIkQAIkQAIkQAIkQAIkQAIkQAJJngC8Ro8dPSzPnj1L8n31pg6mSJFCChYsLJGR0WFOaCRAAp5LgAKv584de04CJEACJEACJEACJEACJEACJEACJEACJEACJODlBCjwevkC4PBJgARIgARIgARIgARIgARIgARIgARIgARIgAQ8lwAFXs+dO/acBEiABEiABEiABEiABEiABEiABEiABEiABEjAywlQ4PXyBcDhkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJeC4BCryeO3fsOQmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQgJcToMDr5QuAwycBEiABEiABEiABEiABEiABEiABEiABEiABEvBcAhR4PXfu2HMSIAESIAESIAESIAESIAESIAESIAESIAESIAEvJ0CB18sXAIdPAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiTguQQo8Hru3LHnJEACJEACJEACJEACJEACJEACJEACJEACJEACXk6AAq+XLwAOnwRIgARIgARIgARIgARIgARIgARIgARIgARIwHMJUOD13Lljz0mABEiABEiABEiABEiABEiABEiABEiABEiABLycAAVeL18AHD4JkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkIDnEqDA67lzx56TAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAl4OQEKvF6+ADh8EiABEiABEiABEiABEiABEiABEiABEiABEiABzyVAgddz5449JwESIAESIAESIAESIAESIAESIAESIAESIAES8HICFHi9fAFw+CRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAp5LgAKv584de04CJEACJEACJEACJEACJEACJEACJEACJEACJODlBCjwevkC4PBJgARIgARIgARIgARIgARIgARIgARIgARIgAQ8lwAFXs+dO/acBEiABEiABEiABEiABEiABEiABEiABEiABEjAywlQ4PXyBcDhkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJeC4BCryeO3fsOQmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQgJcToMDr5QuAwycBEiABEiABEiABEiABEiABEiABEiABEiABEvBcAhR4PXfu2HMSIAESIAESIAESIAESIAESIAESIAESIAESIAEvJ0CB18sXAIdPAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiTguQQo8Hru3LHnJEACJEACJEACJEACJEACJEACJEACJEACJEACXk6AAq+XLwAOnwRIgARIgARIgARIgARIgARIgARIgARIgARIwHMJUOD13Lljz0mABEiABEiABEiABEiABEiABEiABEiABEiABLycAAVeL18AHD4JkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkIDnEqDA67lzx56TAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAl4OQEKvF6+ADh8EiABEiABEiABEiABEiABEiABEiABEiABEiABzyVAgddz5449JwESIAESIAESIAESIAESIAESIAESIAESIAES8HICFHi9fAFw+CRAAiRAAiSQlAmkSJFCfv/99yTXxffee09+++23JNWvN954Q1Kl+kju3bubpPrFzpAACZAACZAACZAACZAACcQvAQq88cuXrZMACZAACZAACbhIIG3adNK7b3/JmSu34L8hov7jH/+Q//3vf/Kf//xHHj36RbZv3SJzZs+IIa52695LmjZvoc6EMuPGjnJ61mHDR0nVatVVuVUrlsvcOTNt1kEfunbrKc1atBQfnw/k7bffVuXQr+fPn8sfT5/Kwx8eypZNG2X5sqW6IJ3N11fClq1y2g9nBRaEhkh42JIYxVL6+MjIkWMlT9688mmatPLOO++oMn///bf88vPPcuvWTdm8aYMsXxbm8BTZc+SQJWEr9DIvXryQ6lUryh9//OGw3r///W/ZtWe//PuNN/Ryg4P6y4ED+y3qzZ47XwoULOhsmDGOV61UzkLc37UnUt5N8W6Mci+eP5dff/1VHj9+JCdPnJCFC+bJX3/9Zfp8salgPTawq12jqjx58sRuc7PmhErBQoXU8cCAFnLl8mWnp169Zr2kz5BBL7d40QJZsmiB03pt2raXdu076uVu3rghLZs3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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "AI-generated follow-up questions:\n", - "\n", - "* What is the country name for each of the top 10 customers by sales?\n", - "* How many orders does each of the top 10 customers by sales have?\n", - "* What is the total revenue for each of the top 10 customers by sales?\n", - "* What are the customer names and total sales for customers in the United States?\n", - "* Which customers in Africa have returned the most parts with a gross value?\n", - "* What are the total sales for the top 3 customers?\n", - "* What are the customer names and total sales for the top 5 customers?\n", - "* What are the total sales for customers in Europe?\n", - "* How many customers are there in each country?\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vn.ask(\"What are the top 10 customers by sales?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT n.n_name as country_name,\n", - " sum(l.l_extendedprice * (1 - l.l_discount)) as total_sales\n", - "FROM snowflake_sample_data.tpch_sf1.nation n join snowflake_sample_data.tpch_sf1.customer c\n", - " ON n.n_nationkey = c.c_nationkey join snowflake_sample_data.tpch_sf1.orders o\n", - " ON c.c_custkey = o.o_custkey join snowflake_sample_data.tpch_sf1.lineitem l\n", - " ON o.o_orderkey = l.l_orderkey\n", - "GROUP BY country_name\n", - "ORDER BY total_sales desc limit 5;\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
COUNTRY_NAMETOTAL_SALES
0FRANCE8960205391.8314
1INDONESIA8942575217.6237
2RUSSIA8925318302.0710
3MOZAMBIQUE8892984086.0088
4JORDAN8873862546.7864
\n", - "
" - ], - "text/plain": [ - " COUNTRY_NAME TOTAL_SALES\n", - "0 FRANCE 8960205391.8314\n", - "1 INDONESIA 8942575217.6237\n", - "2 RUSSIA 8925318302.0710\n", - "3 MOZAMBIQUE 8892984086.0088\n", - "4 JORDAN 8873862546.7864" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAPoCAYAAABkvZZOAAAgAElEQVR4XuzdB5QkVdUA4LeIgIFkAFEk5yg5SZSoIKCICUWCqAgKmEUUcwZBgR9FgmBCMkgGCUaQJDmJKEowIEnSL/zn9f7TOzM7u1NdO2+7b9XX53iO7Lx6dd93392uvV1TPWneeed9NnkRIECAAAECBAgQIECAAAECBAgQIECAQDiBSRq84XImYAIECBAgQIAAAQIECBAgQIAAAQIECHQENHhtBAIECBAgQIAAAQIECBAgQIAAAQIECAQV0OANmjhhEyBAgAABAgQIECBAgAABAgQIECBAQIPXHiBAgAABAgQIECBAgAABAgQIECBAgEBQAQ3eoIkTNgECBAgQIECAAAECBAgQIECAAAECBDR47QECBAgQIECAAAECBAgQIECAAAECBAgEFdDgDZo4YRMgQIAAAQIECBAgQIAAAQIECBAgQECD1x4gQIAAAQIECBAgQIAAAQIECBAgQIBAUAEN3qCJEzYBAgQIECBAgAABAgQIECBAgAABAgQ0eO0BAgQIECBAgAABAgQIECBAgAABAgQIBBXQ4A2aOGETIECAAAECBAgQIECAAAECBAgQIEBAg9ceIECAAAECBAgQIECAAAECBAgQIECAQFABDd6giRM2AQIECBAgQIAAAQIECBAgQIAAAQIENHjtAQIECBAgQIAAAQIECBAgQIAAAQIECAQV0OANmjhhEyBAgAABAgQIECBAgAABAgQIECBAQIPXHiBAgAABAgQIECBAgAABAgQIECBAgEBQAQ3eoIkTNgECBAgQIECAAAECBAgQIECAAAECBDR47QECBAgQIECAAAECBAgQIECAAAECBAgEFdDgDZo4YRMgQIAAAQIECBAgQIAAAQIECBAgQECD1x4gQIAAAQIECBAgQIAAAQIECBAgQIBAUAEN3qCJEzYBAgQIECBAgAABAgQIECBAgAABAgQ0eO0BAgQIECBAgAABAgQIECBAgAABAgQIBBXQ4A2aOGETIECAAAECBAgQIECAAAECBAgQIEBAg9ceIECAAAECBAgQIECAAAECBAgQIECAQFABDd6giRM2AQIECBAgQIAAAQIECBAgQIAAAQIENHjtAQIECBAgQIAAAQIECBAgQIAAAQIECAQV0OANmjhhEyBAgAABAgQIECBAgAABAgQIECBAQIPXHiBAgAABAgQIECBAgAABAgQIECBAgEBQAQ3eoIkTNgECBAgQIECAAAECBAgQIECAAAECBDR47QECBAgQIECAAAECBAgQIECAAAECBAgEFdDgDZo4YRMgQIAAAQIECBAgQIAAAQIECBAgQECD1x4gQIAAAQIECBAgQIAAAQIECBAgQIBAUAEN3qCJEzYBAgQIECBAgAABAgQIECBAgAABAgQ0eO0BAgQIECBAgAABAgQIECBAgAABAgQIBBXQ4A2aOGETIECAAAECBAgQIECAAAECBAgQIEBAg9ceIECAAAECBAgQIECAAAECBAgQIECAQFABDd6giRM2AQIECBAgQIAAAQIECBAgQIAAAQIENHjtAQIECBAgQIAAAQIECBAgQIAAAQIECAQV0OANmjhhEyBAgAABAgQIECBAgAABAgQIECBAQIPXHiBAgAABAgQIECBAgAABAgQIECBAgEBQAQ3eoIkTNgECBAgQIECAAAECBAgQIECAAAECBDR47QECBAgQIECAAAECBAgQIECAAAECBAgEFdDgDZo4YRMgQIAAAQIECBAgQIAAAQIECBAgQECD1x4gQIAAAQIECBAgQIAAAQIECBAgQIBAUAEN3qCJEzYBAgQIECBAgAABAgQIECBAgAABAgQ0eO0BAgQIECBAgAABAgQIECBAgAABAgQIBBXQ4A2aOGETIECAAAECBAgQIECAAAECBAgQIEBAg9ceIECAAAECBAgQIECAAAECBAgQIECAQFABDd6giRM2AQIECBAgQIAAAQIECBAgQIAAAQIENHjtAQIECBAgQIAAAQIECBAgQIAAAQIECAQV0OANmjhhEyBAgAABAgQIECBAgAABAgQIECBAQIPXHiBAgAABAgQIECBAgAABAgQIECBAgEBQAQ3eoIkTNgECBAgQIECAAAECBAgQIECAAAECBDR47QECBAgQIECAAAECBAgQIECAAAECBAgEFdDgDZo4YRMgQIAAAQIECBAgQIAAAQIECBAgQECD1x4gQIAAAQIECBAgQIAAAQIECBAgQIBAUAEN3qCJEzYBAgQIECBAgAABAgQIECBAgAABAgQ0eO0BAgQIECBAgAABAgQIECBAgAABAgQIBBXQ4A2aOGETIECAAAECBAgQIECAAAECBAgQIEBAg9ceIECAAAECBAgQIECAAAECBAgQIECAQFABDd6giRM2AQIECBAgQIAAAQIECBAgQIAAAQIENHjtAQIECBAgQIAAAQIECBAgQIAAAQIECAQV0OANmjhhEyBAgAABAgQIECBAgAABAgQIECBAQIPXHiBAgAABAgQIECBAgAABAgQIECBAgEBQAQ3eoIkTNgECBAgQIECAAAECBAgQIECAAAECBDR47QECBAgQIECAAAECBAgQIECAAAECBAgEFdDgDZo4YRMgQIAAAQIECBAgQIAAAQIECBAgQECD1x4gQIAAAQIECBAgQIAAAQIECBAgQIBAUAEN3qCJEzYBAgQIECBAgAABAgQIECBAgAABAgQ0eO0BAgQIECBAgAABAgQIECBAgAABAgQIBBXQ4A2aOGETIECAAAECBAgQIECAAAECBAgQIEBAg9ceIECAAAECBAgQIECAAAECBAgQIECAQFABDd6giRM2AQLNEnjZyxZIa6+zTndRZ515Rvrf//3fZi1ywFcz33zzp3XXW68b5Tln/zw9+eSTAx618AgQIECAAAECBAgQIECg7QIavGPsgEmTJqVll11uQvfGM888k2655eYJnXMQJ5ttttnSEkssWSu0J596Kt15x+21jq160KKLLZ623W77tMjCi6YXv+QlaY455kh//etfO+e99dZb0rXXXJ0eeOD+qtMZV1hgy61elxZ4+cu7Z/nh8celp556qvBZ+zP9gZ/9Qtplt3d3T779tq9LV1/1+/4EU/Css88+e1pjzbXS8suvmJZZZtm04CtfmR599JFOHd511x/TH++8M91y803p3nv/VjCKsaf+8Ec/nvb+wL7dH77z7W9Jl176i5kehxMSIECAAAECBAgQIECAAIFeBDR4x9DabPMt01FHH9eLY6WxO7zh9enKK35XaWzUQe/adff02c99sXb4Cy84f+1jp3fgXnvvk/bc6wPpBS94wbjz33PPX9Jxxxydjv7+d91BOUor32W6+RZbdv/0tFNPTg8//PC4pnUH3HDzHWnOOefsHr71Vpul66//Q93pBvq4pjd4cx4P/NwX03bbvzHNOuus4+bikUceSb/65WXpqO8dOdP+3tTgHTctBhAgQIAAAQIECBAgQIDAAApo8I6RlM232Cp97/vHTni62tDgzXcg5kZV3ddEN3jzHbs/OOHHaaGFFu45pPzr8RddeH7aY/ddej62qQe8f68Ppo9+/JPd5b13j93SOWefVWy5GrzNuIN3t3e/J31y/09XauyOtZlOO/WU9MG931dsnw1NrMFbnNgJCBAgQIAAAQIECBAgQKCAgAavBu+EbqtBavB+7BP7p/ftuXfKj9wY/Xr22Wc7d57mR2fMM888Y47Jx+THASy52Csn1CjyZBq85bLX1Dt4p3VXf67Bxx9/PP3nscfSnHPNlfKjG6b1uvCC89Juu7yzHP7/z6zBW5zYCQgQIECAAAECBAgQIECggIAG7xioudGw8SabTpf77Tu9M22w4UbdMeede3Y65eSTpntMblI0/UuTRjd4f37WGemkn51Yaes+9dST6ZeXX1Zp7HiDNthgo3T8j3461bDLLr0kffMbX03XXXtNyg2moddyyy2f1t9go/T67bZPK6ywYvfPNXhHEs7sBu9O79g5vWLBBbtBHPqtgzpNwSa+mtjgnfdFL0rXXHfTiA9Q8peWHXfM99NB3/zaiFzmx6estfa6aY0110ybbLJZWmbZZbtp1uBt4o63JgIECBAgQIAAAQIECBCYKAEN3pqS+3/qM2mP9+7ZPfobX/tK+vahB9ecrTmHjW7w9sMl37F7zR9uTvPOO++IRu1HPrxPOu2Uk8fFzs3eI486pvNYBw3e/jZ4x01WgwY0scH7jYMOSW/a8S3dLP3nP/9Jm268fvrrX+8ZN3MLLvjK9M2DD01rr7Nu0uAdl8sAAgQIECBAgAABAgQIEGixgAZvzeRPdIN3lllmSautvkbnruAFX/HKdO21V6dfXHxR+vOf764Z4ZTD8p1xm7xm0/Tq9TdM//znP9L5552brr3m6hmed6wJBqHB+5kDP5923X2Pbnj5Tt311l69UlNp+Jo+/8WvpK23fn1aZeXlpmtVMndFkpRSmmfeedMWW2yV1lxr7XT//fel3/3mN+mKK3477t2xM/sO3hlZf24Q5npadbXV04P/+le66qrfp9/8+pfpoYce6mna/IHB0ksvk1ZZdbW0xBJLpn/+85/plltuTjfdeEO67757e5preoOn1+DNe2z99TdMG2/ymjTrc5+bLr7ownTZpb8Y+N8IuOKq69L887+su+wD9v94+sFxx/Rk9rqtt0lPP/2/6fzzzpnmcbPNNltaZpll08KLLJIWXHChNP/886enn346/etf/0o33nB9uvLK3427t/PkM/KIhmj7rackGEyAAAECBAgQIECAAAECAy2gwVszPRPV4M1fAnbCj36acnNgrFd+pMM5Z/887f3+94x4pMDosaedcXZ61Sqrdv443yW33NKLpbe9/R3p4588IM0999xTTZ2fPXvcsUenAz+9f02BsQ/rd4P3ZS9bIP3miqtTbogNvX524k/Sh/f74ISuM082Ubk77Ijvptdt/fpOfLkZvdjCL59urpdcaql0wUVTHmVxxOHfTl/98henWt+Nt9yZcnM/v6677tq07dZbpne/531p3/0+0v3z4QflPZHvuD7sO4dMNVdumufcTut5xqMPuOGG69PWW23W+ePR8R5+2KHpa1/5Unre856XPrDPfmnd9dZPiy++RHrhC1/YWfc99/wlrb/ump1jf3LiKZ07OPMr30291OILTTePs846a/ruUcekDTfaZJpf6JWbvbvvtnP6/ZVXTHeuHPfXvn5wp7E71rrzwbmJeOUVv0tHHnFYuuSSi2doj43V4M37+DuHH5kWWODlY86dz73jDtt1niU9/JX/Pvnlb67s/lFe83gfVAwN/uGPf5bWe/X63WN3fdc70sUXXVBrbTfd+scRe237bV+Xrr5q4r44Lj9ne6d3vCvNNddc040v76tf/+qX6bMHfirdesst0xzba4M38n6rlVAHESBAgAABAgQIECBAgMBACmjw1kzLRDR4c8Ps05/53Ihm5LTC+fsDD6Q37bBduuuPd4455MKLL0tLLrV092e333briP+e1ry56fG2t+ww3YZiL0T9bvDmhs+e7/9AN+Qnnngirbjckp3m4ES+JjJ3P/jhT9KGG27cDW+RV75suvlYccWV0lnnTGm4Hf+DY9OnPvmxqZZ3x133pOc+97mdP//XP/+ZHn3s0c5jJ8Z7nXvOz9N73r3riGFf/+a30o5vfut4h3Z//sc770gbb7he579XWmnldObZ53d/lu/g/Muf/5w+8rFPpHzn5ehXfkbrUCP35+de2H0mcm7SZZtpvVZfY810zHE/HLfZN3T8j390Qvr4Rz805nS7vfs9ndrs5ZX3Wf7ivrqv0Q3eW26+ecRzaKc1b74De8vNN+nkePjr2vyYkhe9qPtHu++6c7rg/HOnG15ulP7hxtu6De2ci6WXWLj23w+/v/r69NL55uue88Sf/jh95EP71CWa6rjTzjwnrfL/H2xVnXR6Dr00eKPvt6pexhEgQIAAAQIE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AAECBAgQIECAAIE6Ahq8ddQcQ4AAAQIECBAgQIAAAQIECBAgQIAAgQEQ0OAdgCQIgQABAgQIECBAgAABAgQIECBAgAABAnUENHjrqDmGAAECBAgQIECAAAECBAgQIECAAAECAyCgwTsASRACAQIECBAgQIAAAQIECBAgQIAAAQIE6gho8NZRcwwBAgQIECBAgAABAgQIECBAgAABAgQGQECDdwCSIAQCBAgQIECAAAECBAgQIECAAAECBAjUEdDgraPmGAIECBAgQIAAAQIECBAgQIAAAQIECAyAgAbvACRBCAQIECBAgAABAgQIECBAgAABAgQIEKgjoMFbR80xBAgQIECAAAECBAgQIECAAAECBAgQGAABDd4BSIIQCBAgQIAAAQIECBAgQIAAAQIECBAgUEdAg7eOmmMIECBAgAABAgQIECBAgAABAgQIECAwAAIavAOQBCEQIECAAAECBAgQIECAAAECBAgQIECgjoAGbx01xxAgQIAAAQIECBAgQIAAAQIECBAgQGAABDR4ByAJQiBAgAABAgQIECBAgAABAgQIECBAgEAdAQ3eOmqOIUCAAAECBAgQIECAAAECBAgQIECAwAAIaPAOQBKEQIAAAQIECBAgQIAAAQIECBAgQIAAgToCGrx11BxDgAABAgQIECBAgAABAgQIECBAgACBARDQ4B2AJAiBAAECBAgQIECAAAECBAgQIECAAAECdQQ0eOuoOYYAAQIECBAgQIAAAQIECBAgQIAAAQIDIKDBOwBJEAIBAgQIECBAgAABAgQIECBAgAABAgTqCGjw1lFzDAECBAgQIECAAAECBAgQIECAAAECBAZAQIN3AJIgBAIECBAgQIAAAQIECBAgQIAAAQIECNQR0OCto+YYAgQIECBAgAABAgQIECBAgAABAgQIDICABu8AJEEIBAgQIECAAAECBAgQIECAAAECBAgQqCOgwVtHzTEECBAgQIAAAQIECBAgQIAAAQIECBAYAAEN3gFIghAIECBAgAABAgQIECBAgAABAgQIECBQR0CDt46aYwgQIECAAAECBAgQIECAAAECBAgQIDAAAhq8A5AEIRAgQIAAAQIECBAgQIAAAQIECBAgQKCOgAZvHTXHECBAgAABAgQIECBAgAABAgQIECBAYAAENHgHIAlCIECAAAECBAgQIECAAAECBAgQIECAQB0BDd46ao4hQIAAAQIECBAgQIAAAQIECBAgQIDAAAho8A5AEoRAgAABAgQIECBAgAABAgQIECBAgACBOgIavHXUHEOAAAECBAgQIECAAAECBAgQIECAAIEBENDgHYAkCIEAAQIECBAgQIAAAQIECBAgQIAAAQJ1BDR466g5hgABAgQIECBAgAABAgQIECBAgAABAgMgoME7AEkQAgECBAgQIECAAAECBAgQIECAAAECBOoIaPDWUXMMAQIECBAgQIAAAQIECBAgQIAAAQIEBkBAg3cAkiAEAgQIECBAgAABAgQIECBAgAABAgQI1BHQ4K2j5hgCBAgQIECAAAECBAgQIECAAAECBAgMgIAG7wAkQQgECBAgQIAAAQIECBAgQIAAAQIECBCoI6DBW0fNMQQIECBAgAABAgQIECBAgAABAgQIEBgAAQ3eAUiCEAgQIECAAAECBAgQIECAAAECBAgQIFBHQIO3jppjCBAgQIAAAQIECBAgQIAAAQIECBAgMAACGrwDkAQhECBAgAABAgQIECBAgAABAgQIECBAoI6ABm8dNccQIECAAAECBAgQIECAAAECBAgQIEBgAAQ0eAcgCUIgQIAAAQIECBAgQIAAAQIECBAgQIBAHQEN3jpqjiFAgAABAgQIECBAgAABAgQIECBAgMAACGjwDkAShECAAAECBAgQIECAAAECBAgQIECAAIE6Ahq8ddQcQ4AAAQIECBAgQIAAAQIECBAgQIAAgQEQ0OAdgCQIgQABAgQIECBAgAABAgQIECBAgAABAnUENHjrqDmGAAECBAgQIECAAAECBAgQIECAAAECAyCgwTsASRACAQIECBAgQIAAAQIECBAgQIAAAQIE6gho8NZRcwwBAgQIECBAgAABAgQIECBAgAABAgQGQECDdwCSIAQCBAgQIECAAAECBAgQIECAAAECBAjUEdDgraPmGAIECBAgQIAAAQIECBAgQIAAAQIECAyAgAbvACRBCAQIECBAgAABAgQIECBAgAABAgQIEKgjoMFbR80xBAgQIECAAAECBAgQIECAAAECBAgQGAABDd4BSIIQCBAgQIAAAQIECBAgQIAAAQIECBAgUEdAg7eOmmMIECBAgAABAgQIECBAgAABAgQIECAwAAIavAOQBCEQIECAAAECBAgQIECAAAECBAgQIECgjoAGbx01xxAgQIAAAQIECBAgQIAAAQIECBAgQGAABDR4ByAJQiBAgAABAgQIECBAgAABAgQIECBAgEAdAQ3eOmqOIUCAAAECBAgQIECAAAECBAgQIECAwAAIaPAOQBKEQIAAAQIECBAgQIAAAQIECBAgQIAAgToCGrx11BxDgAABAgQIECBAgAABAgQIECBAgACBARDQ4B2AJAiBAAECBAgQIECAAAECBAgQIECAAAECdQQ0eOuoOYYAAQIECBAgQIAAAQIECBAgQIAAAQIDIKDBOwBJEAIBAgQIECBAgAABAgQIECBAgAABAgTqCGjw1lFzDAECBAgQIECAAAECBAgQIECAAAECBAZAQIN3AJIgBAIECBAgQIAAAQIECBAgQIAAAQIECNQR0OCto+YYAgQIECBAgAABAgQIECBAgAABAgQIDICABu8AJEEIBAgQIECAAAECBAgQIECAAAECBAgQqCOgwVtHzTEECBAgQIAAAQIECBAgQIAAAQIECBAYAAEN3gFIghAIECBAgAABAgQIECBAgAABAgQIECBQR0CDt46aYwgQIECAAAECBAgQIECAAAECBAgQIDAAAhq8A5AEIRAgQIAAAQIECBAgQIAAAQIECBAgQKCOgAZvHTXHECBAgAABAgQIECBAgAABAgQIECBAYAAENHgHIAlCIECAAAECBAgQIECAAAECBAgQIECAQB0BDd46ao4hQIAAAQIECBAgQIAAAQIECBAgQIDAAAho8A5AEoRAgAABAgQIECBAgAABAgQIECBAgACBOgIavHXUHEOAAAECBAgQIECAAAECBAgQIECAAIEBENDgHYAkCIEAAQIECBAgQIAAAQIECBAgQIAAAQJ1BDR466g5hgABAgQIECBAgAABAgQIECBAgAABAgMgoME7AEkQAgECBAgQIECAAAECBAgQIECAAAECBOoIaPDWUXMMAQIECBAgQIAAAQIECBAgQIAAAQIEBkBAg3cAkiAEAgQIECBAgAABAgQIECBAgAABAgQI1BHQ4K2j5hgCBAgQIECAAAECBAgQIECAAAECBAgMgIAG7wAkQQgECBAgQIAAAQIECBAgQIAAAQIECBCoI6DBW0fNMQQIECBAgAABAgQIECBAgAABAgQIEBgAAQ3eAUiCEAgQIECAAAECBAgQIECAAAECBAgQIFBHQIO3jppjCBAgQIAAAQIECBAgQIAAAQIECBAgMAACGrwDkAQhECBAgAABAgQIECBAgAABAgQIECBAoI6ABm8dNccQIECAAAECBAgQIECAAAECBAgQIEBgAAQ0eAcgCUIgQIAAAQIECBAgQIAAAQIECBAgQIBAHQEN3jpqjiFAgAABAgQIECBAgAABAgQIECBAgMAACGjwDkAShECAAAECBAgQIECAAAECBAgQIECAAIE6Ahq8ddQcQ4AAAQIECBAgQIAAAQIECBAgQIAAgQEQ0OAdgCQIgQABAgQIECBAgAABAgQIECBAgAABAnUENHjrqDmGAAECBAgQIECAAAECBAgQIECAAAECAyCgwTsASRACAQIECBAgQIAAAQIECBAgQIAAAQIE6gho8NZRcwwBAgQIECBAgAABAgQIECBAgAABAgQGQECDdwCSIAQCBAgQIECAAAECBAgQIECAAAECBAjUEdDgraPmGAIECBAgQIAAAQIECBAgQIAAAQIECAyAgAbvACRBCAQIECBAgAABAgQIECBAgAABAgQIEKgjoMFbR80xBAgQIECAAAECBAgQIECAAAECBAgQGAABDd4BSIIQCBAgQIAAAQIECBAgQIAAAQIECBAgUEdAg7eOmmMIECBAgAABAgQIECBAgAABAgQIECAwAAIavAOQBCEQIECAAAECBAgQIECAAAECBAgQIECgjoAGbx01xxAgQIAAAQIECBAgQIAAAQIECBAgQGAABDR4ByAJQiBAgAABAgQIECBAgAABAgQIECBAgEAdAQ3eOmqOIUCAAAECBAgQIECAAAECBAgQIECAwAAIaPAOQBKEQIAAAQIECBAgQIAAAQIECBAgQIAAgToCGrx11BxDgAABAgQIECBAgAABAgQIECBAgACBARDQ4B2AJAiBAAECBAgQIECAAAECBAgQIECAAAECdQQ0eOuoOYYAAQIECBAgQIAAAQIECBAgQIAAAQIDIKDBOwBJEAIBAgQIECBAgAABAgQIECBAgAABAgTqCGjw1lFzzEALPPPM7OnJJ3dLKb1woOMUHIHJAg+nOeY4Nk2a9AQQAgQIECBAgAABAgQIECBAgEDPAhq8PZM5YNAFnnnmeenhh69Ozz47/6CHKj4CadKkv6a5514rTZr0nxAazzzzwvTf/y6VUpo1RLyCbLvA02nWWe9MkyY9HALi2WefTZMmTQoRqyAJZAF71j4gQIAAAQIECAyGgAbv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AggggAACCCCAAAIIIIAAAggggIDTAgR4nW4+Co8AAggggAACCCCAAAIIIIAAAggggAACYRYgwBvm1qfuCCCAAAIIIIAAAggggAACCCCAAAIIIOC0AAFep5uPwiOAAAIIIIAAAggggAACCCCAAAIIIIBAmAUI8Ia59ak7AggggAACCCCAAAIIIIAAAggggAACCDgtQIDX6eaj8AgggAACCCCAAAIIIIAAAggggAACCCAQZgECvGFufeqOAAIIIIAAAggggAACCCCAAAIIIIAAAk4LEOB1uvkoPAIIIIAAAggggAACCCCAAAIIIIAAAgiEWYAAb5hbn7ojgAACCCCAAAIIIIAAAggggAACCCCAgNMCBHidbj4KjwACCCCAAAIIIIAAAggggAACCCCAAAJhFiDAG+bWp+4IIIAAAggggAACCCCAAAIIIIAAAggg4LQAAV6nm4/CI4AAAggggAACCCCAAAIIIIAAAggggECYBQjwhrn1qTsCCCCAAAIIIIAAAggggAACCCCAAAIIOC1AgNfp5qPwCCCAAAIIIIAAAggggAACCCCAAAIIIBBmAQK8YW596o4AAggggAACCCCAAAIIIIAAAggggAACTgsQ4HW6+Sg8AggggAACCCCAAAIIIIAAAggggAACCIRZgABvmFufuiOAAAIIIIAAAggggAACCCCAAAIIIICA0wIEeJ1uPgqPAAIIIIAAAggggAACCCCAAAIIIIAAAmEWIMAb5tan7ggggAACCCCAAAIIIIAAAggggAACCCDgtAABXqebj8IjgAACCCCAAAJFK7DPPvvIb7/9Jn/99VfRHpijIYAAAggggAACCCCAQFwBArx0DAQQQAABBBBAAIGEAhd1u0RatzlZKlWuLKVLHyL/+Mc/zLa///67/PTjj7Jjx3YZNnSwLFgwD0UEEEAAAQQQQAABBBAoBgECvMWAziERQAABBBBAAIFsF6hU+SgZO36ilCtXPlBRf/zxR3nx+Uly5x23BtrexY2u6tVH+t94syn6iuXL5OyO7V2sBmVGAAEEEEAAAQQQyDEBArw51qBUBwEEEEAAAQQQKKzANdf1l959rpHddtstT1b/+c9/5Ntvv5GSJQ+UAw44IN/nf/zxh1SueERhD5+1+/e95jrpd831pnxr16yWDu1Oy9qyUjAEEEAAAQQQQACB8AgQ4A1PW1NTBBBA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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "AI-generated follow-up questions:\n", - "\n", - "* What are the total sales for each country in descending order?\n", - "* Which country has the highest number of customers?\n", - "* What are the total sales for each customer in descending order?\n", - "* Which customers in the United States have the highest total sales?\n", - "* What are the total sales and number of orders for each customer in each country?\n", - "* What are the total sales for customers in Europe?\n", - "* What are the top 10 countries with the highest total order amount?\n", - "* Which country has the highest number of failed orders?\n", - "* Which customers have the highest total sales?\n", - "* \n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vn.ask(\"Which 5 countries have the highest sales?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "with ranked_customers as (SELECT c.c_name as customer_name,\n", - " r.r_name as region_name,\n", - " row_number() OVER (PARTITION BY r.r_name\n", - " ORDER BY sum(l.l_quantity * l.l_extendedprice) desc) as rank\n", - " FROM snowflake_sample_data.tpch_sf1.customer c join snowflake_sample_data.tpch_sf1.orders o\n", - " ON c.c_custkey = o.o_custkey join snowflake_sample_data.tpch_sf1.lineitem l\n", - " ON o.o_orderkey = l.l_orderkey join snowflake_sample_data.tpch_sf1.nation n\n", - " ON c.c_nationkey = n.n_nationkey join snowflake_sample_data.tpch_sf1.region r\n", - " ON n.n_regionkey = r.r_regionkey\n", - " GROUP BY customer_name, region_name)\n", - "SELECT region_name,\n", - " customer_name\n", - "FROM ranked_customers\n", - "WHERE rank <= 2;\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
REGION_NAMECUSTOMER_NAME
0ASIACustomer#000102022
1ASIACustomer#000148750
2AMERICACustomer#000095257
3AMERICACustomer#000091630
4EUROPECustomer#000028180
5EUROPECustomer#000053809
6MIDDLE EASTCustomer#000143500
7MIDDLE EASTCustomer#000103834
8AFRICACustomer#000131113
9AFRICACustomer#000134380
\n", - "
" - ], - "text/plain": [ - " REGION_NAME CUSTOMER_NAME\n", - "0 ASIA Customer#000102022\n", - "1 ASIA Customer#000148750\n", - "2 AMERICA Customer#000095257\n", - "3 AMERICA Customer#000091630\n", - "4 EUROPE Customer#000028180\n", - "5 EUROPE Customer#000053809\n", - "6 MIDDLE EAST Customer#000143500\n", - "7 MIDDLE EAST Customer#000103834\n", - "8 AFRICA Customer#000131113\n", - "9 AFRICA Customer#000134380" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAPoCAYAAABkvZZOAAAgAElEQVR4XuzdebyM5f/H8Q+JlF22rMe+Z9/3ZKkQkexLSJQobSiVVJasUZJs2couspN9y87h2LeoSBItfPk9Prff3GbmzH7PmDPnvK7H4/v4Zuba7ud1z/zxPtdcd6K0adPeFgoCCCCAAAIIIIAAAggggAACCCCAAAIIIIBAxAkkIuCNuDVjwggggAACCCCAAAIIIIAAAggggAACCCCAgCFAwMuNgAACCCCAAAIIIIAAAggggAACCCCAAAIIRKgAAW+ELhzTRgABBBBAAAEEEEAAAQQQQAABBBBAAAEECHi5BxBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgQgVIOCN0IVj2ggggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAIIIBChAgS8EbpwTBsBBBBAAAEEEEAAAQQQQAABBBBAAAEEECDg5R5AAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQiVICAN0IXjmkjgAACCCCAAAIIIIAAAggggAACCCCAAAIEvNwDCCCAAAIIIIAAAggggAACCCCAAAIIIIBAhAoQ8EbowjFtBBBAAAEEEEAAAQQQQAABBBBAAAEEEECAgJd7AAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiFABAt4IXTimjQACCCCAAAIIIIAAAggggAACCCCAAAIIEPByDyCAAAIIIIAAAggggAACCCCAAAIIIIAAAhEqQMAboQvHtBFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQJe7gEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBCBQh4I3ThmDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyz2AAAIIIIAAAggggAACCCCAAAIIIIAAAghEqAABb4QuHNNGAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQIeLkHEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBCBUg4I3QhWPaCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAS/3AAIIIIAAAggggAACCCCAAAIIIIAAAgggEKECBLwRunBMGwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQIODlHkAAAQQQQAABBBBAAAEEEEAAAQQQQAABBCJUgIA3QheOaSOAAAIIIIAAAggggAACCCCAAAIIIIAAAgS83AMIIIAAAggggAACCCCAAAIIIIAAAggggECEChDwRujCMW0EEEAAAQQQQAABBBBAAAEEEEAAAQQQQICAl3sAAQQQQAABBBBAAAEEEEAAAQQQQAABBBCIUAEC3ghdOKaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8HIPIIAAAggggAACCCCAAAIIIIAAAggggAACESpAwBuhC8e0EUAAAQQQQAABBBBAAAEEEEAAAQQQQAABAl7uAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAIEIFCHgjdOGYNgIIIIAAAggggAACCCCAAAIIIIAAAgggQMDLPYAAAggggAACCCCAAAIIIIAAAggggAACCESoAAFvhC4c00YAAQQQQAABBBBAAAEEEEAAAQQQQAABBAh4uQcQQAABBBBAAAEEEEAAAQQQQAABBBBAAIEIFSDgjdCFY9oIIIAAAggggAACCCCAAAIIIIAAAggggAABL/cAAggggAACCCCAAAIIIIAAAggggAACCCAQoQIEvBG6cEwbAQQQQAABBBBAAAEEEEAAAQQQQAABBBAg4OUeQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIlSAgDdCF45pI4AAAggggAACCCCAAAIIIIAAAggggAACBLzcAwgggAACCCCAAAIIIIAAAggggAACCCCAQIQKEPBG6MIxbQQQQAABBBBAAAEEEEAAAQQQQAABBBBAgICXewABBBBAAAEEEEAAAQQQQAABBBBAAAEEEIhQAQLeCF04po0AAggggAACCCCAAAIIIIAAAggggAACCBDwcg8ggAACCCCAAAIIIIAAAggggAACCCCAAAIRKkDAG6ELx7QRQAABBBBAAAEEEEAAAQQQQAABBBBAAAECXu4BBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgQgUIeCN04Zg2AggggAACCCCAAAIIIIAAAggggAACCCBAwMs9gAACCCCAAAIIIIAAAggggAACCCCAAAIIRKgAAW+ELhzTRgABBBBAAAEEEEAAAQQQQAABBBBAAAEECHi5BxBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgQgVIOCN0IVj2ggggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAII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AggggAACCCAQCwEC3lio0yYCCCCAAAIIIIAAAggggAACCCCAAAIIIOCBAAGvB4hUgQACCCCAAAIIIIAAAggggAACCCCAAAIIxEKAgDcW6rSJAAIIIIAAAggggAACCCCAAAIIIIAAAgh4IEDA6wEiVSCAAAIIIIAAAggggAACCCCAAAIIIIAAArEQIOCNhTptIoAAAggggAACCCCAAAIIIIAAAggggAACHggQ8HqASBUIIIAAAggggAACCCCAAAIIIIAAAggggEAsBAh4Y6FOmwgggAACCCCAAAIIIIAAAggggAACCCCAgAcCBLweIFIFAggggAACCCCAAAIIIIAAAggggAACCCAQCwEC3lio0yYCCCCAAAIIIIAAAggggAACCCCAAAIIIOCBAAGvB4hUgQACCCCAAAIIIIAAAggggAACCCCAAAIIxEKAgDcW6rSJAAIIIIAAAggggAACCCCAAAIIIIAAAgh4IEDA6wEiVSCAAAIIIIAAAggggAACCCCAAAIIIIAAArEQIOCNhTptIoAAAggggAACCCCAAAIIIIAAAggggAACHggQ8HqASBUIIIAAAggggAACCCCAAAIIIIAAAggggEAsBAh4Y6FOmwgggAACCCCAAAIIIIAAAggggAACCCCAgAcCBLweIFIFAggggAACCCCAAAIIIIAAAggggAACCCAQCwEC3lio0yYCCCCAAAIIIIAAAggggAACCCCAAAIIIOCBAAGvB4hUgQACCCCAAAIIIIAAAggggAACCCCAAAIIxEKAgDcW6rSJAAIIIIAAAggggAACCCCAAAIIIIAAAgh4IEDA6wEiVSCAAAIIIIAAAggggAACCCCAAAIIIIAAArEQIOCNhTptIoAAAggggAACCCCAAAIIIIAAAggggAACHggQ8HqASBUIIIAAAggggAACCCCAAAIIIIAAAggggEAsBAh4Y6FOmwgggAACCCCAAAIIIIAAAggggAACCCCAgAcCBLweIFIFAggggAACCCCAAAIIIIAAAggggAACCCAQCwEC3lio0yYCCCCAAAIIIIAAAggggAACCCCAAAIIIOCBAAGvB4hUgQACCCCAAAIIIIAAAggggAACCCCAAAIIxEKAgDcW6rSJAAIIIIAAAggggAACCCCAAAIIIIAAAgh4IEDA6wEiVSCAAAIIIIAAAggggAACCCCAAAIIIIAAArEQIOCNhTptIoAAAggggAACCCCAAAIIIIAAAggggAACHggQ8HqASBUIIIAAAggggAACCCCAAAIIIIAAAggggEAsBAh4Y6FOmwgggAACCCCAAAIIIIAAAggggAACCCCAgAcCBLweIFIFAggggAACCCCAAAIIIIAAAggggAACCCAQCwEC3lio0yYCCCCAAAIIIIAAAggggAACCCCAAAIIIOCBAAGvB4hUgQACCCCAAAIIIIAAAggggAACCCCAAAIIxEKAgDcW6rSJAAIIIIAAAggggAACCCCAAAIIIIAAAgh4IEDA6wEiVSCAAAIIIIAAAggggAACCCCAAAIIIIAAArEQIOCNhTptIoAAAggggAACCCCAAAIIIIAAAggggAACHggQ8HqASBUIIIAAAggggAACCCCAAAIIIIAAAggggEAsBAh4Y6FOmwgggAACCCCAAAIIIIAAAggggAACCCCAgAcCBLweIFIFAggggAACCCCAAAIIIIAAAggggAACCCAQCwEC3lio0yYCCCCAAAIIIIAAAggggAACCCCAAAIIIOCBAAGvB4hUgQACCCCAAAIIIIAAAggggAACCCCAAAIIxEKAgDcW6rSJAAIIIIAAAggggAACCCCAAAIIIIAAAgh4IEDA6wEiVSCAAAIIIIAAAggggAACCCCAAAIIIIAAArEQIOCNhTptIoAAAggggAACCCCAAAIIIIAAAggggAACHggQ8HqASBUIIIAAAggggAACCCCAAAIIIIAAAggggEAsBAh4Y6FOmwgggAACCCCAAAIIIIAAAggggAACCCCAgAcCBLweIFIFAggggAACCCCAAAIIIIAAAggggAACCCAQCwEC3lio0yYCCCCAAAIIIIAAAggggAACCCCAAAIIIOCBAAGvB4hUgQACCCCAAAIIIIAAAggggAACCCCAAAIIxEKAgDcW6rSJAAIIIIAAAggggAACCCCAAAIIIIAAAgh4IEDA6wEiVSCAAAIIIIAAAggggAACCCCAAAIIIIAAArEQIOCNhTptIoAAAggggAACCCCAAAIIIIAAAggggAACHggQ8HqASBUIIIAAAggggAACCCCAAAIIIIAAAggggEAsBAh4Y6FOmwgggAACCCCAAAIIIIAAAggggAACCCCAgAcCBLweIFIFAggggAACCCCAAAIIIIAAAggggAACCCAQCwEC3lio0yYCCCCAAAIIIIAAAggggAACCCCAAAIIIOCBAAGvB4hUgQACCCCAAAIIIIAAAggggAACCCCAAAIIxEKAgDcW6rSJAAIIIIAAAggggAACCCCAAAIIIIAAAgh4IEDA6wEiVSCAAAIIIIAAAggggAACCCCAAAIIIIAAArEQIOCNhTptIoAAAggggAACCCCAAAIIIIAAAggggAACHggQ8HqASBUIIIAAAggggAACCCCAAAIIIIAAAggggEAsBP4PEDnN3qu3FrEAAAAASUVORK5CYII=", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "AI-generated follow-up questions:\n", - "\n", - "* - What are the total sales for each customer in the Asia region?\n", - "* - How many orders does each customer in the Americas region have?\n", - "* - Who are the top 5 customers with the highest total sales?\n", - "* - What is the total revenue for each customer in the Europe region?\n", - "* - Can you provide a breakdown of the number of customers in each country?\n", - "* - Which customers in the United States have the highest total sales?\n", - "* - What are the total sales for each customer in the Asia region?\n", - "* - What are the top 10 customers with the highest returned parts gross value in Africa?\n", - "* - What are the top 3 customers with the highest total sales overall?\n", - "* - Can you provide a list of the first 10 customers in the database?\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vn.ask(\"Who are the top 2 biggest customers in each region?\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Run as a Web App\n", - "If you would like to use this functionality in a web app, you can deploy the Vanna Streamlit app and use your own secrets. See [this repo](https://github.com/vanna-ai/vanna-streamlit)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.2" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/vn-connect-to-bigquery.ipynb b/notebooks/vn-connect-to-bigquery.ipynb deleted file mode 100644 index 5ca96996..00000000 --- a/notebooks/vn-connect-to-bigquery.ipynb +++ /dev/null @@ -1,532 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Vanna AI](https://img.vanna.ai/vanna-ask.svg)\n", - "\n", - "The following notebook goes through the process of connecting to your gcs using bigquery connector and running sql queries usig Vanna AI. For demo purpose we are using one the google's example queries.\n", - "\n", - "# Install Vanna\n", - "First we install Vanna from [PyPI](https://pypi.org/project/vanna/) and import it.\n", - "Here, we'll install vanna with extra postgres. If you're using a different database, you'll need to install the appropriate extras." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install vanna[bigquery]" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import vanna as vn" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Set Database Connection\n", - "These details are only referenced within your notebook. These database credentials are never sent to Vanna's severs.\n", - "You need to set:\n", - "`PROJECT_ID`.\n", - "in your environment. By default vanna will look for the pre-set google ADC but if it is not pre-set, you'll also need to provide service account credentials json file path. we can also provide parameters `cred_file_path` `project_id` to the method." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Not using Google Colab.\n" - ] - } - ], - "source": [ - "vn.connect_to_bigquery()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "or if you are using service account you can provide credentials json file path:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "cred_file_path = \"provide/creds/path.json\"\n", - "vn.connect_to_bigquery(cred_file_path=cred_file_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Note: \n", - "You need to add `PROJECT_ID` to your environment or you can pass it as `project_id` in above method as a parameter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Get Results\n", - "This gets the SQL run it and prints it's result as a dataframe. Note that we use your provided credentials to execute the SQL on your warehouse from your local instance. Your connection nor your data gets sent to Vanna's servers. For more info on how Vanna works, [see this post](https://medium.com/vanna-ai/how-vanna-works-how-to-train-it-data-security-8d8f2008042). We will be using google demo sql below. Note that below SQL only works for the google demo data." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
submitter_idcase_iddiag__treat__countprimary_sitedisease_typeproj__nameproj__project_iddemo__demographic_iddemo__genderdemo__race...exp__bmiexp__years_smokedexp__pack_years_smokedexp__cigarettes_per_dayexp__alcohol_historyexp__stateexp__created_datetimeexp__updated_datetimestateupdated_datetime
0TCGA-CN-5363291b069c-9dde-4e1e-8430-85146bc943382LarynxSquamous Cell NeoplasmsHead and Neck Squamous Cell CarcinomaTCGA-HNSC2611cb61-6d05-5286-b94a-ce6cac2ba37bmaleblack or african american...NaNNaN15.00.821918YesreleasedNone2019-07-31T18:43:25.167078-05:00released2019-08-06T14:25:25.511101-05:00
1TCGA-CN-53654cffea0b-90a7-4c86-a73f-bb8feca3ada72TonsilSquamous Cell NeoplasmsHead and Neck Squamous Cell CarcinomaTCGA-HNSC97a7f69b-0f40-5450-bbeb-92084a100a9dmalewhite...NaNNaN26.01.424658YesreleasedNone2019-07-31T19:39:51.442671-05:00released2019-08-06T14:25:25.511101-05:00
2TCGA-CN-A642a1ded1e8-eb28-49dd-8f3d-1ce8f40eed8f2Other and unspecified parts of tongueSquamous Cell NeoplasmsHead and Neck Squamous Cell CarcinomaTCGA-HNSC4bc58619-47fc-5c2d-aaec-9d9e562e049bmalewhite...NaNNaN5.00.273973YesreleasedNone2019-07-31T19:30:27.901248-05:00released2019-08-06T14:25:39.854271-05:00
3TCGA-CR-738053b254b7-021f-43df-af9b-3fc01b87479e2Other and ill-defined sites in lip, oral cavit...Squamous Cell NeoplasmsHead and Neck Squamous Cell CarcinomaTCGA-HNSCbe41a712-ebee-52e1-907c-80b1917daa45malewhite...NaNNaNNaNNaNYesreleasedNone2019-07-31T19:40:20.032260-05:00released2019-08-06T14:26:05.315718-05:00
4TCGA-CV-5978e16e9535-b20f-4c9a-8b5b-82df80c994482LarynxSquamous Cell NeoplasmsHead and Neck Squamous Cell CarcinomaTCGA-HNSC92d1d967-c8a0-52cb-a62d-1d11bdf85068femaleblack or african american...NaNNaNNaNNaNYesreleasedNone2019-07-31T19:52:06.976359-05:00released2019-08-06T14:26:05.315718-05:00
5TCGA-CV-6948fcf0dc48-b889-4593-a15b-aa715aae7bf52Floor of mouthSquamous Cell NeoplasmsHead and Neck Squamous Cell CarcinomaTCGA-HNSC2fd1a926-7584-50d5-b6b7-9b9d02710f47femalewhite...NaNNaNNaNNaNNoreleasedNone2019-07-31T19:55:16.152855-05:00released2019-08-06T14:26:16.536997-05:00
6TCGA-CV-7409acd98e20-d2da-4256-99a5-13e261bc88e62Other and ill-defined sites in lip, oral cavit...Squamous Cell NeoplasmsHead and Neck Squamous Cell CarcinomaTCGA-HNSC2a3f5bb4-3606-5549-8d85-ec413eadd7abmaleblack or african american...NaNNaNNaNNaNNoreleasedNone2019-07-31T19:48:25.311492-05:00released2019-08-06T14:26:28.608672-05:00
7TCGA-CV-A6JUb1b3983d-37d2-4bef-bd17-708e3e6001462Other and unspecified parts of tongueSquamous Cell NeoplasmsHead and Neck Squamous Cell CarcinomaTCGA-HNSC604e3dac-30be-589d-b622-df0b41cd9a7ffemalewhite...NaNNaN81.04.438356YesreleasedNone2019-07-31T19:48:40.594893-05:00released2019-08-06T14:26:39.780396-05:00
8TCGA-QK-A6IHc1f286f6-d4a1-494a-88c8-ff8e2a3df2ce2GumSquamous Cell NeoplasmsHead and Neck Squamous Cell CarcinomaTCGA-HNSC83e5c705-bd2e-5516-9700-ed3803dde268femalewhite...NaNNaNNaNNaNYesreleasedNone2019-07-31T19:49:42.057478-05:00released2019-08-06T14:27:02.392779-05:00
9TCGA-QK-A8Z8ac511727-185b-4ac0-b6c0-dc3a79657be62LarynxSquamous Cell NeoplasmsHead and Neck Squamous Cell CarcinomaTCGA-HNSCfd1e46fb-43bb-54ae-b713-a579ba857ed4femaleblack or african american...NaNNaN80.04.383562YesreleasedNone2019-07-31T19:48:22.125112-05:00released2019-08-06T14:27:02.392779-05:00
\n", - "

10 rows × 70 columns

\n", - "
" - ], - "text/plain": [ - " submitter_id case_id diag__treat__count \\\n", - "0 TCGA-CN-5363 291b069c-9dde-4e1e-8430-85146bc94338 2 \n", - "1 TCGA-CN-5365 4cffea0b-90a7-4c86-a73f-bb8feca3ada7 2 \n", - "2 TCGA-CN-A642 a1ded1e8-eb28-49dd-8f3d-1ce8f40eed8f 2 \n", - "3 TCGA-CR-7380 53b254b7-021f-43df-af9b-3fc01b87479e 2 \n", - "4 TCGA-CV-5978 e16e9535-b20f-4c9a-8b5b-82df80c99448 2 \n", - "5 TCGA-CV-6948 fcf0dc48-b889-4593-a15b-aa715aae7bf5 2 \n", - "6 TCGA-CV-7409 acd98e20-d2da-4256-99a5-13e261bc88e6 2 \n", - "7 TCGA-CV-A6JU b1b3983d-37d2-4bef-bd17-708e3e600146 2 \n", - "8 TCGA-QK-A6IH c1f286f6-d4a1-494a-88c8-ff8e2a3df2ce 2 \n", - "9 TCGA-QK-A8Z8 ac511727-185b-4ac0-b6c0-dc3a79657be6 2 \n", - "\n", - " primary_site disease_type \\\n", - "0 Larynx Squamous Cell Neoplasms \n", - "1 Tonsil Squamous Cell Neoplasms \n", - "2 Other and unspecified parts of tongue Squamous Cell Neoplasms \n", - "3 Other and ill-defined sites in lip, oral cavit... Squamous Cell Neoplasms \n", - "4 Larynx Squamous Cell Neoplasms \n", - "5 Floor of mouth Squamous Cell Neoplasms \n", - "6 Other and ill-defined sites in lip, oral cavit... Squamous Cell Neoplasms \n", - "7 Other and unspecified parts of tongue Squamous Cell Neoplasms \n", - "8 Gum Squamous Cell Neoplasms \n", - "9 Larynx Squamous Cell Neoplasms \n", - "\n", - " proj__name proj__project_id \\\n", - "0 Head and Neck Squamous Cell Carcinoma TCGA-HNSC \n", - "1 Head and Neck Squamous Cell Carcinoma TCGA-HNSC \n", - "2 Head and Neck Squamous Cell Carcinoma TCGA-HNSC \n", - "3 Head and Neck Squamous Cell Carcinoma TCGA-HNSC \n", - "4 Head and Neck Squamous Cell Carcinoma TCGA-HNSC \n", - "5 Head and Neck Squamous Cell Carcinoma TCGA-HNSC \n", - "6 Head and Neck Squamous Cell Carcinoma TCGA-HNSC \n", - "7 Head and Neck Squamous Cell Carcinoma TCGA-HNSC \n", - "8 Head and Neck Squamous Cell Carcinoma TCGA-HNSC \n", - "9 Head and Neck Squamous Cell Carcinoma TCGA-HNSC \n", - "\n", - " demo__demographic_id demo__gender \\\n", - "0 2611cb61-6d05-5286-b94a-ce6cac2ba37b male \n", - "1 97a7f69b-0f40-5450-bbeb-92084a100a9d male \n", - "2 4bc58619-47fc-5c2d-aaec-9d9e562e049b male \n", - "3 be41a712-ebee-52e1-907c-80b1917daa45 male \n", - "4 92d1d967-c8a0-52cb-a62d-1d11bdf85068 female \n", - "5 2fd1a926-7584-50d5-b6b7-9b9d02710f47 female \n", - "6 2a3f5bb4-3606-5549-8d85-ec413eadd7ab male \n", - "7 604e3dac-30be-589d-b622-df0b41cd9a7f female \n", - "8 83e5c705-bd2e-5516-9700-ed3803dde268 female \n", - "9 fd1e46fb-43bb-54ae-b713-a579ba857ed4 female \n", - "\n", - " demo__race ... exp__bmi exp__years_smoked \\\n", - "0 black or african american ... NaN NaN \n", - "1 white ... NaN NaN \n", - "2 white ... NaN NaN \n", - "3 white ... NaN NaN \n", - "4 black or african american ... NaN NaN \n", - "5 white ... NaN NaN \n", - "6 black or african american ... NaN NaN \n", - "7 white ... NaN NaN \n", - "8 white ... NaN NaN \n", - "9 black or african american ... NaN NaN \n", - "\n", - " exp__pack_years_smoked exp__cigarettes_per_day exp__alcohol_history \\\n", - "0 15.0 0.821918 Yes \n", - "1 26.0 1.424658 Yes \n", - "2 5.0 0.273973 Yes \n", - "3 NaN NaN Yes \n", - "4 NaN NaN Yes \n", - "5 NaN NaN No \n", - "6 NaN NaN No \n", - "7 81.0 4.438356 Yes \n", - "8 NaN NaN Yes \n", - "9 80.0 4.383562 Yes \n", - "\n", - " exp__state exp__created_datetime exp__updated_datetime \\\n", - "0 released None 2019-07-31T18:43:25.167078-05:00 \n", - "1 released None 2019-07-31T19:39:51.442671-05:00 \n", - "2 released None 2019-07-31T19:30:27.901248-05:00 \n", - "3 released None 2019-07-31T19:40:20.032260-05:00 \n", - "4 released None 2019-07-31T19:52:06.976359-05:00 \n", - "5 released None 2019-07-31T19:55:16.152855-05:00 \n", - "6 released None 2019-07-31T19:48:25.311492-05:00 \n", - "7 released None 2019-07-31T19:48:40.594893-05:00 \n", - "8 released None 2019-07-31T19:49:42.057478-05:00 \n", - "9 released None 2019-07-31T19:48:22.125112-05:00 \n", - "\n", - " state updated_datetime \n", - "0 released 2019-08-06T14:25:25.511101-05:00 \n", - "1 released 2019-08-06T14:25:25.511101-05:00 \n", - "2 released 2019-08-06T14:25:39.854271-05:00 \n", - "3 released 2019-08-06T14:26:05.315718-05:00 \n", - "4 released 2019-08-06T14:26:05.315718-05:00 \n", - "5 released 2019-08-06T14:26:16.536997-05:00 \n", - "6 released 2019-08-06T14:26:28.608672-05:00 \n", - "7 released 2019-08-06T14:26:39.780396-05:00 \n", - "8 released 2019-08-06T14:27:02.392779-05:00 \n", - "9 released 2019-08-06T14:27:02.392779-05:00 \n", - "\n", - "[10 rows x 70 columns]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sql=\"\"\"SELECT *\n", - "FROM `isb-cgc-bq.TCGA_versioned.clinical_gdc_r24`\n", - "LIMIT 10\"\"\"\n", - "vn.run_sql(sql=sql)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Run as a Web App\n", - "If you would like to use this functionality in a web app, you can deploy the Vanna Streamlit app and use your own secrets. See [this repo](https://github.com/vanna-ai/vanna-streamlit)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/vn-connect-to-postgres.ipynb b/notebooks/vn-connect-to-postgres.ipynb deleted file mode 100644 index 64eae9b0..00000000 --- a/notebooks/vn-connect-to-postgres.ipynb +++ /dev/null @@ -1,1336 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Vanna AI](https://img.vanna.ai/vanna-ask.svg)\n", - "\n", - "The following notebook goes through the process of connecting to your postgres database and running sql queries usig Vanna AI. Here we use a demo connection(https://rnacentral.org/help/public-database)\n", - "\n", - "# Install Vanna\n", - "First we install Vanna from [PyPI](https://pypi.org/project/vanna/) and import it.\n", - "Here, we'll install vanna with extra postgres. If you're using a different database, you'll need to install the appropriate extras." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install vanna[postgres]" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import vanna as vn" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Set Database Connection\n", - "These details are only referenced within your notebook. These database credentials are never sent to Vanna's severs.\n", - "You need to set:\n", - "`Host`\n", - "`DATABASE`\n", - "`PG_USER`\n", - "`PASSWORD`\n", - "`PORT`\n", - "in your environment. Example connection you can use: `HOST=hh-pgsql-public.ebi.ac.uk` `DATABASE=pfmegrnargs` `PG_USER=reader` `PASSWORD=NWDMCE5xdipIjRrp` `PORT=5432`" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "vn.connect_to_postgres()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or we can provide credentials as parameters `host` `dbname` `user` `password` `port` in above method." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Get Results\n", - "This gets the SQL run it and prints it's result as a dataframe. Note that we use your connection string to execute the SQL on your warehouse from your local instance. Your connection nor your data gets sent to Vanna's servers. For more info on how Vanna works, [see this post](https://medium.com/vanna-ai/how-vanna-works-how-to-train-it-data-security-8d8f2008042). We will be using example sql below. Note: below SQL only works for the above demo connection." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idtimestampuserstampdescrcurrent_releasefull_descralivefor_releasedisplay_nameproject_idavg_lengthmin_lengthmax_lengthnum_sequencesnum_organisms
052017-05-17 00:00:00.000000RNACENVEGA98VEGANNoneVEGAPRJEB4568NaNNaNNaN00
112017-05-01 00:00:00.000000RNACENENA731ENAYNoneENANone412.010.0900074.012086180814855
2262017-05-01 00:00:00.000000RNACENGENCODE450GENCODENNoneGENCODENone889.032.0205012.0476772
332017-05-01 00:00:00.000000RNACENSRPDB732SRPDBYNoneSRPDBPRJEB4384173.030.0533.0503684
4152017-05-02 00:00:00.000000RNACENWORMBASE735WormBaseYNoneWormBasePRJNA13758174.017.084141.0261161
5242017-05-02 00:00:00.000000RNACENFLYBASE739FlyBaseYNoneFlyBasePRJ_FLY765.018.021216.042101
6142017-05-01 00:00:00.000000RNACENTAIR720TAIRYNoneTAIRPRJ_TAIR384.019.06227.044061
722017-05-01 00:00:00.000000RNACENRFAM635RFAMYNoneRfamNone135.024.011047.0187208114735
8252017-05-11 00:00:00.000000RNACENENSEMBL721EnsemblYNoneEnsemblNone908.020.0347561.01294678264
9522022-12-21 11:20:36.071013RNACENRIBOCENTRE729RibocentreYNoneRibocentreNone67.028.01619.01517705536
10532023-01-24 11:56:51.648817RNACENEVLNCRNAS730EVLncRNAsYNoneEVLncRNAsNone2311.0199.0205012.09333
1162017-05-01 00:00:00.000000RNACENTMRNA_WEB414tmRNA WebsiteYNonetmRNA WebsitePRJEB4570335.023.0644.028577560
12512022-09-22 15:14:59.500143RNACENEXPRESSION_ATLAS636Expression AtlasYNoneExpression AtlasNone953.072.032709.0110303
13352017-05-01 00:00:00.000000RNACENENSEMBL_PROTISTS724Ensembl ProtistsYNoneEnsembl ProtistsNone212.011.07940.0526132
14362017-05-01 00:00:00.000000RNACENENSEMBL_FUNGI725Ensembl FungiYNoneEnsembl FungiNone210.019.016569.01581762
15222017-05-01 00:00:00.000000RNACENMODOMICS92ModomicsYNoneModomicsNone140.054.05025.031960
16202017-05-01 00:00:00.000000RNACENLNCIPEDIA612LNCipediaYNoneLNCipediaNone1534.0200.0152544.01268761
17282017-05-01 00:00:00.000000RNACENRGD194Rat Genome DatabaseYNoneRGDNone2340.049.027956.0111241
18272017-10-23 00:00:00.000000RNACENMGI174Mouse Genome DatabaseYNoneMGINone851.021.084395.0167191
19502022-08-16 15:52:33.990145RNACENPLNCDB606PLncDBYNonePLncDBNone6659.0199.0985945.093692680
20492017-05-01 00:00:00.000000RNACENRIBOVISION560RiboVisionYNoneRiboVisionNone1676.030.05070.03615
21422017-05-01 00:00:00.000000RNACENINTACT740IntActYNoneIntActNone705.018.093092.03869
22482017-05-01 00:00:00.000000RNACENPSICQUIC632PSICQUICYNonePSICQUICNone2251.021.084395.0958
23342017-05-01 00:00:00.000000RNACENENSEMBL_METAZOA723Ensembl MetazoaYNoneEnsembl MetazoaNone712.018.046956.0285241152
24402017-05-01 00:00:00.000000RNACENMALACARDS726MalaCardsYNoneMalaCardsNone1861.016.0220253.0571291
25412017-05-01 00:00:00.000000RNACENGENECARDS727MalaCardsYNoneGeneCardsNone1301.016.0347561.05153651
26472017-05-01 00:00:00.000000RNACENENSEMBL_GENCODE728ENSEMBL_GENCODEYNoneEnsembl/GENCODENone1274.032.0347561.0760952
27192017-05-01 00:00:00.000000RNACENDICTYBASE86dictyBaseYNonedictyBasePRJ_DICTY82.032.01060.01491
28122017-05-01 00:00:00.000000RNACENSNOPY511snOPYYNonesnOPYPRJEB8122117.042.01004.025017
29462017-05-01 00:00:00.000000RNACENPIRBASE485piRBaseYNonepiRBaseNone28.015.040.020082717
30452017-05-01 00:00:00.000000RNACENCRW593CRWYNoneCRWNone1365.0107.04381.0934685
3182017-05-01 00:00:00.000000RNACENGTRNADB733GtRNAdbYNoneGtRNAdbPRJEB517376.053.0356.0930984337
3292017-05-01 00:00:00.000000RNACENREFSEQ719RefSeqYNoneRefSeqNone637.015.091671.010797622247
33312017-05-01 00:00:00.000000RNACENENSEMBL_PLANTS722Ensembl PlantsYNoneEnsembl PlantsNone279.015.079788.07642859
34432017-05-01 00:00:00.000000RNACENSNORNADB446snoRNA DatabaseYNonesnoRNA DatabaseNone50.045.074.068010
35102017-05-01 00:00:00.000000RNACENRDP85RDPYNoneRDPNone1536.01337.01600.047792487
3672017-05-01 00:00:00.000000RNACENLNCRNADB464lncRNAdbYNonelncRNAdbPRJEB62383086.061.032753.06210
37392017-05-01 00:00:00.000000RNACENMIRGENEDB559MirGeneDBYNoneMirGeneDBNone41.020.0282.01890175
38172017-05-01 00:00:00.000000RNACENSILVA610SILVAYNoneSILVANone1080.0300.04997.08193988665540
39302017-05-01 00:00:00.000000RNACENZWD615ZWDYNoneZWDNone86.021.0951.0443326763
40332017-05-01 00:00:00.000000RNACENLNCBOOK616LncBookYNoneLncBookNone1686.054.0205012.03225521
41112017-05-01 00:00:00.000000RNACENPDBE734PDBeYNonePDBeNone591.010.019000.03760382
42162017-05-01 00:00:00.000000RNACENSGD736SGDYNoneSGDPRJ_SGD243.058.06858.02121
43182017-05-01 00:00:00.000000RNACENPOMBASE737PomBaseYNonePomBasePRJNA13836179.047.03485.02001
44232017-05-01 00:00:00.000000RNACENHGNC738HUGO Gene Nomenclature CommitteeYNoneHGNCNone1058.033.0205012.084381
45442017-05-01 00:00:00.000000RNACENZFIN741ZFINYNoneZFINNone907.083.013525.010251
46372017-05-01 00:00:00.000000RNACENSNODB444snoDBYNonesnoDBNone117.033.0791.019701
47132017-05-01 00:00:00.000000RNACENGREENGENES71GreengenesYNoneGreengenesNone1403.01253.02368.0100489292684
48382017-05-01 00:00:00.000000RNACEN5SRRNADB3875SrRNAdbYNone5SrRNAdbNone120.095.0180.094877158
49322017-05-01 00:00:00.000000RNACENLNCBASE248LncBaseYNoneLncBaseNone22.017.026.011512
50292017-05-01 00:00:00.000000RNACENTARBASE223TarBaseYNoneTarBaseNone22.016.027.012912
5142017-05-01 00:00:00.000000RNACENMIRBASE435MIRBASEYNonemiRBasePRJEB445155.015.02354.065389271
52212017-05-02 00:00:00.000000RNACENNONCODE146NONCODEYNoneNONCODENone1130.0201.0244296.02346697
\n", - "
" - ], - "text/plain": [ - " id timestamp userstamp descr \\\n", - "0 5 2017-05-17 00:00:00.000000 RNACEN VEGA \n", - "1 1 2017-05-01 00:00:00.000000 RNACEN ENA \n", - "2 26 2017-05-01 00:00:00.000000 RNACEN GENCODE \n", - "3 3 2017-05-01 00:00:00.000000 RNACEN SRPDB \n", - "4 15 2017-05-02 00:00:00.000000 RNACEN WORMBASE \n", - "5 24 2017-05-02 00:00:00.000000 RNACEN FLYBASE \n", - "6 14 2017-05-01 00:00:00.000000 RNACEN TAIR \n", - "7 2 2017-05-01 00:00:00.000000 RNACEN RFAM \n", - "8 25 2017-05-11 00:00:00.000000 RNACEN ENSEMBL \n", - "9 52 2022-12-21 11:20:36.071013 RNACEN RIBOCENTRE \n", - "10 53 2023-01-24 11:56:51.648817 RNACEN EVLNCRNAS \n", - "11 6 2017-05-01 00:00:00.000000 RNACEN TMRNA_WEB \n", - "12 51 2022-09-22 15:14:59.500143 RNACEN EXPRESSION_ATLAS \n", - "13 35 2017-05-01 00:00:00.000000 RNACEN ENSEMBL_PROTISTS \n", - "14 36 2017-05-01 00:00:00.000000 RNACEN ENSEMBL_FUNGI \n", - "15 22 2017-05-01 00:00:00.000000 RNACEN MODOMICS \n", - "16 20 2017-05-01 00:00:00.000000 RNACEN LNCIPEDIA \n", - "17 28 2017-05-01 00:00:00.000000 RNACEN RGD \n", - "18 27 2017-10-23 00:00:00.000000 RNACEN MGI \n", - "19 50 2022-08-16 15:52:33.990145 RNACEN PLNCDB \n", - "20 49 2017-05-01 00:00:00.000000 RNACEN RIBOVISION \n", - "21 42 2017-05-01 00:00:00.000000 RNACEN INTACT \n", - "22 48 2017-05-01 00:00:00.000000 RNACEN PSICQUIC \n", - "23 34 2017-05-01 00:00:00.000000 RNACEN ENSEMBL_METAZOA \n", - "24 40 2017-05-01 00:00:00.000000 RNACEN MALACARDS \n", - "25 41 2017-05-01 00:00:00.000000 RNACEN GENECARDS \n", - "26 47 2017-05-01 00:00:00.000000 RNACEN ENSEMBL_GENCODE \n", - "27 19 2017-05-01 00:00:00.000000 RNACEN DICTYBASE \n", - "28 12 2017-05-01 00:00:00.000000 RNACEN SNOPY \n", - "29 46 2017-05-01 00:00:00.000000 RNACEN PIRBASE \n", - "30 45 2017-05-01 00:00:00.000000 RNACEN CRW \n", - "31 8 2017-05-01 00:00:00.000000 RNACEN GTRNADB \n", - "32 9 2017-05-01 00:00:00.000000 RNACEN REFSEQ \n", - "33 31 2017-05-01 00:00:00.000000 RNACEN ENSEMBL_PLANTS \n", - "34 43 2017-05-01 00:00:00.000000 RNACEN SNORNADB \n", - "35 10 2017-05-01 00:00:00.000000 RNACEN RDP \n", - "36 7 2017-05-01 00:00:00.000000 RNACEN LNCRNADB \n", - "37 39 2017-05-01 00:00:00.000000 RNACEN MIRGENEDB \n", - "38 17 2017-05-01 00:00:00.000000 RNACEN SILVA \n", - "39 30 2017-05-01 00:00:00.000000 RNACEN ZWD \n", - "40 33 2017-05-01 00:00:00.000000 RNACEN LNCBOOK \n", - "41 11 2017-05-01 00:00:00.000000 RNACEN PDBE \n", - "42 16 2017-05-01 00:00:00.000000 RNACEN SGD \n", - "43 18 2017-05-01 00:00:00.000000 RNACEN POMBASE \n", - "44 23 2017-05-01 00:00:00.000000 RNACEN HGNC \n", - "45 44 2017-05-01 00:00:00.000000 RNACEN ZFIN \n", - "46 37 2017-05-01 00:00:00.000000 RNACEN SNODB \n", - "47 13 2017-05-01 00:00:00.000000 RNACEN GREENGENES \n", - "48 38 2017-05-01 00:00:00.000000 RNACEN 5SRRNADB \n", - "49 32 2017-05-01 00:00:00.000000 RNACEN LNCBASE \n", - "50 29 2017-05-01 00:00:00.000000 RNACEN TARBASE \n", - "51 4 2017-05-01 00:00:00.000000 RNACEN MIRBASE \n", - "52 21 2017-05-02 00:00:00.000000 RNACEN NONCODE \n", - "\n", - " current_release full_descr alive for_release \\\n", - "0 98 VEGA N None \n", - "1 731 ENA Y None \n", - "2 450 GENCODE N None \n", - "3 732 SRPDB Y None \n", - "4 735 WormBase Y None \n", - "5 739 FlyBase Y None \n", - "6 720 TAIR Y None \n", - "7 635 RFAM Y None \n", - "8 721 Ensembl Y None \n", - "9 729 Ribocentre Y None \n", - "10 730 EVLncRNAs Y None \n", - "11 414 tmRNA Website Y None \n", - "12 636 Expression Atlas Y None \n", - "13 724 Ensembl Protists Y None \n", - "14 725 Ensembl Fungi Y None \n", - "15 92 Modomics Y None \n", - "16 612 LNCipedia Y None \n", - "17 194 Rat Genome Database Y None \n", - "18 174 Mouse Genome Database Y None \n", - "19 606 PLncDB Y None \n", - "20 560 RiboVision Y None \n", - "21 740 IntAct Y None \n", - "22 632 PSICQUIC Y None \n", - "23 723 Ensembl Metazoa Y None \n", - "24 726 MalaCards Y None \n", - "25 727 MalaCards Y None \n", - "26 728 ENSEMBL_GENCODE Y None \n", - "27 86 dictyBase Y None \n", - "28 511 snOPY Y None \n", - "29 485 piRBase Y None \n", - "30 593 CRW Y None \n", - "31 733 GtRNAdb Y None \n", - "32 719 RefSeq Y None \n", - "33 722 Ensembl Plants Y None \n", - "34 446 snoRNA Database Y None \n", - "35 85 RDP Y None \n", - "36 464 lncRNAdb Y None \n", - "37 559 MirGeneDB Y None \n", - "38 610 SILVA Y None \n", - "39 615 ZWD Y None \n", - "40 616 LncBook Y None \n", - "41 734 PDBe Y None \n", - "42 736 SGD Y None \n", - "43 737 PomBase Y None \n", - "44 738 HUGO Gene Nomenclature Committee Y None \n", - "45 741 ZFIN Y None \n", - "46 444 snoDB Y None \n", - "47 71 Greengenes Y None \n", - "48 387 5SrRNAdb Y None \n", - "49 248 LncBase Y None \n", - "50 223 TarBase Y None \n", - "51 435 MIRBASE Y None \n", - "52 146 NONCODE Y None \n", - "\n", - " display_name project_id avg_length min_length max_length \\\n", - "0 VEGA PRJEB4568 NaN NaN NaN \n", - "1 ENA None 412.0 10.0 900074.0 \n", - "2 GENCODE None 889.0 32.0 205012.0 \n", - "3 SRPDB PRJEB4384 173.0 30.0 533.0 \n", - "4 WormBase PRJNA13758 174.0 17.0 84141.0 \n", - "5 FlyBase PRJ_FLY 765.0 18.0 21216.0 \n", - "6 TAIR PRJ_TAIR 384.0 19.0 6227.0 \n", - "7 Rfam None 135.0 24.0 11047.0 \n", - "8 Ensembl None 908.0 20.0 347561.0 \n", - "9 Ribocentre None 67.0 28.0 1619.0 \n", - "10 EVLncRNAs None 2311.0 199.0 205012.0 \n", - "11 tmRNA Website PRJEB4570 335.0 23.0 644.0 \n", - "12 Expression Atlas None 953.0 72.0 32709.0 \n", - "13 Ensembl Protists None 212.0 11.0 7940.0 \n", - "14 Ensembl Fungi None 210.0 19.0 16569.0 \n", - "15 Modomics None 140.0 54.0 5025.0 \n", - "16 LNCipedia None 1534.0 200.0 152544.0 \n", - "17 RGD None 2340.0 49.0 27956.0 \n", - "18 MGI None 851.0 21.0 84395.0 \n", - "19 PLncDB None 6659.0 199.0 985945.0 \n", - "20 RiboVision None 1676.0 30.0 5070.0 \n", - "21 IntAct None 705.0 18.0 93092.0 \n", - "22 PSICQUIC None 2251.0 21.0 84395.0 \n", - "23 Ensembl Metazoa None 712.0 18.0 46956.0 \n", - "24 MalaCards None 1861.0 16.0 220253.0 \n", - "25 GeneCards None 1301.0 16.0 347561.0 \n", - "26 Ensembl/GENCODE None 1274.0 32.0 347561.0 \n", - "27 dictyBase PRJ_DICTY 82.0 32.0 1060.0 \n", - "28 snOPY PRJEB8122 117.0 42.0 1004.0 \n", - "29 piRBase None 28.0 15.0 40.0 \n", - "30 CRW None 1365.0 107.0 4381.0 \n", - "31 GtRNAdb PRJEB5173 76.0 53.0 356.0 \n", - "32 RefSeq None 637.0 15.0 91671.0 \n", - "33 Ensembl Plants None 279.0 15.0 79788.0 \n", - "34 snoRNA Database None 50.0 45.0 74.0 \n", - "35 RDP None 1536.0 1337.0 1600.0 \n", - "36 lncRNAdb PRJEB6238 3086.0 61.0 32753.0 \n", - "37 MirGeneDB None 41.0 20.0 282.0 \n", - "38 SILVA None 1080.0 300.0 4997.0 \n", - "39 ZWD None 86.0 21.0 951.0 \n", - "40 LncBook None 1686.0 54.0 205012.0 \n", - "41 PDBe None 591.0 10.0 19000.0 \n", - "42 SGD PRJ_SGD 243.0 58.0 6858.0 \n", - "43 PomBase PRJNA13836 179.0 47.0 3485.0 \n", - "44 HGNC None 1058.0 33.0 205012.0 \n", - "45 ZFIN None 907.0 83.0 13525.0 \n", - "46 snoDB None 117.0 33.0 791.0 \n", - "47 Greengenes None 1403.0 1253.0 2368.0 \n", - "48 5SrRNAdb None 120.0 95.0 180.0 \n", - "49 LncBase None 22.0 17.0 26.0 \n", - "50 TarBase None 22.0 16.0 27.0 \n", - "51 miRBase PRJEB4451 55.0 15.0 2354.0 \n", - "52 NONCODE None 1130.0 201.0 244296.0 \n", - "\n", - " num_sequences num_organisms \n", - "0 0 0 \n", - "1 12086180 814855 \n", - "2 47677 2 \n", - "3 503 684 \n", - "4 26116 1 \n", - "5 4210 1 \n", - "6 4406 1 \n", - "7 1872081 14735 \n", - "8 1294678 264 \n", - "9 151770 5536 \n", - "10 933 3 \n", - "11 2857 7560 \n", - "12 11030 3 \n", - "13 5261 32 \n", - "14 15817 62 \n", - "15 319 60 \n", - "16 126876 1 \n", - "17 11124 1 \n", - "18 16719 1 \n", - "19 936926 80 \n", - "20 36 15 \n", - "21 386 9 \n", - "22 95 8 \n", - "23 285241 152 \n", - "24 57129 1 \n", - "25 515365 1 \n", - "26 76095 2 \n", - "27 149 1 \n", - "28 2501 7 \n", - "29 200827 17 \n", - "30 934 685 \n", - "31 93098 4337 \n", - "32 107976 22247 \n", - "33 76428 59 \n", - "34 680 10 \n", - "35 4779 2487 \n", - "36 62 10 \n", - "37 18901 75 \n", - "38 8193988 665540 \n", - "39 44332 6763 \n", - "40 322552 1 \n", - "41 3760 382 \n", - "42 212 1 \n", - "43 200 1 \n", - "44 8438 1 \n", - "45 1025 1 \n", - "46 1970 1 \n", - "47 1004892 92684 \n", - "48 9487 7158 \n", - "49 1151 2 \n", - "50 1291 2 \n", - "51 65389 271 \n", - "52 234669 7 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vn.run_sql(sql=\"SELECT * FROM rnc_database\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Run as a Web App\n", - "If you would like to use this functionality in a web app, you can deploy the Vanna Streamlit app and use your own secrets. See [this repo](https://github.com/vanna-ai/vanna-streamlit)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/vn-train.ipynb b/notebooks/vn-train.ipynb deleted file mode 100644 index 56428bf9..00000000 --- a/notebooks/vn-train.ipynb +++ /dev/null @@ -1,394 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "# Install Vanna\n", - "First we install Vanna from [PyPI](https://pypi.org/project/vanna/) and import it.\n", - "Here, we'll also install the Snowflake connector. If you're using a different database, you'll need to install the appropriate connector." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install vanna\n", - "%pip install snowflake-connector-python" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import vanna as vn\n", - "import snowflake.connector" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Login\n", - "Creating a login and getting an API key is as easy as entering your email (after you run this cell) and entering the code we send to you. Check your Spam folder if you don't see the code." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "api_key = vn.get_api_key('my-email@example.com')\n", - "vn.set_api_key(api_key)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Set your Model\n", - "You need to choose a globally unique model name. Try using your company name or another unique string. All data from models are isolated - there's no leakage." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "vn.set_model('my-model') # Enter your model name here. This is a globally unique identifier for your model." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Automatic Training\n", - "If you'd like to use automatic training, the Vanna package can crawl your database to fetch metadata to train your model. You can put in your Snowflake credentials here. These details are only referenced within your notebook. These database credentials are never sent to Vanna's severs." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "vn.connect_to_snowflake(account='my-account', username='my-username', password='my-password', database='my-database')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Trying query history\n", - "Trying INFORMATION_SCHEMA.COLUMNS for SNOWFLAKE_SAMPLE_DATA\n" - ] - }, - { - "data": { - "text/plain": [ - "Train on SQL: What are the top 10 customers ranked by total sales?\n", - "Train on SQL: What are the top 10 customers in terms of total sales?\n", - "Train on SQL: What are the top two customers with the highest total sales for each region?\n", - "Train on SQL: What are the top 5 customers with the highest total sales?\n", - "Train on SQL: What is the total quantity of each product sold in each region, ordered by region name and total quantity in descending order?\n", - "Train on SQL: What is the number of orders for each week, starting from the most recent week?\n", - "Train on SQL: What countries are in the region 'EUROPE'?\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 SUPPLIER\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 LINEITEM\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 CUSTOMER\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 PARTSUPP\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 PART\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 ORDERS\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 REGION\n", - "Train on Information Schema: SNOWFLAKE_SAMPLE_DATA.TPCH_SF1 NATION" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "training_plan = vn.get_training_plan_experimental(filter_databases=['SNOWFLAKE_SAMPLE_DATA'], filter_schemas=['TPCH_SF1'])\n", - "training_plan" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.train(plan=training_plan)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# View Training Data\n", - "At any time you can see what training data is in your model" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idtraining_data_typequestioncontent
015-docdocumentationNoneThis is a table in the PARTSUPP table.\\n\\nThe ...
111-docdocumentationNoneThis is a table in the CUSTOMER table.\\n\\nThe ...
214-docdocumentationNoneThis is a table in the ORDERS table.\\n\\nThe fo...
31244-sqlsqlWhat are the names of the top 10 customers?SELECT c.c_name as customer_name\\nFROM snowf...
41242-sqlsqlWhat are the top 5 customers in terms of total...SELECT c.c_name AS customer_name, SUM(l.l_quan...
517-docdocumentationNoneThis is a table in the REGION table.\\n\\nThe fo...
616-docdocumentationNoneThis is a table in the PART table.\\n\\nThe foll...
71243-sqlsqlWhat are the top 10 customers with the highest...SELECT c.c_name as customer_name,\\n sum(...
81239-sqlsqlWhat are the top 100 customers based on their ...SELECT c.c_name as customer_name,\\n sum(...
913-docdocumentationNoneThis is a table in the SUPPLIER table.\\n\\nThe ...
101241-sqlsqlWhat are the top 10 customers in terms of tota...SELECT c.c_name as customer_name,\\n sum(...
1112-docdocumentationNoneThis is a table in the LINEITEM table.\\n\\nThe ...
1218-docdocumentationNoneThis is a table in the NATION table.\\n\\nThe fo...
131248-sqlsqlHow many customers are in each country?SELECT n.n_name as country,\\n count(*) a...
141240-sqlsqlWhat is the number of orders placed each week?SELECT date_trunc('week', o_orderdate) as week...
\n", - "
" - ], - "text/plain": [ - " id training_data_type \\\n", - "0 15-doc documentation \n", - "1 11-doc documentation \n", - "2 14-doc documentation \n", - "3 1244-sql sql \n", - "4 1242-sql sql \n", - "5 17-doc documentation \n", - "6 16-doc documentation \n", - "7 1243-sql sql \n", - "8 1239-sql sql \n", - "9 13-doc documentation \n", - "10 1241-sql sql \n", - "11 12-doc documentation \n", - "12 18-doc documentation \n", - "13 1248-sql sql \n", - "14 1240-sql sql \n", - "\n", - " question \\\n", - "0 None \n", - "1 None \n", - "2 None \n", - "3 What are the names of the top 10 customers? \n", - "4 What are the top 5 customers in terms of total... \n", - "5 None \n", - "6 None \n", - "7 What are the top 10 customers with the highest... \n", - "8 What are the top 100 customers based on their ... \n", - "9 None \n", - "10 What are the top 10 customers in terms of tota... \n", - "11 None \n", - "12 None \n", - "13 How many customers are in each country? \n", - "14 What is the number of orders placed each week? \n", - "\n", - " content \n", - "0 This is a table in the PARTSUPP table.\\n\\nThe ... \n", - "1 This is a table in the CUSTOMER table.\\n\\nThe ... \n", - "2 This is a table in the ORDERS table.\\n\\nThe fo... \n", - "3 SELECT c.c_name as customer_name\\nFROM snowf... \n", - "4 SELECT c.c_name AS customer_name, SUM(l.l_quan... \n", - "5 This is a table in the REGION table.\\n\\nThe fo... \n", - "6 This is a table in the PART table.\\n\\nThe foll... \n", - "7 SELECT c.c_name as customer_name,\\n sum(... \n", - "8 SELECT c.c_name as customer_name,\\n sum(... \n", - "9 This is a table in the SUPPLIER table.\\n\\nThe ... \n", - "10 SELECT c.c_name as customer_name,\\n sum(... \n", - "11 This is a table in the LINEITEM table.\\n\\nThe ... \n", - "12 This is a table in the NATION table.\\n\\nThe fo... \n", - "13 SELECT n.n_name as country,\\n count(*) a... \n", - "14 SELECT date_trunc('week', o_orderdate) as week... " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vn.get_training_data()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Removing Training Data\n", - "If you added some training data by mistake, you can remove it. Model performance is directly linked to the quality of the training data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vn.remove_training_data(id='my-training-data-id')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.2" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/pyproject.toml b/pyproject.toml index 6c84fa76..892047b8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi" [project] name = "vanna" -version = "0.1.1" +version = "0.2.0" authors = [ { name="Zain Hoda", email="zain@vanna.ai" }, ] @@ -30,7 +30,7 @@ postgres = ["psycopg2-binary", "db-dtypes"] bigquery = ["google-cloud-bigquery"] snowflake = ["snowflake-connector-python"] duckdb = ["duckdb"] -all = ["psycopg2-binary", "db-dtypes", "google-cloud-bigquery", "snowflake-connector-python", "duckdb", "openai", "mistralai"] +all = ["psycopg2-binary", "db-dtypes", "google-cloud-bigquery", "snowflake-connector-python", "duckdb", "openai", "mistralai", "chromadb"] test = ["tox"] chromadb = ["chromadb"] openai = ["openai"] diff --git a/tests/test_vanna.py b/tests/test_vanna.py index c70aae4f..1bf0e40a 100644 --- a/tests/test_vanna.py +++ b/tests/test_vanna.py @@ -51,4 +51,25 @@ def test_vn_mistral(): def test_vn_default(): sql = vn_default.generate_sql("What are the top 6 customers by sales?") df = vn_default.run_sql(sql) - assert len(df) == 6 \ No newline at end of file + assert len(df) == 6 + +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_chroma = MyVanna(config={'api_key': OPENAI_API_KEY, 'model': 'gpt-3.5-turbo'}) +vn_chroma.connect_to_sqlite('https://vanna.ai/Chinook.sqlite') + +def test_vn_chroma(): + df_ddl = vn_chroma.run_sql("SELECT type, sql FROM sqlite_master WHERE sql is not null") + + for ddl in df_ddl['sql'].to_list(): + vn_chroma.train(ddl=ddl) + + sql = vn_chroma.generate_sql("What are the top 7 customers by sales?") + df = vn_chroma.run_sql(sql) + assert len(df) == 7 \ No newline at end of file