feat: version 1
Browse files
app.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
from llm import load_llm, response_generator
|
| 3 |
-
from sql import csv_to_sqlite
|
| 4 |
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
#
|
| 9 |
-
filename = "qwen2.5-0.5b-instruct-q8_0.gguf"
|
| 10 |
|
| 11 |
llm = load_llm(repo_id, filename)
|
| 12 |
|
|
@@ -38,7 +38,12 @@ for message in st.session_state.messages:
|
|
| 38 |
st.markdown(message["content"])
|
| 39 |
|
| 40 |
# Accept user input
|
| 41 |
-
if prompt := st.chat_input(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
# Add user message to chat history
|
| 43 |
st.session_state.messages.append({"role": "user", "content": prompt})
|
| 44 |
# Display user message in chat message container
|
|
@@ -47,14 +52,17 @@ if prompt := st.chat_input("What is up?"):
|
|
| 47 |
|
| 48 |
# Display assistant response in chat message container
|
| 49 |
with st.chat_message("assistant"):
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
question=prompt,
|
| 57 |
-
)
|
| 58 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
# Add assistant response to chat history
|
| 60 |
-
st.session_state.messages.append({"role": "assistant", "content":
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
from llm import load_llm, response_generator
|
| 3 |
+
from sql import csv_to_sqlite, run_sql_query
|
| 4 |
|
| 5 |
|
| 6 |
+
repo_id = "Qwen/Qwen2.5-Coder-1.5B-Instruct-GGUF"
|
| 7 |
+
filename = "qwen2.5-coder-1.5b-instruct-q8_0.gguf"
|
| 8 |
+
# repo_id = "Qwen/Qwen2.5-0.5B-Instruct-GGUF"
|
| 9 |
+
# filename = "qwen2.5-0.5b-instruct-q8_0.gguf"
|
| 10 |
|
| 11 |
llm = load_llm(repo_id, filename)
|
| 12 |
|
|
|
|
| 38 |
st.markdown(message["content"])
|
| 39 |
|
| 40 |
# Accept user input
|
| 41 |
+
if prompt := st.chat_input(
|
| 42 |
+
"What is up?",
|
| 43 |
+
disabled=(
|
| 44 |
+
not "db_name" in st.session_state or not "table_name" in st.session_state
|
| 45 |
+
),
|
| 46 |
+
):
|
| 47 |
# Add user message to chat history
|
| 48 |
st.session_state.messages.append({"role": "user", "content": prompt})
|
| 49 |
# Display user message in chat message container
|
|
|
|
| 52 |
|
| 53 |
# Display assistant response in chat message container
|
| 54 |
with st.chat_message("assistant"):
|
| 55 |
+
response_sql = response_generator(
|
| 56 |
+
db_name=st.session_state.db_name,
|
| 57 |
+
table_name=st.session_state.table_name,
|
| 58 |
+
llm=llm,
|
| 59 |
+
messages=st.session_state.messages,
|
| 60 |
+
question=prompt,
|
|
|
|
|
|
|
| 61 |
)
|
| 62 |
+
response = st.markdown(response_sql)
|
| 63 |
+
result = run_sql_query(db_name=st.session_state.db_name, query=response_sql)
|
| 64 |
+
st.markdown(result)
|
| 65 |
+
st.table(result)
|
| 66 |
+
|
| 67 |
# Add assistant response to chat history
|
| 68 |
+
st.session_state.messages.append({"role": "assistant", "content": response_sql})
|
data/sales.csv
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Date,Product,Category,Quantity,Unit_Price,Total,Customer,Region
|
| 2 |
+
2024-01-15,Laptop Pro X,Electronics,2,999.99,1999.98,John Smith,West
|
| 3 |
+
2024-01-15,Wireless Mouse,Accessories,5,24.99,124.95,Maria Garcia,South
|
| 4 |
+
2024-01-16,Desktop Monitor,Electronics,3,299.99,899.97,Robert Wilson,North
|
| 5 |
+
2024-01-17,USB-C Cable,Accessories,10,12.99,129.90,Emily Chen,East
|
| 6 |
+
2024-01-17,Laptop Pro X,Electronics,1,999.99,999.99,David Brown,West
|
| 7 |
+
2024-01-18,Keyboard Elite,Accessories,4,89.99,359.96,Sarah Johnson,North
|
| 8 |
+
2024-01-18,Webcam HD,Electronics,2,79.99,159.98,James Lee,South
|
| 9 |
+
2024-01-19,Laptop Stand,Accessories,3,34.99,104.97,Lisa Anderson,East
|
| 10 |
+
2024-01-19,Desktop Monitor,Electronics,2,299.99,599.98,Michael Wong,West
|
| 11 |
+
2024-01-20,Wireless Mouse,Accessories,6,24.99,149.94,Rachel Martinez,North
|
employees
DELETED
|
Binary file (8.19 kB)
|
|
|
llm.py
CHANGED
|
@@ -19,7 +19,7 @@ def load_llm(repo_id, filename):
|
|
| 19 |
return llm
|
| 20 |
|
| 21 |
|
| 22 |
-
def
|
| 23 |
"""
|
| 24 |
Generates a prompt to provide context about a table's schema for LLM to convert natural language to SQL.
|
| 25 |
|
|
@@ -48,45 +48,27 @@ def generate_llm_prompt(table_name, table_schema):
|
|
| 48 |
return prompt
|
| 49 |
|
| 50 |
|
| 51 |
-
def generate_sql_query(question, table_name, db_name):
|
| 52 |
-
pass
|
| 53 |
-
# table_name = 'movies'
|
| 54 |
-
# db_name = 'movies_db.db'
|
| 55 |
-
# table_schema = get_table_schema(db_name, table_name)
|
| 56 |
-
# llm_prompt = generate_llm_prompt(table_name, table_schema)
|
| 57 |
-
# user_prompt = """Question: {question}"""
|
| 58 |
-
# response = completion(
|
| 59 |
-
# api_key=OPENAI_API_KEY,
|
| 60 |
-
# model="gpt-4o-mini",
|
| 61 |
-
# messages=[
|
| 62 |
-
# ,
|
| 63 |
-
# {"content": user_prompt.format(question=question),"role": "user"}],
|
| 64 |
-
# max_tokens=1000
|
| 65 |
-
# )
|
| 66 |
-
# answer = response.choices[0].message.content
|
| 67 |
-
|
| 68 |
-
# query = answer.replace("```sql", "").replace("```", "")
|
| 69 |
-
# query = query.strip()
|
| 70 |
-
# return query
|
| 71 |
-
|
| 72 |
-
|
| 73 |
# Streamed response emulator
|
| 74 |
def response_generator(llm, messages, question, table_name, db_name):
|
| 75 |
table_schema = get_table_schema(db_name, table_name)
|
| 76 |
-
llm_prompt =
|
| 77 |
-
user_prompt = """Question: {question}"""
|
| 78 |
|
| 79 |
-
messages
|
|
|
|
| 80 |
|
| 81 |
-
for val in
|
| 82 |
-
|
| 83 |
|
| 84 |
-
|
| 85 |
|
| 86 |
response = llm.create_chat_completion(
|
| 87 |
-
messages
|
|
|
|
|
|
|
|
|
|
| 88 |
)
|
| 89 |
-
answer = response["choices"][0]
|
| 90 |
|
| 91 |
query = answer.replace("```sql", "").replace("```", "")
|
| 92 |
query = query.strip()
|
|
|
|
| 19 |
return llm
|
| 20 |
|
| 21 |
|
| 22 |
+
def generate_system_prompt(table_name, table_schema):
|
| 23 |
"""
|
| 24 |
Generates a prompt to provide context about a table's schema for LLM to convert natural language to SQL.
|
| 25 |
|
|
|
|
| 48 |
return prompt
|
| 49 |
|
| 50 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
# Streamed response emulator
|
| 52 |
def response_generator(llm, messages, question, table_name, db_name):
|
| 53 |
table_schema = get_table_schema(db_name, table_name)
|
| 54 |
+
llm_prompt = generate_system_prompt(table_name, table_schema)
|
| 55 |
+
user_prompt = f"""Question: {question}"""
|
| 56 |
|
| 57 |
+
print(messages, llm_prompt, user_prompt)
|
| 58 |
+
history = [{"content": llm_prompt.format(table_name=table_name), "role": "system"}]
|
| 59 |
|
| 60 |
+
for val in messages:
|
| 61 |
+
history.append(val)
|
| 62 |
|
| 63 |
+
history.append({"role": "user", "content": user_prompt})
|
| 64 |
|
| 65 |
response = llm.create_chat_completion(
|
| 66 |
+
messages=history,
|
| 67 |
+
max_tokens=2048,
|
| 68 |
+
temperature=0.7,
|
| 69 |
+
top_p=0.95,
|
| 70 |
)
|
| 71 |
+
answer = response["choices"][0]["message"]["content"]
|
| 72 |
|
| 73 |
query = answer.replace("```sql", "").replace("```", "")
|
| 74 |
query = query.strip()
|