File size: 2,266 Bytes
aeb1340
edb320d
 
 
aeb1340
 
edb320d
 
 
 
 
aeb1340
 
 
 
 
 
 
 
 
 
 
edb320d
aeb1340
 
 
edb320d
 
 
 
 
aeb1340
edb320d
aeb1340
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_huggingface import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain_groq import ChatGroq
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough


# Initialize the FAISS vector store
vector_store = None

# Function to handle PDF upload and indexing
def index_pdf(pdf):
    global vector_store
    
    # Load the PDF
    loader = PyPDFLoader(pdf.name)
    documents = loader.load()

    # Split the documents into chunks
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    texts = text_splitter.split_documents(documents)

    # Embed the chunks 
    embeddings = HuggingFaceEmbeddings(model_name="bert-base-uncased", encode_kwargs={"normalize_embeddings": True})

    # Store the embeddings in the vector store
    vector_store = FAISS.from_documents(texts, embeddings)

    return "PDF indexed successfully!"

# Function to handle chatbot queries
def chatbot_query(query):
    if vector_store is None:
        return "Please upload and index a PDF first."
    
    # Create a retrieval-based QA chain
    retriever = vector_store.as_retriever()
    qa_chain = RetrievalQA(llm=OpenAI(), retriever=retriever)
    
    # Get the response from the QA chain
    response = qa_chain.run(query)
    
    return response

# Create the Gradio interface
with gr.Blocks() as demo:
    with gr.Tab("Indexing"):
        pdf_input = gr.File(label="Upload PDF", file_types=[".pdf"])
        index_button = gr.Button("Index PDF")
        index_output = gr.Textbox(label="Indexing Status")
        
        index_button.click(index_pdf, inputs=pdf_input, outputs=index_output)
    
    with gr.Tab("Chatbot"):
        query_input = gr.Textbox(label="Enter your question")
        query_button = gr.Button("Submit")
        query_output = gr.Textbox(label="Response")
        
        query_button.click(chatbot_query, inputs=query_input, outputs=query_output)

# Launch the Gradio app
demo.launch()