Spaces:
Runtime error
Runtime error
File size: 8,171 Bytes
b9a69cb |
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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
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 |