from PyPDF2 import PdfReader import json import requests import io class AI_RH: def treat_text(self, pdf): pdfreader = PdfReader(io.BytesIO(pdf)) raw_text = '' for i, page in enumerate(pdfreader.pages): content = page.extract_text() if content: if '•' in content: content = content.replace("•", "") raw_text += content return raw_text def create_contents(self, pdf): text_ = self.treat_text(pdf) query = f""" Responda apenas o dicionário em formato json, não acrescente mais nada. Retorne apenas o dicionário com as informações solicitadas e nada mais. Texto: {text_} #End """ system_cfg = """ Responda em formato dicionário python padrão. Responda em português. Ao encerrar o dicionário, não acrescente mais nada. Os dados identificadores da pessoa, como nome, localização, email e telefone devem vir com rótulo (Exemplo: Nome: Nome Sobrenome, Email: email_da_pessoa, Telefone: telefone_da_pessoa). O nome deve ter todos os primeiros caracteres de cada nome em maiúscula. O telefone pode estar bagunçado no meio do texto, portanto, considere qualquer sequência numeral de 9 números como um telefone válido. As experiências, ou empresas trabalhadas, é um dos dados mais relevantes. Coloque cada empresa e ano de ingressão e conclusão se houver. Coloque os as empresas trabalhadas, certificados e cursos em formato de lista, separando cada curso como um item da lista. O E-MAIL É UMA DAS INFORMAÇÕES MAIS RELEVANTES, procure com atenção. Geralmente ele está escrito no meio do texto, portanto, lembre-se de considerar o que está antes e depois do "@" como o email. Não reorganize as palavras do email de jeito algum, retorne como encontrar. Geralmente o cargo está anexado à empresa (Exemplo: Cargo em Empresa_X). É IMPORTANTE CLASSIFICAR todas as experiências do mais recente para o mais antigo, considerando sempre a data de início como parâmetro para tal. O telefone pode estar bagunçado no meio do texto, portanto, considere qualquer sequência numeral de 9 números como um telefone válido. Considere o dado de habilidades ou skills tudo que você identificar como potencias cursos que a pessoa fez. Faculdades, cursos técnicos e pós graduações devem ficar no campo de Ensino. Por vezes, o candidato não descreve suas habilidades, nesses casos, inclua o campo Habilidades porém retorne vazio. Algumas vezes a pessoa descreve como "Certificados" suas habilidades. Considere isso também para o campo Habilidades. Por vezes, a pessoa o descreve como qualificação complementar ou certificações, portanto, considere isso para atribuir à chave de Habilidades. Sempre leve em consideração a descrição das atividades para o campo Descrição de cada Cargo. Se atente aos conhecimentos citados no texto e agrupe tudo dentro da chave Habilidades, não renomeie essa chave jamais. Caso esteja descrito carteira de habilitação no texto, acrescente isso ao campo Habilidades. Responda em formato dicionário python padrão. Não comece a resposta com "json", apenas os dados. Você receberá um texto que será convertido em dicionário python padrão. Apenas chaves e valores. Fique atento à formatação. Quando não encontrar, retorne null no campo correspondente. Respeite a ordem dos itens abaixo, independente de como esteja escrita no texto. *** A idade pode vir descrita ou como data de nascimento. Considere ambos. Nome: Idade: Localização: Email: (Considere qualquer coisa antes e depois do "@" como email.) Telefone: (Sempre no formato +55 11 99999-9999) *** *** Experiências: (o nome do campo sempre no plural, independente da quantidade) Coloque todos os empregos. Para cada emprego, inclua: Cargo: Empresa: Descrição: (Geralmente a descrição está logo após o cargo e a empresa. Considere sempre que encontrar.) Data de Início: Data de Término (se aplicável): *** *** Educação: (Esse campo sempre se chamará "Educação", independente de como esteja chamando no texto original.) Considere cursos técnicos, faculdades, cursos superiores, pós graduações. Retorne o campo Educação mesmo se não encontrar nada. Para cada item de formação acadêmica, inclua: Formação: Instituição: Data de conclusão: (se houver) *** *** Habilidades: (Esse campo sempre se chamará "Habilidades", independente de como esteja chamando no texto original. Sempre escreva o campo Habilidades mesmo se não encontrar nada.) Para cada habilidade, inclua: Conhecimento: *** Abaixo segue um exemplo de formatação. Toda resposta deve vir nesse exato formato. Por favor, considere apenas a formatação e o nome das chaves, e ignore o conteúdo: { "Nome": "Marcelo Oliveira", "Idade": 24, "Localização": "São Paulo, SP", "Email": "marcelooliveira485_pso@indeedemail.com", "Telefone": "+55 11 99354 6847", "Experiências": [ { "Cargo": "Auxiliar Técnico em Eletrônica", "Empresa": "Grupo PLL", "Descrição: "Manutenção de aparelhos (celulares e tablets), voltado para o reaproveitamento de placas e componentes de dispositivos danificados." "Data de Início": "Maio de 2019", "Data de Término": "Outubro de 2023" } ], "Educação": [ { "Formação": "Ensino Médio", "Instituição": "São Paulo, SP", "Data de Conclusão": "Julho de 2016" }, { "Formação": "Técnico em eletroeletrônica", "Instituição": "Etec Profª Drª Doroti Quiomi Kanashiro Toyohara", "Data de Conclusão": "Junho de 2016" } ], "Habilidades": [ { "Conhecimento": "Curso: Técnico em eletroeletrônica" }, { "Conhecimento": "Diagnóstico e consertos" } ] } """ content = self.chat_completion(system_cfg, query) print (content) return content def chat_completion(self, system_content, user_content): url = "http://localhost:1234/v1/chat/completions" payload = json.dumps({ "model": "lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF", "messages": [ { "role": "system", "content": system_content }, { "role": "user", "content": user_content } ], "temperature": 0, "max_tokens": -1 }) headers = { 'Content-Type': 'application/json' } response = requests.request("POST", url, headers=headers, data=payload) n_data = json.loads(response.text) content = n_data["choices"][0]["message"]["content"] return content def resumo_ai_function(self, job_dict, resume_dict): query = f""" Você é um analista de RH com 10 anos de experiência. Analise se o candidato possui as qualificações necessárias para a vaga. Considere o conjunto de habilidades, descrição das experiências anteriores e outras informações que o candidato tenha. Leia atentamente o currículo. Não invente informações que não esteja explicitamente descrita no currículo. Vaga: {job_dict} Currículo: {resume_dict} Seja simples e breve na sua resposta. Responda no formato do exemplo abaixo. Exemplo: tem as qualificações que se adequa a vaga. No entanto, não foi mencionado no currículo. Avaliação: %. """ system_cfg = """### Instruction: Responda em porcentagem de 0 a 100. Responda em português. Ao encerrar a resposta, não acrescente mais nada. """ content = self.chat_completion(system_cfg, query) return content