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()