File size: 6,184 Bytes
a59e205
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# -*- 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()