File size: 3,995 Bytes
00ea8c0
efb9187
 
 
 
 
d47f253
efb9187
 
d47f253
efb9187
 
 
 
 
 
 
 
 
 
 
 
 
d47f253
efb9187
 
 
 
 
 
 
 
 
4d65906
 
 
efb9187
4d65906
efb9187
4d65906
 
efb9187
4d65906
efb9187
 
 
 
4d65906
efb9187
4d65906
efb9187
 
 
4d65906
efb9187
 
 
 
 
 
 
 
 
 
 
 
 
 
4d65906
efb9187
 
 
 
 
 
 
 
 
4d65906
 
efb9187
4d65906
 
 
 
 
 
 
efb9187
4d65906
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efb9187
4d65906
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
import gradio as gr
from llama_index.core import StorageContext, load_index_from_storage, VectorStoreIndex, SimpleDirectoryReader, ChatPromptTemplate
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
from dotenv import load_dotenv
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings
import os
import base64

# Load environment variables
load_dotenv()

# Configure the Llama index settings
Settings.llm = HuggingFaceInferenceAPI(
    model_name="nltpt/Llama-3.2-3B-Instruct",
    tokenizer_name="nltpt/Llama-3.2-3B-Instruct",
    context_window=3000,
    token=os.getenv("HF_TOKEN"),
    max_new_tokens=512,
    generate_kwargs={"temperature": 0.1},
)
Settings.embed_model = HuggingFaceEmbedding(
    model_name="BAAI/bge-small-en-v1.5"
)

# Define the directory for persistent storage and data
PERSIST_DIR = "./db"
DATA_DIR = "data"

# Ensure data directory exists
os.makedirs(DATA_DIR, exist_ok=True)
os.makedirs(PERSIST_DIR, exist_ok=True)

# Function to display PDF (for Gradio it will just show a message saying PDF was uploaded)
def display_pdf(file):
    return f"Uploaded PDF: {file.name}"

# Data ingestion function
def data_ingestion(files):
    for uploaded_file in files:
        filepath = os.path.join(DATA_DIR, uploaded_file.name)
        with open(filepath, "wb") as f:
            f.write(uploaded_file.read())
    documents = SimpleDirectoryReader(DATA_DIR).load_data()
    storage_context = StorageContext.from_defaults()
    index = VectorStoreIndex.from_documents(documents)
    index.storage_context.persist(persist_dir=PERSIST_DIR)
    return "PDFs processed successfully!"

# Query handling function
def handle_query(query):
    storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
    index = load_index_from_storage(storage_context)
    
    chat_text_qa_msgs = [
        (
            "user",
            """You are a Q&A assistant. Your main goal is to provide answers as accurately as possible, based on the context of the document provided. If the question does not match the context or is outside the scope of the document, advise the user to ask questions that are relevant to the document.
            Context:
            {context_str}
            Question:
            {query_str}
            """
        )
    ]
    
    text_qa_template = ChatPromptTemplate.from_messages(chat_text_qa_msgs)
    query_engine = index.as_query_engine(text_qa_template=text_qa_template)
    
    answer = query_engine.query(query)
    
    if hasattr(answer, 'response'):
        return answer.response
    elif isinstance(answer, dict) and 'response' in answer:
        return answer['response']
    else:
        return "Sorry, I couldn't find an answer."

# Chatbot functionality
def chatbot(files, user_input, history):
    if files:
        data_ingestion(files)  # Process PDFs
        history.append(("assistant", "Your PDFs have been processed. You can now ask questions."))
    if user_input:
        response = handle_query(user_input)
        history.append(("user", user_input))
        history.append(("assistant", response))
    return history, history

# Gradio Interface
with gr.Blocks() as app:
    gr.Markdown("# (PDF) Information and Inference ๐Ÿ—ž๏ธ")
    gr.Markdown("Upload PDF files and ask questions about their content!")
    
    with gr.Row():
        with gr.Column(scale=2):
            file_upload = gr.File(label="Upload your PDF files", file_types=["pdf"], multiple=True)
        with gr.Column(scale=8):
            chatbot_interface = gr.Chatbot(label="Q&A Assistant", elem_id="chatbot")
    
    user_input = gr.Textbox(label="Ask a question", placeholder="Type your question here...")
    
    history = gr.State([])  # To hold chat history
    
    submit_button = gr.Button("Submit")
    
    submit_button.click(
        fn=chatbot, 
        inputs=[file_upload, user_input, history], 
        outputs=[chatbot_interface, history]
    )

app.launch()