File size: 5,693 Bytes
ce3af46
 
fdc80c8
ce3af46
0e36212
ce3af46
1a1332a
ce3af46
 
 
 
e6167f8
 
 
 
 
ece1395
e6167f8
 
 
 
 
 
 
f78495c
 
 
ce3af46
 
f78495c
ce3af46
 
 
f78495c
ce3af46
f78495c
ce3af46
 
 
 
f78495c
 
 
 
 
ce3af46
f78495c
ce3af46
f78495c
 
ce3af46
f78495c
0e36212
01c5a73
0e36212
 
 
 
 
 
 
 
 
 
ced5431
0e36212
 
ce3af46
0e36212
 
ece1395
 
 
 
0e36212
 
 
 
ece1395
 
0e36212
8848e89
1a1332a
 
0e36212
1a1332a
8848e89
1a1332a
0e36212
 
 
 
 
 
 
599d161
1a1332a
 
 
8848e89
e6167f8
ca5aacd
8848e89
3c7eb9f
ce3af46
0e36212
 
 
 
ce3af46
0e36212
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ce3af46
 
 
 
 
 
 
 
e6167f8
fdc80c8
0e36212
 
 
ece1395
0e36212
 
ece1395
0e36212
 
e6167f8
0e36212
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import streamlit as st
from generator import generate_response_from_document
from retrieval import retrieve_documents_hybrid,find_query_dataset
from evaluation import calculate_metrics
from data_processing import load_recent_questions, save_recent_questions
import time
import matplotlib.pyplot as plt

# Page Title
st.title("RAG7 - Real World RAG System")

st.markdown(
    """

    <style>

    .stTextArea textarea {

        background-color: white !important;

        font-size: 24px !important;

        color: black !important;

    }

    </style>

    """,
    unsafe_allow_html=True
)

# # Submit Button
# if st.button("Submit"):
#     start_time = time.time()
#     retrieved_documents = retrieve_documents_hybrid(question, 10)  
#     response = generate_response_from_document(question, retrieved_documents)
#     end_time = time.time()
#     time_taken_for_response = end_time-start_time
# else:
#     response = ""

# # Response Section
# st.subheader("Response")
# st.text_area("Generated Response:", value=response, height=150, disabled=True)

# # Metrics Section
# st.subheader("Metrics")

# col1, col2 = st.columns([1, 3])  # Creating two columns for button and metrics display

# with col1:
#     if st.button("Calculate Metrics"):
#         metrics = calculate_metrics(question, response, retrieved_documents, time_taken_for_response)
#     else:
#         metrics = ""

# with col2:
#     st.text_area("Metrics:", value=metrics, height=100, disabled=True)

# Initialize session state
if "recent_questions" not in st.session_state:
    st.session_state.recent_questions = load_recent_questions()

if "last_question" not in st.session_state:
    st.session_state.last_question = None

if "response_time" not in st.session_state:
    st.session_state.response_time = None

if "retrieved_documents" not in st.session_state:
    st.session_state.retrieved_documents = None

if "response" not in st.session_state:
    st.session_state.response = None

if st.session_state.recent_questions:
    recent_qns = list(reversed(st.session_state.recent_questions))

    print(recent_qns)

    # Display Recent Questions
    st.sidebar.title("Overall RMSE")
    rmse_values = [q["metrics"]["rmse"] for q in recent_qns if "metrics" in q and "rmse" in q["metrics"]]
    average_rmse = sum(rmse_values) / len(rmse_values) if rmse_values else 0
    st.sidebar.write(f"📊 **Average RMSE:** {average_rmse:.4f}")

    st.sidebar.markdown("---")
    
    st.sidebar.title("Analytics")

    # Extract response times and labels
    response_time = [q.get('metrics').get('response_time') for q in recent_qns]
    labels = [f"Q{i+1}" for i in range(len(response_time))]

    # Plot graph
    if any(response_time):
        fig, ax = plt.subplots()
        ax.plot(labels, response_time, marker="o", linestyle="-", color="skyblue")
        ax.set_xlabel("Recent Questions")
        ax.set_ylabel("Time Taken for Response (seconds)")
        ax.set_title("Response Time Analysis")
        st.sidebar.pyplot(fig)

    st.sidebar.markdown("---")

    # Display Recent Questions
    st.sidebar.title("Recent Questions")
    for q in recent_qns:  # Show latest first
        st.sidebar.write(f"🔹 {q['question']}")
else:
    st.sidebar.title("No recent questions")

# Question Section
st.subheader("Hi, What do you want to know today?")
question = st.text_area("Enter your question:", placeholder="Type your question here...", height=100)
question = question.strip()

if st.button("Submit"):
    if question:
        st.session_state.last_question = question

        start_time = time.time()
        st.session_state.metrics = {}
        st.session_state.response = ""
        st.session_state.query_dataset =  find_query_dataset(question)
        st.session_state.retrieved_documents = retrieve_documents_hybrid(question, st.session_state.query_dataset, 10)  
        st.session_state.response = generate_response_from_document(question, st.session_state.retrieved_documents)
        end_time = time.time()
        st.session_state.time_taken_for_response = end_time - start_time

        # Check if question already exists
        existing_questions = [q["question"] for q in st.session_state.recent_questions]
        
        if question not in existing_questions:
            new_entry = {
                    "question": question,
                    "metrics": st.session_state.metrics
                }
            st.session_state.recent_questions.append(new_entry)
            save_recent_questions(st.session_state.recent_questions)
    else:
        st.error("Please enter a question before submitting.")
    
# Display stored response
st.subheader("Response")
st.text_area("Generated Response:", value=st.session_state.response, height=150, disabled=True)

col1, col2 = st.columns([1, 3])  # Creating two columns for button and metrics display

# Calculate Metrics Button
with col1:
    if st.button("Show Metrics"):     
        st.session_state.metrics = calculate_metrics(question, st.session_state.query_dataset, st.session_state.response, st.session_state.retrieved_documents, st.session_state.time_taken_for_response)
        for q in st.session_state.recent_questions:
            if q["question"] == st.session_state.last_question:
                q["metrics"] = {"metrics": st.session_state.metrics}

        # Save updated data to file
        save_recent_questions(st.session_state.recent_questions)

with col2:
    st.text_area("Metrics:", value=st.session_state.metrics, height=100, disabled=True)

st.experimental_rerun()