Importaciones
Comenzamos importando algunas bibliotecas de Python manuales. Los claves son abierto para acceder a GPT-4o-mini, así como reducción y impresión fácil para crear una versión PDF del currículum final. Nota: Se requiere una clave API de OpenAI para este proyecto, que importé desde un script de Python separado.
from IPython.display import display, Markdown
from openai import OpenAI
from top_secret import my_skfrom markdown import markdown
from weasyprint import HTML
Paso 1: Ingrese el currículum y el JD
A continuación, cargaremos nuestro currículum de entrada en Python como una cadena y usaremos Python aporte() función que nos permite copiarlo y pegarlo en cualquier descripción del trabajo cuando ejecutamos el script.
# open and read the markdown file
with open("resumes/resume.md", "r", encoding="utf-8") as file:
resume_string = file.read()# input job description
jd_string = input()
Un detalle aquí es que el El currículum se guarda en formato Markdown.. Esto es importante porque alentará a GPT-4o-mini a generar un nuevo currículum en Markdown, que podemos diseñar fácilmente en un PDF. Nota: ChatGPT (o similar) puede convertir su currículum en PDF en rebajas.
Paso 2: construir mensaje
Con nuestro currículum y JD importados, ahora podemos crear un mensaje para indicarle al modelo que optimice el currículum. Un consejo profesional aquí es use ChatGPT para escribir una versión inicial de este mensaje porque 1) es bastante largo y 2) los LLM tienden a escribir instrucciones más alineadas con las expectativas de otros LLM.
Después de experimentar un poco, terminé con la siguiente plantilla, que reescribe el currículum y hace sugerencias adicionales para mejorar si existen brechas de habilidades.
prompt_template = lambda resume_string, jd_string : f"""
You are a professional resume optimization expert specializing in tailoring \
resumes to specific job descriptions. Your goal is to optimize my resume and \
provide actionable suggestions for improvement to align with the target role.### Guidelines:
1. **Relevance**:
- Prioritize experiences, skills, and achievements **most relevant to the \
job description**.
- Remove or de-emphasize irrelevant details to ensure a **concise** and \
**targeted** resume.
- Limit work experience section to 2-3 most relevant roles
- Limit bullet points under each role to 2-3 most relevant impacts
2. **Action-Driven Results**:
- Use **strong action verbs** and **quantifiable results** (e.g., \
percentages, revenue, efficiency improvements) to highlight impact.
3. **Keyword Optimization**:
- Integrate **keywords** and phrases from the job description naturally to \
optimize for ATS (Applicant Tracking Systems).
4. **Additional Suggestions** *(If Gaps Exist)*:
- If the resume does not fully align with the job description, suggest:
1. **Additional technical or soft skills** that I could add to make my \
profile stronger.
2. **Certifications or courses** I could pursue to bridge the gap.
3. **Project ideas or experiences** that would better align with the role.
5. **Formatting**:
- Output the tailored resume in **clean Markdown format**.
- Include an **"Additional Suggestions"** section at the end with \
actionable improvement recommendations.
---
### Input:
- **My resume**:
{resume_string}
- **The job description**:
{jd_string}
---
### Output:
1. **Tailored Resume**:
- A resume in **Markdown format** that emphasizes relevant experience, \
skills, and achievements.
- Incorporates job description **keywords** to optimize for ATS.
- Uses strong language and is no longer than **one page**.
2. **Additional Suggestions** *(if applicable)*:
- List **skills** that could strengthen alignment with the role.
- Recommend **certifications or courses** to pursue.
- Suggest **specific projects or experiences** to develop.
"""
Paso 3: realizar una llamada API
Usando la plantilla de mensaje anterior, podemos construir dinámicamente un mensaje usando el currículum de entrada y JD y luego enviarlo a OpenAI a través de su API.
# create prompt
prompt = prompt_template(resume_string, jd_string)# setup api client
client = OpenAI(api_key=my_sk)
# make api call
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "Expert resume writer"},
{"role": "user", "content": prompt}
],
temperature = 0.7
)
# extract response
response_string = response.choices[0].message.content
Paso 4: guardar el nuevo currículum
Finalmente podremos extraer el currículum optimizado y sugerencias de mejora.
# separate new resume from improvement suggestions
response_list = response_string.split("## Additional Suggestions")
Para el currículum, podemos convertir la salida de Markdown a HTML usando la biblioteca de Markdown. Luego, convierta el HTML a PDF usando weasyprint.
# save as PDF
output_pdf_file = "resumes/resume_new.pdf"# Convert Markdown to HTML
html_content = markdown(response_list[0])
# Convert HTML to PDF and save
HTML(string=html_content).write_pdf(output_pdf_file,
stylesheets=['resumes/style.css'])
Así es como se ve el resultado final.
Para las sugerencias de mejora, podemos imprimirlas directamente.
display(Markdown(response_list[1]))
Bonificación: cree una GUI
Si bien el código anterior simplifica este proceso hasta cierto punto, podemos hacerlo mejor. Para mejorar la usabilidad de esta herramienta, podemos crear una interfaz web sencilla usando Gradio.
El producto final se muestra a continuación. Un usuario puede cargar un archivo de rebajas de su currículum y pegarlo en cualquier descripción de trabajo de manera más sencilla. También agregué un área donde los usuarios pueden editar el nuevo currículum antes de exportarlo como PDF.
El El código de ejemplo está disponible en GitHub. repositorio aquí. Mira el vídeo de youtube para verme hablar a través del código.
Si bien adaptar el currículum a descripciones de trabajo específicas es una forma eficaz de hacer que una solicitud se destaque, puede resultar bastante tedioso. Aquí, analizamos la implementación de una herramienta de optimización de currículums impulsada por IA utilizando Python y la API de OpenAI.
Si tienes alguna pregunta o quieres profundizar en alguno de los temas tratados, házmelo saber en los comentarios 🙂
—
y2b.io Me ayudó a escribir este artículo.