{
  "source_file": "0930",
  "source_platform": "Medium",
  "author": "Shawhin Talebi",
  "title_listed": "How to Build a Resume Optimizer with AI",
  "keywords": "AI应用,Python",
  "domain": "大模型算法",
  "content_type": "深度技术解析",
  "is_paid_flag": "部分免费/会员墙",
  "url": "https://towardsdatascience.com/how-to-build-a-resume-optimizer-with-ai-d73c2f9b9fcd/",
  "publish_date": "2024-12",
  "corpus_stage": "预训练/SFT",
  "notes": "",
  "id": "e666aab184ee",
  "collected_at": "2026-10-01T22:22:11",
  "title": "How to Build a Resume Optimizer with AI | Towards Data Science",
  "body_markdown": "Toggle Search[](https://towardsdatascience.com/)Toggle Mobile Navigation\n[](https://towardsdatascience.com/)\nPublish AI, ML & data-science insights to a global community of data professionals.\nSign in[Submit an Article](https://write.insightmediagroup.io)\n[Latest](https://towardsdatascience.com/latest/)[Editor's Picks](https://towardsdatascience.com/tag/editors-pick/)[Newsletter](https://towardsdatascience.com/tag/the-variable/)[ShipAI](https://towardsdatascience.com/shipai/)\n* * *\n[Write For TDS](https://towardsdatascience.com/submissions/)\n[LinkedIn](https://www.linkedin.com/company/towards-data-science/)[X](https://x.com/TDataScience)Toggle Search\n# How to Build a Resume Optimizer with AI\nStep-by-step guide with example Python code\n[Shaw Talebi](https://towardsdatascience.com/author/shawhin/)\nDecember 30, 20246 min read\nIn a previous blog post, I shared [5 AI Projects You Can Build This Weekend](https://towardsdatascience.com/5-ai-projects-you-can-build-this-weekend-with-python-c57724e9c461), where the first project idea was a resume optimization tool. Since then, many people have asked for more guidance on implementing this project. In this article, I'll walk through an example implementation using Python and OpenAI's API.\n![Image from Canva.](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1aefMwjIYw6N8Ci5jY3De6w.png)\nImage from Canva.\n* * *\nAdapting your resume to different job descriptions is an effective yet tedious part of finding a job. Even if you've tailored your resume for a specific role, companies may have **varying expectations for similar job titles**.\nFor instance, below are two comparable data scientist roles at Netflix and Google with slightly different job descriptions. Lucky for us, with today's AI tools, **we can build an app to streamline this process**.\n![Comparison of similar data scientist roles. Image by author.](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/16Qz-BPfw8QKUthBe5XWarQ.png)\nComparison of similar data scientist roles. Image by author.\n## **Can't I Use ChatGPT?**\nHearing this idea, you might think, _can't I just use a no-code AI tool like ChatGPT or Claude for this?_\nThe answer is yes! In fact, **I'd recommend starting with no-code solutions** anytime you want to build a project like this. However, there are two limitations to consider.\n**First** , working with long prompts in a chat UI can get cumbersome, especially when you have several jobs you want to apply to. **Second** , if you want to scale this process up from 5 resumes to 50, using ChatGPT (or the like) may become impractical.\n## **The Project Workflow**\nAt a high level, this project aims to take a resume and job description (JD) and return an optimized version of the resume based on the JD. While one could implement such a tool in many ways, here I'll use the following **4-step workflow**.\n  1. **Import the Resume and JD** : Load your resume and define the job description you want to target.\n  2. **Construct a Prompt** : Create a prompt to guide the AI in rewriting your resume.\n  3. **Make API Call** : Use OpenAI's API to prompt GPT-4o-mini to rewrite your resume.\n  4. **Display and Save the Results** : Save the new resume as a PDF.\n\n\n![4-step workflow. Image by author.](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1I0EW2hwh5suzFBx2s7cZww.png)\n4-step workflow. Image by author.\n## **Example Code: Automated Resume Optimizer**\nWith a basic understanding of what we are trying to build and why, let's see how to implement this project in Python. The example code is freely available on [GitHub](https://github.com/ShawhinT/AI-Builders-Bootcamp-2/tree/main/lightning-lesson).\n> [**AI-Builders-Bootcamp-2/lightning-lesson at main · ShawhinT/AI-Builders-Bootcamp-2**](https://github.com/ShawhinT/AI-Builders-Bootcamp-2/tree/main/lightning-lesson)\n* * *\n### **Imports**\nWe start by importing a few hand Python libraries. The key ones are _openai_ for accessing GPT-4o-mini, as well as _markdown_ and _weasyprint_ to create a PDF version of the final resume. _Note: An OpenAI API key is required for this project, which I imported from a separate Python script._\npython\n\n```\nfrom IPython.display import display, Markdown\nfrom openai import OpenAI\nfrom top_secret import my_sk\n\nfrom markdown import markdown\nfrom weasyprint import HTML\n```\n\n### **Step 1: Input Resume & JD**\nNext, we will load our input resume into Python as a string and use Python's _input()_ function to allow us to copy-paste it into any job description when we run the script.\npython\n\n```\n# open and read the markdown file\nwith open(\"resumes/resume.md\", \"r\", encoding=\"utf-8\") as file:\n    resume_string = file.read()\n\n# input job description\njd_string = input()\n```\n\nA detail here is that the **resume is saved in a markdown format**. This is important because it will encourage GPT-4o-mini to generate a new resume in markdown, which we can easily style into a PDF. _Note: ChatGPT (or the like) can convert your PDF resume to markdown._\n### **Step 2: Construct Prompt**\nWith our resume and JD imported, we can now craft a prompt to instruct the model to optimize the resume. A pro tip here is to **use ChatGPT to write an initial version of this prompt** because 1) it's pretty long, and 2) LLMs tend to write instructions more aligned with the expectations of other LLMs.\nAfter some experimentation, I ended up with the following prompt template, which rewrites the resume and makes additional suggestions for improvement if skill gaps exist.\npython\n\n```\nprompt_template = lambda resume_string, jd_string : f\"\"\"\nYou are a professional resume optimization expert specializing in tailoring \nresumes to specific job descriptions. Your goal is to optimize my resume and \nprovide actionable suggestions for improvement to align with the target role.\n\n### Guidelines:\n1. **Relevance**:  \n   - Prioritize experiences, skills, and achievements **most relevant to the \njob description**.  \n   - Remove or de-emphasize irrelevant details to ensure a **concise** and \n**targeted** resume.\n   - Limit work experience section to 2-3 most relevant roles\n   - Limit bullet points under each role to 2-3 most relevant impacts\n\n2. **Action-Driven Results**:  \n   - Use **strong action verbs** and **quantifiable results** (e.g., \npercentages, revenue, efficiency improvements) to highlight impact.  \n\n3. **Keyword Optimization**:  \n   - Integrate **keywords** and phrases from the job description naturally to \noptimize for ATS (Applicant Tracking Systems).  \n\n4. **Additional Suggestions** *(If Gaps Exist)*:  \n   - If the resume does not fully align with the job description, suggest:  \n     1. **Additional technical or soft skills** that I could add to make my \nprofile stronger.  \n     2. **Certifications or courses** I could pursue to bridge the gap.  \n     3. **Project ideas or experiences** that would better align with the role.  \n\n5. **Formatting**:  \n   - Output the tailored resume in **clean Markdown format**.  \n   - Include an **\"Additional Suggestions\"** section at the end with \nactionable improvement recommendations.  \n\n---\n\n### Input:\n- **My resume**:  \n{resume_string}\n\n- **The job description**:  \n{jd_string}\n\n---\n\n### Output:  \n1. **Tailored Resume**:  \n   - A resume in **Markdown format** that emphasizes relevant experience, \nskills, and achievements.  \n   - Incorporates job description **keywords** to optimize for ATS.  \n   - Uses strong language and is no longer than **one page**.\n\n2. **Additional Suggestions** *(if applicable)*:  \n   - List **skills** that could strengthen alignment with the role.  \n   - Recommend **certifications or courses** to pursue.  \n   - Suggest **specific projects or experiences** to develop.\n\"\"\"\n```\n\n### **Step 3: Make API Call**\nUsing the above prompt template, we can dynamically construct a prompt using the input resume and JD and then send it to OpenAI via their API.\npython\n\n```\n# create prompt\nprompt = prompt_template(resume_string, jd_string)\n\n# setup api client\nclient = OpenAI(api_key=my_sk)\n\n# make api call\nresponse = client.chat.completions.create(\n    model=\"gpt-4o-mini\",\n    messages=[\n        {\"role\": \"system\", \"content\": \"Expert resume writer\"},\n        {\"role\": \"user\", \"content\": prompt}\n    ], \n    temperature = 0.7\n)\n\n# extract response\nresponse_string = response.choices[0].message.content\n```\n\n### Step 4: Save New Resume\nFinally, we can extract the optimized resume and suggestions for improvement.\npython\n\n```\n# separate new resume from improvement suggestions\nresponse_list = response_string.split(\"## Additional Suggestions\")\n```\n\nFor the resume, we can convert the markdown output to HTML using the markdown library. Then, convert the HTML to a PDF using weasyprint.\npython\n\n```\n# save as PDF\noutput_pdf_file = \"resumes/resume_new.pdf\"\n\n# Convert Markdown to HTML\nhtml_content = markdown(response_list[0])\n\n# Convert HTML to PDF and save\nHTML(string=html_content).write_pdf(output_pdf_file, \n                                    stylesheets=['resumes/style.css'])\n```\n\nHere's what the final result looks like.\n![Final PDF version of resume. Image by author.](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1yxotdba0q76KEDMYFkPrOg.png)\nFinal PDF version of resume. Image by author.\nFor the improvement suggestions, we can print those directly.\npython\n\n```\ndisplay(Markdown(response_list[1]))\n```\n\n![Improvement suggestions. Image by author.](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1z_eRkm1cegn92vAbmNTf9w.png)\nImprovement suggestions. Image by author.\n### **Bonus: Build a GUI**\nWhile the code above streamlines this process to some extent, we can do better. To improve the usability of this tool, we can **create a simple web interface using Gradio**.\nThe final product is shown below. A user can upload a markdown file of their resume and paste it into any job description more straightforwardly. I also added an area where users can edit the new resume before exporting it as a PDF.\n![Demo of final GUI. GIF by author.](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1WSr9YjOT6voOgLiYBXPpFA.gif)\nDemo of final GUI. GIF by author.\nThe **example code is available at the GitHub** repository [here](https://github.com/ShawhinT/AI-Builders-Bootcamp-2/blob/main/lightning-lesson/resume_optimizer_UI.ipynb). Check out the [YouTube video](https://youtu.be/R5WXaxmb6m4) to see me talk through the code.\n## **What's Next?**\nWhile tailoring one's resume to specific job descriptions is an effective way to make an application stand out, it can be quite tedious. Here, we walk through the implementation of an AI-powered resume optimization tool using Python and OpenAI's API.\nIf you have any questions or want to dive deeper into any of the topics covered, let me know in the comments :)\n  * [_y2b.io_](https://y2b.io/) _helped me write this article._\n\n\n* * *\n👉 _Get exclusive access to AI resources and project ideas:_[_**Learn more**_](https://the-data-entrepreneurs.kit.com/shaw)\n## Register Now to Continue Reading\n### Unlock Towards Data Science with a Free Account\nAll articles on Towards Data Science are available to registered users. Create a free account today to access this article and thousands more.\nRegister for freeSign in to your account\n* * *\n![](https://assets.insightmediagroup.io/media/1787657074748_utev3i.jpeg)\nWritten By\n## [Shaw Talebi](https://towardsdatascience.com/author/shawhin/)\n[See all from Shaw Talebi](https://towardsdatascience.com/author/shawhin/)\n[AI](https://towardsdatascience.com/tag/ai/)[Hands On Tutorials](https://towardsdatascience.com/tag/hands-on-tutorials/)[OpenAI](https://towardsdatascience.com/tag/openai/)[Python](https://towardsdatascience.com/tag/python/)[Resume](https://towardsdatascience.com/tag/resume/)\nShare This Article\n  * [](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Ftowardsdatascience.com%2Fhow-to-build-a-resume-optimizer-with-ai-d73c2f9b9fcd%2F&title=How%20to%20Build%20a%20Resume%20Optimizer%20with%20AI)\n  * [](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Ftowardsdatascience.com%2Fhow-to-build-a-resume-optimizer-with-ai-d73c2f9b9fcd%2F&title=How%20to%20Build%20a%20Resume%20Optimizer%20with%20AI)\n  * [](https://x.com/share?url=https%3A%2F%2Ftowardsdatascience.com%2Fhow-to-build-a-resume-optimizer-with-ai-d73c2f9b9fcd%2F&text=How%20to%20Build%20a%20Resume%20Optimizer%20with%20AI)\n\n\nTowards Data Science is a community publication. Submit your insights to reach our global audience and earn through the TDS Author Payment Program.\n[Write for TDS](https://towardsdatascience.com/submissions/)\n## Related Articles\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/11/1zfXSlG3P5qaflANlpH0eWQ.png)](https://towardsdatascience.com/pyqt-relational-databases-data-format-2-2203505f778/)\n## [PyQt & Relational Databases - Data Format 2](https://towardsdatascience.com/pyqt-relational-databases-data-format-2-2203505f778/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nPresent relational database data easily with PyQt. No SQL needed.\n[Stefan Melo](https://towardsdatascience.com/author/melo-stefan/)\nNovember 18, 20214 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/06/1AA_d2Dw7Gm-N5F_wIXYSDA-scaled.jpeg)](https://towardsdatascience.com/incorporate-an-llm-chatbot-into-your-web-application-with-openai-python-and-shiny-fe78673a5d26/)\n## [Incorporate an LLM Chatbot into Your Web Application with OpenAI, Python, and Shiny](https://towardsdatascience.com/incorporate-an-llm-chatbot-into-your-web-application-with-openai-python-and-shiny-fe78673a5d26/)\n[](https://towardsdatascience.com/how-to-build-a-resume-optimizer-with-ai-d73c2f9b9fcd/)\nStep-by-Step Integration of AI Chatbots into Shiny for Python Applications: From API Setup to User Interaction.\n[Deepsha Menghani](https://towardsdatascience.com/author/menghani.deepsha/)\nJune 18, 20248 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/09/1C5v8YO8zSEDZ5fpDVZPEHQ.png)](https://towardsdatascience.com/build-a-tokenizer-for-the-thai-language-from-scratch-0e4ea5f2a8b3/)\n## [Build a Tokenizer for the Thai Language from Scratch](https://towardsdatascience.com/build-a-tokenizer-for-the-thai-language-from-scratch-0e4ea5f2a8b3/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nA step-by-step guide to building a Thai multilingual sub-word tokenizer based on a BPE algorithm trained on Thai and English datasets\n[Milan Tamang](https://towardsdatascience.com/author/tamangmilan/)\nSeptember 14, 202415 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/05/18xlCuhcsfj17TZd7i4L-cw.png)](https://towardsdatascience.com/all-public-transport-leads-to-utrecht-not-rome-bb9674600e81/)\n## [All public transport leads to Utrecht, not Rome](https://towardsdatascience.com/all-public-transport-leads-to-utrecht-not-rome-bb9674600e81/)\n[](https://towardsdatascience.com/how-to-build-a-resume-optimizer-with-ai-d73c2f9b9fcd/)\nWe all know the saying \"All roads lead to Rome\". But this not valid for public transport in the Netherlands, where they lead to Utrecht\n[Leo van der Meulen](https://towardsdatascience.com/author/leo-vander-meulen/)\nMay 28, 20216 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/10/0royXScvlCQQOxx5X-scaled.jpg)](https://towardsdatascience.com/extraction-of-vietnam-address-data-from-the-unstructured-text-150fe8cb0045/)\n## [Extraction of Vietnam address data from the unstructured text](https://towardsdatascience.com/extraction-of-vietnam-address-data-from-the-unstructured-text-150fe8cb0045/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nNowadays, social network and e-commerce is an important part of our life. We buy and sell many things on these platforms, and Vietnam\n[Linh Tran](https://towardsdatascience.com/author/linrium/)\nOctober 15, 202012 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2024/09/1bRWpQz9o4qdSdls3oopp6Q.png)](https://towardsdatascience.com/how-to-train-a-vision-transformer-vit-from-scratch-f26641f26af2/)\n## [How to Train a Vision Transformer (ViT) from Scratch](https://towardsdatascience.com/how-to-train-a-vision-transformer-vit-from-scratch-f26641f26af2/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nA practical guide to implementing the Vision Transformer (ViT)\n[François Porcher](https://towardsdatascience.com/author/francoisporcher/)\nSeptember 4, 202412 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/02/1bwq2DZgDEedqDGAxZM8I1Q-scaled.jpeg)](https://towardsdatascience.com/read-csv-let-me-down-956acd1cee91/)\n## [read_csv Let Me Down!](https://towardsdatascience.com/read-csv-let-me-down-956acd1cee91/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nWhy not to trust your favourite data import functions\n[Simon Lipson](https://towardsdatascience.com/author/simonlipson/)\nFebruary 2, 20214 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/09/1OxZ9VTsqvNYko58C4_axYA-scaled.jpeg)](https://towardsdatascience.com/regression-for-classification-hands-on-experience-8754a909a298/)\n## [Regression for Classification | Hands on Experience](https://towardsdatascience.com/regression-for-classification-hands-on-experience-8754a909a298/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nLogistic Regression and Softmax Regression with Core Concepts\n[Yasas Sandeepa](https://towardsdatascience.com/author/yasassandeepa007/)\nSeptember 13, 20218 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/03/0potYOOdPXWdoo-W8-scaled.jpg)](https://towardsdatascience.com/creating-geospatial-heatmaps-with-pythons-plotly-and-folium-libraries-4159e98a1ae8/)\n## [Creating Geospatial Heatmaps With Python's Plotly and Folium Libraries](https://towardsdatascience.com/creating-geospatial-heatmaps-with-pythons-plotly-and-folium-libraries-4159e98a1ae8/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nTwo Great Python Options for Visualising Geospatial Variation\n[Andy McDonald](https://towardsdatascience.com/author/andymcdonaldgeo/)\nMarch 17, 20236 min read\n\n\n  * [YouTube](https://www.youtube.com/c/TowardsDataScience)\n  * [X](https://x.com/TDataScience)\n  * [LinkedIn](https://www.linkedin.com/company/towards-data-science/)\n  * [Threads](https://www.threads.net/@towardsdatascience)\n  * [Bluesky](https://bsky.app/profile/towardsdatascience.com)\n\n\n[](https://towardsdatascience.com/)\nYour home for data science and AI. The world's leading publication for data science, data analytics, data engineering, machine learning, and artificial intelligence professionals.\nSubscribe to Our Newsletter[Write For TDS](https://towardsdatascience.com/submissions/)•[About](https://towardsdatascience.com/about-towards-data-science-d691af11cc2f/)•[Advertise](https://contact.towardsdatascience.com/advertise-with-towards-data-science)•[Privacy Policy](https://towardsdatascience.com/privacy-policy/)•[Terms of Use](https://towardsdatascience.com/website-terms-of-use/)\n© Insight Media Group, LLC 2026•[The New Stack](https://thenewstack.io)•[roadmap.sh](https://roadmap.sh)•[Creator Network](https://insightmediagroup.io/creator-network)\nword word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word\n  \nmmMwWLliI0fiflO&1  \nmmMwWLliI0fiflO&1  \nmmMwWLliI0fiflO&1  \nmmMwWLliI0fiflO&1  \nmmMwWLliI0fiflO&1  \nmmMwWLliI0fiflO&1  \nmmMwWLliI0fiflO&1\n####  Recommended Articles \nClose\n",
  "metadata": {
    "title": "How to Build a Resume Optimizer with AI | Towards Data Science",
    "description": "Step-by-step guide with example Python code",
    "keywords": null,
    "author": "Shaw Talebi",
    "og:locale": "en_US",
    "og:type": "article",
    "og:title": "How to Build a Resume Optimizer with AI",
    "og:description": "Step-by-step guide with example Python code",
    "og:url": "https://towardsdatascience.com/how-to-build-a-resume-optimizer-with-ai-d73c2f9b9fcd/",
    "og:site_name": "Towards Data Science",
    "og:image": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1aefMwjIYw6N8Ci5jY3De6w.png",
    "og:image:width": "1280",
    "og:image:height": "720",
    "og:image:type": "image/png",
    "twitter:card": "summary_large_image",
    "twitter:site": "@TDataScience",
    "twitter:creator": "@TDataScience",
    "twitter:label1": "Written by",
    "twitter:data1": "Shaw Talebi",
    "twitter:label2": "Est. reading time",
    "twitter:data2": "6 min read",
    "article:published_time": "2024-12-30T13:02:50.000Z",
    "article:modified_time": "2024-12-30T13:02:50.000Z",
    "article:author": "https://towardsdatascience.com/author/shawhin/"
  },
  "paywall": {
    "listed_paid": true,
    "detected": false,
    "marker": "",
    "public_only": true,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": "",
    "retried": true
  },
  "code_blocks": [
    {
      "language": "txt",
      "file": "attachments/e666aab184ee/code/block_000.txt",
      "chars": 160
    },
    {
      "language": "txt",
      "file": "attachments/e666aab184ee/code/block_001.txt",
      "chars": 174
    },
    {
      "language": "txt",
      "file": "attachments/e666aab184ee/code/block_002.txt",
      "chars": 2189
    },
    {
      "language": "txt",
      "file": "attachments/e666aab184ee/code/block_003.txt",
      "chars": 431
    },
    {
      "language": "txt",
      "file": "attachments/e666aab184ee/code/block_004.txt",
      "chars": 118
    },
    {
      "language": "txt",
      "file": "attachments/e666aab184ee/code/block_005.txt",
      "chars": 284
    },
    {
      "language": "txt",
      "file": "attachments/e666aab184ee/code/block_006.txt",
      "chars": 36
    }
  ],
  "images": [
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1aefMwjIYw6N8Ci5jY3De6w.png",
      "alt": "Image from Canva.",
      "local_path": "attachments/e666aab184ee/images/000.png",
      "bytes": 826957,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/16Qz-BPfw8QKUthBe5XWarQ.png",
      "alt": "Comparison of similar data scientist roles. Image by author.",
      "local_path": "attachments/e666aab184ee/images/001.png",
      "bytes": 299111,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1I0EW2hwh5suzFBx2s7cZww.png",
      "alt": "4-step workflow. Image by author.",
      "local_path": "attachments/e666aab184ee/images/002.png",
      "bytes": 22756,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1yxotdba0q76KEDMYFkPrOg.png",
      "alt": "Final PDF version of resume. Image by author.",
      "local_path": "attachments/e666aab184ee/images/003.png",
      "bytes": 69965,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1z_eRkm1cegn92vAbmNTf9w.png",
      "alt": "Improvement suggestions. Image by author.",
      "local_path": "attachments/e666aab184ee/images/004.png",
      "bytes": 30964,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/12/1WSr9YjOT6voOgLiYBXPpFA.gif",
      "alt": "Demo of final GUI. GIF by author.",
      "local_path": "attachments/e666aab184ee/images/005.gif",
      "bytes": 5286292,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/11/1zfXSlG3P5qaflANlpH0eWQ.png",
      "alt": "",
      "local_path": "attachments/e666aab184ee/images/006.png",
      "bytes": 2416714,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/06/1AA_d2Dw7Gm-N5F_wIXYSDA-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/e666aab184ee/images/007.jpeg",
      "bytes": 246903,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/09/1C5v8YO8zSEDZ5fpDVZPEHQ.png",
      "alt": "",
      "local_path": "attachments/e666aab184ee/images/008.png",
      "bytes": 61105,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/05/18xlCuhcsfj17TZd7i4L-cw.png",
      "alt": "",
      "local_path": "attachments/e666aab184ee/images/009.png",
      "bytes": 167229,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2020/10/0royXScvlCQQOxx5X-scaled.jpg",
      "alt": "",
      "local_path": "attachments/e666aab184ee/images/010.jpg",
      "bytes": 839041,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2024/09/1bRWpQz9o4qdSdls3oopp6Q.png",
      "alt": "",
      "local_path": "attachments/e666aab184ee/images/011.png",
      "bytes": 103117,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/02/1bwq2DZgDEedqDGAxZM8I1Q-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/e666aab184ee/images/012.jpeg",
      "bytes": 562035,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/09/1OxZ9VTsqvNYko58C4_axYA-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/e666aab184ee/images/013.jpeg",
      "bytes": 393445,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/03/0potYOOdPXWdoo-W8-scaled.jpg",
      "alt": "",
      "local_path": "attachments/e666aab184ee/images/014.jpg",
      "bytes": 493396,
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [],
  "retry_at": "2026-10-03T08:00:17",
  "repair_version": 2,
  "repaired_at": "2026-10-14T11:11:49Z",
  "source_url": "https://towardsdatascience.com/how-to-build-a-resume-optimizer-with-ai-d73c2f9b9fcd/",
  "delivery_status": "excluded_paid",
  "discovery_status": "excluded_paid",
  "missing_reason": "按原约定排除付费/会员全文"
}