{"id":1662,"date":"2025-02-05T07:03:00","date_gmt":"2025-02-05T07:03:00","guid":{"rendered":"https:\/\/mailitics.com\/index.php\/2025\/02\/05\/from-resume-to-cover-letter-using-ai-and-llm-with-python-and-streamlit\/"},"modified":"2025-02-05T07:03:00","modified_gmt":"2025-02-05T07:03:00","slug":"from-resume-to-cover-letter-using-ai-and-llm-with-python-and-streamlit","status":"publish","type":"post","link":"https:\/\/mailitics.com\/index.php\/2025\/02\/05\/from-resume-to-cover-letter-using-ai-and-llm-with-python-and-streamlit\/","title":{"rendered":"From Resume to Cover Letter Using AI and LLM, with Python and Streamlit"},"content":{"rendered":"<p>    From Resume to Cover Letter Using AI and LLM, with Python and Streamlit<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n    <!-- no image --><br \/>\n \t<BR><br \/>\n<BR><\/BR><\/p>\n<div>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>DISCLAIMER<\/strong>: The idea of doing Cover Letter or even Resume with AI does not obviously start with me. <strong>A lot of people have done this before<\/strong> (very successfully) and have built websites and even companies from the idea. This is just a <strong>tutorial<\/strong> on how to build your own Cover Letter AI Generator App using Python and a few lines of code. All the code you will say in this blog post can be found in my public <a href=\"https:\/\/github.com\/PieroPaialungaAI\/CoverLetterAI\/tree\/main\" rel=\"noreferrer noopener\" target=\"_blank\">Github folder<\/a>. Enjoy.\u00a0<img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/1f642.png?ssl=1\" alt=\"\ud83d\ude42\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\">\u00a0<\/p>\n<\/blockquote>\n<p class=\"wp-block-paragraph\">Pep Guardiola is a (very successful) Manchester City <strong>football<\/strong> coach. During Barcelona\u2019s Leo Messi years, he invented a way of playing football known as \u201c<strong><em>Tiki-Taka<\/em><\/strong>\u201d. This means that as soon as you receive the ball, you pass the ball, immediately, without even controlling it. You can pass the ball 30\u201340 times before scoring a goal.<\/p>\n<p class=\"wp-block-paragraph\">More than a decade later, we can see how the way of playing football made Guardiola and his Barcelona famous is gone. If you look at a Manchester City match, they take the ball and immediately look for the striker or the winger. You only need a few, vertical passes, immediately looking for the opportunity. It is more predictable, but you do it so many times that you will eventually find the space to hit the target.<\/p>\n<p class=\"wp-block-paragraph\">I think that the <strong>job market<\/strong> has somehow gone in the same direction.\u00a0<\/p>\n<p>Before you had the opportunity to go to the company, hand in your resume, talk to them, be around them, schedule an interview, and actively talk to people. You would spend weeks preparing for that trip, polishing your resume, and reviewing questions and answers.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">For many, this old-fashioned strategy still works, and <strong>I<\/strong> <strong>believe it<\/strong>. If you have a good networking opportunity, or the right time and place, the handing the resume thing works very well. We love the human connection, and it is very effective to actually <strong>know<\/strong> someone.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">It is important to consider that there is a whole other approach as well. Companies like <strong>LinkedIn<\/strong>, <strong>Indeed, <\/strong>and even in general the <strong>internet<\/strong> completely changed the game. You can send so many resumes to so many companies and find a job out of statistics. <strong>AI is changing this game<\/strong> a little bit further. There are a lot of AI tools to tailor your resume for the specific company, make your resume more impressive, or build the<strong> job specific cover letter<\/strong>. There are indeed many <strong>companies<\/strong> that sell this kind of services to people that are looking for jobs.<\/p>\n<p class=\"wp-block-paragraph\">Now, believe me, I have got <strong>nothing<\/strong> against these companies, at all, but the AI that they are using it\u2019s not really \u201c<strong><em>their AI<\/em><\/strong>\u201d. What I mean by that is that if you use <a href=\"https:\/\/towardsdatascience.com\/tag\/chatgpt\/\" title=\"ChatGPT\">ChatGPT<\/a>, Gemini, or the super new DeepSeek to do the exact task you will very likely <strong>not<\/strong> get a worse response than the (paid) tool that you are using on their website. You are really paying for the \u201c<strong>commodity<\/strong>\u201d of having a backend API that does what we would have to do through ChatGPT. And that\u2019s fair.\u00a0<\/p>\n<p class=\"wp-block-paragraph\">Nonetheless, I want to show you that it is indeed very simple <strong>and cheap<\/strong> to make your own \u201cresume assistant\u201d using <strong>Large Language Models<\/strong>. In particular, I want to focus on <strong>cover letters<\/strong>. <strong>You give me your resume and the job description, and I give you your cover letter you can copy and paste to LinkedIn, Indeed, or your email<\/strong>.<\/p>\n<p class=\"wp-block-paragraph\">In one image, it will look like this:<\/p>\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/cdn-images-1.medium.com\/max\/1600\/1%2Ac5QPizAoAuQKoWlA61FZ3A.png?ssl=1\" alt=\"\"><figcaption class=\"wp-element-caption\">Image made by the author, credits on the\u00a0image<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">Now, Large Language Models (LLMs) are specific AI models that produce text. More specifically, they are <strong>HUGE<\/strong> Machine Learning models (even the small ones are very big).\u00a0<\/p>\n<p class=\"wp-block-paragraph\">This means that building your own LLM or training one from scratch is very, <strong>very<\/strong> expensive. We won\u2019t do anything like that. We will use a perfectly working LLM and we will smartly instruct it to perform our task. More specifically, we will do that in <strong>Python<\/strong> and using some APIs. Formally, it is a paid API. Nonetheless, since I started the whole project (with all the trial and error process) I spent <strong><em>less than 30 cents<\/em><\/strong>. You will likely spend <strong>4 <\/strong>or <strong>5 cents on it. \u00a0<\/strong><\/p>\n<p class=\"wp-block-paragraph\">Additionally, we will make a working <strong>web app<\/strong> that will allow you to have your cover letter in a few clicks. It will be an effort of a couple hundred lines of code (with spaces <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/1f642.png?ssl=1\" alt=\"\ud83d\ude42\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\">).<\/p>\n<p class=\"wp-block-paragraph\">To motivate you, here are screenshots of the final app:<\/p>\n<figure class=\"wp-block-image is-resized\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/cdn-images-1.medium.com\/max\/1200\/1%2ALAflnH_pVNk0xl0U8MIbig.png?ssl=1\" alt=\"\" style=\"width:384px;height:auto\"><\/figure>\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/cdn-images-1.medium.com\/max\/1600\/1%2AqOwtH25N88cqTzHVDIL7bg.png?ssl=1\" alt=\"\"><\/figure>\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/cdn-images-1.medium.com\/max\/2400\/1%2AS3IFQnp5UTy620M4mbmYPg.png?ssl=1\" alt=\"\"><\/figure>\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/cdn-images-1.medium.com\/max\/1600\/1%2AhJEy_lw1YkQWWXek4cnTOQ.png?ssl=1\" alt=\"\"><figcaption class=\"wp-element-caption\">Images made by the\u00a0author<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">Pretty cool right? It took me less than 5 hours to build the whole thing from scratch. Believe me: <strong><em>it\u2019s that simple<\/em><\/strong>. In this blog post, we will describe, in order:<\/p>\n<ol class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">The <strong>LLM API Strategy.<\/strong> This part will help the reader understand what LLM Agents we are using and how we are connecting them.<\/li>\n<li class=\"wp-block-list-item\">The <strong>LLM Object<\/strong>. This is the implementation of the LLM API strategy above using <strong>Python<\/strong>.\u00a0<\/li>\n<li class=\"wp-block-list-item\">The <strong>Web App and results<\/strong>.<strong> <\/strong>The LLM Object is then transferred into a web app using <strong>Streamlit<\/strong>. I\u2019ll show you how to access it and some results.\u00a0<\/li>\n<\/ol>\n<p class=\"wp-block-paragraph\">I\u2019ll try to be as specific as possible so that you have <strong>everything <\/strong>you need to make it yourself, but if this stuff gets too technical, feel free to skip to part 3 and just enjoy the sunset <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/1f643.png?ssl=1\" alt=\"\ud83d\ude43\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\">.<\/p>\n<p class=\"wp-block-paragraph\">Let\u2019s get started!<\/p>\n<h3 class=\"wp-block-heading\">1. LLM API\u00a0Strategy<\/h3>\n<p class=\"wp-block-paragraph\">This is the Machine Learning System Design part of this project, which I kept <strong>extremely <\/strong>light, because I wanted to maximize the readability of the whole approach (and because it honestly didn\u2019t need to be more complicated than that).<\/p>\n<p class=\"wp-block-paragraph\">We will use two APIs:<\/p>\n<ol class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">\n<strong>A Document Parser LLM API <\/strong>will read the <a href=\"https:\/\/towardsdatascience.com\/tag\/resume\/\" title=\"Resume\">Resume<\/a> and extract all the meaningful information<strong>.<\/strong> This information will be put in a\u00a0.json file so that, in production, we will have the resume already processed and stored somewhere in our memory.<\/li>\n<li class=\"wp-block-list-item\">\n<strong>A cover letter LLM API. <\/strong>This API will read the parsed resume (the output of the previous API) and the <strong>job description <\/strong>and it will output the Cover Letter.<\/li>\n<\/ol>\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/cdn-images-1.medium.com\/max\/1600\/1%2AVJYRjqJXtfhI1r2UNMJv2w.png?ssl=1\" alt=\"\"><figcaption class=\"wp-element-caption\">Image made by the author, credits on the\u00a0image<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">Two main points:<\/p>\n<ol class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">\n<strong>What is the best LLM for this task? <\/strong>For text extraction and summarization, <a href=\"https:\/\/medium.com\/@ankit941208\/generating-summaries-for-large-documents-with-llama2-using-hugging-face-and-langchain-f7de567339d2\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>LLama<\/strong><\/a> or <a href=\"https:\/\/ai.google.dev\/gemma\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Gemma<\/strong><\/a> are known to be a reasonably cheap and efficient LLM. As we are going to use LLama for the summarization task, in order to keep consistency, we can adopt it for the other API as well. If you want to use another model, feel free to do so.<\/li>\n<li class=\"wp-block-list-item\">\n<strong>How do we connect the APIs<\/strong>? There are a variety of ways you can do that. I decided to give it a try to<a href=\"https:\/\/www.llama-api.com\/\" target=\"_blank\" rel=\"noreferrer noopener\"> <strong>Llama API<\/strong><\/a>. The documentation is not exactly extensive, but it works well and it allows you to play with many models. You will need to log in, buy some credit ($1 is more than sufficient for this task), and save your API key. Feel free to switch to another solution (like <a href=\"https:\/\/huggingface.co\/meta-llama\/Llama-3.3-70B-Instruct\" target=\"_blank\" rel=\"noreferrer noopener\">Hugging Face<\/a> or <a href=\"https:\/\/www.langchain.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Langchain<\/a>) if you feel like it.<\/li>\n<\/ol>\n<p class=\"wp-block-paragraph\">Ok, now that we know <strong>what <\/strong>to do, we just need to actually implement it in Python.\u00a0<\/p>\n<h3 class=\"wp-block-heading\">2. LLM\u00a0Object<\/h3>\n<p class=\"wp-block-paragraph\">The first thing that we need is the actual <strong>LLM<\/strong> prompts. In the API, the prompts are usually passed using a dictionary. As they can be pretty long, and their structure is always similar, it makes sense to store them in\u00a0<strong>.json files<\/strong>. We will read the JSON files and use them as inputs for the API call.\u00a0<\/p>\n<h4 class=\"wp-block-heading\">2.1 LLM\u00a0Prompts<\/h4>\n<p class=\"wp-block-paragraph\">In this\u00a0.json file, you will have the <strong>model (<\/strong>you can call whatever model you like) and the <strong>content<\/strong> which is the instruction for the LLM. Of course, the content key has a static part, which is the \u201cinstruction\u201d and a \u201cdynamic\u201d part, which is the specific input of the API call. For example: this is the\u00a0.json file for the first API, I called it <strong><em>resume_parser_api.json<\/em><\/strong>:<\/p>\n<p><script class=\"wp-block-html\" src=\"https:\/\/gist.github.com\/PieroPaialungaAI\/3269bc348411a4b90b074d2ad4673534.js\"><\/script><\/p>\n<p class=\"wp-block-paragraph\">As you can see from the \u201ccontent\u201d there is the static call:<\/p>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cYou are a resume parser. You will extract information from this resume and put them in a\u00a0.json file. The keys of your dictionary will be first_name, last_name, location, work_experience, school_experience, skills. In selecting the information, keep track of the most insightful.\u201d<\/p>\n<\/blockquote>\n<p class=\"wp-block-paragraph\">The keys I want to extract out of my \u201c.json\u201d files are:<\/p>\n<pre class=\"wp-block-code\"><code>[first_name, last_name, location, work_experience, school_experience, skills]<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Feel free to add anything more information that you want to be \u201cextracted\u201d out of your resume, but remember that this is stuff that should matter <strong>only for your cover letter. <\/strong>The specific resume will be added after this text to form the full call\/instruction. More on that later.<\/p>\n<p class=\"wp-block-paragraph\">The order instruction is the <strong><em>cover_letter_api.json:<\/em><\/strong><\/p>\n<p><script class=\"wp-block-html\" src=\"https:\/\/gist.github.com\/PieroPaialungaAI\/2d099de9679468143c4b99d16e515944.js\"><\/script><\/p>\n<p class=\"wp-block-paragraph\">Now the instruction is this one:<\/p>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cYou are an expert in job hunting and a cover letter writer. Given a resume json file, the job description, and the date, write a cover letter for this candidate. Be persuasive and professional. Resume JSON: {resume_json}\u00a0; Job Description: {job_description}, Date: {date}\u201d<\/p>\n<\/blockquote>\n<p class=\"wp-block-paragraph\">As you can see, there are three placeholders: \u201c<strong>Resume_json<\/strong>\u201d, \u201c<strong>job_description<\/strong>\u201d and \u201c<strong>date<\/strong>\u201d.<strong> <\/strong>As before,<strong> <\/strong>these placeholders will then be replaced with the correct information to form the full prompt.\u00a0<\/p>\n<h4 class=\"wp-block-heading\">2.2 constants.py<\/h4>\n<p class=\"wp-block-paragraph\">I made a very small<strong><em> constants.py <\/em><\/strong>file with the path of the two\u00a0.json prompt files and the API that you have to generate from LLamaApi (or really whatever API you are using). Modify this if you want to run the file locally.\u00a0<\/p>\n<p><script class=\"wp-block-html\" src=\"https:\/\/gist.github.com\/PieroPaialungaAI\/8aa735012342a4b759bfa5320ce2edd4.js\"><\/script><\/p>\n<h4 class=\"wp-block-heading\">2.3 file_loader.py<\/h4>\n<p class=\"wp-block-paragraph\">This file is a collection of \u201cloaders\u201d for your resume. Boring stuff but important.\u00a0<\/p>\n<p><script class=\"wp-block-html\" src=\"https:\/\/gist.github.com\/PieroPaialungaAI\/334813aae180cb3040613fd08f0650c5.js\"><\/script><\/p>\n<h4 class=\"wp-block-heading\">2.4 cover_letter.py<\/h4>\n<p class=\"wp-block-paragraph\">The whole implementation of the LLM Strategy can be found in this object that I called <strong>CoverLetterAI<\/strong>. There it is:<\/p>\n<p><script class=\"wp-block-html\" src=\"https:\/\/gist.github.com\/PieroPaialungaAI\/cd8ee8fb2ebb7d747d072e41dd4ef5b4.js\"><\/script><\/p>\n<p class=\"wp-block-paragraph\">I spent quite some time trying to make everything modular and easy to read. I also made a lot of comments to all the functions so you can see exactly what does what. <strong>How do we use this beast?<\/strong><\/p>\n<p class=\"wp-block-paragraph\">So the whole code runs in 5 simple lines. Like this:<\/p>\n<pre class=\"wp-block-code\"><code>from cover_letter import CoverLetterAI&lt;br&gt;cover_letter_AI = CoverLetterAI()&lt;br&gt;cover_letter_AI.read_candidate_data('path_to_your_resume_file')&lt;br&gt;cover_letter_AI.profile_candidate()&lt;br&gt;cover_letter_AI.add_job_description('Insert job description')&lt;br&gt;cover_letter_AI.write_cover_letter()<\/code><\/pre>\n<p class=\"wp-block-paragraph\">So in order:<\/p>\n<ol class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">You call the <strong>CoverLetterAI <\/strong>object. It will be the star of the show<\/li>\n<li class=\"wp-block-list-item\">You give me the path to your <strong>resume<\/strong>. It can be PDF or Word and I read your information and store them in a variable.<\/li>\n<li class=\"wp-block-list-item\">You call <strong><em>profile_candidate(), <\/em><\/strong>and I run my first LLM. This process the candidate word info and creates the\u00a0.json file we will use for the second LLM\u00a0<\/li>\n<li class=\"wp-block-list-item\">You give me the <strong>job_description<\/strong> and you add it to the system. Stored.<\/li>\n<li class=\"wp-block-list-item\">You call <strong><em>write_cover_letter()<\/em><\/strong><em> <\/em>and I run my second LLM that generates, given the job description and the resume\u00a0.json file, the cover letter<\/li>\n<\/ol>\n<h3 class=\"wp-block-heading\">3. Web App and\u00a0Results<\/h3>\n<p class=\"wp-block-paragraph\">So that is really it. You saw all the technical details of this blog post in the previous paragraphs.<\/p>\n<p class=\"wp-block-paragraph\">Just to be extra fancy and show you that it works, I also made it a web app, where you can just <strong>upload your resume<\/strong>, <strong>add your job description<\/strong> and click <strong>generate cover letter<\/strong>. This is the <a href=\"https:\/\/coverletterpieropaialunga.streamlit.app\/\">link<\/a> and this is the <a href=\"https:\/\/github.com\/PieroPaialungaAI\/CoverLetterAI\/blob\/main\/main.py\" target=\"_blank\" rel=\"noreferrer noopener\">code<\/a>.<\/p>\n<p class=\"wp-block-paragraph\">Now, the <strong>cover letters <\/strong>that are generated are scary good.<\/p>\n<p class=\"wp-block-paragraph\">This is a random one:<\/p>\n<p class=\"wp-block-paragraph\">February 1, 2025<\/p>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Hiring Manager,<br \/>[Company I am intentionally blurring]<\/p>\n<p class=\"wp-block-paragraph\">I am thrilled to apply for the Distinguished AI Engineer position at [Company I am intentionally blurring], where I can leverage my passion for building responsible and scalable AI systems to revolutionize the banking industry. As a seasoned machine learning engineer and researcher with a strong background in physics and engineering, I am confident that my skills and experience align with the requirements of this role.<\/p>\n<p class=\"wp-block-paragraph\">With a Ph.D. in Aerospace Engineering and Engineering Mechanics from the University of Cincinnati and a Master\u2019s degree in Physics of Complex Systems and Big Data from the University of Rome Tor Vergata, I possess a unique blend of theoretical and practical knowledge. My experience in developing and deploying AI models, designing and implementing machine learning algorithms, and working with large datasets has equipped me with the skills to drive innovation in AI engineering.<\/p>\n<p class=\"wp-block-paragraph\">As a Research and Teaching Assistant at the University of Cincinnati, I applied surrogate models to detect and classify cracks in pipes, achieving a 14% improvement in damage detection experiments. I also developed surrogate models using deep learning algorithms to accelerate Finite Element Methods (FEM) simulations, resulting in a 1M-fold reduction in computational time. My experience in teaching and creating courses in signal processing and image processing for teens interested in AI has honed my ability to communicate complex concepts effectively.<\/p>\n<p class=\"wp-block-paragraph\">In my previous roles as a Machine Learning Engineer at Gen Nine, Inc., Apex Microdevices, and Accenture, I have successfully designed, developed, and deployed AI-powered solutions, including configuring mmWave radar and Jetson devices for data collection, implementing state-of-the-art point cloud algorithms, and leading the FastMRI project to accelerate MRI scan times. My expertise in programming languages such as Python, TensorFlow, PyTorch, and MATLAB, as well as my experience with cloud platforms like AWS, Docker, and Kubernetes, has enabled me to develop and deploy scalable AI solutions.<\/p>\n<p class=\"wp-block-paragraph\">I am particularly drawn to [Company I am intentionally blurring] commitment to creating responsible and reliable AI systems that prioritize customer experience and simplicity. My passion for staying abreast of the latest AI research and my ability to judiciously apply novel techniques in production align with the company\u2019s vision. I am excited about the opportunity to work with a cross-functional team of engineers, research scientists, and product managers to deliver AI-powered products that transform how [Company I am intentionally blurring] serves its customers.<\/p>\n<p class=\"wp-block-paragraph\">In addition to my technical skills and experience, I possess excellent communication and presentation skills, which have been demonstrated through my technical writing experience at Towards Data Science, where I have written comprehensive articles on machine learning and data science, reaching a broad audience of 50k+ monthly viewers.<\/p>\n<p class=\"wp-block-paragraph\">Thank you for considering my application. I am eager to discuss how my skills and experience can contribute to the success of the [Company I am intentionally blurring] and [Company I am intentionally blurring]\u2019s mission to bring humanity and simplicity to banking through AI. I am confident that my passion for AI, my technical expertise, and my ability to work collaboratively will make me a valuable asset to your team.<\/p>\n<p class=\"wp-block-paragraph\">Sincerely,<\/p>\n<p class=\"wp-block-paragraph\">Piero Paialunga<\/p>\n<\/blockquote>\n<p class=\"wp-block-paragraph\">They look just like I would write them for a specific job description. That being said, in 2025, you need to be careful because hiring managers <strong>do know<\/strong> that you are using AI to write them and the \u201ccomputer tone\u201d is pretty easy to spot (e.g. words like \u201c<strong><em>eager<\/em><\/strong>\u201d are <strong>very<\/strong> ChatGPT-ish lol). For this reason, I\u2019d like to say to <strong>use these tools wisely<\/strong>. Sure, you can build your \u201c<strong><em>template<\/em><\/strong>\u201d with them, but be sure to add your personal touch, otherwise your cover letter will be exactly like the other thousands of cover letters that the other applicants are sending in.\u00a0<\/p>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">This is the code to build the web <a href=\"https:\/\/github.com\/PieroPaialungaAI\/CoverLetterAI\/blob\/main\/main.py\" rel=\"noreferrer noopener\" target=\"_blank\">app<\/a>.\u00a0<\/p>\n<\/blockquote>\n<h3 class=\"wp-block-heading\">4. Conclusions\u00a0<\/h3>\n<p class=\"wp-block-paragraph\">In this blog article, we discovered how to use LLM to convert your resume and job description into a specific <strong>cover letter<\/strong>. These are the points we touched:<\/p>\n<ol class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">\n<strong>The use of AI in job hunting<\/strong>.<strong> <\/strong>In the first chapter we discussed how job hunting is now completely revolutionized by AI.\u00a0<\/li>\n<li class=\"wp-block-list-item\">\n<strong>Large Language Models idea<\/strong>. It is important to design the LLM APIs wisely. We did that in the second paragraph<\/li>\n<li class=\"wp-block-list-item\">\n<strong>LLM API implementation<\/strong>. We used Python to implement the LLM APIs organically and efficiently<\/li>\n<li class=\"wp-block-list-item\">\n<strong>The Web App<\/strong>. We used streamlit to build a Web App API to display the power of this approach.<\/li>\n<li class=\"wp-block-list-item\">\n<strong>Limits of this approach<\/strong>. I think that AI generated cover letters are indeed very good. They are on point, professional and well crafted. Nonetheless, if everyone starts using AI to build cover letters, they all really look the same, or at least they all have the same tone, which is not great. Something to think about.\u00a0<\/li>\n<\/ol>\n<h3 class=\"wp-block-heading\">5. References and other brilliant implementations<\/h3>\n<p class=\"wp-block-paragraph\">I feel that is just fair to mention a lot of brilliant people that have had this idea before me and have made this public and available for anyone. This is only a few of them I found online.<\/p>\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/coverlettercraft.com\/\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>Cover Letter Craft<\/strong><\/a><strong> <\/strong>by <a href=\"https:\/\/balajikesavan.com\/\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>Balaji Kesavan<\/strong><\/a> is a Streamlit app that implements a very similar idea of crafting the cover letter using AI. What we do different from that app is that we extract the resume directly from the word or PDF, while his app requires copy-pasteing. That being said, I think the guy is incredibly talented and very creative and I recommend giving a look to his <a href=\"https:\/\/balajikesavan.com\/\" rel=\"noreferrer noopener\" target=\"_blank\">portoflio<\/a>.<\/p>\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/medium.com\/u\/a55ed7fac031\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Randy Pettus<\/strong><\/a><strong> <\/strong>has a<a href=\"https:\/\/medium.com\/better-programming\/creating-an-ai-powered-cover-letter-generator-with-openai-ad224852f80a\" target=\"_blank\" rel=\"noreferrer noopener\"> <strong>similar idea<\/strong> <\/a>as well. The difference between his approach and the one proposed in this tutorial is that he is very specific in the information, asking questions like \u201ccurrent hiring manager\u201d and the temperature of the model. It\u2019s very interesting (and smart) that you can clearly see the way he is thinking of Cover Letters to guide the AI to build it the way he likes them. Highly recommended.<\/p>\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/Juanchobanano\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>Juan Esteban Cepeda<\/strong><\/a> does a very good job in his <a href=\"https:\/\/datapalooza-cover-letters.streamlit.app\/\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>app<\/strong><\/a> as well. You can also tell that he was working on making it bigger than a simple streamlit add because he added the link to his company and a bunch of reviews by users. Great job and great hustle. <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/1f642.png?ssl=1\" alt=\"\ud83d\ude42\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\"><\/p>\n<h3 class=\"wp-block-heading\">6. About\u00a0me!<\/h3>\n<p class=\"wp-block-paragraph\">Thank you again for your time. It means a lot <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/2764.png?ssl=1\" alt=\"\u2764\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\"><\/p>\n<p class=\"wp-block-paragraph\">My name is Piero Paialunga and I\u2019m this guy here:<\/p>\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/cdn-images-1.medium.com\/max\/1600\/0%2Aw9Y8ftqBkR5kNWR5.png?ssl=1\" alt=\"\"><figcaption class=\"wp-element-caption\"><em>Image made by author<\/em><\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">\n<p class=\"wp-block-paragraph\">I am a Ph.D. candidate at the University of Cincinnati Aerospace Engineering Department and a Machine Learning Engineer for Gen Nine. I talk about AI, and Machine Learning in my blog posts and on Linkedin. If you liked the article and want to know more about machine learning and follow my studies you can:<\/p>\n<p class=\"wp-block-paragraph\">A. Follow me on <a href=\"https:\/\/www.linkedin.com\/in\/pieropaialunga\/\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>Linkedin<\/strong><\/a>, where I publish all my stories<br \/>B. Subscribe to my <a href=\"https:\/\/piero-paialunga.medium.com\/subscribe\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>newsletter<\/strong><\/a>. It will keep you updated about new stories and give you the chance to text me to receive all the corrections or doubts you may have.<br \/>C. Become a <a href=\"https:\/\/piero-paialunga.medium.com\/membership\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>referred member<\/strong><\/a>, so you won\u2019t have any \u201cmaximum number of stories for the month\u201d and you can read whatever I (and thousands of other Machine Learning and Data Science top writers) write about the newest technology available.<br \/>D. Want to work with me? Check my rates and projects on <a href=\"https:\/\/www.upwork.com\/freelancers\/~017f9a75d13c030610\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>Upwork<\/strong><\/a>!<\/p>\n<p class=\"wp-block-paragraph\">If you want to ask me questions or start a collaboration, leave a message here or on <a href=\"https:\/\/www.linkedin.com\/in\/pieropaialunga\/\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>Linkedin<\/strong><\/a>:<\/p>\n<p class=\"wp-block-paragraph\"><strong><em>piero.paialunga@hotmail.com<\/em><\/strong><\/p>\n<p>The post <a href=\"https:\/\/towardsdatascience.com\/from-resume-to-cover-letter-using-ai-and-llm-with-python-and-streamlit\/\">From Resume to Cover Letter Using AI and LLM, with Python and Streamlit<\/a> appeared first on <a href=\"https:\/\/towardsdatascience.com\/\">Towards Data Science<\/a>.<\/p>\n<\/div>\n<p> \t<BR><br \/>\n <BR><\/BR><br \/>\n    Piero Paialunga<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n<a href=\"https:\/\/towardsdatascience.com\/from-resume-to-cover-letter-using-ai-and-llm-with-python-and-streamlit\/\">Go to original source<\/a><br \/>\n \t<BR><br \/>\n <BR><\/BR><\/p>\n","protected":false},"excerpt":{"rendered":"<p>From Resume to Cover Letter Using AI and LLM, with Python and Streamlit DISCLAIMER: The idea of doing Cover Letter or even Resume with AI does not obviously start with me. A lot of people have done this before (very successfully) and have built websites and even companies from the idea. This is just a [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[62,69,367,166,71,87,1634],"tags":[1636,1637,1635],"class_list":["post-1662","post","type-post","status-publish","format-standard","hentry","category-aimldsaimlds","category-artificial-intelligence","category-chatgpt","category-hands-on-tutorials","category-large-language-models","category-llm","category-resume","tag-cover","tag-letter","tag-resume"],"_links":{"self":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts\/1662"}],"collection":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/comments?post=1662"}],"version-history":[{"count":0,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts\/1662\/revisions"}],"wp:attachment":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/media?parent=1662"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/categories?post=1662"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/tags?post=1662"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}