File size: 2,967 Bytes
8b7951f c857094 8b7951f |
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 |
import streamlit as st
import pdfplumber
from sentence_transformers import SentenceTransformer
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, ServiceContext
from llama_index.llms.huggingface import HuggingFaceLLM as LlamaHuggingFaceLLM
from llama_index.core.prompts.prompts import SimpleInputPrompt
from llama_index.legacy.embeddings.langchain import LangchainEmbedding
import torch
# Setup for caching the index and LLM to avoid reloading
@st.cache(allow_output_mutation=True, suppress_st_warning=True)
def setup_llama_index():
# Define and configure the embedding model
embed_model = LangchainEmbedding(SentenceTransformer('sentence-transformers/all-mpnet-base-v2'))
# Define and configure the Llama LLM
llama_llm = LlamaHuggingFaceLLM(
context_window=4096,
max_new_tokens=256,
generate_kwargs={"temperature": 0.0, "do_sample": False},
system_prompt="You are a Q&A assistant...",
query_wrapper_prompt=SimpleInputPrompt("{query_str}"),
tokenizer_name="HuggingFaceH4/zephyr-7b-beta",
model_name="HuggingFaceH4/zephyr-7b-beta",
device_map="auto",
model_kwargs={"torch_dtype": torch.float16, "load_in_8bit": True}
)
# Load documents and create the index
documents = SimpleDirectoryReader('/content/data').load_data() # Assuming document data is in this directory
service_context = ServiceContext.from_defaults(chunk_size=1024, llm=llama_llm, embed_model=embed_model)
index = VectorStoreIndex.from_documents(documents, service_context=service_context)
return index.as_query_engine()
def extract_text_from_pdf(file):
""" Extract text from the uploaded PDF file using pdfplumber. """
text = []
with pdfplumber.open(file) as pdf:
for page in pdf.pages:
page_text = page.extract_text()
if page_text: # Ensure that text extraction was successful
text.append(page_text)
return " ".join(text)
def main():
st.title('PDF Reader and Question Answering with RAG-like Model')
# Load the query engine only once
query_engine = setup_llama_index()
uploaded_file = st.file_uploader("Upload your PDF", type=["pdf"])
if uploaded_file is not None:
document_text = extract_text_from_pdf(uploaded_file)
if document_text:
st.text_area("Extracted Text", document_text, height=300)
else:
st.error("No text could be extracted from the PDF. Please check the file and try again.")
question = st.text_input("Ask a question based on the PDF")
if st.button("Get Answer"):
if question:
# Simulate RAG-like query using the index and LLM
response = query_engine.query(question)
st.text_area("Answer", response, height=150)
else:
st.error("Please enter a question to get an answer.")
if __name__ == "__main__":
main()
|