GPT-4 점수 매기기 및 Gmail 알림을 사용한 후보자 평가 자동화
중급
이것은HR, AI Summarization분야의자동화 워크플로우로, 12개의 노드를 포함합니다.주로 If, Set, Code, Gmail, Webhook 등의 노드를 사용하며. GPT-4 점수 매기기와 Gmail 알림을 사용한 후보자 평가 자동화
사전 요구사항
- •Google 계정 및 Gmail API 인증 정보
- •HTTP Webhook 엔드포인트(n8n이 자동으로 생성)
- •대상 API의 인증 정보가 필요할 수 있음
사용된 노드 (12)
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"nodes": [
{
"id": "1",
"name": "CV 제출 웹훅",
"type": "n8n-nodes-base.webhook",
"position": [
240,
300
],
"parameters": {
"path": "cv-received",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 1
},
{
"id": "2",
"name": "스티키 노트",
"type": "n8n-nodes-base.stickyNote",
"position": [
140,
180
],
"parameters": {
"width": 240,
"height": 160,
"content": "## Recruitment AI Config\n\n⚙️ **Customize scoring:**\n- Technical skills weights\n- Experience requirements\n- Education priorities\n- Cultural fit criteria"
},
"typeVersion": 1
},
{
"id": "3",
"name": "직무 요구사항",
"type": "n8n-nodes-base.set",
"position": [
440,
300
],
"parameters": {
"values": {
"number": [
{
"name": "minExperience",
"value": 5
},
{
"name": "passingScore",
"value": 75
}
],
"string": [
{
"name": "requiredSkills",
"value": "JavaScript,React,Node.js,Python"
}
]
}
},
"typeVersion": 1
},
{
"id": "4",
"name": "AI를 통한 CV 파싱",
"type": "n8n-nodes-base.httpRequest",
"position": [
640,
300
],
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"body": {
"model": "gpt-4",
"messages": [
{
"role": "system",
"content": "You are a CV parsing expert. Extract key information from CVs and return structured JSON data."
},
{
"role": "user",
"content": "Parse this CV and extract: name, email, phone, skills, experience_years, education, previous_roles. CV content: {{ $json.cv_content }}"
}
],
"response_format": {
"type": "json_object"
}
},
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{ $credentials.openai.apiKey }}"
}
},
"typeVersion": 1
},
{
"id": "5",
"name": "후보자 점수 매기기",
"type": "n8n-nodes-base.code",
"position": [
840,
300
],
"parameters": {
"jsCode": "// Intelligent candidate scoring algorithm\nconst candidate = $json.choices[0].message.content;\nconst requirements = $node['Job Requirements'].json;\nconst candidateData = JSON.parse(candidate);\n\nlet totalScore = 0;\n\n// Skills matching (40% weight)\nconst requiredSkills = requirements.requiredSkills.split(',');\nconst candidateSkills = candidateData.skills || [];\nconst skillsMatch = requiredSkills.filter(skill => \n candidateSkills.some(cSkill => cSkill.toLowerCase().includes(skill.toLowerCase()))\n);\nconst skillsScore = (skillsMatch.length / requiredSkills.length) * 40;\ntotalScore += skillsScore;\n\n// Experience scoring (30% weight)\nconst experienceYears = candidateData.experience_years || 0;\nlet experienceScore = 0;\nif (experienceYears >= requirements.minExperience) {\n experienceScore = 30;\n} else if (experienceYears >= requirements.minExperience * 0.8) {\n experienceScore = 25;\n} else if (experienceYears >= requirements.minExperience * 0.6) {\n experienceScore = 20;\n} else {\n experienceScore = 10;\n}\ntotalScore += experienceScore;\n\n// Education scoring (20% weight)\nconst education = candidateData.education || '';\nlet educationScore = 0;\nif (education.toLowerCase().includes('master') || education.toLowerCase().includes('phd')) {\n educationScore = 20;\n} else if (education.toLowerCase().includes('bachelor') || education.toLowerCase().includes('degree')) {\n educationScore = 15;\n} else {\n educationScore = 10;\n}\ntotalScore += educationScore;\n\n// Role relevance (10% weight)\nconst previousRoles = candidateData.previous_roles || [];\nconst roleRelevance = previousRoles.some(role => \n role.toLowerCase().includes('engineer') || role.toLowerCase().includes('developer')\n) ? 10 : 5;\ntotalScore += roleRelevance;\n\n// Determine recommendation\nlet recommendation = 'reject';\nlet priority = 'low';\n\nif (totalScore >= 85) {\n recommendation = 'hire';\n priority = 'high';\n} else if (totalScore >= requirements.passingScore) {\n recommendation = 'interview';\n priority = 'medium';\n} else if (totalScore >= 60) {\n recommendation = 'phone_screen';\n priority = 'low';\n}\n\nreturn {\n candidateData,\n scoring: {\n skillsScore,\n experienceScore,\n educationScore,\n roleRelevance,\n totalScore: Math.round(totalScore),\n recommendation,\n priority\n },\n jobTitle: requirements.jobTitle,\n evaluatedAt: new Date().toISOString()\n};"
},
"typeVersion": 1
},
{
"id": "6",
"name": "상위 후보자 확인",
"type": "n8n-nodes-base.if",
"position": [
1040,
200
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.scoring.recommendation }}",
"rightValue": "hire"
}
]
}
},
"typeVersion": 2
},
{
"id": "7",
"name": "인사팀에 알림",
"type": "n8n-nodes-base.gmail",
"position": [
1240,
100
],
"parameters": {
"sendTo": "={{ $node['Job Requirements'].json.hrEmail }}",
"message": "=<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; background-color: #f8f9fa; }\n .container { max-width: 600px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; }\n .top-candidate { background: linear-gradient(45deg, #28a745, #20c997); color: white; padding: 20px; text-align: center; margin: 20px 0; border-radius: 10px; }\n .candidate-info { background: #d4edda; padding: 15px; margin: 15px 0; border-radius: 5px; }\n .score-breakdown { background: #f8f9fa; padding: 15px; margin: 15px 0; border-radius: 5px; }\n .cta { background: #007bff; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"top-candidate\">\n <h2>🌟 EXCEPTIONAL CANDIDATE</h2>\n <p>High-priority candidate for {{ $json.jobTitle }}</p>\n </div>\n \n <div class=\"candidate-info\">\n <h3>👤 Candidate Profile</h3>\n <p><strong>Name:</strong> {{ $json.candidateData.name }}</p>\n <p><strong>Email:</strong> {{ $json.candidateData.email }}</p>\n <p><strong>Phone:</strong> {{ $json.candidateData.phone }}</p>\n <p><strong>Experience:</strong> {{ $json.candidateData.experience_years }} years</p>\n <p><strong>Education:</strong> {{ $json.candidateData.education }}</p>\n </div>\n \n <div class=\"score-breakdown\">\n <h3>📊 Scoring Breakdown</h3>\n <p><strong>Overall Score:</strong> {{ $json.scoring.totalScore }}/100</p>\n <p><strong>Skills Match:</strong> {{ $json.scoring.skillsScore }}/40</p>\n <p><strong>Experience:</strong> {{ $json.scoring.experienceScore }}/30</p>\n <p><strong>Education:</strong> {{ $json.scoring.educationScore }}/20</p>\n <p><strong>Role Relevance:</strong> {{ $json.scoring.roleRelevance }}/10</p>\n </div>\n \n <div style=\"text-align: center;\">\n <a href=\"mailto:{{ $json.candidateData.email }}\" class=\"cta\">📧 Contact Candidate</a>\n <a href=\"https://calendly.com/interview-{{ $json.candidateData.name }}\" class=\"cta\">📅 Schedule Interview</a>\n </div>\n \n <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n Recommendation: {{ $json.scoring.recommendation }} | Priority: {{ $json.scoring.priority }}\n </p>\n </div>\n</body>\n</html>",
"options": {
"contentType": "html"
},
"subject": "🌟 Top Candidate Alert - {{ $json.jobTitle }}"
},
"typeVersion": 1
},
{
"id": "8",
"name": "면접 적합성 확인",
"type": "n8n-nodes-base.if",
"position": [
1040,
300
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.scoring.recommendation }}",
"rightValue": "interview"
}
]
}
},
"typeVersion": 2
},
{
"id": "9",
"name": "면접 초대장 발송",
"type": "n8n-nodes-base.gmail",
"position": [
1240,
300
],
"parameters": {
"sendTo": "={{ $json.candidateData.email }}",
"message": "=<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; background-color: #f8f9fa; }\n .container { max-width: 600px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; }\n .interview-invite { background: #007bff; color: white; padding: 20px; text-align: center; margin: 20px 0; border-radius: 8px; }\n .next-steps { background: #e8f4f8; padding: 15px; margin: 15px 0; border-radius: 5px; }\n .cta { background: #28a745; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"interview-invite\">\n <h2>🎉 Interview Invitation</h2>\n <p>Congratulations! We'd like to interview you for the {{ $json.jobTitle }} position.</p>\n </div>\n \n <p>Dear {{ $json.candidateData.name }},</p>\n \n <p>We were impressed by your profile and would like to invite you for an interview.</p>\n \n <div class=\"next-steps\">\n <h3>📅 Next Steps</h3>\n <ul>\n <li>Schedule your interview using the link below</li>\n <li>Prepare for technical questions about your experience</li>\n <li>Review our company culture and values</li>\n <li>Prepare questions about the role and team</li>\n </ul>\n </div>\n \n <div style=\"text-align: center;\">\n <a href=\"https://calendly.com/interview-{{ $json.candidateData.name }}\" class=\"cta\">\n 📅 Schedule Your Interview\n </a>\n </div>\n \n <p>Looking forward to meeting you!</p>\n \n <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n Best regards,<br>\n HR Team\n </p>\n </div>\n</body>\n</html>",
"options": {
"contentType": "html"
},
"subject": "Interview Invitation - {{ $json.jobTitle }} Position"
},
"typeVersion": 1
},
{
"id": "10",
"name": "거부 여부 확인",
"type": "n8n-nodes-base.if",
"position": [
1040,
400
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.scoring.recommendation }}",
"rightValue": "reject"
}
]
}
},
"typeVersion": 2
},
{
"id": "11",
"name": "거부 이메일 발송",
"type": "n8n-nodes-base.gmail",
"position": [
1240,
400
],
"parameters": {
"sendTo": "={{ $json.candidateData.email }}",
"message": "=<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; background-color: #f8f9fa; }\n .container { max-width: 600px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; }\n .thank-you { background: #6c757d; color: white; padding: 20px; text-align: center; margin: 20px 0; border-radius: 8px; }\n .feedback { background: #f8f9fa; padding: 15px; margin: 15px 0; border-radius: 5px; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"thank-you\">\n <h2>Thank You for Your Interest</h2>\n <p>We appreciate you taking the time to apply for the {{ $json.jobTitle }} position.</p>\n </div>\n \n <p>Dear {{ $json.candidateData.name }},</p>\n \n <p>Thank you for your application. While your background is impressive, we have decided to move forward with other candidates who more closely match our current requirements.</p>\n \n <div class=\"feedback\">\n <h3>💡 For Future Opportunities</h3>\n <p>We encourage you to:</p>\n <ul>\n <li>Continue developing your technical skills</li>\n <li>Gain more relevant experience in your field</li>\n <li>Apply for future positions that match your expertise</li>\n </ul>\n </div>\n \n <p>We'll keep your resume on file and will reach out if a suitable position becomes available.</p>\n \n <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n Best regards,<br>\n HR Team\n </p>\n </div>\n</body>\n</html>",
"options": {
"contentType": "html"
},
"subject": "Thank you for your application - {{ $json.jobTitle }}"
},
"typeVersion": 1
},
{
"id": "12",
"name": "스티키 노트1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1140,
60
],
"parameters": {
"width": 240,
"height": 160,
"content": "## AI-Powered Decisions\n\n🤖 **Automated actions:**\n- Top candidates: HR alert\n- Interview worthy: Auto-invite\n- Rejected: Polite decline\n- Phone screen: Initial contact"
},
"typeVersion": 1
}
],
"connections": {
"1": {
"main": [
[
{
"node": "3",
"type": "main",
"index": 0
}
]
]
},
"3": {
"main": [
[
{
"node": "4",
"type": "main",
"index": 0
}
]
]
},
"4": {
"main": [
[
{
"node": "5",
"type": "main",
"index": 0
}
]
]
},
"5": {
"main": [
[
{
"node": "6",
"type": "main",
"index": 0
},
{
"node": "8",
"type": "main",
"index": 0
},
{
"node": "10",
"type": "main",
"index": 0
}
]
]
},
"6": {
"main": [
[
{
"node": "7",
"type": "main",
"index": 0
}
]
]
},
"8": {
"main": [
[
{
"node": "9",
"type": "main",
"index": 0
}
]
]
},
"10": {
"main": [
[
{
"node": "11",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급 - 인사, AI 요약
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
AI 평점과 Gmail을 사용하여 소셜 미디어 인플루언서 활동을 홍보 관리
AI 평점과 Gmail 프로모션을 통해 소셜 미디어 인플루언서 활동 관리
If
Set
Code
+
If
Set
Code
15 노드Rodrigue
소셜 미디어
공급업체 위험 점수 자동화
D&B, NewsAPI 및 Gmail 알림을 사용한 공급업체 위험 점수 자동화
If
Set
Code
+
If
Set
Code
16 노드Rodrigue
기타
JotForm, Azure OCR, GPT-4.1, Zoho CRM을 사용한 이력서 분석 및 후보자 스크리닝 자동화
JotForm, Azure OCR, GPT-4.1, Zoho CRM을 사용한 이력서 분석 및 후보자 선별 자동화
If
Set
Code
+
If
Set
Code
25 노드moosa
인사
AI 기반 자동화 구직 및 지원 워크플로우
AI 기반 자동화 구직 및 지원
If
Set
Code
+
If
Set
Code
21 노드Gerald Denor
인사
Gmail 및 Google 스프레드시트 분석을 사용한 버려진 장바구니 복구 기능
사용Gmail및Google表格분석의废弃购物车恢复功能
If
Set
Code
+
If
Set
Code
13 노드Rodrigue
소셜 미디어
경쟁사 콘텐츠 격차 분석기: 자동화된 웹사이트 주제 매핑
Gemini AI, Apify, Google Sheets를 사용한 경쟁사 콘텐츠 격차 분석
If
Set
Code
+
If
Set
Code
30 노드Mychel Garzon
기타