File size: 3,935 Bytes
fba1b46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import os, streamlit as st

from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader, LLMPredictor, PromptHelper, ServiceContext
from llama_index import SQLDatabase,ServiceContext
from llama_index.llms import OpenAI
from sqlalchemy import select, create_engine, MetaData, Table,inspect
from llama_index.indices.struct_store.sql_query import NLSQLTableQueryEngine
from llama_index.prompts.prompts import SimpleInputPrompt
import openai

openai_api_key = st.sidebar.text_input(
    label="#### Your OpenAI API key πŸ‘‡",
    placeholder="Paste your openAI API key, sk-",
    type="password")

db_user = st.sidebar.text_input(
    label="#### Enter mysql user πŸ‘‡",
    placeholder="Enter mysql username",
    type="default")
db_password = st.sidebar.text_input(
    label="#### Enter mysql password πŸ‘‡",
    placeholder="Enter mysql password",
    type="password")
db_host = st.sidebar.text_input(
    label="#### Enter mysql server address πŸ‘‡",
    placeholder="Enter mysql server address",
    type="default")
db_port = st.sidebar.text_input(
    label="#### Enter mysql server port πŸ‘‡",
    placeholder="Enter mysql server port",
    type="default")
db_name = st.sidebar.text_input(
    label="#### Enter mysql db name πŸ‘‡",
    placeholder="Enter mysql db name",
    type="default")

def get_response(question: str | list[str],synthesize_response: bool = True):
    SYSTEM_PROMPT = """You are an AI assistant that answers questions in a friendly manner, based on the given source documents. Here are some rules you always follow:
        - Generate human readable output, avoid creating output with gibberish text.
        - Generate only the requested output, don't include any other language before or after the requested output.
        - Never say thank you, that you are happy to help, that you are an AI agent, etc. Just answer directly.
        - Generate professional language typically used in business documents in North America.
        - Never generate offensive or foul language.
    """

    query_wrapper_prompt = "[INST]<<SYS>>\n" + SYSTEM_PROMPT + f"<</SYS>>\n\n {question}[/INST]"
    
    
    os.environ['OPENAI_API_KEY'] = openai_api_key
    openai.api_key = os.environ.get('OPENAI_API_KEY')
    llm = OpenAI(temperature=0.5, model="gpt-3.5-turbo-16k")
    connection_uri = f"mysql+pymysql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}"
    
    service_context = ServiceContext.from_defaults(llm=llm)
    engine = create_engine(connection_uri)
    sql_database = SQLDatabase(engine)
    
    inspector = inspect(engine)
    table_names = inspector.get_table_names()
    
    response_template = """
        ## Question

        {question}

        ## Answer
        ```
        {response}
        ```
        ## Generated SQL Query
        ```
        {sql}
        ```
     """
    query_engine = NLSQLTableQueryEngine(
        sql_database=sql_database,
        tables=table_names,
        synthesize_response=synthesize_response,
        service_context=service_context,
        )
    try:
        response = query_engine.query(query_wrapper_prompt)
        response_md = str(response)
        sql = response.metadata["sql_query"]
        st.success("""
        ## Question
        {}
        ## Answer
        {}
        ## Generated SQL Query
        {}
     """.format(question,response,sql))
    except Exception as ex:
        st.error(f"ERROR: {str(ex)}")
    
        
# Define a simple Streamlit app
st.title("DbChat")
query = st.text_input("What would you like to ask to db?", "")

# If the 'Submit' button is clicked
if st.button("Submit"):
    if not query.strip():
        st.error(f"Please provide the search query.")
    else:
        try:
            if len(openai_api_key) > 0:
                get_response(query)
            else:
                st.error(f"Enter a valid openai key")
        except Exception as e:
            st.error(f"An error occurred: {e}")