File size: 3,606 Bytes
9054137
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
752610d
9054137
 
90d9fe0
752610d
9054137
 
 
f9a51f1
9054137
f9a51f1
3ea8937
f9a51f1
9054137
f9a51f1
9054137
f9a51f1
9054137
f9a51f1
9054137
f9a51f1
6ec818e
9054137
3ea8937
6ec818e
9054137
 
 
 
 
 
 
f9a51f1
9054137
 
 
 
 
6ec818e
 
9054137
 
 
6ec818e
9054137
 
6ec818e
9054137
 
 
 
6ec818e
9054137
 
 
 
 
e8060ec
9054137
e8060ec
9054137
 
 
 
 
 
 
b63876a
 
9054137
 
 
 
 
 
 
 
6ec818e
9054137
 
 
 
 
b63876a
6ec818e
9054137
 
 
6ec818e
9054137
 
 
 
 
 
 
f73474f
3c631fa
6ec818e
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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 = """
<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" 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")

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