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() | |