Spaces:
Sleeping
Sleeping
import streamlit as st | |
from doc_loading import read_pdf_text | |
from llm_functions import get_conversational_chain | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
from langchain_openai import OpenAIEmbeddings | |
from langchain.vectorstores import FAISS | |
import warnings | |
warnings.filterwarnings('ignore') | |
from dotenv import load_dotenv | |
load_dotenv() | |
from dataclasses import dataclass | |
import os | |
api_key = os.getenv("OPENAI_API_KEY") | |
from openai import OpenAI | |
client = OpenAI(api_key=api_key) | |
st.set_page_config(page_title="Resume QA") | |
st.header("Feel free to ask any question") | |
st.write("Welcome!!") | |
# st.session_state | |
if "option" not in st.session_state: | |
option = st.selectbox("How are you going to input your document?", | |
("Upload LinkedIn PDF", "Upload xml")) | |
# Conditionally show components based on user's choice | |
file_name = "" | |
main_text = "" | |
if option == "Upload LinkedIn PDF": | |
uploaded_file = st.file_uploader("Choose a PDF file", type=["pdf"], key="uploading_pdf") | |
if uploaded_file is not None: | |
# Process the uploaded file | |
st.write("PDF uploaded successfully!") | |
main_text = read_pdf_text(uploaded_file) | |
else: | |
st.write("This functionality in under construction.") | |
if option == "Upload LinkedIn PDF": | |
if uploaded_file is not None and uploaded_file.type != "application/pdf": | |
st.error("Please choose a PDF file only.") | |
if len(main_text) > 0: | |
text_splitter = RecursiveCharacterTextSplitter( | |
chunk_size=500, | |
chunk_overlap=50, | |
length_function=len, | |
is_separator_regex='\n' | |
) | |
texts = text_splitter.create_documents([main_text]) | |
embeddings = OpenAIEmbeddings(api_key=api_key) | |
# store in vector db | |
db = FAISS.from_documents(texts, embeddings) | |
hash_name = f"{option.replace(' ', '-')}" | |
db.save_local(f'faiss_{hash_name}_index') | |
if "messages" not in st.session_state: | |
st.session_state.messages = [] | |
st.write("What's your question? (try being a bit detailed about the question)") | |
class Message: | |
actor: str | |
payload: str | |
USER = "user" | |
ASSISTANT = "ai" | |
MESSAGES = "messages" | |
def initialize_session_state(): | |
if MESSAGES not in st.session_state: | |
st.session_state[MESSAGES] = [Message(actor=ASSISTANT, payload="Hi!How can I help you?")] | |
if "llm_chain" not in st.session_state: | |
st.session_state["llm_chain"] = get_conversational_chain() | |
def get_llm_chain_from_session(): | |
return st.session_state["llm_chain"] | |
initialize_session_state() | |
msg: Message | |
for msg in st.session_state[MESSAGES]: | |
st.chat_message(msg.actor).write(msg.payload) | |
prompt = st.chat_input("Enter a prompt here") | |
if prompt: | |
docs = db.similarity_search(prompt, k=5) | |
st.session_state[MESSAGES].append(Message(actor=USER, payload=prompt)) | |
st.chat_message(USER).write(prompt) | |
with st.spinner("Please wait.."): | |
llm_chain = get_llm_chain_from_session() | |
response = llm_chain({"context": docs, "question": prompt})['text'] | |
st.session_state[MESSAGES].append(Message(actor=ASSISTANT, payload=response)) | |
st.chat_message(ASSISTANT).write(response) |