Swasun/The_Guide_Chatbot
0
1import streamlit as st2from openai import OpenAI3import os4from langchain_astradb import AstraDBVectorStore5from langchain_openai import OpenAIEmbeddings6from langchain_text_splitters import CharacterTextSplitter7from pypdf import PdfReader8from langchain_core.documents import Document9 10if "emb" not in st.session_state:11 st.session_state["emb"] = OpenAIEmbeddings()12 13embedding = st.session_state["emb"]14 15if "db" not in st.session_state:16 st.session_state["db"] = AstraDBVectorStore(17 embedding=embedding,18 namespace="default_keyspace",19 collection_name="testchat",20 token=os.environ["ASTRA_DB_APPLICATION_TOKEN"],21 api_endpoint=os.environ["ASTRA_DB_API_ENDPOINT"],22)23 24db = st.session_state["db"]25 26# Set a default model27if "openai_model" not in st.session_state:28 st.session_state["openai_model"] = "gpt-3.5-turbo"29 30# Initialize chat history31if "messages" not in st.session_state:32 st.session_state.messages = []33 34st.title("The GUIDE")35 36if st.button("Clear Context"):37 st.session_state.messages =[]38 st.write("Context cleared.")39 40# Set OpenAI API key from Streamlit secrets41client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])42 43def get_similar_doc(ip):44 results = db.similarity_search_with_score(ip, k=4)45 #Fetch vectors that have a similarity score of more that 0.8546 content = [res[0].page_content for res in results if(res[1]>0.90)]47 if(len(content)):48 return ''.join(content)49 else:50 return ""51 52def get_full_prompt(ip,context=""):53 if(context==""):54 #if no vectors similar to query there is no context added55 return ip56 else:57 return ip+", context:"+f"{context}"58 59uploaded_files = st.file_uploader("Choose files", type=["txt", "csv", "pdf", "docx"], accept_multiple_files=True)60 61#Split the document into chunks62splitter = CharacterTextSplitter(separator='\n',chunk_size=800,chunk_overlap=50,length_function=len)63 64if uploaded_files is not None:65 for uploaded_file in uploaded_files:66 st.write(f"Filename: {uploaded_file.name} uploaded successfully")67 68 # Handle PDF files69 if uploaded_file.type == "application/pdf":70 reader = PdfReader(uploaded_file)71 text = ""72 docs = []73 for i,page in enumerate(reader.pages):74 content = page.extract_text()75 if content:76 text += content77 dbtext = splitter.split_text(text)78 metadta = {'source':f'{uploaded_file.name}'}79 for d in dbtext:80 doc = Document(page_content=d,metadata=metadta)81 docs.append(doc)82 83 #upload received douments to the vector db84 db.add_documents(docs)85 86# Display chat messages from history on app rerun87for message in st.session_state.messages:88 with st.chat_message(message["role"]):89 st.markdown(message["content"])90 91# Accept user input92if prompt := st.chat_input("What is up?"):93 # Add user message to chat history94 rev_doc = get_similar_doc(prompt)95 FullPrompt = get_full_prompt(prompt,rev_doc)96 st.session_state.messages.append({"role": "user", "content": FullPrompt})97 # Display user message in chat message container98 with st.chat_message("user"):99 st.markdown(prompt)100 101 # Display assistant response in chat message container102 with st.chat_message("assistant"):103 stream = client.chat.completions.create(104 model=st.session_state["openai_model"],105 messages=[106 {"role": m["role"], "content": m["content"]}107 for m in st.session_state.messages108 ],109 stream=True,110 )111 response = st.write_stream(stream)112 st.session_state.messages.append({"role": "assistant", "content": response})113 114 115 