juca-qa2-demo / app.py
JucaInTanjo's picture
Upload app.py
a59e205 verified
# -*- coding: utf-8 -*-
import os
import json
import torch
import gradio as gr
from transformers import pipeline
# --- Funções de contexto ---
def create_context(context_path='juca_context.json'):
"""
Cria o arquivo de contexto com informações sobre Juca.
"""
main_info = {
"nome_completo": "Julio Cesar Gomes do Nascimento", "nome_social": "Juca", "idade": 17, "altura": "1,77m",
"pais_nomes": "Cesar e Fabíola do Nascimento", "cidade": "Carapicuíba", "estado": "São Paulo", "pais": "Brasil",
"idiomas": ["Português (nativo)", "Inglês (básico)"],
"conhecimentos_tecnicos": ["Python", "C++", "Desenvolvimento de IA", "Visão Computacional"]
}
certificacoes = [
{"nome": "Python Fundamentos para Análise de Dados 3.0", "instituicao": "Data Science Academy", "concluido": True},
{"nome": "Fundamentos de Engenharia de Dados", "instituicao": "Data Science Academy", "carga_horaria": "24h", "aproveitamento": "85%", "data_conclusao": "05/05/2023", "concluido": True},
{"nome": "IA Generativa e LLMs para Processamento de Linguagem Natural", "instituicao": "Data Science Academy", "carga_horaria": "96h", "aproveitamento": "78%", "data_conclusao": "13/04/2025", "concluido": True},
{"nome": "Deep Learning para Aplicações de Inteligência Artificial com Python e C++", "instituicao": "Data Science Academy", "carga_horaria": "96h", "aproveitamento": "88%", "data_conclusao": "12/02/2025", "concluido": True}
]
formacao_atual = {
"nome": "Formação Engenheiro de Inteligência Artificial 4.0", "instituicao": "Data Science Academy", "status": "Em andamento",
"cursos_incluidos": ["Deep Learning para Aplicações de Inteligência Artificial com Python e C++", "IA Generativa e LLMs para Processamento de Linguagem Natural", "Inteligência Artificial para Visão Computacional", "Engenharia Financeira com Inteligência Artificial", "Machine Learning com JavaScript e Go", "Data Science e Machine Learning com Linguagem Julia"]
}
experiencia = {
"periodo": "2023-2024", "instituicao": "Projov", "local": "Barueri", "tipo": "Associação",
"descricao": "Participação em dinâmicas para aprimorar habilidades como oratória, trabalho em equipe, liderança, investimentos e conhecimento sobre o mercado de trabalho",
"experiencia_trabalho": {"cargo": "Jovem Aprendiz", "area": "Administrativa", "empresa": "Nissha Metallizing Solutions", "tipo_contrato": "Terceirizado", "responsabilidades": "Organização e gerenciamento dos documentos da empresa"}
}
context = {"informacoes_pessoais": main_info, "certificacoes": certificacoes, "formacao_atual": formacao_atual, "experiencia_profissional": experiencia}
with open(context_path, 'w', encoding='utf-8') as f:
json.dump(context, f, ensure_ascii=False, indent=4)
return context
def load_context_from_json(context_path="juca_context.json"):
if not os.path.exists(context_path):
context_data = create_context(context_path)
else:
with open(context_path, 'r', encoding='utf-8') as f:
context_data = json.load(f)
info = context_data.get("informacoes_pessoais", {})
certificacoes = context_data.get("certificacoes", [])
formacao = context_data.get("formacao_atual", {})
experiencia = context_data.get("experiencia_profissional", {})
exp_trabalho = experiencia.get("experiencia_trabalho", {})
context_text = (
f"Nome completo: {info.get('nome_completo', '')}. Nome social: {info.get('nome_social', '')}. Idade: {info.get('idade', '')} anos. "
f"Altura: {info.get('altura', '')}. Pais: {info.get('pais_nomes', '')}. Localização: {info.get('cidade', '')}, {info.get('estado', '')}, {info.get('pais', '')}. "
f"Idiomas: {', '.join(info.get('idiomas', []))}. Conhecimentos técnicos: {', '.join(info.get('conhecimentos_tecnicos', []))}. "
f"Certificações: {'; '.join([c['nome'] for c in certificacoes])}. "
f"Formação: {formacao.get('nome', '')} ({formacao.get('instituicao', '')}), Status: {formacao.get('status', '')}. "
f"Cursos incluídos: {', '.join(formacao.get('cursos_incluidos', []))}. "
f"Experiência Profissional: {experiencia.get('descricao', '')}. "
f"Cargo: {exp_trabalho.get('cargo', '')}, Empresa: {exp_trabalho.get('empresa', '')}."
)
return context_data, context_text
# --- Carregamento do modelo ---
MODEL_NAME = "pierreguillou/bert-base-cased-squad-v1.1-portuguese"
context_data, context_text = load_context_from_json()
try:
device_num = 0 if torch.cuda.is_available() else -1
qa_pipeline = pipeline("question-answering", model=MODEL_NAME, tokenizer=MODEL_NAME, device=device_num)
except Exception as e:
print(f"Erro ao carregar o modelo: {e}")
qa_pipeline = None
# --- Função de resposta ---
def responder_pergunta(pergunta):
if not pergunta:
return "Por favor, digite uma pergunta."
if not context_text:
return "Erro: contexto não carregado."
if not qa_pipeline:
return "Erro: modelo não carregado."
try:
result = qa_pipeline(question=pergunta, context=context_text)
return result['answer']
except Exception as e:
return f"Erro durante a inferência: {e}"
# --- Interface Gradio ---
description = """
# Pergunte sobre Juca!
Este é um sistema de QA com BERT em português baseado em contexto personalizado.
"""
context_display = json.dumps(context_data, indent=2, ensure_ascii=False) if context_data else "Contexto indisponível."
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown(description)
with gr.Row():
with gr.Column(scale=2):
question_input = gr.Textbox(label="Digite sua pergunta:", placeholder="Ex: Qual a idade de Juca?")
answer_output = gr.Textbox(label="Resposta:", interactive=False)
submit_button = gr.Button("Perguntar")
submit_button.click(fn=responder_pergunta, inputs=question_input, outputs=answer_output)
question_input.submit(fn=responder_pergunta, inputs=question_input, outputs=answer_output)
demo.queue().launch()