File size: 4,027 Bytes
f807e7d
 
 
a2f42ca
f807e7d
a2f42ca
175c5c3
f807e7d
a2f42ca
 
f807e7d
 
a2f42ca
b95388b
 
a2f42ca
b95388b
 
 
f807e7d
 
 
 
b95388b
 
 
 
 
 
 
f807e7d
 
 
 
 
 
 
 
 
 
 
 
 
 
b95388b
f807e7d
a2f42ca
 
 
f807e7d
b95388b
 
 
 
 
a2f42ca
b95388b
 
 
 
 
 
 
 
 
 
175c5c3
a2f42ca
 
 
 
b95388b
 
a2f42ca
 
 
 
 
 
 
b95388b
 
 
 
 
 
a2f42ca
 
 
 
175c5c3
b95388b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a2f42ca
b95388b
 
a2f42ca
b95388b
f807e7d
 
ea129da
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
120
121
122
123
124
125
126
127
128
import json
import time
import random
import os

import openai
import gradio as gr
import pandas as pd
import numpy as np
from openai.embeddings_utils import distances_from_embeddings

from utils.gpt_processor import QuestionAnswerer
from utils.work_flow_controller import WorkFlowController
from utils.chatbot import Chatbot
from utils.utils import *
    
def create_chatbot():
    bot = Chatbot()
    return bot

with gr.Blocks() as demo:
    history = gr.State([])
    user_question = gr.State("")
    chatbot_utils = Chatbot()

    user_chatbot = gr.State(Chatbot())
    
    upload_state = gr.State("wating")
    finished = gr.State("finished")

    with gr.Row():
        gr.HTML('Junyi Academy Chatbot')
    with gr.Row(equal_height=True):
        with gr.Column(scale=5):
            with gr.Row():
                chatbot = gr.Chatbot()

            with gr.Row():
                with gr.Column(scale=12):
                    user_input = gr.Textbox(
                        show_label=False,
                        placeholder="Enter text",
                        container=False,
                    )

                with gr.Column(min_width=70, scale=1):
                    clear_btn = gr.Button("清除")
                with gr.Column(min_width=70, scale=1):
                    submit_btn = gr.Button("傳送")

                bot_args = dict(
                    fn=bot,
                    inputs=user_chatbot,
                    outputs=chatbot,
                )

                user_args = dict(
                    fn=user,
                    inputs=[user_chatbot, user_input],
                    outputs=[user_input, chatbot],
                    queue=False,
                )

                response = user_input.submit(**user_args).then(**bot_args)
                
                response.then(lambda: gr.update(interactive=True), None, [user_input], queue=False)

                submit_btn.click(user,
                                [user_input, chatbot], 
                                [user_input, chatbot],
                                chatbot,
                                queue=False).then(**bot_args).then(lambda: gr.update(interactive=True), None, [user_input], queue=False)
                
                

    with gr.Row():
        index_file = gr.File(file_count="multiple", file_types=["pdf"], label="Upload PDF file")
    
    with gr.Row():
        instruction = gr.Markdown("""
            ## 使用說明
            1. 上傳一個或多個 PDF 檔案,系統將自動進行摘要、翻譯等處理後建立知識庫
            2. 在上方輸入欄輸入問題,系統將自動回覆
            3. 可以根據下方的摘要內容來提問
            4. 每次對話會根據第一個問題的內容來檢索所有文件,並挑選最能回答問題的文件來回覆
            5. 要切換檢索的文件,請點選「清除對話記錄」按鈕後再重新提問
        """)

    with gr.Row():
        describe = gr.Markdown('', visible=True)

        
    clear_state_args = dict(
        fn=clear_state,
        inputs=user_chatbot,
        outputs=None,
    )

    clear_btn.click(**clear_state_args)

    send_system_nofification_args = dict(
        fn=send_system_nofification,
        inputs=user_chatbot,
        outputs=chatbot,
    )

    bulid_knowledge_base_args = dict(
        fn=build_knowledge_base,
        inputs=[user_chatbot, index_file],
        outputs=None,
    )

    change_md_args = dict(
        fn=change_md,
        inputs=[user_chatbot],
        outputs=[describe],
    )

    index_file.upload(**send_system_nofification_args) \
                  .then(lambda: gr.update(interactive=True), None, None, queue=False) \
                  .then(**bulid_knowledge_base_args) \
                  .then(**send_system_nofification_args) \
                  .then(lambda: gr.update(interactive=True), None, None, queue=False) \
                  .then(**change_md_args)
    
if __name__ == "__main__":
    demo.launch()