File size: 3,414 Bytes
5e8e8f0
c2af1e5
4c684d6
5e8e8f0
 
 
 
6d4e313
5e8e8f0
302b34f
5e8e8f0
302b34f
6d4e313
5e8e8f0
 
 
28f9d4d
5bfa5bd
5e8e8f0
 
5bfa5bd
c2af1e5
 
 
 
 
20be73c
c2af1e5
6d4e313
c2af1e5
 
 
 
 
 
 
 
 
 
5e8e8f0
 
cee9235
5e8e8f0
 
 
4b82b7b
6294be6
 
 
599598a
 
 
 
5e8e8f0
4b82b7b
37e534a
 
0335ad6
c2af1e5
0335ad6
f59b998
0335ad6
c2af1e5
5e8e8f0
28f9d4d
c2af1e5
599598a
5e8e8f0
 
 
 
 
 
 
3f410fb
5e8e8f0
3f410fb
 
5e8e8f0
 
 
 
 
 
 
 
 
c2af1e5
5e8e8f0
 
 
 
 
 
bd181e0
93ad8df
5e8e8f0
c2af1e5
5e8e8f0
 
 
bd181e0
 
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
95
96
97
98
99
100
101
102
103
104
105
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():
    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()
        text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
        texts = text_splitter.split_documents(documents)
        embeddings = OpenAIEmbeddings()
        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] = ""
    
    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)
    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 • OpenAI</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 ;) <br />
    This version is set to store chat history, and uses OpenAI as LLM, don't forget to copy/paste your OpenAI API key</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)
        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()