Spaces:
Sleeping
Sleeping
File size: 3,652 Bytes
6a40ae3 |
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 |
import gradio as gr
import json
import requests
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from io import BytesIO
# -------------------------------
# 1. Configuration and Data Loading
# -------------------------------
# URL to the JSON file (the URL below resolves to the raw file)
DATA_URL = "https://huggingface.co/spaces/alielfilali01/3C3H-HeatMap/resolve/main/files/aragen_v1_results.json"
# Define the metrics order (6 dimensions)
METRICS = ["Correctness", "Completeness", "Conciseness", "Helpfulness", "Honesty", "Harmlessness"]
def load_data(url=DATA_URL):
response = requests.get(url)
data = response.json()
# Filter out any non-model entries (e.g. timestamp entries)
model_data = [entry for entry in data if "Meta" in entry]
return model_data
# Load the JSON data once when the app starts
DATA = load_data()
# Extract model names for the dropdown based on the JSON "Meta" field
def get_model_names(data):
model_names = [entry["Meta"]["Model Name"] for entry in data]
return model_names
MODEL_NAMES = get_model_names(DATA)
# -------------------------------
# 2. Heatmap Generation Functions
# -------------------------------
def generate_heatmap_image(model_entry):
"""
Given a model entry from the JSON data, this function extracts the 6 metrics,
computes a 6x6 similarity matrix using the definition: similarity = 1 - |v_i - v_j|,
and returns the heatmap image as bytes.
"""
scores = model_entry["claude-3.5-sonnet Scores"]["3C3H Scores"]
# Create a vector with the metrics in the defined order
v = np.array([scores[m] for m in METRICS])
# Compute the 6x6 similarity matrix
matrix = 1 - np.abs(np.subtract.outer(v, v))
# Create a mask for the upper triangle (diagonal remains visible)
mask = np.triu(np.ones_like(matrix, dtype=bool), k=1)
plt.figure(figsize=(6, 5))
ax = sns.heatmap(matrix,
mask=mask,
annot=True,
fmt=".2f",
cmap="viridis",
xticklabels=METRICS,
yticklabels=METRICS,
cbar_kws={"label": "Similarity"})
plt.title(f"Confusion Matrix for Model: {model_entry['Meta']['Model Name']}")
plt.xlabel("Metrics")
plt.ylabel("Metrics")
plt.tight_layout()
# Save the figure to a bytes buffer
buf = BytesIO()
plt.savefig(buf, format="png")
plt.close()
buf.seek(0)
return buf.read()
def generate_heatmaps(selected_model_names):
"""
Filters the global DATA for entries matching the selected model names,
generates a heatmap for each one, and returns a list of image bytes.
"""
filtered_entries = [entry for entry in DATA if entry["Meta"]["Model Name"] in selected_model_names]
images = []
for entry in filtered_entries:
img_bytes = generate_heatmap_image(entry)
images.append(img_bytes)
return images
# -------------------------------
# 3. Build the Gradio Interface
# -------------------------------
with gr.Blocks() as demo:
gr.Markdown("## 3C3H Heatmap Generator")
gr.Markdown("Select the models you want to compare and generate their heatmaps below.")
with gr.Row():
model_dropdown = gr.Dropdown(choices=MODEL_NAMES, label="Select Model(s)", multiselect=True, value=MODEL_NAMES[:3])
generate_btn = gr.Button("Generate Heatmaps")
gallery = gr.Gallery(label="Heatmaps").style(grid=[2], height="auto")
generate_btn.click(fn=generate_heatmaps, inputs=model_dropdown, outputs=gallery)
# Launch the Gradio app
demo.launch()
|