AI简历优化器
高级
这是一个AI Summarization, Multimodal AI领域的自动化工作流,包含 18 个节点。主要使用 Set, Code, Gmail, Merge, Webhook 等节点。 使用Gemini分析和邮件报告将简历匹配到职位描述
前置要求
- •Google 账号和 Gmail API 凭证
- •HTTP Webhook 端点(n8n 会自动生成)
- •可能需要目标 API 的认证凭证
- •Google Gemini API Key
使用的节点 (18)
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "TzPKUZdrlcTUenHQ",
"meta": {
"instanceId": "d1dc073e8e3059a23e2730f69cb1b90065a2ac39039fea0727fdf9bee77a9131",
"templateCredsSetupCompleted": true
},
"name": "AI 简历优化器",
"tags": [],
"nodes": [
{
"id": "08a1bb78-33db-4698-9970-c5b38c25835c",
"name": "Webhook - 简历优化器表单",
"type": "n8n-nodes-base.webhook",
"position": [
-224,
272
],
"webhookId": "d50feff6-c48f-41e8-8df2-62ee9864907c",
"parameters": {
"path": "cv-optimizer",
"options": {},
"responseMode": "responseNode",
"multipleMethods": true
},
"typeVersion": 2.1
},
{
"id": "310ffa59-1f26-4ddd-881d-c5819b89d7f1",
"name": "Webhook 响应 - HTML 表单",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
0,
176
],
"parameters": {
"options": {},
"respondWith": "text",
"responseBody": "=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>AI CV Optimizer</title>\n <style>\n :root {\n --primary: #2563eb;\n --primary-hover: #1e4ed8;\n --gray-light: #f9fafb;\n --gray: #ccc;\n --text-dark: #333;\n --radius: 10px;\n }\n body {\n font-family: Arial, sans-serif;\n background: var(--gray-light);\n margin: 0;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n }\n .container {\n background: white;\n padding: 2rem;\n border-radius: var(--radius);\n box-shadow: 0 6px 16px rgba(0,0,0,0.1);\n max-width: 420px;\n width: 100%;\n }\n h2 {\n margin-bottom: 1.5rem;\n color: var(--text-dark);\n font-size: 1.5rem;\n text-align: center;\n }\n label {\n font-weight: 600;\n display: block;\n margin: 1rem 0 0.5rem;\n }\n input[type=\"file\"], input[type=\"text\"], input[type=\"email\"] {\n width: 100%;\n padding: 0.75rem;\n border: 1px solid var(--gray);\n border-radius: var(--radius);\n font-size: 0.95rem;\n box-sizing: border-box;\n }\n input:focus {\n border-color: var(--primary);\n outline: none;\n box-shadow: 0 0 0 3px rgba(37,99,235,0.15);\n }\n button {\n margin-top: 1.5rem;\n padding: 0.9rem;\n background: var(--primary);\n color: white;\n border: none;\n border-radius: var(--radius);\n width: 100%;\n font-size: 1rem;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n button:hover {\n background: var(--primary-hover);\n }\n button:disabled {\n background: #9ca3af;\n cursor: not-allowed;\n }\n .status {\n margin-top: 1rem;\n font-size: 0.9rem;\n text-align: center;\n }\n .status.success { color: green; }\n .status.error { color: red; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h2>AI CV Optimizer</h2>\n <form id=\"cvForm\">\n <label for=\"cv\">Upload your CV (PDF):</label>\n <input type=\"file\" id=\"cv\" name=\"cv\" accept=\"application/pdf\" required />\n\n <label for=\"job_url\">Job Posting URL:</label>\n <input type=\"text\" id=\"job_url\" name=\"job_url\" placeholder=\"https://linkedin.com/job/123\" required />\n\n <label for=\"email\">Your Email:</label>\n <input type=\"email\" id=\"email\" name=\"email\" placeholder=\"you@example.com\" required/>\n\n <button type=\"submit\">Check My CV</button>\n <div class=\"status\" id=\"status\"></div>\n </form>\n </div>\n\n <script>\n const form = document.getElementById(\"cvForm\");\n const statusDiv = document.getElementById(\"status\");\n\n form.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n\n const formData = new FormData(form);\n statusDiv.textContent = \"⏳ Uploading and analyzing your CV...\";\n statusDiv.className = \"status\";\n\n try {\n const res = await fetch(\"https://n8nworkflow.eu/webhook-test/cv-optimizer\", {\n method: \"POST\",\n body: formData\n });\n\n if (!res.ok) {\n throw new Error(\"Server error: \" + res.statusText);\n }\n\n const data = await res.json();\n console.log(\"n8n response:\", data);\n statusDiv.textContent = \"✅ CV submitted successfully! Check your email for results.\";\n statusDiv.className = \"status success\";\n } catch (err) {\n console.error(err);\n statusDiv.textContent = \"❌ Error: \" + err.message;\n statusDiv.className = \"status error\";\n }\n });\n </script>\n</body>\n</html>"
},
"typeVersion": 1.4
},
{
"id": "5f221527-5476-49cb-a166-eb3213f5d4a6",
"name": "提取简历文本 (PDF)",
"type": "n8n-nodes-base.extractFromFile",
"position": [
0,
384
],
"parameters": {
"options": {},
"operation": "pdf",
"binaryPropertyName": "=cv"
},
"typeVersion": 1
},
{
"id": "75eb814c-8d04-4310-bc01-3fcaf1640634",
"name": "准备简历文本",
"type": "n8n-nodes-base.set",
"position": [
224,
384
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "be5e5936-7940-43be-b905-62b54d9db076",
"name": "cv_text",
"type": "string",
"value": "={{ $json.text }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "da50a5a9-a727-45f9-b07c-e75844f89d45",
"name": "获取职位发布",
"type": "n8n-nodes-base.httpRequest",
"position": [
448,
304
],
"parameters": {
"url": "={{ $(' Webhook - CV Optimizer Form').item.json.body.job_url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "405c1c1d-afa1-4b9e-a595-a7eef3772303",
"name": "合并简历 + 职位数据",
"type": "n8n-nodes-base.merge",
"position": [
896,
368
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.2
},
{
"id": "f7e1ebf8-5e4e-48b8-a384-d88f53d771bb",
"name": "Gemini 模型 - 主要",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
1120,
592
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"id": "qQGrvqnSPqWFH6I6",
"name": "Google Gemini(PaLM) Api account 5"
}
},
"typeVersion": 1
},
{
"id": "cf43c082-b2ae-42e0-8d3d-83db4a4d9f9d",
"name": "解析 AI JSON 输出",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1248,
592
],
"parameters": {
"autoFix": true,
"jsonSchemaExample": "{\n \"job_title\": \"Frontend Developer (React)\",\n \"location\": \"Helsinki, Finland\",\n \"fit_summary\": \"The candidate has solid React, TypeScript, and JavaScript experience, supported by practical work on full-stack applications. They also demonstrate CI/CD knowledge and testing skills (Cypress, Jest), which align well with the role. However, the CV does not explicitly highlight advanced CSS frameworks or accessibility practices that are emphasized in the job description.\",\n \"recommendation\": \"Consider\",\n \"fit_score\": 7,\n \"missing_critical\": [\n \"Advanced CSS framework experience (e.g., Tailwind, Material UI)\",\n \"Accessibility (WCAG) best practices\"\n ],\n \"cv_optimization\": \"Add a section highlighting hands-on experience with CSS frameworks (Tailwind, Material UI) and accessibility best practices (WCAG). Include concrete project examples that demonstrate user-focused design and frontend performance improvements.\",\n \"final_recommendation\": \" The candidate is a good potential match but should strengthen their CV by explicitly mentioning CSS framework expertise and accessibility knowledge to move from 'Consider' to a stronger 'Apply'.\"\n}"
},
"typeVersion": 1.3
},
{
"id": "51bd8f61-dea2-4763-beb3-d0171ca55660",
"name": "Gemini 模型",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
1328,
800
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"id": "qQGrvqnSPqWFH6I6",
"name": "Google Gemini(PaLM) Api account 5"
}
},
"typeVersion": 1
},
{
"id": "a0bbfaab-6717-4a88-9766-97d70dec3f03",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-304
],
"parameters": {
"width": 512,
"height": 272,
"content": "## AI 简历优化器:使用 AI 将您的简历与职位描述匹配"
},
"typeVersion": 1
},
{
"id": "91fb8dbc-2126-47dc-a4ae-a42d8b9c4397",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1152,
192
],
"parameters": {
"color": 6,
"width": 224,
"content": "### AI - 比较简历与职位"
},
"typeVersion": 1
},
{
"id": "0343291b-6da2-4155-9a52-164f4c4ab1d1",
"name": "便签2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1088,
736
],
"parameters": {
"color": 5,
"width": 208,
"height": 112,
"content": "### Gemini / AI"
},
"typeVersion": 1
},
{
"id": "14e53603-87f5-4d4e-92ef-216eb5917964",
"name": "便签5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1584,
528
],
"parameters": {
"color": 5,
"width": 192,
"height": 96,
"content": "### 发送报告"
},
"typeVersion": 1
},
{
"id": "c05f35ba-eeb9-4752-80ef-23eefbcca0f2",
"name": "发送报告",
"type": "n8n-nodes-base.gmail",
"position": [
1616,
368
],
"webhookId": "ce5d269e-ee40-4c92-9479-e5af8baec199",
"parameters": {
"sendTo": "={{ $(' Webhook - CV Optimizer Form').item.json.body.email }}",
"message": "=<p>Hi,</p>\n\n<p>We’ve analyzed your CV against the job posting for <b>{{ $json.output.job_title }}</b> in <b>{{ $json.output.location }}</b>.</p>\n\n<p><b>Summary:</b><br>\n{{ $json.output.fit_summary }}</p>\n\n<p><b>Critical gaps identified:</b></p>\n<ul>\n {{ $json.output.missing_critical.map(gap => `<li>${gap}</li>`).join(\"\") }}\n</ul>\n\n<p><b>FinalFit Score:</b> {{ $json.output.fit_score }} / 10 <b> Recommendation: <b/> {{ $json.output.recommendation }}</p>\n<p>\n<b>Tips for improving CV: </b>{{ $json.output.cv_optimization }}\n</p>\n<p><b>AI Advice:</b><br>\n{{ $json.output.final_recommendation }}\n</p>\n\n<p>Best of luck with your applications,<br>AI CV Optimizer</p>",
"options": {},
"subject": "=Your CV Review: {{ $json.output.job_title }} in {{ $json.output.location }}"
},
"credentials": {
"gmailOAuth2": {
"id": "jkKHvU2Pb9X5WJk5",
"name": "Gmail account"
}
},
"typeVersion": 2.1
},
{
"id": "8918b88f-f90d-4e68-b28b-84dd68ad854a",
"name": "便签 11",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
16
],
"parameters": {
"color": 5,
"width": 160,
"height": 144,
"content": "### 提交表单"
},
"typeVersion": 1
},
{
"id": "03491b28-4df7-4be4-88b1-4128e92fe9b7",
"name": "AI 简历分析器",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1152,
368
],
"parameters": {
"text": "=CV:\n{{ $json[\"cv_text\"] ? $json[\"cv_text\"].slice(0, 18000) : \"\" }}\n\nJOB:\n{{ $json[\"job_text\"] ? $json[\"job_text\"].slice(0, 18000) : \"\" }}\n\nTasks:\n1) Extract the \"job_title\" and \"location\". \n2) Identify \"matched_skills\" and \"missing_critical\" skills. \n3) Write a short \"advice\" paragraph (max 100 words). \n4) Write a friendly \"email_body\" addressed to the candidate, summarizing:\n - Job title & location \n - What they already match well \n - Areas to improve or learn for better fit \n - A motivating closing sentence \n5)5) Write a short final_recommendation paragraph.\n\n6) Provide **two recommendations**: \n - \"recommendation\": Apply / Consider / Not a fit (must align with fit_score) \n - \"cv_optimization\": Clear advice on how to improve the CV for similar roles. \n6) The \"fit_score\" must always align with \"recommendation\": \n - Apply → fit_score between 9 and 10 \n - Consider → fit_score between 7 and 8 \n - Not a fit → fit_score between 1 and 6 \n\n⚠️ IMPORTANT: Return ONLY valid JSON in this schema:\n{\n \"job_title\": \"string\",\n \"location\": \"string\",\n \"fit_score\": 0,\n \"recommendation\": \"Apply|Consider|Not a fit\",\n\"final_recommendation\": [\"string\"],\n \"matched_skills\": [\"string\"],\n \"missing_critical\": [\"string\"],\n \"advice\": \"string\",\n \"cv_optimization\": \"string\",\n \"email_body\": \"string\"\n}",
"options": {
"systemMessage": "You are a professional career assistant. \nYour task is to compare a candidate’s CV with a job description and return a structured JSON output. \n\n⚠️ RULES: \n- Follow the schema exactly. \n- Every field must be included. \n- All values must be plain text, arrays, or integers — never nested objects. \n- `fit_score` must be an integer (1–10) aligned with `recommendation`: \n - \"Apply\" → 9–10 \n - \"Consider\" → 7–8 \n - \"Not a fit\" → 1–6 \n- Do not add responsibilities, requirements, or benefits. \n- Do not include any text outside the JSON. \n\nSchema:\n{\n \"job_title\": \"string\",\n \"location\": \"string\",\n \"fit_score\": 0,\n \"recommendation\": \"Apply|Consider|Not a fit\",\n \"matched_skills\": [\"string\"],\n \"missing_critical\": [\"string\"],\n \"advice\": \"string\",\n \"cv_optimization\": \"string\",\n \"email_body\": \"string\",\n\"final_recommendation\": : \"string\",\n\n}"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "798f0b85-bd22-4ad8-a9c3-a3535d955069",
"name": "职位文本清理器",
"type": "n8n-nodes-base.code",
"position": [
672,
304
],
"parameters": {
"jsCode": "const raw = $json.data || \"\";\nconst text = raw\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \"\")\n .replace(/<\\/?[^>]+(>|$)/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\nreturn [{ job_text: text }];"
},
"typeVersion": 2
},
{
"id": "eef4754b-adb0-4859-93df-cfc361f8175c",
"name": "便签3",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-304
],
"parameters": {
"color": 2,
"width": 304,
"height": 144,
"content": "## 自定义清单"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "039ce290-aa42-4e4a-a346-65841445a6a6",
"connections": {
"Gemini Model": {
"ai_languageModel": [
[
{
"node": "Parse AI JSON Output",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"AI CV Analyzer": {
"main": [
[
{
"node": "Send report ",
"type": "main",
"index": 0
}
]
]
},
"Prepare CV Text": {
"main": [
[
{
"node": "Fetch Job Posting",
"type": "main",
"index": 0
},
{
"node": "Merge CV + Job Data",
"type": "main",
"index": 1
}
]
]
},
"Job Text Cleaner": {
"main": [
[
{
"node": "Merge CV + Job Data",
"type": "main",
"index": 0
}
]
]
},
"Fetch Job Posting": {
"main": [
[
{
"node": "Job Text Cleaner",
"type": "main",
"index": 0
}
]
]
},
"Merge CV + Job Data": {
"main": [
[
{
"node": "AI CV Analyzer",
"type": "main",
"index": 0
}
]
]
},
"Parse AI JSON Output": {
"ai_outputParser": [
[
{
"node": "AI CV Analyzer",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Extract CV Text (PDF)": {
"main": [
[
{
"node": "Prepare CV Text",
"type": "main",
"index": 0
}
]
]
},
" Gemini Model - Primary": {
"ai_languageModel": [
[
{
"node": "AI CV Analyzer",
"type": "ai_languageModel",
"index": 0
}
]
]
},
" Webhook - CV Optimizer Form": {
"main": [
[
{
"node": "Webhook Response - HTML Form",
"type": "main",
"index": 0
}
],
[
{
"node": "Extract CV Text (PDF)",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - AI 摘要总结, 多模态 AI
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
竞争对手内容差距分析器:自动化网站主题映射
使用Gemini AI、Apify和Google Sheets分析竞争对手内容差距
If
Set
Code
+10
30 节点Mychel Garzon
杂项
在可视化参考库中探索n8n节点
在可视化参考库中探索n8n节点
If
Ftp
Set
+93
113 节点I versus AI
其他
来自多个招聘网站的求职自动化
使用 5 个招聘平台和 AI 简历生成器自动化求职与申请
If
Set
Code
+14
34 节点Gerald Denor
个人效率
转录评估器
使用DeepGram和GPT-4o的音频对话分析与可视化
Set
Code
Html
+15
54 节点RealSimple Solutions
人工智能
自动向客户发送发票
通过 OCR.Space、GPT-4 和 Google Drive 到 Gmail 实现发票处理的自动化
If
Set
Code
+12
29 节点Michael Taleb
AI 摘要总结
使用Groq AI和GhostGenius比较LinkedIn个人资料与职位描述
使用Groq AI和GhostGenius比较LinkedIn个人资料与职位描述的匹配度
If
Set
Code
+8
17 节点Stephan Koning
杂项