File size: 3,800 Bytes
11e4790
 
9e3b21a
6530075
11e4790
2320eeb
 
9e3b21a
ef94623
 
9e3b21a
8414f72
 
 
 
 
30e87ad
ef94623
 
30e87ad
 
 
 
 
 
 
 
915c63d
 
 
 
 
 
ef94623
26894bc
 
 
 
 
 
 
 
 
 
4749834
ef94623
 
 
 
 
39c5160
ef94623
 
 
 
 
 
 
 
9e3b21a
 
 
 
 
ef94623
9e3b21a
 
 
ef94623
 
9e3b21a
 
ef94623
 
 
 
 
 
 
 
 
9e3b21a
 
915c63d
 
 
 
9e3b21a
 
b7653fb
 
24ff085
d476719
 
9e3b21a
ef94623
1a94c44
9e3b21a
915c63d
 
 
 
 
 
 
d476719
 
 
 
 
 
26894bc
30e87ad
915c63d
 
 
 
 
 
26894bc
 
11e4790
9e3b21a
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
import gradio as gr
import pandas as pd
import os
from openai import OpenAI

OPEN_AI_KEY = os.getenv("OPEN_AI_KEY")
client = OpenAI(api_key=OPEN_AI_KEY)



def process_file(file):
    # 读取文件
    if file.name.endswith('.csv'):
        df = pd.read_csv(file)
    else:
        df = pd.read_excel(file)
        
    df_string = df.to_string()

    # 根据上传的文件内容生成问题
    questions = generate_questions(df_string)

    # 返回按钮文本和 DataFrame 字符串
    return questions[0] if len(questions) > 0 else "", \
           questions[1] if len(questions) > 1 else "", \
           questions[2] if len(questions) > 2 else "", \
           df_string

def update_buttons(df_string):
    # 根据上传的文件内容生成问题
    questions = generate_questions(df_string)
    return questions[:3]  # 确保返回三个问题


def generate_questions(df_string):
    # 使用 OpenAI 生成基于上传数据的问题
    # 这里需要编写代码来实现此功能
    questions = ["问题 1", "问题 2", "问题 3"]  # 示例问题列表
    return questions

def send_question(question, df_string_output, chat_history):
    # 当问题按钮被点击时调用此函数
    return respond(question, df_string_output, chat_history)

def respond(user_message, df_string_output, chat_history):
    print("=== 變數:user_message ===")
    print(user_message)
    print("=== 變數:chat_history ===")
    print(chat_history)

    sys_content = f"你是一個資料分析師,請用 {df_string_output} 為資料進行對話,使用 zh-TW"
    messages = [
        {"role": "system", "content": sys_content},
        {"role": "user", "content": user_message}
    ]

    print("=====messages=====")
    print(messages)
    print("=====messages=====")


    request_payload = {
        "model": "gpt-4-1106-preview",
        "messages": messages,
        "max_tokens": 2000  # 設定一個較大的值,可根據需要調整
    }

    response = client.chat.completions.create(**request_payload)
    print(response)
    
    response_text = response.choices[0].message.content.strip()

    # 更新聊天历史
    new_chat_history = (user_message, response_text)
    if chat_history is None:
        chat_history = [new_chat_history]
    else:
        chat_history.append(new_chat_history)

    # 返回聊天历史和空字符串清空输入框
    return "", chat_history


def on_button_click(button, df_string_output, chat_history):
    # 当按钮被点击时发送对应的问题
    return respond(button.text, df_string_output, chat_history)

with gr.Blocks() as demo:
    with gr.Row():
        with gr.Column():
            file_upload = gr.File(label="Upload your file")
            chatbot = gr.Chatbot()
            msg = gr.Textbox(label="Message")
            send_button = gr.Button("Send")

        with gr.Column():
            df_string_output = gr.Textbox(label="raw data")

            with gr.Group():
                gr.Markdown("## 常用问题")
                btn_1 = gr.Button()
                btn_2 = gr.Button()
                btn_3 = gr.Button()

            
    send_button.click(
        respond, 
        inputs=[msg, df_string_output, chatbot], 
        outputs=[msg, chatbot]
    )

    # file_upload.change(process_file, inputs=file_upload, outputs=df_string_output)
    file_upload.change(process_file, inputs=file_upload, outputs=[btn_1, btn_2, btn_3, df_string_output])


    # 连接按钮点击事件
    btn_1.click(on_button_click, inputs=[btn_1, df_string_output, chatbot], outputs=[msg, chatbot])
    btn_2.click(on_button_click, inputs=[btn_2, df_string_output, chatbot], outputs=[msg, chatbot])
    btn_3.click(on_button_click, inputs=[btn_3, df_string_output, chatbot], outputs=[msg, chatbot])



demo.launch()