面试质量审计
高级
这是一个Content Creation, Multimodal AI领域的自动化工作流,包含 23 个节点。主要使用 If, Code, Slack, GoogleSheets, ManualTrigger 等节点。 使用GPT-4o-mini和Google表格通过Slack审核面试反馈并生成报告
前置要求
- •Slack Bot Token 或 Webhook URL
- •Google Sheets API 凭证
- •OpenAI API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "DZrX6urOE53Tm4jp",
"meta": {
"instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
"templateCredsSetupCompleted": true
},
"name": "面试质量审计",
"tags": [],
"nodes": [
{
"id": "9e228e13-31c4-4f40-8bc1-83ffc0c0df21",
"name": "当点击“执行工作流”时",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-176,
16
],
"parameters": {},
"typeVersion": 1
},
{
"id": "4656de9f-4ad6-4b48-a8b0-6802cd1e88ca",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
576,
160
],
"parameters": {
"height": 384,
"content": "✅ 验证 AI 响应"
},
"typeVersion": 1
},
{
"id": "ed2e275a-ea76-4d78-b9da-2149ec9f5b50",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
224,
352
],
"parameters": {
"height": 320,
"content": "🤖 AI 质量评估器 (GPT-4o)"
},
"typeVersion": 1
},
{
"id": "97cdbdb7-5306-4910-8e93-927940ed699d",
"name": "便签2",
"type": "n8n-nodes-base.stickyNote",
"position": [
224,
-560
],
"parameters": {
"width": 336,
"height": 544,
"content": "🔍 分析反馈质量"
},
"typeVersion": 1
},
{
"id": "6681d513-9520-4c78-8595-cbb27bdfff9c",
"name": "便签3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-64,
192
],
"parameters": {
"height": 368,
"content": "📋 获取面试反馈"
},
"typeVersion": 1
},
{
"id": "f3e8a974-86fa-4a81-a5bd-3cbebf6302b4",
"name": "便签4",
"type": "n8n-nodes-base.stickyNote",
"position": [
928,
-224
],
"parameters": {
"width": 288,
"height": 208,
"content": "🔄 解析 AI JSON 输出"
},
"typeVersion": 1
},
{
"id": "78deb6fe-c12f-4281-974d-19a9155f0f0e",
"name": "便签5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1664,
448
],
"parameters": {
"width": 320,
"height": 224,
"content": "🎯 检查是否需要培训"
},
"typeVersion": 1
},
{
"id": "97e18f0a-359c-4bf3-8ff8-bfe51a193e7d",
"name": "便签6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2064,
464
],
"parameters": {
"width": 400,
"height": 304,
"content": "📚 发送培训建议"
},
"typeVersion": 1
},
{
"id": "b88c8198-7941-41a6-8b7f-406f62371288",
"name": "便签7",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
464
],
"parameters": {
"height": 320,
"content": "🚨 记录 AI 错误"
},
"typeVersion": 1
},
{
"id": "a98fbf8e-388a-40fe-a7a7-5e54866da422",
"name": "便签9",
"type": "n8n-nodes-base.stickyNote",
"position": [
1808,
-144
],
"parameters": {
"width": 336,
"height": 304,
"content": "💬 发送反馈摘要"
},
"typeVersion": 1
},
{
"id": "989baf43-960a-4393-9640-02b4454289d3",
"name": "便签10",
"type": "n8n-nodes-base.stickyNote",
"position": [
1488,
-592
],
"parameters": {
"width": 352,
"height": 336,
"content": "💾 保存分数到电子表格"
},
"typeVersion": 1
},
{
"id": "c7fbcc25-cdde-4b02-b4ec-afdae31fff2e",
"name": "便利贴11",
"type": "n8n-nodes-base.stickyNote",
"position": [
1152,
160
],
"parameters": {
"width": 288,
"height": 480,
"content": "🧮 计算加权质量分数"
},
"typeVersion": 1
},
{
"id": "69339a87-95fa-4827-a768-a6a9aa1def9e",
"name": "获取原始反馈数据",
"type": "n8n-nodes-base.googleSheets",
"position": [
32,
16
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 315277036,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=315277036",
"cachedResultName": "Raw_Feedback"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
"cachedResultName": "Interviewer Brief Pack "
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "kpPEOLCGn963qpoh",
"name": "automations@techdome.ai"
}
},
"typeVersion": 4.6,
"alwaysOutputData": false
},
{
"id": "99814f2b-ab97-49bf-8eec-43083f731dad",
"name": "AI 质量评估器 (GPT-4o1",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
272,
192
],
"parameters": {
"model": "gpt-4o-mini",
"options": {}
},
"credentials": {
"azureOpenAiApi": {
"id": "C3WzT18XqF8OdVM6",
"name": "Azure Open AI account"
}
},
"typeVersion": 1
},
{
"id": "6517c215-19c5-4644-97f6-26d650c65540",
"name": "分析反馈质量",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
288,
16
],
"parameters": {
"text": "=You are an Interview Feedback Quality Auditor.\n\nYour task is to evaluate interviewer feedback notes and score them across 5 dimensions:\n- specificity (1–5)\n- structure_STAR (1–5)\n- bias_free_language (1–5)\n- actionability (1–5)\n- depth (1–5)\n\n⚖️ Scoring Guidelines:\n- 5 = Excellent: Clear, detailed, STAR format (Situation, Task, Action, Result) explicitly used or strongly implied, with evidence/examples.\n- 4 = Good: Mostly structured, some detail, minor gaps, still useful for decisions.\n- 3 = Adequate: Some relevant info but mixed with vagueness, missing STAR elements.\n- 2 = Poor: Mostly vague or generic, no clear evidence, over-reliant on subjective phrasing.\n- 1 = Unusable: Purely subjective (“great guy”, “nice energy”), no actionable details.\n\nBias-free language: Score low if feedback references gender, looks, personality, or irrelevant traits.\n\nActionability: Score higher if the feedback directly helps in making a decision (e.g., “passed all test cases under time constraint” vs “seems smart”).\n\nDepth: Score higher if multiple competencies or dimensions are covered, lower if only 1 vague point.\n\n🚨 Additional Rules:\n- If text <30 words OR contains mostly emojis/placeholders → set ALL scores ≤2 and add `\"too_short\"` to vague_phrases.\n- Extract vague phrases (e.g., “good energy”, “smart guy”, “should be fine”) into `\"vague_phrases\"` array.\n\nReturn ONLY valid JSON in this schema:\n{\n \"specificity\": <1–5>,\n \"structure\": <1–5>,\n \"bias_free_language\": <1–5>,\n \"actionability\": <1–5>,\n \"depth\": <1–5>,\n \"vague_phrases\": [ ... ]\n}\n",
"batching": {},
"messages": {
"messageValues": [
{
"message": "You are an Interview Feedback Quality Auditor. Evaluate interview feedback for specificity, structure (STAR), bias-free language, actionability, and depth. Be strict but fair. Always return **only valid JSON** that follows the given schema.Return ONLY valid JSON, no explanations, no markdown, no quotes wrapping the whole object.\n"
},
{
"type": "HumanMessagePromptTemplate",
"message": "=Role: {{$json[\"Role\"]}} Stage: {{$json[\"Stage\"]}} Feedback: {{$json[\"Feedback_Text\"]}}"
}
]
},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "0612aeb7-a3a2-4215-9910-4cd077e06586",
"name": "验证 AI 响应",
"type": "n8n-nodes-base.if",
"position": [
640,
16
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "4901c65c-6aaf-4efe-a133-1fedfedc0bca",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.text }}",
"rightValue": "undefined "
}
]
}
},
"typeVersion": 2.2
},
{
"id": "f89f5698-5d3c-4771-8b0b-511b32b9fc33",
"name": "解析 AI JSON 输出",
"type": "n8n-nodes-base.code",
"position": [
1024,
0
],
"parameters": {
"jsCode": "// OpenAI output comes as string in $json.text\nconst raw = $json[\"text\"];\n\n// Parse safely\nlet parsed;\ntry {\n parsed = JSON.parse(raw);\n} catch (e) {\n throw new Error(\"Invalid JSON returned by OpenAI: \" + raw);\n}\n\nreturn parsed;\n"
},
"typeVersion": 2
},
{
"id": "1174cddb-9bf5-4582-a7ba-aed412336b7f",
"name": "计算加权质量分数",
"type": "n8n-nodes-base.code",
"position": [
1232,
0
],
"parameters": {
"jsCode": "// Input = parsed JSON from AI\nconst data = $json;\n\n// Weights (can be adjusted or moved to Config sheet later)\nconst weights = {\n specificity: 0.35,\n structure: 0.15,\n bias_free_language: 0.15,\n actionability: 0.10,\n depth: 0.25,\n};\n\n// ✅ Fallback for structure (AI might send structure or structure_star)\nconst structureValue = data.structure ?? data.structure_star ?? 0;\n\n// Calculate weighted score safely\nlet total = (\n (data.specificity * weights.specificity) +\n (structureValue * weights.structure) +\n (data.bias_free_language * weights.bias_free_language) +\n (data.actionability * weights.actionability) +\n (data.depth * weights.depth)\n) / (\n weights.specificity +\n weights.structure +\n weights.bias_free_language +\n weights.actionability +\n weights.depth\n);\n\n// Scale to 0–100\ntotal = Math.round(total * 20);\n\n// Flags\nconst flags = [];\nif ((data.specificity ?? 0) < 3 || (data.depth ?? 0) < 3) {\n flags.push(\"low_detail\");\n}\nif ((data.bias_free_language ?? 0) < 3) {\n flags.push(\"bias\");\n}\n\n// Format vague phrases if they exist\nlet vagueFormatted = \"\";\nif (Array.isArray(data.vague_phrases) && data.vague_phrases.length > 0) {\n vagueFormatted = data.vague_phrases.map(p => `• ${p}`).join(\"\\n\");\n}\n\n// Return clean JSON\nreturn {\n json: {\n Score: total,\n Flags: flags.join(\", \"),\n LLM_JSON: JSON.stringify(data),\n VaguePhrasesFormatted: vagueFormatted, // for Slack message\n row_number: $json.row_number, // keep tracking the row\n Role: $item(0).$node[\"Fetch Raw Feedback Data\"].json.Role,\n Stage: $item(0).$node[\"Fetch Raw Feedback Data\"].json.Stage\n }\n};\n"
},
"typeVersion": 2
},
{
"id": "5d940fc3-8727-4dc4-9a58-133ab5180f08",
"name": "保存分数到电子表格",
"type": "n8n-nodes-base.googleSheets",
"position": [
1600,
-208
],
"parameters": {
"columns": {
"value": {
"Flags": "={{ $json.Flags }}",
"Score": "={{ $json.Score }}",
"LLM_JSON": "={{ $json.LLM_JSON }}",
"row_number": "={{ $('Fetch Raw Feedback Data').item.json.row_number }}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Candidate_ID",
"type": "string",
"display": true,
"required": false,
"displayName": "Candidate_ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Role",
"type": "string",
"display": true,
"required": false,
"displayName": "Role",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Stage",
"type": "string",
"display": true,
"required": false,
"displayName": "Stage",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Interviewer_Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Interviewer_Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Feedback_Text",
"type": "string",
"display": true,
"required": false,
"displayName": "Feedback_Text",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Score",
"type": "string",
"display": true,
"required": false,
"displayName": "Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Flags",
"type": "string",
"display": true,
"required": false,
"displayName": "Flags",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LLM_JSON",
"type": "string",
"display": true,
"required": false,
"displayName": "LLM_JSON",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 315277036,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=315277036",
"cachedResultName": "Raw_Feedback"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
"cachedResultName": "Interviewer Brief Pack "
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "kpPEOLCGn963qpoh",
"name": "automations@techdome.ai"
}
},
"typeVersion": 4.6,
"alwaysOutputData": true
},
{
"id": "40df551b-4ca7-4268-a1fe-4ebb01fd304f",
"name": "向面试官发送反馈摘要",
"type": "n8n-nodes-base.slack",
"position": [
1616,
0
],
"webhookId": "ddaa7632-9e35-4bd3-82d6-572d5cae84cc",
"parameters": {
"text": "=:mag: *Interview Feedback Audit*\n\n*Role:* {{ $json[\"Role\"] }}\n*Stage:* {{ $json[\"Stage\"] }}\n\n:bar_chart: *Score:* {{ $json[\"Score\"] }}/100 \n:warning: *Flags:* {{ $json[\"Flags\"] || \"none\" }}\n\n{{ $json[\"VaguePhrasesFormatted\"] ? \n (\"_We noticed vague or incomplete feedback. Examples:_\\n\" + $json[\"VaguePhrasesFormatted\"] + \n \"\\n\\n_To improve: try being more specific and evidence-based (e.g., STAR method)._\") \n : \n \"_✅ Great job! Your feedback was specific, structured, and bias-free._\" \n}}\n\nKeep it up — your detailed notes help us make fairer hiring decisions 🚀\n\n_Automated with this n8n workflow_\n",
"user": {
"__rl": true,
"mode": "list",
"value": "U09HMPVD466",
"cachedResultName": "newscctv22"
},
"select": "user",
"otherOptions": {}
},
"credentials": {
"slackApi": {
"id": "rNqvWj9TfChPVRYY",
"name": "Slack account vivek"
}
},
"typeVersion": 2.3
},
{
"id": "de2e5d93-df58-41ef-a22f-e7a681308a64",
"name": "检查是否需要培训",
"type": "n8n-nodes-base.if",
"position": [
1776,
288
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "62f94225-d1b6-42a0-a3e9-7afceb9b937d",
"operator": {
"type": "number",
"operation": "lt"
},
"leftValue": "={{$json[\"Score\"]}}",
"rightValue": 50
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "49b80e52-27d3-455d-8082-e3e0f2365a69",
"name": "发送培训建议",
"type": "n8n-nodes-base.slack",
"position": [
2064,
272
],
"webhookId": "ddaa7632-9e35-4bd3-82d6-572d5cae84cc",
"parameters": {
"text": "=:books: *Training Recommendation*\n\nYour interview feedback for **{{$json[\"Role\"]}} ({{$json[\"Stage\"]}})** was reviewed.\n\n📊 **Score:** {{$json[\"Score\"]}}/100 \n⚠️ **Flags:** {{$json[\"Flags\"] || \"none\"}} \n\nWe noticed vague or incomplete feedback. Here are some examples: \n{{ $json.VaguePhrasesFormatted }}\n\nTo improve: try using structured, evidence-based feedback (e.g., STAR method). \n\n👉 Helpful resources: \n📘 [STAR Method Guide](https://example.com/star-training) \n🎥 [Bias-Free Interviewing Video](https://example.com/interview-bias) \n\nYour detailed notes help us make fairer hiring decisions 🚀\n",
"user": {
"__rl": true,
"mode": "list",
"value": "U09HMPVD466",
"cachedResultName": "newscctv22"
},
"select": "user",
"otherOptions": {}
},
"credentials": {
"slackApi": {
"id": "rNqvWj9TfChPVRYY",
"name": "Slack account vivek"
}
},
"typeVersion": 2.3
},
{
"id": "48988700-46e2-4464-87a5-99054d6e9cbc",
"name": "记录 AI 错误",
"type": "n8n-nodes-base.googleSheets",
"position": [
944,
304
],
"parameters": {
"columns": {
"value": {},
"schema": [],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1338537721,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=1338537721",
"cachedResultName": "error log sheet"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
"cachedResultName": "Interviewer Brief Pack "
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "kpPEOLCGn963qpoh",
"name": "automations@techdome.ai"
}
},
"typeVersion": 4.7
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "e2d8cf56-20c5-4e9a-9d03-d8b8536128fe",
"connections": {
"Parse AI JSON Output": {
"main": [
[
{
"node": "Calculate Weighted Quality Score",
"type": "main",
"index": 0
}
]
]
},
"Validate AI Response": {
"main": [
[
{
"node": "Parse AI JSON Output",
"type": "main",
"index": 0
}
],
[
{
"node": "Log AI Errors",
"type": "main",
"index": 0
}
]
]
},
"Fetch Raw Feedback Data": {
"main": [
[
{
"node": "Analyze Feedback Quality",
"type": "main",
"index": 0
}
]
]
},
"Analyze Feedback Quality": {
"main": [
[
{
"node": "Validate AI Response",
"type": "main",
"index": 0
}
]
]
},
"Check if Training Needed": {
"main": [
[
{
"node": "Send Training Recommendations",
"type": "main",
"index": 0
}
]
]
},
"Save Scores to Spreadsheet": {
"main": [
[]
]
},
"AI Quality Evaluator (GPT-4o1": {
"ai_languageModel": [
[
{
"node": "Analyze Feedback Quality",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Calculate Weighted Quality Score": {
"main": [
[
{
"node": "Send Feedback Summary to Interviewer",
"type": "main",
"index": 0
},
{
"node": "Save Scores to Spreadsheet",
"type": "main",
"index": 0
},
{
"node": "Check if Training Needed",
"type": "main",
"index": 0
}
]
]
},
"When clicking ‘Execute workflow’": {
"main": [
[
{
"node": "Fetch Raw Feedback Data",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 内容创作, 多模态 AI
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
雇佣后留存跟踪
使用GPT-4o和Gmail摘要生成员工留存分析报告
If
Code
Gmail
+6
19 节点Rahul Joshi
内容创作
技能差距 → 培训推荐
为 HR 团队使用 GPT-4o、Google Sheets 和 Gmail 个性化候选人反馈
If
Code
Gmail
+7
27 节点Rahul Joshi
内容创作
## 仅限自托管N8N用户:
使用GPT-4o-mini、Google Sheets和Gmail自动化Zendesk支持回复
Code
Gmail
Merge
+6
24 节点Rahul Joshi
内容创作
客户入职帮助请求(Typeform 到 Gmail 和 Sheets)
客户入职帮助请求(Typeform 到 Gmail 和 Sheets)
If
Code
Gmail
+10
28 节点Rahul Joshi
内容创作
销售代表绩效追踪器
基于HighLevel CRM、GPT-4o、Notion和Slack的自动化销售排行榜
If
Code
Slack
+7
21 节点Rahul Joshi
客户关系管理
GoHighLevel管道速度跟踪器和自动化停滞交易提醒
使用GoHighLevel、Gmail和Slack分析管道速度并提醒停滞交易
If
Code
Gmail
+5
25 节点Rahul Joshi
内容创作
工作流信息
难度等级
高级
节点数量23
分类2
节点类型8
作者
Rahul Joshi
@rahul08Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.
外部链接
在 n8n.io 查看 →
分享此工作流