| import os |
| import streamlit as st |
| from langchain_community.document_loaders.pdf import PyPDFDirectoryLoader |
| from langchain.text_splitter import CharacterTextSplitter |
| from langchain_community.embeddings import HuggingFaceInstructEmbeddings |
| from langchain_community.vectorstores import FAISS |
| from langchain.chains import RetrievalQA |
| from langchain.memory import ConversationBufferMemory |
| from langchain_community.llms import HuggingFaceHub |
|
|
| def make_vectorstore(embeddings): |
| loader = PyPDFDirectoryLoader("data") |
| documents = loader.load() |
| text_splitter = CharacterTextSplitter(chunk_size=400, chunk_overlap=0) |
| texts = text_splitter.split_documents(documents) |
| docsearch = FAISS.from_documents(texts, embeddings) |
| |
| return docsearch |
|
|
| def get_conversation(vectorstore, model): |
| |
| memory = ConversationBufferMemory(memory_key="messages", return_messages=True) |
|
|
| conversation_chain = RetrievalQA.from_llm( |
| llm=model, |
| retriever=vectorstore.as_retriever(), |
| memory=memory) |
| |
| return conversation_chain |
|
|
| def get_response(conversation_chain, query): |
| |
| response = conversation_chain.invoke(query) |
| response = response["result"] |
| answer = response.split('\nHelpful Answer: ')[1] |
| return answer |
|
|
| def main(): |
| st.title("Chat LLM") |
| if not os.path.exists("data"): |
| os.makedirs("data") |
| |
| print("Downloading Embeddings Model") |
| with st.spinner('Downloading Embeddings Model...'): |
| embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-base", model_kwargs = {'device': 'cpu'}) |
| |
| print("Loading LLM from HuggingFace") |
| with st.spinner('Loading LLM from HuggingFace...'): |
| llm = HuggingFaceHub(repo_id="HuggingFaceH4/zephyr-7b-beta", model_kwargs={"temperature":0.7, "max_new_tokens":512, "top_p":0.95, "top_k":50}) |
| |
| st.sidebar.title("Upload PDFs") |
| uploaded_files = st.sidebar.file_uploader("Upload PDFs", accept_multiple_files=True) |
| if uploaded_files: |
| for file in uploaded_files: |
| with open(f"data/{file.name}", "wb") as f: |
| f.write(file.getbuffer()) |
| with st.spinner('making a vectorstore database...'): |
| vectorstore = make_vectorstore(embeddings) |
| with st.spinner('making a conversation chain...'): |
| conversation_chain = get_conversation(vectorstore, llm) |
| st.sidebar.success("PDFs uploaded successfully") |
| else: |
| st.sidebar.warning("Please upload PDFs") |
| |
| if st.button("Clear Chat"): |
| st.session_state.messages = [] |
| |
| if "messages" not in st.session_state: |
| st.session_state.messages = [] |
| |
| for message in st.session_state.messages: |
| if message["role"] == "user": |
| st.chat_message("user").markdown(message["content"]) |
| else: |
| st.chat_message("bot").markdown(message["content"]) |
| |
| user_prompt = st.chat_input("ask a question", key="user") |
| if user_prompt: |
| st.chat_message("user").markdown(user_prompt) |
| st.session_state.messages.append({"role": "user", "content": user_prompt}) |
| response = get_response(conversation_chain, user_prompt) |
| st.chat_message("bot").markdown(response) |
| st.session_state.messages.append({"role": "bot", "content": response}) |
| |
| if __name__ == "__main__": |
| main() |