File size: 7,833 Bytes
4b7909a
 
 
 
 
 
 
 
 
3fc0136
4b7909a
4fa4ed8
 
 
 
 
 
 
 
 
 
4b7909a
 
3fc0136
 
 
 
 
 
 
 
4b7909a
 
3fc0136
 
 
4b7909a
 
 
 
 
 
 
 
 
 
 
 
3fc0136
4b7909a
ae35587
4b7909a
 
3fc0136
 
 
 
4b7909a
3fc0136
4b7909a
 
 
 
 
 
3fc0136
4b7909a
 
 
 
 
3fc0136
4b7909a
55f5354
4b7909a
 
 
 
3fc0136
4b7909a
ae35587
4b7909a
3fc0136
4b7909a
3fc0136
4b7909a
 
 
 
 
 
3fc0136
 
4b7909a
 
 
3fc0136
 
 
 
 
 
 
 
 
4fa4ed8
3fc0136
4fa4ed8
3fc0136
 
4b7909a
3fc0136
4b7909a
 
3fc0136
4b7909a
 
 
 
 
3fc0136
4b7909a
3fc0136
4b7909a
 
c290437
 
 
4b7909a
 
17c1954
b9b76ed
4b7909a
3fc0136
4fa4ed8
 
3fc0136
4b7909a
 
3fc0136
4b7909a
3fc0136
 
4b7909a
b9b76ed
3fc0136
4b7909a
b9b76ed
3fc0136
4b7909a
 
 
 
 
 
 
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import os
from openai import OpenAI
import gradio as gr

# Set up OpenAI client
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))

# Initialize conversation history and difficulty
conversation_history = []
current_difficulty = "sedang"

# Predefined scenarios
predefined_scenarios = {
    "Pilih skenario": "",
    "Produk Cacat": "Saya baru saja membeli sebuah produk dari toko Anda, dan ternyata produk tersebut cacat.",
    "Pengiriman Terlambat": "Saya memesan produk minggu lalu dan seharusnya sudah diterima kemarin, tapi belum sampai.",
    "Harga Tidak Sesuai": "Harga yang tertera di rak berbeda dengan yang di kasir saat saya membayar.",
    "Pelayanan Buruk": "Saya tidak puas dengan pelayanan yang saya terima dari salah satu staf Anda.",
    "Pengembalian Barang": "Saya ingin mengembalikan produk yang saya beli, tapi kasir menolak permintaan saya."
}

def get_system_message(difficulty):
    base_message = """
Anda adalah asisten AI yang dirancang untuk mensimulasikan pelanggan dalam skenario pelatihan penjualan asuransi.
Peran Anda HANYA untuk berperan sebagai pelanggan dengan keluhan. JANGAN PERNAH merespons seolah-olah Anda adalah perwakilan penjualan.
Manusia yang berinteraksi dengan Anda akan berperan sebagai perwakilan penjualan asuransi.
Evaluasi respons perwakilan dan putuskan apakah akan melanjutkan percakapan atau mengakhirinya.
Jika perwakilan menangani keluhan Anda dengan baik, tanggapi secara positif sebagai pelanggan yang puas.
Jika perwakilan gagal mengatasi kekhawatiran Anda dengan memadai, tanggapi secara negatif dan tunjukkan bahwa Anda ingin mengakhiri percakapan.
Selalu tetap berperan sebagai pelanggan sepanjang percakapan.
Gunakan Bahasa Indonesia dalam semua respons Anda.
"""
    difficulty_adjustments = {
        "mudah": "Jadilah pelanggan yang mudah diatur, terbuka terhadap saran, dan cepat menerima solusi yang masuk akal.",
        "sedang": "Jadilah pelanggan yang cukup menantang, membutuhkan sedikit bujukan tetapi akhirnya menerima solusi yang baik.",
        "sulit": "Jadilah pelanggan yang sulit, skeptis terhadap solusi dan membutuhkan layanan luar biasa untuk merasa puas."
    }
    return base_message + difficulty_adjustments[difficulty]

def chat_with_gpt(user_message, history):
    global conversation_history
    try:
        conversation_history.append({"role": "user", "content": user_message})
        messages = [
            {"role": "system", "content": get_system_message(current_difficulty)},
            *conversation_history
        ]
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=messages,
            max_tokens=300
        )
        bot_response = response.choices[0].message.content.strip()
        
        if "sebagai perwakilan penjualan" in bot_response.lower() or "saya bisa membantu anda dengan itu" in bot_response.lower():
            bot_response = "Maaf, tapi saya adalah pelanggan dalam skenario ini. Bisakah Anda menangani keluhan saya?"
        
        conversation_history.append({"role": "assistant", "content": bot_response})
        conversation_ended = "percakapan berakhir" in bot_response.lower() or "mengakhiri" in bot_response.lower()
        history.append((user_message, bot_response))
        if conversation_ended:
            summary_feedback = generate_summary_feedback()
            return history, history, "", summary_feedback
        return history, history, "", None
    except Exception as e:
        error_msg = f"Terjadi kesalahan dalam chat_with_gpt: {str(e)}"
        print(error_msg)
        return history + [("Error", error_msg)], history + [("Error", error_msg)], "", None

def generate_summary_feedback():
    try:
        summary_prompt = "Rangkum percakapan, evaluasi kinerja perwakilan penjualan, dan berikan umpan balik untuk perbaikan. Buat ringkas namun komprehensif."
        messages = [
            {"role": "system", "content": "Anda adalah asisten AI yang memberikan umpan balik tentang interaksi penjualan Asuransi."},
            *conversation_history,
            {"role": "user", "content": summary_prompt}
        ]
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=messages,
            max_tokens=1000
        )
        return "Status: Selesai\n\n" + response.choices[0].message.content.strip()
    except Exception as e:
        return f"Kesalahan dalam menghasilkan ringkasan: {str(e)}"

def clear_conversation():
    global conversation_history
    conversation_history = []
    return None, None, "", None

def start_new_conversation(difficulty, scenario):
    global current_difficulty, conversation_history
    current_difficulty = difficulty
    try:
        clear_conversation()
        system_message = get_system_message(difficulty)
        initial_prompt = f"Anda adalah pelanggan dengan keluhan berikut: {scenario}. Mulailah percakapan dengan menyampaikan keluhan ini kepada perwakilan penjualan."
        
        conversation_history = [
            {"role": "system", "content": system_message},
            {"role": "user", "content": initial_prompt}
        ]
        
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=conversation_history,
            max_tokens=1500
        )
        initial_response = response.choices[0].message.content.strip()
        conversation_history.append({"role": "assistant", "content": initial_response})
        
        return [(None, initial_response)], [(None, initial_response)], "", None
    except Exception as e:
        error_msg = f"Terjadi kesalahan dalam memulai percakapan baru: {str(e)}"
        print(error_msg)
        return [("Error", error_msg)], [("Error", error_msg)], "", None

def end_conversation(history):
    global conversation_history
    conversation_history.append({"role": "user", "content": "Perwakilan penjualan telah mengakhiri percakapan."})
    summary_feedback = generate_summary_feedback()
    history.append((None, "Perwakilan penjualan telah mengakhiri percakapan."))
    return history, history, "", summary_feedback

def update_scenario(choice):
    return predefined_scenarios[choice]

# Set up Gradio interface
with gr.Blocks() as demo:
    gr.Markdown("# BAWANA AI - Complain Handling Simulator")
    gr.Markdown("Pilih tingkat kesulitan, pilih atau modifikasi skenario, dan mulai simulasi. Anda akan berperan sebagai perwakilan penjualan.")

    difficulty_radio = gr.Radio(["mudah", "sedang", "sulit"], label="Tingkat Kesulitan Pelanggan", value="sedang")
    scenario_dropdown = gr.Dropdown(choices=list(predefined_scenarios.keys()), label="Pilih Skenario", value="Pilih skenario")
    scenario_input = gr.Textbox(label="Skenario Keluhan Pelanggan (Anda dapat memodifikasi)", lines=3)
    new_scenario = gr.Button("Mulai Simulasi")

    chatbot = gr.Chatbot()
    msg = gr.Textbox(label="Respons Anda sebagai perwakilan penjualan")
    with gr.Row():
        submit_btn = gr.Button("Kirim")
        end_btn = gr.Button("Akhiri Percakapan")

    summary = gr.Textbox(label="Ringkasan Percakapan dan Umpan Balik", lines=10, interactive=False)
    clear = gr.Button("Bersihkan Percakapan")

    scenario_dropdown.change(update_scenario, inputs=[scenario_dropdown], outputs=[scenario_input])
    new_scenario.click(start_new_conversation, inputs=[difficulty_radio, scenario_input], outputs=[chatbot, chatbot, msg, summary])
    submit_btn.click(chat_with_gpt, [msg, chatbot], [chatbot, chatbot, msg, summary])
    msg.submit(chat_with_gpt, [msg, chatbot], [chatbot, chatbot, msg, summary])
    end_btn.click(end_conversation, inputs=[chatbot], outputs=[chatbot, chatbot, msg, summary])
    clear.click(clear_conversation, inputs=None, outputs=[chatbot, msg, msg, summary])

# Launch the interface
demo.launch()