Spaces:
Sleeping
Sleeping
import streamlit as st | |
import torch | |
from rag import FinancialChatbot | |
import warnings | |
from transformers import logging | |
# Suppress warnings | |
warnings.filterwarnings("ignore") | |
logging.set_verbosity_error() | |
torch.classes.__path__ = [] | |
# Use session state to persist the chatbot instance | |
if "chatbot" not in st.session_state: | |
st.session_state.chatbot = FinancialChatbot() | |
def fetch_answer_from_backend(query): | |
"""Calls the backend function to get an answer.""" | |
return st.session_state.chatbot.get_answer(query) # Use session state chatbot instance | |
# Initialize Session State for Chat History | |
if "chat_history" not in st.session_state: | |
st.session_state.chat_history = [] | |
if "loading" not in st.session_state: | |
st.session_state.loading = False | |
# Layout and Title | |
st.title("Financial RAG Chat Assistant") | |
# st.markdown( | |
# """ | |
# <style> | |
# body, .stApp { | |
# background: url('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQlSQ-kkQFs_BAOhel_cd_CkFoHN1V-5bUO7vv8NwRp0cjftW6Wm2utQSE&s=10'); | |
# background-size: cover; | |
# # background-attachment: fixed; | |
# # background-position: center; | |
# # background-repeat: no-repeat; | |
# } | |
# # .stApp { | |
# # background: transparent; | |
# # } | |
# # .stTextInput, .stTextArea, .stButton { | |
# # background-color: rgba(0, 0, 0, 0.5); | |
# # border-radius: 10px; | |
# # color: #ffffff; | |
# # } | |
# # .stTextInput > div > input { | |
# # color: #ffffff; | |
# # } | |
# # .stButton button { | |
# # color: #ffffff; | |
# # background-color: #4CAF50; | |
# # border: none; | |
# # border-radius: 10px; | |
# # } | |
# </style> | |
# """, | |
# unsafe_allow_html=True | |
# ) | |
# Display Chat History | |
for chat in st.session_state.chat_history: | |
# User's query on the right | |
st.markdown( | |
f""" | |
<div style='text-align: right; max-width: 75%; float: right; clear: both;'> | |
<div style='font-size: 13px; color: #4a4a4a; margin: 0 10px;'>You</div> | |
<div style='background-color: #d3d3d3; color: black; padding: 10px; border-radius: 10px; | |
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);'> | |
{chat['question']} | |
</div> | |
</div> | |
""", | |
unsafe_allow_html=True | |
) | |
# Assistant's label and response on the left | |
if chat["answer"] is not None: | |
st.markdown( | |
f""" | |
<div style='text-align: left; max-width: 75%; float: left; clear: both;'> | |
<div style='font-size: 13px; color: #4a4a4a; margin: 0 10px;'>Assistant</div> | |
<div style='background-color: #add8e6; color: black; padding: 10px; border-radius: 10px; | |
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);'> | |
{chat['answer']} | |
</div> | |
</div> | |
""", | |
unsafe_allow_html=True | |
) | |
# Confidence Score (Below the answer) | |
if chat["confidence"] is not None: | |
st.markdown( | |
f"<div style='clear: both; color: #4a4a4a; font-size: 13px;'>Confidence: {chat['confidence'] * 100}%</div>", | |
unsafe_allow_html=True | |
) | |
st.divider() # Adds a visual divider between Q&A pairs | |
# User Input (Always at the Bottom) | |
user_input = st.chat_input("Ask a financial question...") | |
# If user inputs a question | |
if user_input: | |
# Add question to chat history and show loading animation | |
st.session_state.chat_history.append({ | |
"question": user_input, | |
"answer": None, # Placeholder for the answer | |
"confidence": None # Placeholder for the confidence score | |
}) | |
st.session_state.loading = True | |
st.rerun() # Refresh to display the question immediately | |
# If loading, simulate the API call and update the last question's answer | |
if st.session_state.loading: | |
with st.spinner("Fetching answer..."): | |
# Get the last question | |
last_question = st.session_state.chat_history[-1]["question"] | |
# API Call | |
answer, confidence = fetch_answer_from_backend(last_question) | |
# Update the last chat history item with the answer and confidence | |
st.session_state.chat_history[-1]["answer"] = answer | |
st.session_state.chat_history[-1]["confidence"] = confidence | |
# Stop loading and refresh to show the answer | |
st.session_state.loading = False | |
st.rerun() | |