SlickSlick commited on
Commit
cad6daa
·
verified ·
1 Parent(s): 23a3d21

Upload 2 files

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