In Progress
Résumé Generator
Check it out here: Resume Generator
Introduction
This project is an extension of a substantial amount of work done to automate one of life's occasional necessities, drafting resumes. Rather than spam a stock resume or embrace the time consumption of drafting tailored resumes, the modern era of writing machines enables a third way: LLM resume generation.
Truly, is there a better role for these wondrous tools? Maybe, but the order of the day is sending out résumés.
Initial development
Initially it was apparent that what is needed is a general discussion of the user's work history, education, and so on. This can be fed to the LLM along with the job description, and a résumé comes out the other end.
If you're into markdown. And nowadays, are we not all down with markdown? And yet, it's not the standard, "approved", proprietary compressed XML format systems expect; nor the readable, immutable PDF; nor even plain text. Instead it uses readable-ish punctuation sigils and hopes the user will put it through a formatter.
No, plain markdown would not do. PDF is the right choice: it always displays correctly and provides peace of mind and a feeling of professionalism. So the first task was creating a system that will turn something an LLM is comfortable producing into a PDF. We will skip recalling the attempt at
Given candidate's longform history, the job description, and Power Markdown examples, all that's left is feeding the beast and telling it to write a resume. Simple. And if the assistant can search around in the local directories and find fine-tuned examples, boosting its own output, so much the better. Everything seems fine.
Operationalization
For creating the Résumé Generator in the site, more is required. Finding Chromium-sporting images for the PDF renderer, wiring up Cloudflare Turnstile and the API gateway, doing AI Native fullstack development to make the JavaScript component for the frontend, job description processing, storage and metadata setup, and of course, the main serverless instance which interfaces with these to call the LLM API.
Crafting the LLM request (for Claude) was not especially difficult. The prompts used locally had to be split out into system and user prompts, and a preprocessor was created to build the user prompt using the longform history (a versioned and stored input) and job description.
Issues and Opportunities
The main issue discovered was that LLMs really like technical keywords. Why should a 4-trillion parameter Transformer decoder trained on the sum total of human knowledge (i.e. Reddit) fight its natural affinity with ATS systems? Here are some examples:
[insert jargon resume]
Prompt-massaging only goes so far in this circumstance, somewhat surprisingly:
[insert prompt excerpt]
[insert result]
The solution was to split the LLM flow into two stages, both with strong instructions guiding the LLMs towards human-oriented, i.e. meaning-oriented outputs:
[insert sample prompt language]
[insert result]
The first phase acts as a résumé strategist, analyzing the job description for