CoolFace
Apppublic

Swasun/The_Guide_Chatbot

sourceHugging Faceapache-2.0updated 2y agoView on Hugging Face
0likes
app.py115 linesDownload Raw Back to root
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