AI 기반 학생 답안 평가 에이전트
고급
이것은Document Extraction, AI Summarization분야의자동화 워크플로우로, 17개의 노드를 포함합니다.주로 Code, FormTrigger, GoogleSheets, GoogleDocsTool, Agent 등의 노드를 사용하며. 사용Gemini AI및Google Workspace实现学生答题卡评估자동화
사전 요구사항
- •Google Sheets API 인증 정보
- •Google Gemini API Key
사용된 노드 (17)
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "4sTIIfK40TvKs0O8",
"meta": {
"instanceId": "e0f9933c2de40fd346dddfe612cf584d10411f4630c7e4f4f3436a3c24dfa368",
"templateCredsSetupCompleted": true
},
"name": "AI-Powered Student Answer Sheet Evaluation Agent",
"tags": [],
"nodes": [
{
"id": "7e734b0a-96c8-4c30-b7a0-7dbb3bce0771",
"name": "답안지 업로더",
"type": "n8n-nodes-base.formTrigger",
"position": [
-672,
-224
],
"webhookId": "1b176d73-c779-4095-8dc7-6535b7b6d924",
"parameters": {
"options": {},
"formTitle": "Examiner",
"formFields": {
"values": [
{
"fieldLabel": "Examiner Name",
"placeholder": "Examiner Name",
"requiredField": true
},
{
"fieldType": "file",
"fieldLabel": "Upload Answer Sheet",
"acceptFileTypes": ".png,.jpg"
}
]
},
"formDescription": "Examiner AI Agent"
},
"typeVersion": 2.3
},
{
"id": "328e9f3e-a81e-405f-b2af-3707c71121dd",
"name": "이미지 분석",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
-448,
-224
],
"parameters": {
"text": "=The image is an answer paper of a student, you need to analyze and pick each and every answer along with section name, question number and student name.",
"modelId": {
"__rl": true,
"mode": "list",
"value": "models/gemini-2.5-flash",
"cachedResultName": "models/gemini-2.5-flash"
},
"options": {},
"resource": "image",
"inputType": "binary",
"operation": "analyze",
"binaryPropertyName": "Upload_Answer_Sheet"
},
"credentials": {
"googlePalmApi": {
"id": "AaiLYcmkHuNwDORB",
"name": "Google Gemini(PaLM) Api account 4"
}
},
"typeVersion": 1
},
{
"id": "ba55ae1e-0c3a-4050-ad8f-91f9aa5887f5",
"name": "AI 에이전트",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-96,
-224
],
"parameters": {
"text": "=Marks of the student:\n{{ $json.content.parts[0].text }}\nExaminer Name:{{ $('Answer Sheet Uploader').item.json['Examiner Name'] }}\n\n",
"options": {
"systemMessage": "=You are an intelligent Answer Evaluation Agent designed to assess student answer sheets accurately.\n\nYour task is to cross-check each student’s answers from the uploaded Student Answer Sheet (user input) with the provided Question Paper (tool: “Question Paper 5Th Class”) and the Correct Answer Paper (tool: “Answer Paper 5th Class”), and then calculate the marks accordingly.\n\nSteps 1:\nEvaluation Process \nRead the Question Paper (Question Paper 5Th Class)\nExtract all questions and question numbers.\nMaintain the order and numbering as given.\nRead the Correct Answer Paper (Answer Paper 5th Class)\nExtract correct answers corresponding to each question number.\nEnsure mapping between question number and correct answer is accurate.\n\nStep 2:\nRead the Student Answer Sheet (user input)\nIdentify the student’s answers for each question number.\nMaintain consistent numbering for comparison.\n\nStep 3:\nCompare Answers\nMatch each student answer with the correct answer from the Answer Paper.\nIf the answer matches exactly (or within acceptable variation for text answers), mark as Correct; otherwise mark as Incorrect. ignore punctuation marks like .,;:'\"\"' \n\n₹ is equal Rs. or Rs or rs. or rs or ruppees\n\nStep 4:\nCalculate Marks\nuse append row tool to append the below information.\nAssign marks for each correct answer (e.g., 2 mark each).\n\nAppend the Evaluation Summary using append row tool\nStudent Name\nExaminer Name\nCorrect Answer - no of correct answers\nIncorrect Answers - no of incorrect answers\nTotal Marks - Total marks \nTotal Marks Obtain - Marks obtain by student\n\n\nStep 5:\nCretae a JSON as final output in the below format for all the questions.\n\n{\n \"Student Name\": \"value\",\n \"Teacher Name\": \"value\",\n \"Total Correct Answers\": 8,\n \"Total Incorrect Answers\": 2,\n \"Total Marks\": 10,\n \"Marks Obtained\": 8,\n \"Data\": [\n {\n \"Question\": \"value\",\n \"Correct Answer\": \"value\",\n \"Student Answer\": \"value\",\n \"Status\": \"value\"\n },\n {\n \"Question\": \"value\",\n \"Correct Answer\": \"value\",\n \"Student Answer\": \"value\",\n \"Status\": \"value\"\n },\n {\n \"Question\": \"value\",\n \"Correct Answer\": \"value\",\n \"Student Answer\": \"value\",\n \"Status\": \"value\"\n }\n ]\n}\n"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "9eb8d9c8-0bc9-4637-a57b-c4120b7cfd7c",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
-224,
0
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-pro"
},
"credentials": {
"googlePalmApi": {
"id": "AaiLYcmkHuNwDORB",
"name": "Google Gemini(PaLM) Api account 4"
}
},
"typeVersion": 1
},
{
"id": "62e3fcd5-e0d5-482d-b123-c4712d11d753",
"name": "5학년 문제지",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
-96,
0
],
"parameters": {
"operation": "get",
"documentURL": "=https://docs.google.com/document/d/1-B5C4_RjUpNbtw3ByEQXTh8r3_0IPTwwEx7EKqFqmG0/edit?usp=drive_link"
},
"credentials": {
"googleDocsOAuth2Api": {
"id": "ddlaiYwDEDtnemfS",
"name": "Google Docs account"
}
},
"typeVersion": 2
},
{
"id": "844d4fe0-49da-421d-9bd4-29297118e858",
"name": "5학년 답안지",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
32,
0
],
"parameters": {
"operation": "get",
"documentURL": "https://docs.google.com/document/d/1DPWpi4wLbLumV6FaKk2G0GfNY63l5GCLfBqMeAUs5UY/edit?usp=drive_link"
},
"credentials": {
"googleDocsOAuth2Api": {
"id": "ddlaiYwDEDtnemfS",
"name": "Google Docs account"
}
},
"typeVersion": 2
},
{
"id": "252ace90-c1c6-403e-bfdc-297808ed2abf",
"name": "구조화 출력 파서1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
160,
0
],
"parameters": {
"jsonSchemaExample": "{\n \"Student Name\": \"John Doe\",\n \"Examiner Name\": \"Mrs. Smith\",\n \"Total Correct Answers\": 8,\n \"Total Incorrect Answers\": 2,\n \"Total Marks\": 10,\n \"Marks Obtained\": 8,\n \"Data\": [\n {\n \"Question\": \"Q1\",\n \"Correct Answer\": \"B\",\n \"Student Answer\": \"B\",\n \"Status\": \"Correct\"\n },\n {\n \"Question\": \"Q2\",\n \"Correct Answer\": \"A\",\n \"Student Answer\": \"C\",\n \"Status\": \"Incorrect\"\n },\n {\n \"Question\": \"Q3\",\n \"Correct Answer\": \"D\",\n \"Student Answer\": \"D\",\n \"Status\": \"Correct\"\n }\n ]\n}"
},
"typeVersion": 1.3
},
{
"id": "5875281b-95c5-45b0-b97a-4f24fdb54f82",
"name": "스티커 노트",
"type": "n8n-nodes-base.stickyNote",
"position": [
-768,
-320
],
"parameters": {
"height": 256,
"content": "Form Trigger – Collects Teacher Name and uploads the Student’s scanned Answer Sheet."
},
"typeVersion": 1
},
{
"id": "6a43448e-837e-44da-b813-23697f57e9c5",
"name": "스티커 노트1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-512,
-320
],
"parameters": {
"color": 2,
"height": 256,
"content": "Gemini image Analysis Node – Extracts the student’s answers from the scanned image."
},
"typeVersion": 1
},
{
"id": "bf8fa4b1-ae80-4073-8351-76480d754d05",
"name": "스티커 노트2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-240,
-320
],
"parameters": {
"color": 3,
"width": 496,
"height": 464,
"content": "AI Evaluation Agent Node – Uses attached Google Docs (Question Paper and Correct Answer Sheet) to compare answers and generate a structured JSON result with correct/incorrect count and marks obtained."
},
"typeVersion": 1
},
{
"id": "cd8c33f8-c4be-4924-8c36-f3746f67ca63",
"name": "스티커 노트3",
"type": "n8n-nodes-base.stickyNote",
"position": [
304,
-496
],
"parameters": {
"color": 4,
"width": 272,
"height": 304,
"content": "Google Sheets (Summary Update) – Appends an entry with Student Name, Teacher Name, Total Questions, Correct Count, Incorrect Count, Total Marks, and Marks Obtained"
},
"typeVersion": 1
},
{
"id": "5ba0dd51-dbd4-4144-ab72-0ce450ba924b",
"name": "스티커 노트4",
"type": "n8n-nodes-base.stickyNote",
"position": [
592,
-240
],
"parameters": {
"color": 4,
"width": 352,
"height": 272,
"content": "Google Sheets (Detailed Report Update) – Appends question-wise details with Question, Correct Answer, Student Answer, and Evaluation Status."
},
"typeVersion": 1
},
{
"id": "6d16f5b7-f914-4330-a76a-5dcdd820ba30",
"name": "스티커 노트5",
"type": "n8n-nodes-base.stickyNote",
"position": [
304,
-176
],
"parameters": {
"color": 6,
"width": 272,
"height": 352,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThis code merger all the questions into one json to append into google sheet\n"
},
"typeVersion": 1
},
{
"id": "882afe39-f035-4f2a-afea-9cd15848f5b6",
"name": "스티커 노트6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1392,
-496
],
"parameters": {
"width": 512,
"height": 736,
"content": "## AI-Powered Student Answer Sheet Evaluation Agent\n\nThis flow helps teachers automatically evaluate student exam papers using AI.\n\n## Business Problem\n\nIn schools, manually checking and marking answer sheets is a time-consuming and repetitive task for teachers. This AI-powered agent simplifies the process by evaluating scanned student answer sheets intelligently and accurately.\n\n## Solution Overview\n\nTeachers only need to upload a scanned copy of the student’s answer sheet through the form. The AI agent—connected to the Question Paper and Correct Answer Sheet tools—automatically compares each answer, calculates marks, and generates results in JSON format.\n\nThe evaluated data is then saved into Google Sheets, but it can also be integrated with any school database for seamless record management.\n\n## Future Enhancements\n\nThis flow can be further enhanced to handle multi-page answer sheets and generate customized evaluation reports based on the school’s format or grading standards."
},
"typeVersion": 1
},
{
"id": "ba0cf804-f83f-41f9-9775-d39e41df83e7",
"name": "요약 추가",
"type": "n8n-nodes-base.googleSheets",
"position": [
384,
-336
],
"parameters": {
"columns": {
"value": {
"Total Marks": "={{ $json.output['Total Marks'] }}",
"Student Name": "={{ $json.output['Student Name'] }}",
"Examiner Name": "={{ $json.output['Examiner Name'] }}",
"Correct Answer": "={{ $json.output['Total Correct Answers'] }}",
"Incorrect Answers": "={{ $json.output['Total Incorrect Answers'] }}",
"Total Marks Obtain": "={{ $json.output['Marks Obtained'] }}"
},
"schema": [
{
"id": "Student Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Student Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Examiner Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Examiner Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Correct Answer",
"type": "string",
"display": true,
"required": false,
"displayName": "Correct Answer",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Incorrect Answers",
"type": "string",
"display": true,
"required": false,
"displayName": "Incorrect Answers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Total Marks",
"type": "string",
"display": true,
"required": false,
"displayName": "Total Marks",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Total Marks Obtain",
"type": "string",
"display": true,
"required": false,
"displayName": "Total Marks Obtain",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BVy9jadiWBx-N8DSYGoBbc2XBb9Z2bC8Gi7fA5N4kKE/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1BVy9jadiWBx-N8DSYGoBbc2XBb9Z2bC8Gi7fA5N4kKE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BVy9jadiWBx-N8DSYGoBbc2XBb9Z2bC8Gi7fA5N4kKE/edit?usp=drivesdk",
"cachedResultName": "Score Card"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "xw7WRgAozbgAiIjH",
"name": "Google Sheets account 6"
}
},
"typeVersion": 4.7
},
{
"id": "786aa89b-d2aa-4546-95ca-acfeb74baa4c",
"name": "성적표 추가",
"type": "n8n-nodes-base.googleSheets",
"position": [
688,
-128
],
"parameters": {
"columns": {
"value": {
"Status": "={{ $json.Status }}",
"Student Name": "={{ $json['Student Name'] }}",
"Actual Answer": "={{ $json['Correct Answer'] }}",
"Student Answer": "={{ $json['Student Answer'] }}",
"Question Number": "={{ $json.Question }}"
},
"schema": [
{
"id": "Student Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Student Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Question Number",
"type": "string",
"display": true,
"required": false,
"displayName": "Question Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Actual Answer",
"type": "string",
"display": true,
"required": false,
"displayName": "Actual Answer",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Student Answer",
"type": "string",
"display": true,
"required": false,
"displayName": "Student Answer",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 760946435,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BVy9jadiWBx-N8DSYGoBbc2XBb9Z2bC8Gi7fA5N4kKE/edit#gid=760946435",
"cachedResultName": "Scorecard"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1BVy9jadiWBx-N8DSYGoBbc2XBb9Z2bC8Gi7fA5N4kKE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BVy9jadiWBx-N8DSYGoBbc2XBb9Z2bC8Gi7fA5N4kKE/edit?usp=drivesdk",
"cachedResultName": "Score Card"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "xw7WRgAozbgAiIjH",
"name": "Google Sheets account 6"
}
},
"typeVersion": 4.7
},
{
"id": "f6bc7583-39ee-4769-b099-9b4a915a3d1a",
"name": "Code to merge multiple items into one JSON",
"type": "n8n-nodes-base.code",
"position": [
384,
-112
],
"parameters": {
"jsCode": "// Get AI output JSON safely (works even if wrapped in array)\nconst raw = $json[\"output\"] || ($json[0] && $json[0].output);\nif (!raw) {\n throw new Error(\"No valid output data found in input\");\n}\n\nconst studentName = raw[\"Student Name\"];\nconst examinerName = raw[\"Examiner Name\"];\nconst totalCorrect = raw[\"Total Correct Answers\"];\nconst totalIncorrect = raw[\"Total Incorrect Answers\"];\nconst totalMarks = raw[\"Total Marks\"];\nconst marksObtained = raw[\"Marks Obtained\"];\n\nconst questions = raw[\"Data\"] || [];\n\nconst result = questions.map(q => ({\n json: {\n \"Student Name\": studentName,\n \"Examiner Name\": examinerName,\n \"Question\": q[\"Question\"],\n \"Correct Answer\": q[\"Correct Answer\"],\n \"Student Answer\": q[\"Student Answer\"],\n \"Status\": q[\"Status\"],\n \"Total Correct Answers\": totalCorrect,\n \"Total Incorrect Answers\": totalIncorrect,\n \"Total Marks\": totalMarks,\n \"Marks Obtained\": marksObtained\n }\n}));\n\nreturn result;\n"
},
"typeVersion": 2
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "c792c0f5-bb22-4b80-afe0-d7abc878346f",
"connections": {
"ba55ae1e-0c3a-4050-ad8f-91f9aa5887f5": {
"main": [
[
{
"node": "ba0cf804-f83f-41f9-9775-d39e41df83e7",
"type": "main",
"index": 0
},
{
"node": "f6bc7583-39ee-4769-b099-9b4a915a3d1a",
"type": "main",
"index": 0
}
]
]
},
"328e9f3e-a81e-405f-b2af-3707c71121dd": {
"main": [
[
{
"node": "ba55ae1e-0c3a-4050-ad8f-91f9aa5887f5",
"type": "main",
"index": 0
}
]
]
},
"786aa89b-d2aa-4546-95ca-acfeb74baa4c": {
"main": [
[]
]
},
"7e734b0a-96c8-4c30-b7a0-7dbb3bce0771": {
"main": [
[
{
"node": "328e9f3e-a81e-405f-b2af-3707c71121dd",
"type": "main",
"index": 0
}
]
]
},
"844d4fe0-49da-421d-9bd4-29297118e858": {
"ai_tool": [
[
{
"node": "ba55ae1e-0c3a-4050-ad8f-91f9aa5887f5",
"type": "ai_tool",
"index": 0
}
]
]
},
"9eb8d9c8-0bc9-4637-a57b-c4120b7cfd7c": {
"ai_languageModel": [
[
{
"node": "ba55ae1e-0c3a-4050-ad8f-91f9aa5887f5",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"62e3fcd5-e0d5-482d-b123-c4712d11d753": {
"ai_tool": [
[
{
"node": "ba55ae1e-0c3a-4050-ad8f-91f9aa5887f5",
"type": "ai_tool",
"index": 0
}
]
]
},
"252ace90-c1c6-403e-bfdc-297808ed2abf": {
"ai_outputParser": [
[
{
"node": "ba55ae1e-0c3a-4050-ad8f-91f9aa5887f5",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"f6bc7583-39ee-4769-b099-9b4a915a3d1a": {
"main": [
[
{
"node": "786aa89b-d2aa-4546-95ca-acfeb74baa4c",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 문서 추출, AI 요약
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Gemini와 Jina AI를 사용한 공급업체 실사 연구 자동화
Gemini 및 Jina AI를 사용한 공급업체 실사 조사 자동화
If
Set
Code
+
If
Set
Code
27 노드Adnan
문서 추출
Gemini에서 Google Sheets로 자동화된 학술 논문 메타데이터 및 변수 추출
자동화된 학술 논문 메타데이터 및 변수 추출, Gemini에서 Google Sheets로
Set
Code
Wait
+
Set
Code
Wait
39 노드OwenLee
문서 추출
PO_청구서_매칭_V1
Google Gemini AI와 이메일 알림 기반 자동 인voice-PO 매칭
If
Switch
Google Drive
+
If
Switch
Google Drive
19 노드Abdul Matheen
청구서 처리
Decodo와 Gemini를 사용한 Trustpilot 및 Sitejabber 감정 분석 및 Sheets에 저장
Decodo 및 Gemini를 사용하여 Trustpilot 및 Sitejabber 감성 분석 및 Sheets에 저장
Set
Merge
Form Trigger
+
Set
Merge
Form Trigger
18 노드Fahmi Fahreza
시장 조사
회의 요약 생성기
Google Drive, Gemini AI 및 Google Docs를 사용한 자동화된 회의 요약
Code
Google Drive
Http Request
+
Code
Google Drive
Http Request
12 노드Parth Pansuriya
AI 요약
Gemini AI와 Google 스프레드시트를 사용한 레스토랑 매출 및 재고 예측 시스템
Gemini AI 및 Google 스프레드시트를 사용한 레스토랑 판매 및 재고 예측 자동화
Code
Gmail
Google Sheets
+
Code
Gmail
Google Sheets
17 노드Oneclick AI Squad
문서 추출
워크플로우 정보
난이도
고급
노드 수17
카테고리2
노드 유형9
저자
Abdul Matheen
@matheenI am an automation consultant at a multinational company with 18 years of experience in automation technologies, including RPA, Python, and VBA. I am also expanding my expertise by learning AI Agents to further enhance my skill set. Currently serving as delivery manager for a automation team.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유