File size: 3,997 Bytes
19c89c6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
import streamlit as st
from langchain.document_loaders import TextLoader
from pypdf import PdfReader
from langchain import HuggingFaceHub
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceInstructEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferWindowMemory
def read_pdf(file):
document = ""
reader = PdfReader(file)
for page in reader.pages:
document += page.extract_text()
return document
class llmClass():
def __init__(self, token, llm_model, instruct_embeddings, existing_vector_store, temperature, max_length):
print('Created')
def generate_answer(self, question, token):
return 'LLm not connected'
def read_txt(file):
document = str(file.getvalue())
document = document.replace("\\n", " \\n ").replace("\\r", " \\r ")
return document
def split_doc(document, chunk_size, chunk_overlap):
splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap
)
split = splitter.split_text(document)
split = splitter.create_documents(split)
return split
def embedding_storing(model_name, split, create_new_vs, existing_vector_store, new_vs_name):
if create_new_vs is not None:
# Load embeddings instructor
instructor_embeddings = HuggingFaceInstructEmbeddings(
model_name=model_name, model_kwargs={"device":"cuda"}
)
# Implement embeddings
db = FAISS.from_documents(split, instructor_embeddings)
if create_new_vs == True:
# Save db
db.save_local("vector store/" + new_vs_name)
else:
# Load existing db
load_db = FAISS.load_local(
"vector store/" + existing_vector_store,
instructor_embeddings,
allow_dangerous_deserialization=True
)
# Merge two DBs and save
load_db.merge_from(db)
load_db.save_local("vector store/" + new_vs_name)
st.success("The document has been saved.")
def prepare_rag_llm(
token, llm_model, instruct_embeddings, vector_store_list, temperature, max_length
):
# # Load embeddings instructor
# instructor_embeddings = HuggingFaceInstructEmbeddings(
# model_name=instruct_embeddings, model_kwargs={"device":"cuda"}
# )
# # Load db
# loaded_db = FAISS.load_local(
# f"vector store/{vector_store_list}", instructor_embeddings, allow_dangerous_deserialization=True
# )
# # Load LLM
# llm = HuggingFaceHub(
# repo_id=llm_model,
# model_kwargs={"temperature": temperature, "max_length": max_length},
# huggingfacehub_api_token=token
# )
# memory = ConversationBufferWindowMemory(
# k=2,
# memory_key="chat_history",
# output_key="answer",
# return_messages=True,
# )
# # Create the chatbot
# qa_conversation = ConversationalRetrievalChain.from_llm(
# llm=llm,
# chain_type="stuff",
# retriever=loaded_db.as_retriever(),
# return_source_documents=True,
# memory=memory,
# )
llm_object = llmClass(token, llm_model, instruct_embeddings, vector_store_list, temperature, max_length)
return llm_object
def generate_answer(question, token):
return ["Not connected to An LLm", "No documentation available"]
answer = "An error has occured"
if token == "":
answer = "Insert the Hugging Face token"
doc_source = ["no source"]
else:
response = st.session_state.conversation({"question": question})
answer = response.get("answer").split("Helpful Answer:")[-1].strip()
explanation = response.get("source_documents", [])
doc_source = [d.page_content for d in explanation]
return answer, doc_source
|