File size: 2,756 Bytes
5e8e8f0
 
 
 
 
 
 
302b34f
5e8e8f0
302b34f
 
5e8e8f0
 
 
28f9d4d
5bfa5bd
5e8e8f0
 
5bfa5bd
5e8e8f0
 
 
 
 
 
 
28f9d4d
28d750d
 
28f9d4d
5e8e8f0
 
 
 
 
 
 
4b82b7b
9750f10
5e8e8f0
 
4b82b7b
4a9ac6b
37e534a
 
0335ad6
2645c4d
0335ad6
2645c4d
0335ad6
37e534a
5e8e8f0
28f9d4d
243253e
28f9d4d
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
import gradio as gr

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):
    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"

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):
    print(history[-1])
    
    res = []
    for human, ai in history[:-1]:
        pair = f"Human:{human}\nAI:{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():
            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, pdf_doc, langchain_status, queue=False)
    question.submit(add_text, [chatbot, question], [chatbot, question]).then(
        bot, chatbot, chatbot
    )

demo.launch()