Spaces:
Sleeping
Sleeping
| # -*- 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() | |