Secret Ninja Blog

プロダクトマネージャーしてます

雑記: StreamlitとOllamaでローカルLLMでSQLチューニングをしてみる

自分用のメモなので雑記。

Streamlitは、機械学習やデータサイエンス向けのグラフィカルなWebアプリを簡単に作成して公開できるサービスで、Snowflakeに買収されてからはSnowflakeの上でデータアプリを作れるフレームワークとしての機能だったり、LLMができてからはそのチャットUIが簡単に使えるフレームワークとして利用されている。

Ollamaは、ローカルでLLMを動かすことができるアプリケーションで、色々モデルをMacのローカルで利用できる。また、サーバとして立ち上がるので、Streamlitと組み合わせるとStreamlitの裏のLLMとして利用ができる

出来上がったものはこちら:

下記をコードを実行すると、Webアプリがたちがあり、SQLを入力するとSQL:2023のシンタックスベースで改善案を提示してくれる。

import streamlit as st # Import python packages
from langchain_community.llms import Ollama
llm = Ollama(model="llama2-uncensored:latest")
import pandas as pd

pd.set_option("max_colwidth", None)

def create_prompt(myquery):
    prompt = f"""
    'You are a SQL expert. Given the following query, provide a more optimal way to write the query based on SQL:2023 syntax.
    Original Query:
    {myquery}
    Modified Query: '
    """
    return prompt

def complete(myquery):
    prompt = create_prompt(myquery)
    df_response = llm.predict(prompt)
    return df_response

def display_response(question):
    response = complete(question)
    res_text = response
    st.markdown(res_text)

# Main code
st.title("SQL Query Optimizer :TreasureData:")
st.write("Select a cortex model from the drowpdown menu and paste your long running SQL queries below. Each model will provide an optimized query if applicable, and suggest ways you can improve and optimize the pasted SQL query.")
st.write("""
1. Copy SQL Query
2. Paste SQL query and Run Optimzer 
3. Reduce Compute costs and optimize long running queries!
""")


question = st.text_area("",placeholder="Enter your SQL query here")

if st.button("Optimize Query"):
    display_response(question)

例として下記の無駄なUnion ALLをつけてクエリを提示したところ、

SELECT id, name FROM test
where id = 1
union all
SELECT id, name FROM test
where id = 2
union all
SELECT id, name FROM test
where id = 3

IN句を使った改善案を提示してくれている。

The modified query should be written as follows based on SQL:2023 syntax:

SELECT id, name FROM test WHERE id IN (1, 2, 3)

This is because the original query was using an older version of SQL syntax and could potentially return duplicate rows for each ID. By using a subquery with IN operator instead of UNION ALL, we can ensure that only unique rows are returned.

モデルにはllama2-uncensoredを使っているがuncensoredを使っているのは特に深い意味はない。他のモデルも下記から選択できる。

ollama.com

実際にちゃんとしたチューニングをさせるには、データのメタデータだったり、統計データなんかを取りながら、SQLとその改善をイテレーションさせて、より良いものを見つける方が良い気がするが、手元でパパッと試したので雑記として残しておく。 (TDのAPIを使って、クエリ発行とかもやろうと思ったが、何もやっていない)