velvet-api / controllers /metrics_controller.py
Grilocas77's picture
Upload 25 files
e679b32 verified
# controllers/metrics_controllers.py
# Duarte Grilo - 2201320 - Projeto Informático
import json
import pandas as pd
import matplotlib.pyplot as plt
import time
import sys
import os
# Garante que é possível importar a partir do diretório principal
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
# 🧠 Carrega os datasets necessários
with open("data/respostas/respostas_tipo.json", encoding="utf-8") as f:
respostas_tipo = json.load(f) # Respostas de referência (ouro)
with open("data/respostas/velvet_respostas_metricas.json", encoding="utf-8") as f:
respostas_velvet = json.load(f) # Respostas do modelo Velvet
with open("data/respostas/chatgpt_respostas.json", encoding="utf-8") as f:
respostas_chatgpt = json.load(f) # Respostas do ChatGPT
# 🧠 Modelo de embeddings para medir similaridade semântica
from sentence_transformers import SentenceTransformer, util
modelo = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
# 📊 Calcula as similaridades entre resposta_ouro e cada modelo
resultados = []
for tipo, velvet, chatgpt in zip(respostas_tipo, respostas_velvet, respostas_chatgpt):
pergunta = tipo["pergunta"]
resposta_ouro = tipo["resposta"]
resposta_velvet = velvet["resposta"]
resposta_chatgpt = chatgpt["resposta"]
# Calcula embeddings
emb_ouro = modelo.encode(resposta_ouro, convert_to_tensor=True)
emb_velvet = modelo.encode(resposta_velvet, convert_to_tensor=True)
emb_chatgpt = modelo.encode(resposta_chatgpt, convert_to_tensor=True)
# Similaridade coseno com a resposta de referência
sim_velvet = float(util.cos_sim(emb_ouro, emb_velvet))
sim_chatgpt = float(util.cos_sim(emb_ouro, emb_chatgpt))
# Regista resultados em percentagem
resultados.append({
"Pergunta": pergunta,
"Velvet": sim_velvet * 100,
"ChatGPT": sim_chatgpt * 100
})
# 📈 Cria um DataFrame com os resultados
df = pd.DataFrame(resultados)
# 🖼️ Gráfico de barras comparativo
ax = df.plot(
x="Pergunta",
kind="bar",
figsize=(12, 6),
ylabel="Similaridade com Resposta de Ouro (%)",
xlabel="Pergunta",
title="Comparação de Qualidade das Respostas (ChatGPT vs Velvet)",
rot=20
)
# 🧼 Ajustes visuais no gráfico
plt.xticks(rotation=30, ha="right")
plt.legend(title="Modelo")
plt.tight_layout()
plt.grid(axis="y")
# 💾 Exporta resultados para CSV
nome_ficheiro = f"data/relatorio_comparativo_{int(time.time())}.csv"
df.to_csv(nome_ficheiro, index=False, encoding="utf-8-sig")
print(f"✅ Relatório salvo em: {nome_ficheiro}")
# 📊 Mostra o gráfico
plt.show()