File size: 2,661 Bytes
a415299
e21a6e7
8742642
b488926
8742642
 
 
 
 
 
 
 
a415299
8742642
 
 
 
 
 
 
 
 
e21a6e7
8742642
 
 
 
 
 
 
 
e21a6e7
8742642
 
 
 
 
a415299
8742642
 
 
 
af19806
8742642
 
 
af19806
8742642
af19806
8742642
af19806
7b3747b
8742642
 
 
e21a6e7
8742642
7b3747b
8742642
 
 
 
 
a415299
 
 
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
import gradio as gr
from transformers import pipeline
from sentence_transformers import SentenceTransformer, util

class ModelComparator:
    def __init__(self):
        # Modelo de QA (mais rápido e leve)
        self.qa_pipeline = pipeline("question-answering", model="distilbert-base-uncased-distilled-squad")
        # Modelo de geração de texto simples
        self.text_gen_pipeline = pipeline("text-generation", model="gpt2", max_new_tokens=50)
        # Modelo para embeddings e similaridade
        self.sim_model = SentenceTransformer("all-MiniLM-L6-v2")

    def get_qa_answer(self, question, context=None):
        # Se não passar contexto, responde "não sei"
        if context is None:
            return "No context provided for QA model."
        try:
            result = self.qa_pipeline(question=question, context=context)
            return result['answer']
        except Exception as e:
            return f"Error in QA pipeline: {e}"

    def get_text_gen_answer(self, prompt):
        try:
            generated = self.text_gen_pipeline(prompt)[0]['generated_text']
            # O GPT2 gera o texto incluindo o prompt, vamos remover o prompt para deixar só resposta
            answer = generated[len(prompt):].strip()
            return answer if answer else generated.strip()
        except Exception as e:
            return f"Error in text generation pipeline: {e}"

    def compare_answers(self, answer1, answer2):
        emb1 = self.sim_model.encode(answer1, convert_to_tensor=True)
        emb2 = self.sim_model.encode(answer2, convert_to_tensor=True)
        similarity = util.cos_sim(emb1, emb2).item()
        return round(similarity, 3)

    def respond(self, question, context):
        qa_answer = self.get_qa_answer(question, context)
        gen_answer = self.get_text_gen_answer(question)
        similarity = self.compare_answers(qa_answer, gen_answer)

        return (f"Model QA answer:\n{qa_answer}\n\n"
                f"Model GPT-2 generated answer:\n{gen_answer}\n\n"
                f"Semantic similarity score: {similarity}")

# Interface Gradio

model_comparator = ModelComparator()

with gr.Blocks() as demo:
    gr.Markdown("## Comparador de respostas entre dois modelos locais (CPU)")
    question_input = gr.Textbox(label="Pergunta")
    context_input = gr.Textbox(label="Contexto para o modelo de QA (opcional)", lines=5)
    output = gr.Textbox(label="Respostas e Similaridade", lines=15)
    btn = gr.Button("Comparar")

    btn.click(
        fn=model_comparator.respond,
        inputs=[question_input, context_input],
        outputs=output
    )

if __name__ == "__main__":
    demo.launch()