Spaces:
Sleeping
Sleeping
| 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) | |