File size: 3,415 Bytes
2f0e211
 
 
 
 
 
 
 
 
 
e455307
 
2f0e211
b91cab8
2f0e211
e455307
 
 
f8e7afd
e455307
 
 
 
 
1c54445
d8fad86
1c54445
 
e455307
2f0e211
a08bac4
 
 
 
 
2f0e211
 
 
 
 
 
00e09c1
2f0e211
 
00e09c1
2f0e211
 
 
00e09c1
2f0e211
 
 
 
 
 
 
 
 
 
 
e455307
2f0e211
 
 
 
 
b91cab8
2f0e211
 
e455307
2f0e211
 
 
 
 
 
 
 
 
 
 
b505ef9
a08bac4
2f0e211
a08bac4
e455307
2f0e211
a08bac4
e455307
 
a08bac4
2f0e211
 
 
 
e455307
 
2f0e211
e455307
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
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

os.environ['OPENAI_API_KEY'] = os.getenv("Your_API_Key")

def loading_pdf():
    return "Working the upload. Also, pondering the usefulness of sporks..."

def pdf_changes(pdf_doc):
    loader = OnlinePDFLoader(pdf_doc.name)
    documents = loader.load()
    text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
    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"

def clear_data():
    global qa
    qa = None
    return "Data cleared"

def add_text(history, text):
    history = history + [(text, None)]
    return history, ""

def bot(history):
    response = infer(history[-1][0], history)
    formatted_response = '\n'.join(response.split('. '))
    history[-1][1] = ""
    
    for character in formatted_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
    query = question
    result = qa({"question": query, "chat_history": chat_history})
    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>CauseWriter 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.</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("Convert PDF to Magic AI language")
                clear_btn = gr.Button("Clear Data")
        
        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], outputs=[langchain_status], queue=False)
    clear_btn.click(clear_data, 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()