SlickSlick commited on
Commit
7ac3bc1
·
verified ·
1 Parent(s): 804abd9

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +80 -0
app.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # app.py
2
+
3
+ from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
4
+ from sentence_transformers import SentenceTransformer, util
5
+ import torch
6
+ import gradio as gr
7
+
8
+ # Modelos A e B
9
+ modelo_a_nome = "pierreguillou/t5-base-pt-small-finetuned-question-generation"
10
+ modelo_b_nome = "unicamp-dl/ptt5-base-portuguese-vocab"
11
+
12
+ tokenizer_a = AutoTokenizer.from_pretrained(modelo_a_nome)
13
+ modelo_a = AutoModelForSeq2SeqLM.from_pretrained(modelo_a_nome)
14
+
15
+ tokenizer_b = AutoTokenizer.from_pretrained(modelo_b_nome)
16
+ modelo_b = AutoModelForSeq2SeqLM.from_pretrained(modelo_b_nome)
17
+
18
+ # Modelo Árbitro
19
+ modelo_arbitro_nome = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
20
+ modelo_arbitro = SentenceTransformer(modelo_arbitro_nome)
21
+
22
+ # Dispositivo
23
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
24
+ modelo_a = modelo_a.to(device)
25
+ modelo_b = modelo_b.to(device)
26
+ modelo_arbitro = modelo_arbitro.to(device)
27
+
28
+ # Funções
29
+ def gerar_resposta_modelo_a(pergunta):
30
+ entrada = tokenizer_a.encode(pergunta, return_tensors="pt").to(device)
31
+ saida_ids = modelo_a.generate(entrada, max_length=50, num_beams=4, early_stopping=True)
32
+ resposta = tokenizer_a.decode(saida_ids[0], skip_special_tokens=True)
33
+ return resposta
34
+
35
+ def gerar_resposta_modelo_b(pergunta):
36
+ entrada = tokenizer_b.encode(pergunta, return_tensors="pt").to(device)
37
+ saida_ids = modelo_b.generate(entrada, max_length=50, num_beams=4, early_stopping=True)
38
+ resposta = tokenizer_b.decode(saida_ids[0], skip_special_tokens=True)
39
+ return resposta
40
+
41
+ def escolher_melhor_resposta(pergunta, resposta_a, resposta_b):
42
+ embeddings = modelo_arbitro.encode([pergunta, resposta_a, resposta_b], convert_to_tensor=True)
43
+ similaridade_a = util.pytorch_cos_sim(embeddings[0], embeddings[1]).item()
44
+ similaridade_b = util.pytorch_cos_sim(embeddings[0], embeddings[2]).item()
45
+
46
+ if similaridade_a > similaridade_b:
47
+ melhor = "A"
48
+ resposta_escolhida = resposta_a
49
+ else:
50
+ melhor = "B"
51
+ resposta_escolhida = resposta_b
52
+
53
+ return resposta_escolhida, melhor, similaridade_a, similaridade_b
54
+
55
+ def responder(pergunta):
56
+ resposta_a = gerar_resposta_modelo_a(pergunta)
57
+ resposta_b = gerar_resposta_modelo_b(pergunta)
58
+ resposta_final, escolhido, sim_a, sim_b = escolher_melhor_resposta(pergunta, resposta_a, resposta_b)
59
+
60
+ return {
61
+ "Melhor Resposta": resposta_final,
62
+ "Resposta do Modelo A": f"{resposta_a} (similaridade: {sim_a:.2f})",
63
+ "Resposta do Modelo B": f"{resposta_b} (similaridade: {sim_b:.2f})",
64
+ "Modelo Escolhido": f"Modelo {escolhido}"
65
+ }
66
+
67
+ interface = gr.Interface(
68
+ fn=responder,
69
+ inputs=gr.Textbox(label="Digite sua pergunta"),
70
+ outputs=[
71
+ gr.Textbox(label="Melhor Resposta"),
72
+ gr.Textbox(label="Resposta do Modelo A"),
73
+ gr.Textbox(label="Resposta do Modelo B"),
74
+ gr.Textbox(label="Modelo Escolhido"),
75
+ ],
76
+ title="Chatbot em Cascata",
77
+ description="Este chatbot compara duas respostas geradas por modelos diferentes e escolhe a melhor com base na similaridade semântica. Respostas 100% em português."
78
+ )
79
+
80
+ interface.launch()