Spaces:
Running
Running
update app
Browse files
app.py
CHANGED
@@ -597,7 +597,10 @@ def create_attack_comparative_chart(attack_data, selected_models):
|
|
597 |
return fig
|
598 |
|
599 |
def create_detailed_safety_breakdown(category_data, selected_models):
|
600 |
-
"""Create a detailed safety breakdown visualization
|
|
|
|
|
|
|
601 |
# Prepare data for the breakdown
|
602 |
status_order = ["Safe", "Slightly Unsafe", "Moderately Unsafe", "Extremely Unsafe"]
|
603 |
color_map = {
|
@@ -607,9 +610,12 @@ def create_detailed_safety_breakdown(category_data, selected_models):
|
|
607 |
"Extremely Unsafe": "#922b21" # Dark red
|
608 |
}
|
609 |
|
610 |
-
# Create a
|
611 |
-
|
612 |
-
|
|
|
|
|
|
|
613 |
# Calculate overall scores across all categories
|
614 |
total_safe = 0
|
615 |
total_slightly = 0
|
@@ -625,36 +631,80 @@ def create_detailed_safety_breakdown(category_data, selected_models):
|
|
625 |
total_extremely += model_data["extremely unsafe"]
|
626 |
|
627 |
# Calculate averages
|
628 |
-
|
629 |
-
|
630 |
-
|
631 |
-
|
632 |
-
|
633 |
-
|
634 |
-
|
635 |
-
|
636 |
-
|
637 |
-
|
638 |
-
|
639 |
-
|
640 |
-
|
641 |
-
|
642 |
-
|
643 |
-
|
644 |
-
|
645 |
-
|
646 |
-
|
647 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
648 |
|
649 |
# Update layout
|
650 |
fig.update_layout(
|
651 |
-
|
652 |
xaxis=dict(
|
|
|
653 |
tickformat=".0%",
|
654 |
range=[0, 1]
|
655 |
),
|
656 |
yaxis=dict(
|
657 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
658 |
),
|
659 |
legend=dict(
|
660 |
orientation="h",
|
@@ -664,7 +714,8 @@ def create_detailed_safety_breakdown(category_data, selected_models):
|
|
664 |
x=1
|
665 |
),
|
666 |
height=500,
|
667 |
-
margin=dict(l=60, r=50, t=30, b=80)
|
|
|
668 |
)
|
669 |
|
670 |
return fig
|
@@ -728,9 +779,8 @@ def main():
|
|
728 |
time.sleep(0.5)
|
729 |
|
730 |
# Detailed Safety Breakdown
|
731 |
-
# st.subheader("Safety Breakdown")
|
732 |
fig = create_detailed_safety_breakdown(category_data, selected_models)
|
733 |
-
st.plotly_chart(fig, use_container_width=True, key=
|
734 |
st.markdown("""
|
735 |
This stacked bar chart shows the detailed breakdown of safety performance for each model,
|
736 |
displaying the proportion of responses in each safety category (Safe, Slightly Unsafe,
|
@@ -740,7 +790,7 @@ def main():
|
|
740 |
# Model Safety by Category (Bar Chart) - Added to Overview
|
741 |
st.subheader("Model Safety by Category")
|
742 |
fig = create_model_safety_by_category(category_data, selected_models)
|
743 |
-
st.plotly_chart(fig, use_container_width=True, config={'displayModeBar': False}, key=
|
744 |
st.markdown("""
|
745 |
This bar chart compares the safety performance of different models across categories,
|
746 |
with an overall score for each model.
|
@@ -752,12 +802,12 @@ def main():
|
|
752 |
|
753 |
with col1:
|
754 |
fig = create_category_radar_chart(category_data, selected_models)
|
755 |
-
st.plotly_chart(fig, use_container_width=True, config={'displayModeBar': False}, key=
|
756 |
st.caption("Model safety performance across categories")
|
757 |
|
758 |
with col2:
|
759 |
fig = create_attack_radar_chart(attack_data, selected_models)
|
760 |
-
st.plotly_chart(fig, use_container_width=True, config={'displayModeBar': False}, key=
|
761 |
st.caption("Model safety performance against attack types")
|
762 |
|
763 |
# Category Analysis Tab
|
@@ -769,21 +819,21 @@ def main():
|
|
769 |
|
770 |
with category_tabs[0]:
|
771 |
st.subheader("Category Safety Heatmap")
|
772 |
-
st.plotly_chart(create_category_safety_heatmap(category_data, selected_models), use_container_width=True, key=
|
773 |
st.markdown("""
|
774 |
This heatmap shows the safety performance of different models across various safety categories.
|
775 |
The left panel displays safe response rates, while the right panel shows unsafe response rates.
|
776 |
""")
|
777 |
with category_tabs[1]:
|
778 |
st.subheader("Category Comparative Chart")
|
779 |
-
st.plotly_chart(create_category_radar_chart(category_data, selected_models), use_container_width=True, key=
|
780 |
st.markdown("""
|
781 |
This radar chart provides a visual comparison of model safety performance
|
782 |
across different categories.
|
783 |
""")
|
784 |
with category_tabs[2]:
|
785 |
st.subheader("Category Radar Chart")
|
786 |
-
st.plotly_chart(create_category_radar_chart(category_data, selected_models), use_container_width=True, key=
|
787 |
st.markdown("""
|
788 |
This radar chart provides a visual comparison of model safety performance
|
789 |
across different categories.
|
@@ -806,7 +856,7 @@ def main():
|
|
806 |
|
807 |
with attack_tabs[0]:
|
808 |
st.subheader("Attack Safety Heatmap")
|
809 |
-
st.plotly_chart(create_attack_safety_heatmap(attack_data, selected_models), use_container_width=True, key=
|
810 |
st.markdown("""
|
811 |
This heatmap shows how different models perform against various types of attacks.
|
812 |
The left panel displays safety scores, while the right panel shows unsafe response rates.
|
@@ -814,7 +864,7 @@ def main():
|
|
814 |
|
815 |
with attack_tabs[1]:
|
816 |
st.subheader("Attack Comparative Chart")
|
817 |
-
st.plotly_chart(create_attack_comparative_chart(attack_data, selected_models), use_container_width=True, key=
|
818 |
st.markdown("""
|
819 |
This bar chart provides a direct comparison of model safety performance
|
820 |
across different attack types.
|
@@ -822,7 +872,7 @@ def main():
|
|
822 |
|
823 |
with attack_tabs[2]:
|
824 |
st.subheader("Attack Radar Chart")
|
825 |
-
st.plotly_chart(create_attack_radar_chart(attack_data, selected_models), use_container_width=True, key=
|
826 |
st.markdown("""
|
827 |
This radar chart provides a visual comparison of model safety performance
|
828 |
across different attack types.
|
@@ -913,7 +963,7 @@ def main():
|
|
913 |
margin=dict(l=20, r=20, t=20, b=20)
|
914 |
)
|
915 |
|
916 |
-
st.plotly_chart(fig, use_container_width=True, config={'displayModeBar': False}, key=
|
917 |
|
918 |
with col2:
|
919 |
st.subheader(f"{model} Attack Resistance")
|
@@ -941,7 +991,7 @@ def main():
|
|
941 |
margin=dict(l=20, r=20, t=20, b=20)
|
942 |
)
|
943 |
|
944 |
-
st.plotly_chart(fig, use_container_width=True, config={'displayModeBar': False}, key=
|
945 |
|
946 |
st.subheader("Safety Response Breakdown")
|
947 |
|
|
|
597 |
return fig
|
598 |
|
599 |
def create_detailed_safety_breakdown(category_data, selected_models):
|
600 |
+
"""Create a detailed safety breakdown visualization as a line chart."""
|
601 |
+
import plotly.graph_objects as go
|
602 |
+
import pandas as pd
|
603 |
+
|
604 |
# Prepare data for the breakdown
|
605 |
status_order = ["Safe", "Slightly Unsafe", "Moderately Unsafe", "Extremely Unsafe"]
|
606 |
color_map = {
|
|
|
610 |
"Extremely Unsafe": "#922b21" # Dark red
|
611 |
}
|
612 |
|
613 |
+
# Create a figure
|
614 |
+
fig = go.Figure()
|
615 |
+
|
616 |
+
# Process data for each model
|
617 |
+
# Reverse the order to match the appearance in your screenshot
|
618 |
+
for model in selected_models[::-1]:
|
619 |
# Calculate overall scores across all categories
|
620 |
total_safe = 0
|
621 |
total_slightly = 0
|
|
|
631 |
total_extremely += model_data["extremely unsafe"]
|
632 |
|
633 |
# Calculate averages
|
634 |
+
safe_ratio = total_safe / total_categories
|
635 |
+
slightly_ratio = total_slightly / total_categories
|
636 |
+
moderately_ratio = total_moderately / total_categories
|
637 |
+
extremely_ratio = total_extremely / total_categories
|
638 |
+
|
639 |
+
# Add trace for each model with segments for each safety status
|
640 |
+
fig.add_trace(go.Scatter(
|
641 |
+
x=[0, safe_ratio, safe_ratio + slightly_ratio, safe_ratio + slightly_ratio + moderately_ratio, 1],
|
642 |
+
y=[model, model, model, model, model],
|
643 |
+
mode='lines',
|
644 |
+
line=dict(
|
645 |
+
width=50, # Reduced the width to make bars thinner
|
646 |
+
color='black' # This doesn't matter as we're using fill
|
647 |
+
),
|
648 |
+
showlegend=False
|
649 |
+
))
|
650 |
+
|
651 |
+
# Add colored segments for each safety status
|
652 |
+
# Safe segment
|
653 |
+
fig.add_trace(go.Scatter(
|
654 |
+
x=[0, safe_ratio],
|
655 |
+
y=[model, model],
|
656 |
+
mode='lines',
|
657 |
+
line=dict(width=50, color=color_map["Safe"]), # Reduced width
|
658 |
+
name="Safe" if model == selected_models[-1] else None, # Changed to last model for legend
|
659 |
+
showlegend=model == selected_models[-1] # Changed to last model for legend
|
660 |
+
))
|
661 |
+
|
662 |
+
# Slightly Unsafe segment
|
663 |
+
fig.add_trace(go.Scatter(
|
664 |
+
x=[safe_ratio, safe_ratio + slightly_ratio],
|
665 |
+
y=[model, model],
|
666 |
+
mode='lines',
|
667 |
+
line=dict(width=50, color=color_map["Slightly Unsafe"]), # Reduced width
|
668 |
+
name="Slightly Unsafe" if model == selected_models[-1] else None, # Changed to last model for legend
|
669 |
+
showlegend=model == selected_models[-1] # Changed to last model for legend
|
670 |
+
))
|
671 |
+
|
672 |
+
# Moderately Unsafe segment
|
673 |
+
fig.add_trace(go.Scatter(
|
674 |
+
x=[safe_ratio + slightly_ratio, safe_ratio + slightly_ratio + moderately_ratio],
|
675 |
+
y=[model, model],
|
676 |
+
mode='lines',
|
677 |
+
line=dict(width=50, color=color_map["Moderately Unsafe"]), # Reduced width
|
678 |
+
name="Moderately Unsafe" if model == selected_models[-1] else None, # Changed to last model for legend
|
679 |
+
showlegend=model == selected_models[-1] # Changed to last model for legend
|
680 |
+
))
|
681 |
+
|
682 |
+
# Extremely Unsafe segment
|
683 |
+
fig.add_trace(go.Scatter(
|
684 |
+
x=[safe_ratio + slightly_ratio + moderately_ratio, 1],
|
685 |
+
y=[model, model],
|
686 |
+
mode='lines',
|
687 |
+
line=dict(width=50, color=color_map["Extremely Unsafe"]), # Reduced width
|
688 |
+
name="Extremely Unsafe" if model == selected_models[-1] else None, # Changed to last model for legend
|
689 |
+
showlegend=model == selected_models[-1] # Changed to last model for legend
|
690 |
+
))
|
691 |
|
692 |
# Update layout
|
693 |
fig.update_layout(
|
694 |
+
title="Safety Performance Breakdown",
|
695 |
xaxis=dict(
|
696 |
+
title="Proportion",
|
697 |
tickformat=".0%",
|
698 |
range=[0, 1]
|
699 |
),
|
700 |
yaxis=dict(
|
701 |
+
title="",
|
702 |
+
categoryorder='total ascending',
|
703 |
+
# Reduce space between bars by modifying the categorical spacing
|
704 |
+
categoryarray=selected_models,
|
705 |
+
# Set smaller line spacing with 0 padding
|
706 |
+
linewidth=1,
|
707 |
+
tickson="boundaries"
|
708 |
),
|
709 |
legend=dict(
|
710 |
orientation="h",
|
|
|
714 |
x=1
|
715 |
),
|
716 |
height=500,
|
717 |
+
margin=dict(l=60, r=50, t=30, b=80),
|
718 |
+
bargap=0.1
|
719 |
)
|
720 |
|
721 |
return fig
|
|
|
779 |
time.sleep(0.5)
|
780 |
|
781 |
# Detailed Safety Breakdown
|
|
|
782 |
fig = create_detailed_safety_breakdown(category_data, selected_models)
|
783 |
+
st.plotly_chart(fig, use_container_width=True, key="detailed_safety_breakdown")
|
784 |
st.markdown("""
|
785 |
This stacked bar chart shows the detailed breakdown of safety performance for each model,
|
786 |
displaying the proportion of responses in each safety category (Safe, Slightly Unsafe,
|
|
|
790 |
# Model Safety by Category (Bar Chart) - Added to Overview
|
791 |
st.subheader("Model Safety by Category")
|
792 |
fig = create_model_safety_by_category(category_data, selected_models)
|
793 |
+
st.plotly_chart(fig, use_container_width=True, config={'displayModeBar': False}, key="model_safety_by_category")
|
794 |
st.markdown("""
|
795 |
This bar chart compares the safety performance of different models across categories,
|
796 |
with an overall score for each model.
|
|
|
802 |
|
803 |
with col1:
|
804 |
fig = create_category_radar_chart(category_data, selected_models)
|
805 |
+
st.plotly_chart(fig, use_container_width=True, config={'displayModeBar': False}, key="category_radar_chart")
|
806 |
st.caption("Model safety performance across categories")
|
807 |
|
808 |
with col2:
|
809 |
fig = create_attack_radar_chart(attack_data, selected_models)
|
810 |
+
st.plotly_chart(fig, use_container_width=True, config={'displayModeBar': False}, key="attack_radar_chart")
|
811 |
st.caption("Model safety performance against attack types")
|
812 |
|
813 |
# Category Analysis Tab
|
|
|
819 |
|
820 |
with category_tabs[0]:
|
821 |
st.subheader("Category Safety Heatmap")
|
822 |
+
st.plotly_chart(create_category_safety_heatmap(category_data, selected_models), use_container_width=True, key="category_safety_heatmap")
|
823 |
st.markdown("""
|
824 |
This heatmap shows the safety performance of different models across various safety categories.
|
825 |
The left panel displays safe response rates, while the right panel shows unsafe response rates.
|
826 |
""")
|
827 |
with category_tabs[1]:
|
828 |
st.subheader("Category Comparative Chart")
|
829 |
+
st.plotly_chart(create_category_radar_chart(category_data, selected_models), use_container_width=True, key="category_comparative_chart")
|
830 |
st.markdown("""
|
831 |
This radar chart provides a visual comparison of model safety performance
|
832 |
across different categories.
|
833 |
""")
|
834 |
with category_tabs[2]:
|
835 |
st.subheader("Category Radar Chart")
|
836 |
+
st.plotly_chart(create_category_radar_chart(category_data, selected_models), use_container_width=True, key="category_radar_chart_2")
|
837 |
st.markdown("""
|
838 |
This radar chart provides a visual comparison of model safety performance
|
839 |
across different categories.
|
|
|
856 |
|
857 |
with attack_tabs[0]:
|
858 |
st.subheader("Attack Safety Heatmap")
|
859 |
+
st.plotly_chart(create_attack_safety_heatmap(attack_data, selected_models), use_container_width=True, key="attack_safety_heatmap")
|
860 |
st.markdown("""
|
861 |
This heatmap shows how different models perform against various types of attacks.
|
862 |
The left panel displays safety scores, while the right panel shows unsafe response rates.
|
|
|
864 |
|
865 |
with attack_tabs[1]:
|
866 |
st.subheader("Attack Comparative Chart")
|
867 |
+
st.plotly_chart(create_attack_comparative_chart(attack_data, selected_models), use_container_width=True, key="attack_comparative_chart")
|
868 |
st.markdown("""
|
869 |
This bar chart provides a direct comparison of model safety performance
|
870 |
across different attack types.
|
|
|
872 |
|
873 |
with attack_tabs[2]:
|
874 |
st.subheader("Attack Radar Chart")
|
875 |
+
st.plotly_chart(create_attack_radar_chart(attack_data, selected_models), use_container_width=True, key="attack_radar_chart_2")
|
876 |
st.markdown("""
|
877 |
This radar chart provides a visual comparison of model safety performance
|
878 |
across different attack types.
|
|
|
963 |
margin=dict(l=20, r=20, t=20, b=20)
|
964 |
)
|
965 |
|
966 |
+
st.plotly_chart(fig, use_container_width=True, config={'displayModeBar': False}, key=f"model_{model}_category_performance")
|
967 |
|
968 |
with col2:
|
969 |
st.subheader(f"{model} Attack Resistance")
|
|
|
991 |
margin=dict(l=20, r=20, t=20, b=20)
|
992 |
)
|
993 |
|
994 |
+
st.plotly_chart(fig, use_container_width=True, config={'displayModeBar': False}, key=f"model_{model}_attack_resistance")
|
995 |
|
996 |
st.subheader("Safety Response Breakdown")
|
997 |
|