kamau1 commited on
Commit
e762464
1 Parent(s): c9d5692

Create semapdf1.3.py

Browse files
Files changed (1) hide show
  1. version/semapdf1.3.py +138 -0
version/semapdf1.3.py ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain.text_splitter import CharacterTextSplitter
2
+ from langchain.embeddings import HuggingFaceBgeEmbeddings
3
+ from langchain.vectorstores import FAISS
4
+ from langchain.chat_models import ChatOpenAI
5
+ from langchain.memory import ConversationBufferMemory
6
+ from langchain.chains import ConversationalRetrievalChain
7
+ from langchain.llms import HuggingFaceHub
8
+
9
+ from htmlTemplates import css, bot_template, user_template
10
+
11
+ from dotenv import load_dotenv
12
+ from PyPDF2 import PdfReader
13
+ import streamlit as st
14
+ import requests
15
+ import json
16
+ import os
17
+
18
+ # set this key as an environment variable
19
+ os.environ["HUGGINGFACEHUB_API_TOKEN"] = st.secrets['huggingface_token']
20
+
21
+ # Page configuration
22
+ st.set_page_config(page_title="SemaNaPDF", page_icon="📚",)
23
+
24
+ # Sema Translator
25
+ #Public_Url = os.environ["sema_url"] #endpoint
26
+
27
+ def translate(userinput, target_lang, source_lang=None):
28
+ if source_lang:
29
+ url = "Public_Url/translate_enter/"
30
+ data = {
31
+ "userinput": userinput,
32
+ "source_lang": source_lang,
33
+ "target_lang": target_lang,
34
+ }
35
+ response = requests.post(url, json=data)
36
+ result = response.json()
37
+ print(type(result))
38
+ source_lange = source_lang
39
+ translation = result['translated_text']
40
+ return source_lange, translation
41
+ else:
42
+ url = "Public_Url/translate_detect/"
43
+ data = {
44
+ "userinput": userinput,
45
+ "target_lang": target_lang,
46
+ }
47
+
48
+ response = requests.post(url, json=data)
49
+ result = response.json()
50
+ source_lange = result['source_language']
51
+ translation = result['translated_text']
52
+ return source_lange, translation
53
+
54
+ def get_pdf_text(pdf_docs : list) -> str:
55
+ text = ""
56
+ for pdf in pdf_docs:
57
+ pdf_reader = PdfReader(pdf)
58
+ for page in pdf_reader.pages:
59
+ text += page.extract_text()
60
+ return text
61
+
62
+
63
+ def get_text_chunks(text:str) ->list:
64
+ text_splitter = CharacterTextSplitter(
65
+ separator="\n", chunk_size=1500, chunk_overlap=300, length_function=len
66
+ )
67
+ chunks = text_splitter.split_text(text)
68
+ return chunks
69
+
70
+
71
+ def get_vectorstore(text_chunks : list) -> FAISS:
72
+ model = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
73
+ encode_kwargs = {
74
+ "normalize_embeddings": True
75
+ } # set True to compute cosine similarity
76
+ embeddings = HuggingFaceBgeEmbeddings(
77
+ model_name=model, encode_kwargs=encode_kwargs, model_kwargs={"device": "cpu"}
78
+ )
79
+ vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embeddings)
80
+ return vectorstore
81
+
82
+
83
+ def get_conversation_chain(vectorstore:FAISS) -> ConversationalRetrievalChain:
84
+ llm = HuggingFaceHub(
85
+ repo_id="mistralai/Mixtral-8x7B-Instruct-v0.1",
86
+ #repo_id="TheBloke/Mixtral-8x7B-Instruct-v0.1-GGUF"
87
+ model_kwargs={"temperature": 0.5, "max_length": 1048},
88
+ )
89
+
90
+ memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
91
+ conversation_chain = ConversationalRetrievalChain.from_llm(
92
+ llm=llm, retriever=vectorstore.as_retriever(), memory=memory
93
+ )
94
+ return conversation_chain
95
+
96
+ def main():
97
+ st.title("SemaNaPDF📚")
98
+ # upload file
99
+ pdf_docs = st.file_uploader(
100
+ "Upload your PDFs here and click on 'Process'", accept_multiple_files=True
101
+ )
102
+ if pdf_docs is not None:
103
+ with st.spinner("processing"):
104
+ # get pdf text
105
+ raw_text = get_pdf_text(pdf_docs)
106
+
107
+ # get the text chunks
108
+ text_chunks = get_text_chunks(raw_text)
109
+
110
+ # create vector store
111
+ vectorstore = get_vectorstore(text_chunks)
112
+
113
+ # create conversation chain
114
+ st.session_state.conversation = get_conversation_chain(vectorstore)
115
+ st.info("done")
116
+
117
+ #user_question = st.text_input("Get insights into your finances ...")
118
+ # show user input
119
+ if "messages" not in st.session_state:
120
+ st.session_state.messages = []
121
+
122
+ for message in st.session_state.messages:
123
+ with st.chat_message(message["role"]):
124
+ st.markdown(message["content"])
125
+
126
+ if user_question := st.chat_input("Ask your document anything ......?"):
127
+ with st.chat_message("user"):
128
+ st.markdown(user_question)
129
+ st.session_state.messages.append({"role": "user", "content": user_question})
130
+ response = st.session_state.conversation({"question": user_question})
131
+ st.session_state.chat_history = response["chat_history"]
132
+ with st.chat_message("assistant"):
133
+ st.markdown(response)
134
+ st.session_state.messages.append({"role": "assistant", "content": response})
135
+
136
+
137
+ if __name__ == '__main__':
138
+ main()