blind-test / app.py
Adipta's picture
Update app.py
ac7a9a3 verified
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()