Spaces:
Sleeping
Sleeping
import pandas as pd | |
import warnings | |
from ast import literal_eval | |
import gradio as gr | |
warnings.filterwarnings('ignore') | |
# Load the CSV file. | |
# For Hugging Face Spaces, place the CSV file in your repository (or update the path accordingly). | |
df = pd.read_csv('df_chatbot_response.csv') | |
df['len_history'] = df['history_conversation'].apply(lambda x: len(literal_eval(x))) | |
df = df[df['len_history']>1].reset_index(drop=True) | |
# Create new conversation columns for variants A and B. | |
df['full_conversation_a'] = '' | |
df['full_conversation_b'] = '' | |
for i in range(len(df)): | |
a = literal_eval(df['history_conversation'][i]) | |
a.append({'AI': df['existing_answer'][i]}) | |
b = literal_eval(df['history_conversation'][i]) | |
b.append({'AI': df['new_answer'][i]}) | |
df.at[i, 'full_conversation_a'] = a | |
df.at[i, 'full_conversation_b'] = b | |
# Store conversation rounds as a list of dictionaries. | |
conversation_rounds = [] | |
for i in range(len(df)): | |
a = df['full_conversation_a'][i] | |
# Replace literal "\n" with actual newline characters. | |
for d in a: | |
for key, value in d.items(): | |
if isinstance(value, str): | |
d[key] = value.replace('\\n', '\n') | |
b = df['full_conversation_b'][i] | |
for d in b: | |
for key, value in d.items(): | |
if isinstance(value, str): | |
d[key] = value.replace('\\n', '\n') | |
data_conv = {"a": df['full_conversation_a'][i], "b": df['full_conversation_b'][i]} | |
conversation_rounds.append(data_conv) | |
# --- Helper Function to Format Conversations --- | |
def format_conversation(conv): | |
""" | |
Convert a list of dictionaries (with 'human' and 'AI' keys) into a list of tuples, | |
pairing each human message with its subsequent AI response. | |
""" | |
pairs = [] | |
i = 0 | |
while i < len(conv): | |
if 'human' in conv[i]: | |
human_msg = conv[i]['human'] | |
# If the next message exists and is from AI, pair them | |
if i + 1 < len(conv) and 'AI' in conv[i+1]: | |
ai_msg = conv[i+1]['AI'] | |
pairs.append((human_msg, ai_msg)) | |
i += 2 | |
else: | |
pairs.append((human_msg, "")) | |
i += 1 | |
else: | |
# If conversation starts with an AI message | |
if 'AI' in conv[i]: | |
pairs.append(("", conv[i]['AI'])) | |
i += 1 | |
return pairs | |
def get_conversation(round_idx): | |
"""Return formatted conversation pairs for a given round index.""" | |
if round_idx < len(conversation_rounds): | |
conv = conversation_rounds[round_idx] | |
existing_pairs = format_conversation(conv["a"]) | |
new_pairs = format_conversation(conv["b"]) | |
return existing_pairs, new_pairs | |
else: | |
# End-of-conversation message if no more rounds. | |
return [("End of conversation.", "")], [("End of conversation.", "")] | |
def update_conversation(choice, current_idx, choices_list): | |
""" | |
Update the conversation round when the user clicks the button. | |
- 'choice' is the user's selection ("A" or "B") for the current round. | |
- 'current_idx' is the current conversation round index. | |
- 'choices_list' accumulates all the user's choices. | |
""" | |
choices_list = choices_list + [choice] | |
new_idx = current_idx + 1 | |
if new_idx >= len(conversation_rounds): | |
summary_text = "Semua percakapan selesai.\nPilihan pengguna per ronde: " + ", ".join(choices_list) | |
# Display the summary in both chatbots when done. | |
return new_idx, [("End of conversation.", summary_text)], [("End of conversation.", summary_text)], choices_list | |
else: | |
existing_pairs, new_pairs = get_conversation(new_idx) | |
return new_idx, existing_pairs, new_pairs, choices_list | |
# --- Gradio UI Setup --- | |
with gr.Blocks() as demo: | |
gr.Markdown(f"## Blind Test 2 Model LLM with Total Conversation {len(df)}") | |
# States to track the current round and store user choices. | |
conversation_index = gr.State(0) | |
user_choices = gr.State([]) | |
# Display the two conversation variants side by side. | |
with gr.Row(): | |
existing_chat = gr.Chatbot(label="A") | |
new_chat = gr.Chatbot(label="B") | |
# Initialize the chatbots with the first conversation round. | |
initial_existing, initial_new = get_conversation(0) | |
existing_chat.value = initial_existing | |
new_chat.value = initial_new | |
# Radio button for the user to choose their preferred conversation variant. | |
flag_choice = gr.Radio(choices=["A", "B"], label="Pilih percakapan yang lebih disukai:") | |
next_button = gr.Button("Percakapan Berikutnya") | |
# Textbox to display the final summary of user choices. | |
summary_output = gr.Textbox(label="Ringkasan Pilihan", interactive=False) | |
next_button.click( | |
update_conversation, | |
inputs=[flag_choice, conversation_index, user_choices], | |
outputs=[conversation_index, existing_chat, new_chat, user_choices] | |
) | |
def show_summary(choices): | |
choices_a = choices.count("A") | |
choices_b = choices.count("B") | |
return f"A: {choices_a}\nB: {choices_b}" | |
gr.Button("Tampilkan Ringkasan").click( | |
show_summary, | |
inputs=[user_choices], | |
outputs=[summary_output] | |
) | |
# Launch the Gradio app. | |
if __name__ == "__main__": | |
demo.launch() | |