Spaces:
Runtime error
Runtime error
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": "[email protected]", | |
"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: <nome> tem as qualificações <habilidades, formação, qualificação, etc.> que se adequa a vaga. No entanto, não foi mencionado <algo da vaga> no currículo. Avaliação: <numero> %. | |
""" | |
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 |