Spaces:
Running
Running
import gradio as gr | |
from transformers import AutoTokenizer, AutoModelForCausalLM, AutoModelForSequenceClassification, pipeline | |
import torch | |
import numpy as np | |
# === CARREGAR OS MODELOS GERADORES === | |
generator_1_name = "pierreguillou/gpt2-small-portuguese" | |
generator_2_name = "pierreguillou/gpt2-small-portuguese" # Usando o mesmo por simplicidade/teste | |
tokenizer_1 = AutoTokenizer.from_pretrained(generator_1_name) | |
model_1 = AutoModelForCausalLM.from_pretrained(generator_1_name) | |
tokenizer_2 = AutoTokenizer.from_pretrained(generator_2_name) | |
model_2 = AutoModelForCausalLM.from_pretrained(generator_2_name) | |
# === CARREGAR MODELO ÁRBITRO (BERT) === | |
judge_model_name = "neuralmind/bert-base-portuguese-cased" | |
judge_tokenizer = AutoTokenizer.from_pretrained(judge_model_name) | |
judge_model = AutoModelForSequenceClassification.from_pretrained(judge_model_name, num_labels=2) | |
# Classificador de similaridade (baseado em relevância para o prompt) | |
def score_response(prompt, response): | |
inputs = judge_tokenizer(prompt, response, return_tensors="pt", truncation=True, padding=True) | |
with torch.no_grad(): | |
outputs = judge_model(**inputs) | |
score = torch.softmax(outputs.logits, dim=1)[0][1].item() # Probabilidade da classe "boa" | |
return score | |
# Gerar resposta com modelo | |
def generate_response(model, tokenizer, prompt): | |
input_ids = tokenizer.encode(prompt, return_tensors="pt") | |
output_ids = model.generate(input_ids, max_new_tokens=60, num_return_sequences=1, do_sample=True) | |
return tokenizer.decode(output_ids[0], skip_special_tokens=True) | |
# Função principal | |
def chatbot(prompt): | |
response_1 = generate_response(model_1, tokenizer_1, prompt) | |
response_2 = generate_response(model_2, tokenizer_2, prompt) | |
score_1 = score_response(prompt, response_1) | |
score_2 = score_response(prompt, response_2) | |
if score_1 > score_2: | |
final = response_1 | |
chosen = "Resposta 1" | |
else: | |
final = response_2 | |
chosen = "Resposta 2" | |
return ( | |
prompt, | |
response_1, | |
response_2, | |
chosen, | |
final | |
) | |
# === INTERFACE GRADIO === | |
iface = gr.Interface( | |
fn=chatbot, | |
inputs=gr.Textbox(label="Digite sua pergunta"), | |
outputs=[ | |
gr.Textbox(label="Prompt"), | |
gr.Textbox(label="Resposta 1"), | |
gr.Textbox(label="Resposta 2"), | |
gr.Textbox(label="Resposta escolhida pelo árbitro"), | |
gr.Textbox(label="Resposta final exibida") | |
], | |
title="Chatbot em Cascata (Português)", | |
description="Dois modelos geram respostas e um árbitro (BERT) escolhe a melhor." | |
) | |
if __name__ == "__main__": | |
iface.launch() | |