import gradio as gr import os import time from langchain.document_loaders import OnlinePDFLoader from langchain.text_splitter import CharacterTextSplitter from langchain.llms import OpenAI from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.chains import ConversationalRetrievalChain def loading_pdf(): print("loading_pdf") return "Loading..." def pdf_changes(pdf_doc, open_ai_key): print("pdf_change") if openai_key is not None: os.environ['OPENAI_API_KEY'] = open_ai_key loader = OnlinePDFLoader(pdf_doc.name) print(loader) documents = loader.load() print(documents) text_splitter = CharacterTextSplitter(chunk_size=2048, chunk_overlap=0) print(text_splitter) texts = text_splitter.split_documents(documents) print(texts) embeddings = OpenAIEmbeddings() print(embeddings) db = Chroma.from_documents(texts, embeddings) print(db) retriever = db.as_retriever() print(retriever) global qa qa = ConversationalRetrievalChain.from_llm( llm=OpenAI(temperature=0.3), retriever=retriever, return_source_documents=False) return "Ready" else: return "You forgot OpenAI API key" def add_text(history, text): history = history + [(text, None)] print(history) return history, "" def bot(history): response = infer(history[-1][0], history) history[-1][1] = "" for character in response: history[-1][1] += character time.sleep(0.05) yield history def infer(question, history): res = [] for human, ai in history[:-1]: pair = (human, ai) res.append(pair) chat_history = res #print(chat_history) query = question result = qa({"question": query, "chat_history": chat_history}) #print(result) print(result["answer"]) return result["answer"] css=""" #col-container {max-width: 700px; margin-left: auto; margin-right: auto;} """ title = """

Chat with PDF • OpenAI

Upload a .PDF from your computer, click the "Load PDF" button,
when everything is ready, you can start asking questions about the pdf
This version is set to store chat history, and uses OpenAI as LLM, don't forget to copy/paste your OpenAI API key

""" with gr.Blocks(css=css) as demo: with gr.Column(elem_id="col-container"): gr.HTML(title) with gr.Column(): openai_key = gr.Textbox(label="You OpenAI API key", type="password") pdf_doc = gr.File(label="Load a pdf", file_types=['.pdf'], type="file") with gr.Row(): langchain_status = gr.Textbox(label="Status", placeholder="", interactive=False) load_pdf = gr.Button("Load pdf") chatbot = gr.Chatbot([], elem_id="chatbot").style(height=350) question = gr.Textbox(label="Question", placeholder="Type your question and hit Enter ") submit_btn = gr.Button("Send Message") load_pdf.click(loading_pdf, None, langchain_status, queue=False) load_pdf.click(pdf_changes, inputs=[pdf_doc, openai_key], outputs=[langchain_status], queue=False) question.submit(add_text, [chatbot, question], [chatbot, question]).then( bot, chatbot, chatbot ) submit_btn.click(add_text, [chatbot, question], [chatbot, question]).then( bot, chatbot, chatbot) demo.launch()