amoghsuman's picture
Update app.py
4a77a16 verified
import gradio as gr
import os
from dotenv import load_dotenv
from langchain.chains.question_answering import load_qa_chain
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
llm = ChatOpenAI(model_name="gpt-4", temperature=0)
embedding = OpenAIEmbeddings()
db = None # Global DB
def upload_pdf(file):
global db
loader = PyPDFLoader(file.name)
documents = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
docs = splitter.split_documents(documents)
db = FAISS.from_documents(docs, embedding)
return "βœ… PDF processed. Ask your questions below."
def chat_with_pdf(message, history):
global db
if not db:
return history + [[message, "❌ Please upload a PDF first."]]
retriever = db.as_retriever()
chain = load_qa_chain(llm, chain_type="stuff")
docs = retriever.get_relevant_documents(message)
response = chain.run(input_documents=docs, question=message)
history.append([message, response])
return history
with gr.Blocks(title="πŸ“„ Interactive PDF Chatbot") as demo:
gr.Markdown("## Talk to a PDF")
with gr.Row():
pdf = gr.File(label="Upload PDF", file_types=[".pdf"])
upload_btn = gr.Button("Process PDF")
status = gr.Textbox(label="Status", interactive=False)
chatbot = gr.Chatbot(label="Chat History", height=400)
msg = gr.Textbox(label="Ask a question", placeholder="Type your question and press Enter...", lines=2)
send_btn = gr.Button("Send")
upload_btn.click(upload_pdf, inputs=pdf, outputs=status)
msg.submit(chat_with_pdf, inputs=[msg, chatbot], outputs=chatbot)
send_btn.click(chat_with_pdf, inputs=[msg, chatbot], outputs=chatbot)
send_btn.click(lambda: "", None, msg) # Clear input after send
msg.submit(lambda: "", None, msg) # Clear input after enter
demo.launch(share=True)