File size: 3,035 Bytes
5e8e8f0 c2af1e5 5e8e8f0 302b34f 5e8e8f0 302b34f 5e8e8f0 28f9d4d 5bfa5bd 5e8e8f0 5bfa5bd c2af1e5 5e8e8f0 4b82b7b 9750f10 5e8e8f0 4b82b7b 37e534a 0335ad6 c2af1e5 0335ad6 2645c4d 0335ad6 c2af1e5 5e8e8f0 28f9d4d c2af1e5 28f9d4d 5e8e8f0 c2af1e5 5e8e8f0 c2af1e5 5e8e8f0 |
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 |
import gradio as gr
import os
from langchain.document_loaders import OnlinePDFLoader
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=350, chunk_overlap=0)
from langchain.llms import OpenAI
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
from langchain.vectorstores import Chroma
from langchain.chains import ConversationalRetrievalChain
def loading_pdf():
return "Loading..."
def pdf_changes(pdf_doc, open_ai_key):
if openai_key is not None:
os.environ['OPENAI_API_KEY'] = open_ai_key
loader = OnlinePDFLoader(pdf_doc.name)
documents = loader.load()
texts = text_splitter.split_documents(documents)
db = Chroma.from_documents(texts, embeddings)
retriever = db.as_retriever()
global qa
qa = ConversationalRetrievalChain.from_llm(
llm=OpenAI(temperature=0.5),
retriever=retriever,
return_source_documents=False)
return "Ready"
else:
return "You forgot OpenAI API key"
def add_text(history, text):
history = history + [(text, None)]
return history, ""
def bot(history):
response = infer(history[-1][0], history)
history[-1][1] = response
return history
def infer(question, history):
res = []
for human, ai in history[:-1]:
pair = (human, ai)
res.append(pair)
res = ["\n".join(res)]
chat_history = res
#print(chat_history)
query = question
result = qa({"question": query, "chat_history": chat_history})
#print(result)
return result["answer"]
css="""
#col-container {max-width: 700px; margin-left: auto; margin-right: auto;}
"""
title = """
<div style="text-align: center;max-width: 700px;">
<h1>Chat with PDF</h1>
<p style="text-align: center;">Upload a .PDF from your computer, click the "Load PDF to LangChain" button, <br />
when everything is ready, you can start asking questions about the pdf ;)</p>
</div>
"""
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 to langchain")
chatbot = gr.Chatbot([], elem_id="chatbot").style(height=350)
with gr.Row():
question = gr.Textbox(label="Question", placeholder="Type your question and hit Enter ")
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
)
demo.launch() |