import gradio as gr from transformers import AutoTokenizer, AutoModelForQuestionAnswering import torch import logging from typing import Tuple, Dict import warnings warnings.filterwarnings('ignore') # Configuração de logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) class QAModel: def __init__(self): logger.info("Inicializando modelo...") self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") self.model_name = "pierreguillou/bert-base-cased-squad-v1.1-portuguese" self.tokenizer = AutoTokenizer.from_pretrained(self.model_name) self.model = AutoModelForQuestionAnswering.from_pretrained(self.model_name) self.model.to(self.device) logger.info(f"Modelo carregado no dispositivo: {self.device}") def answer_question(self, question: str, context: str) -> Tuple[str, Dict]: # Tokenização inputs = self.tokenizer.encode_plus( question, context, add_special_tokens=True, return_tensors="pt", max_length=512, truncation=True, padding="max_length" ).to(self.device) # Previsão with torch.no_grad(): outputs = self.model(**inputs) # Processamento das respostas answer_start = torch.argmax(outputs.start_logits) answer_end = torch.argmax(outputs.end_logits) # Convertendo para tokens e depois para texto tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0]) answer = tokens[answer_start:answer_end + 1] answer = self.tokenizer.convert_tokens_to_string(answer) # Calculando score confidence_start = torch.softmax(outputs.start_logits, dim=1)[0][answer_start].item() confidence_end = torch.softmax(outputs.end_logits, dim=1)[0][answer_end].item() confidence = (confidence_start + confidence_end) / 2 return answer, { "confiança": f"{confidence:.2%}", "início": answer_start.item(), "fim": answer_end.item() } def create_gradio_interface(): # Instanciando o modelo qa_model = QAModel() def process_question(context: str, question: str) -> Tuple[str, str]: try: answer, metadata = qa_model.answer_question(question, context) return ( answer, f"Confiança: {metadata['confiança']}\n" f"Posição da resposta: {metadata['início']} até {metadata['fim']}" ) except Exception as e: logger.error(f"Erro ao processar pergunta: {str(e)}") return "Ocorreu um erro ao processar sua pergunta.", "N/A" # Criando a interface demo = gr.Interface( fn=process_question, inputs=[ gr.Textbox( label="Contexto", placeholder="Cole aqui o texto de contexto...", lines=10 ), gr.Textbox( label="Pergunta", placeholder="Digite sua pergunta sobre o texto acima...", lines=2 ) ], outputs=[ gr.Textbox(label="Resposta"), gr.Textbox(label="Metadados") ], title="Perguntas e Respostas em Português", description=""" Este aplicativo usa o modelo BERT em português para responder perguntas baseadas em um contexto fornecido. Cole um texto no campo de contexto e faça uma pergunta sobre ele. """, examples=[ [ "O Brasil é o maior país da América do Sul. Sua capital é Brasília e sua maior cidade é São Paulo. O país tem uma população de mais de 200 milhões de habitantes.", "Qual é a capital do Brasil?" ], [ "A linguagem Python foi criada por Guido van Rossum em 1991. É uma linguagem de programação de alto nível, interpretada e orientada a objetos.", "Quem criou a linguagem Python?" ] ], theme=gr.themes.Soft() ) return demo if __name__ == "__main__": logger.info("Iniciando aplicação...") demo = create_gradio_interface() demo.launch( server_name="0.0.0.0", share=True, show_error=True )