AI Agent 실전 예제 5선
시나리오 — 휴가/근태 문의 상담 챗봇
사내 임직원의 휴가·근태 문의를 24시간 응대하는 AI Agent 를 만듭니다. AI 가 스프레드시트에서 직원 정보와 휴가 사용 이력을 스스로 조회하고, 남은 연차를 계산하고, 필요 시 담당자에게 Gmail 로 신청 접수까지 자동으로 처리하는 흐름.
- Chat Model — OpenAI GPT
- Memory — Simple Memory (대화 이어가기)
- Tool 1: Google Sheets — 직원 정보 / 휴가 사용 내역 조회
- Tool 2: Calculator — 남은 연차 자동 계산
- Tool 3: Gmail — 담당자에게 신청 메일 발송
실습 데이터 — 스프레드시트 준비
구글 시트에 2개의 시트 탭을 만듭니다. 하나는 직원 정보, 하나는 휴가 사용 이력. 아래 표를 그대로 📋 시트에 복사 로 눌러 각각의 탭 A1 셀에 붙여넣으면 실습 데이터가 바로 세팅됩니다.
Employees 탭 — 직원 정보 35명 (사번 · 이름 · 부서 · 이메일 · 연간 부여 연차)
| EmployeeId | Name | Department | AnnualLeave | |
|---|---|---|---|---|
| E001 | 김민수 | 개발팀 | minsu.kim@example.com | 15 |
| E002 | 이서연 | 마케팅팀 | seoyeon.lee@example.com | 15 |
| E003 | 박준호 | 영업팀 | junho.park@example.com | 16 |
| E004 | 최지우 | 개발팀 | jiwoo.choi@example.com | 15 |
| E005 | 정현우 | 디자인팀 | hyunwoo.jung@example.com | 17 |
| E006 | 한유진 | 인사팀 | yujin.han@example.com | 15 |
| E007 | 강민재 | 개발팀 | minjae.kang@example.com | 16 |
| E008 | 윤서진 | 마케팅팀 | seojin.yoon@example.com | 15 |
| E009 | 송지훈 | 영업팀 | jihoon.song@example.com | 18 |
| E010 | 김하늘 | 디자인팀 | haneul.kim@example.com | 15 |
| E011 | 오세훈 | 개발팀 | sehoon.oh@example.com | 17 |
| E012 | 임수빈 | 인사팀 | subin.lim@example.com | 15 |
| E013 | 조현민 | 영업팀 | hyunmin.cho@example.com | 16 |
| E014 | 신예은 | 마케팅팀 | yeeun.shin@example.com | 15 |
| E015 | 백승우 | 개발팀 | seungwoo.baek@example.com | 19 |
| E016 | 장다은 | 디자인팀 | daeun.jang@example.com | 15 |
| E017 | 문재현 | 마케팅팀 | jaehyun.moon@example.com | 16 |
| E018 | 서유나 | 인사팀 | yuna.seo@example.com | 17 |
| E019 | 권도윤 | 개발팀 | doyoon.kwon@example.com | 15 |
| E020 | 홍지수 | 영업팀 | jisoo.hong@example.com | 18 |
| E021 | 김도현 | 경영지원팀 | dohyun.kim@example.com | 20 |
| E022 | 이주원 | 개발팀 | juwon.lee@example.com | 15 |
| E023 | 박서현 | 마케팅팀 | seohyun.park@example.com | 16 |
| E024 | 최민호 | 영업팀 | minho.choi@example.com | 15 |
| E025 | 정유림 | 디자인팀 | yurim.jung@example.com | 17 |
| E026 | 한지민 | 인사팀 | jimin.han@example.com | 15 |
| E027 | 강서준 | 개발팀 | seojun.kang@example.com | 18 |
| E028 | 윤다영 | 경영지원팀 | dayoung.yoon@example.com | 16 |
| E029 | 송현석 | 영업팀 | hyunseok.song@example.com | 15 |
| E030 | 김아린 | 마케팅팀 | arin.kim@example.com | 17 |
| E031 | 오지훈 | 개발팀 | jihoon.oh@example.com | 15 |
| E032 | 임채원 | 디자인팀 | chaewon.lim@example.com | 16 |
| E033 | 조민석 | 경영지원팀 | minseok.cho@example.com | 18 |
| E034 | 신유진 | 인사팀 | yujin.shin@example.com | 15 |
| E035 | 백지민 | 개발팀 | jimin.baek@example.com | 20 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
LeaveHistory 탭 — 휴가 사용 내역 71건(승인) + 신청 대기 4건 (뒤에서 AI 가 남은 연차 계산할 때 이 표를 조회)
| LeaveId | EmployeeId | Name | StartDate | EndDate | Days | Type | Status |
|---|---|---|---|---|---|---|---|
| L001 | E001 | 김민수 | 2026-01-16 | 2026-01-16 | 1 | 연차 | 승인 |
| L002 | E001 | 김민수 | 2026-03-10 | 2026-03-10 | 1 | 연차 | 승인 |
| L003 | E001 | 김민수 | 2026-06-19 | 2026-06-19 | 0.5 | 오전반차 | 승인 |
| L004 | E002 | 이서연 | 2026-02-06 | 2026-02-06 | 1 | 연차 | 승인 |
| L005 | E002 | 이서연 | 2026-04-15 | 2026-04-15 | 0.5 | 오후반차 | 승인 |
| L006 | E003 | 박준호 | 2026-01-26 | 2026-01-27 | 2 | 연차 | 승인 |
| L007 | E003 | 박준호 | 2026-05-08 | 2026-05-08 | 1 | 연차 | 승인 |
| L008 | E004 | 최지우 | 2026-02-20 | 2026-02-20 | 1 | 연차 | 승인 |
| L009 | E004 | 최지우 | 2026-07-03 | 2026-07-03 | 1 | 연차 | 승인 |
| L010 | E005 | 정현우 | 2026-03-02 | 2026-03-04 | 3 | 연차 | 승인 |
| L011 | E005 | 정현우 | 2026-06-12 | 2026-06-12 | 0.5 | 오후반차 | 승인 |
| L012 | E006 | 한유진 | 2026-01-09 | 2026-01-09 | 1 | 연차 | 승인 |
| L013 | E006 | 한유진 | 2026-04-24 | 2026-04-24 | 1 | 연차 | 승인 |
| L014 | E007 | 강민재 | 2026-02-12 | 2026-02-13 | 2 | 연차 | 승인 |
| L015 | E007 | 강민재 | 2026-05-29 | 2026-05-29 | 1 | 연차 | 승인 |
| L016 | E008 | 윤서진 | 2026-03-20 | 2026-03-20 | 1 | 연차 | 승인 |
| L017 | E008 | 윤서진 | 2026-07-10 | 2026-07-10 | 0.5 | 오전반차 | 승인 |
| L018 | E009 | 송지훈 | 2026-01-19 | 2026-01-21 | 3 | 연차 | 승인 |
| L019 | E009 | 송지훈 | 2026-06-05 | 2026-06-05 | 1 | 연차 | 승인 |
| L020 | E010 | 김하늘 | 2026-02-27 | 2026-02-27 | 1 | 연차 | 승인 |
| L021 | E010 | 김하늘 | 2026-05-15 | 2026-05-15 | 0.5 | 오후반차 | 승인 |
| L022 | E011 | 오세훈 | 2026-03-06 | 2026-03-06 | 1 | 연차 | 승인 |
| L023 | E011 | 오세훈 | 2026-07-17 | 2026-07-17 | 1 | 연차 | 승인 |
| L024 | E012 | 임수빈 | 2026-01-30 | 2026-01-30 | 0.5 | 오전반차 | 승인 |
| L025 | E012 | 임수빈 | 2026-04-03 | 2026-04-03 | 1 | 연차 | 승인 |
| L026 | E013 | 조현민 | 2026-02-09 | 2026-02-10 | 2 | 연차 | 승인 |
| L027 | E013 | 조현민 | 2026-06-26 | 2026-06-26 | 1 | 연차 | 승인 |
| L028 | E014 | 신예은 | 2026-03-13 | 2026-03-13 | 1 | 연차 | 승인 |
| L029 | E014 | 신예은 | 2026-05-22 | 2026-05-22 | 0.5 | 오후반차 | 승인 |
| L030 | E015 | 백승우 | 2026-01-12 | 2026-01-16 | 5 | 연차 | 승인 |
| L031 | E015 | 백승우 | 2026-04-10 | 2026-04-10 | 1 | 연차 | 승인 |
| L032 | E016 | 장다은 | 2026-02-16 | 2026-02-16 | 1 | 연차 | 승인 |
| L033 | E016 | 장다은 | 2026-07-24 | 2026-07-24 | 1 | 연차 | 승인 |
| L034 | E017 | 문재현 | 2026-03-27 | 2026-03-27 | 1 | 연차 | 승인 |
| L035 | E017 | 문재현 | 2026-06-15 | 2026-06-16 | 2 | 연차 | 승인 |
| L036 | E018 | 서유나 | 2026-01-23 | 2026-01-23 | 1 | 연차 | 승인 |
| L037 | E018 | 서유나 | 2026-05-04 | 2026-05-04 | 0.5 | 오전반차 | 승인 |
| L038 | E019 | 권도윤 | 2026-02-23 | 2026-02-25 | 3 | 연차 | 승인 |
| L039 | E019 | 권도윤 | 2026-07-31 | 2026-07-31 | 1 | 연차 | 승인 |
| L040 | E020 | 홍지수 | 2026-03-09 | 2026-03-10 | 2 | 연차 | 승인 |
| L041 | E020 | 홍지수 | 2026-06-08 | 2026-06-08 | 1 | 연차 | 승인 |
| L042 | E021 | 김도현 | 2026-01-05 | 2026-01-07 | 3 | 연차 | 승인 |
| L043 | E021 | 김도현 | 2026-04-17 | 2026-04-17 | 1 | 연차 | 승인 |
| L044 | E022 | 이주원 | 2026-02-02 | 2026-02-02 | 1 | 연차 | 승인 |
| L045 | E022 | 이주원 | 2026-05-11 | 2026-05-11 | 0.5 | 오후반차 | 승인 |
| L046 | E023 | 박서현 | 2026-03-16 | 2026-03-17 | 2 | 연차 | 승인 |
| L047 | E023 | 박서현 | 2026-07-06 | 2026-07-06 | 1 | 연차 | 승인 |
| L048 | E024 | 최민호 | 2026-01-29 | 2026-01-30 | 2 | 연차 | 승인 |
| L049 | E024 | 최민호 | 2026-06-22 | 2026-06-22 | 1 | 연차 | 승인 |
| L050 | E025 | 정유림 | 2026-02-05 | 2026-02-05 | 0.5 | 오전반차 | 승인 |
| L051 | E025 | 정유림 | 2026-05-18 | 2026-05-20 | 3 | 연차 | 승인 |
| L052 | E026 | 한지민 | 2026-03-05 | 2026-03-05 | 1 | 연차 | 승인 |
| L053 | E026 | 한지민 | 2026-07-13 | 2026-07-13 | 1 | 연차 | 승인 |
| L054 | E027 | 강서준 | 2026-01-14 | 2026-01-15 | 2 | 연차 | 승인 |
| L055 | E027 | 강서준 | 2026-04-27 | 2026-04-27 | 0.5 | 오후반차 | 승인 |
| L056 | E028 | 윤다영 | 2026-02-18 | 2026-02-18 | 1 | 연차 | 승인 |
| L057 | E028 | 윤다영 | 2026-06-29 | 2026-06-30 | 2 | 연차 | 승인 |
| L058 | E029 | 송현석 | 2026-03-23 | 2026-03-23 | 1 | 연차 | 승인 |
| L059 | E029 | 송현석 | 2026-05-25 | 2026-05-25 | 1 | 연차 | 승인 |
| L060 | E030 | 김아린 | 2026-01-08 | 2026-01-09 | 2 | 연차 | 승인 |
| L061 | E030 | 김아린 | 2026-07-20 | 2026-07-20 | 0.5 | 오전반차 | 승인 |
| L062 | E031 | 오지훈 | 2026-02-26 | 2026-02-27 | 2 | 연차 | 승인 |
| L063 | E031 | 오지훈 | 2026-06-11 | 2026-06-11 | 1 | 연차 | 승인 |
| L064 | E032 | 임채원 | 2026-03-30 | 2026-03-31 | 2 | 연차 | 승인 |
| L065 | E032 | 임채원 | 2026-05-28 | 2026-05-28 | 0.5 | 오후반차 | 승인 |
| L066 | E033 | 조민석 | 2026-01-20 | 2026-01-22 | 3 | 연차 | 승인 |
| L067 | E033 | 조민석 | 2026-07-01 | 2026-07-01 | 1 | 연차 | 승인 |
| L068 | E034 | 신유진 | 2026-02-11 | 2026-02-11 | 1 | 연차 | 승인 |
| L069 | E034 | 신유진 | 2026-04-20 | 2026-04-20 | 0.5 | 오전반차 | 승인 |
| L070 | E035 | 백지민 | 2026-03-11 | 2026-03-13 | 3 | 연차 | 승인 |
| L071 | E035 | 백지민 | 2026-06-01 | 2026-06-02 | 2 | 연차 | 승인 |
| L072 | E001 | 김민수 | 2026-08-18 | 2026-08-20 | 3 | 연차 | 신청 |
| L073 | E008 | 윤서진 | 2026-08-21 | 2026-08-21 | 1 | 연차 | 신청 |
| L074 | E015 | 백승우 | 2026-08-24 | 2026-08-25 | 2 | 연차 | 신청 |
| L075 | E021 | 김도현 | 2026-08-28 | 2026-08-28 | 0.5 | 오후반차 | 신청 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
AI Agent 기본 세팅
새 워크플로우에 Chat Trigger + AI Agent 를 배치하고, 하위에 Chat Model(OpenAI) + Memory(Simple Memory) 를 붙입니다.
Tool 1 — Google Sheets 툴 연결
AI Agent 의 Tool 슬롯에 Google Sheets Tool 을 붙입니다. AI 가 필요할 때 시트를 스스로 조회할 수 있게.
Tool 2 — Calculator 툴 추가
남은 연차, 사용률 등 수치 계산을 AI 가 정확히 하려면 Calculator Tool 을 붙여줍니다. GPT 는 산수에 약해서 큰 숫자·정확한 계산은 이 도구에 맡기는 게 안전.
Tool 3 — Gmail 툴 추가
AI 가 담당자에게 휴가 신청 이메일을 대신 보낼 수 있도록 Gmail Tool 을 붙입니다.
받는 사람만 고정하고, 제목·본문은 AI 자동 정의 모드로 두면 상황에 맞춰 AI 가 매번 다르게 씁니다.
Tools 세팅 완료 — 오버뷰
3개 Tool(Sheets · Calculator · Gmail) 이 모두 붙은 상태.
AI Agent 지침서 세팅
AI 가 사용자 문의를 어떻게 이해하고 어떤 Tool 을 언제 써야 하는지를 System Message 에 자세히 명시합니다.
너는 회사의 인사팀 휴가/근태 담당 AI 어시스턴트입니다.
직원의 질문을 이해하고 필요한 경우 연결된 도구를 사용하여
직원 정보와 휴가 사용 내역을 조회하고 정확하게 답변하세요.
[데이터]
직원정보 시트
- EmployeeId
- Name
- Department
- Email
- AnnualLeave
휴가사용내역 시트
- LeaveId
- EmployeeId
- Name
- StartDate
- EndDate
- Days
- Type
- Status
[연차 계산 규칙]
1. 직원의 연차 정보를 확인할 때는 직원정보 시트에서 해당 직원을 조회하세요.
2. 휴가사용내역 시트에서 해당 직원의 휴가 기록을 조회하세요.
3. 기본 잔여 연차 계산에서는 Status가 "승인"인 기록만 사용한 연차로 계산하세요.
4. 사용자가 "신청 중인 휴가까지 포함"하라고 요청하면
Status가 "승인" 또는 "신청"인 기록을 모두 포함하세요.
5. 잔여 연차는 다음과 같이 계산합니다.
잔여 연차 = AnnualLeave - 사용한 휴가 일수 합계
계산이 필요한 경우 Calculator 도구를 사용하세요.
6. 반차는 Days 값을 그대로 사용합니다.
예: Days가 0.5이면 0.5일입니다.
7. 데이터에 존재하지 않는 내용은 추측하지 마세요.
[휴가 신청 이메일]
사용자가 명확하게 휴가 신청을 요청하면 Gmail 도구를 사용하세요.
이 워크플로우는 교육 및 테스트용입니다.
실제 직원이나 인사담당자의 이메일 주소로 절대 발송하지 마세요.
Gmail 도구의 수신자는 미리 설정된 테스트 이메일 주소만 사용합니다.
수신자 주소를 변경하거나 다른 이메일 주소를 선택하려고 하지 마세요.
메일 제목은 다음 형식을 사용하세요.
[휴가신청] 직원이름 / 휴가종류 / 시작일
메일 본문에는 다음 내용을 포함하세요.
- 직원 이름
- EmployeeId
- 부서
- 휴가 종류
- 시작일
- 종료일
- 사용 일수
- 현재 잔여 연차
- 신청 후 예상 잔여 연차
메일 발송 후에는 사용자에게
어떤 내용의 테스트 이메일을 발송했는지 알려주세요.
실행 시 오류 — 한글 시트 이름
테스트로 채팅을 보내면 이런 오류를 만납니다.
오류 해결 — 시트 이름 영문화
구글 시트 탭 이름을 Employees, LeaveHistory 처럼 영문으로 바꿉니다.
채팅으로 이어서 휴가 신청 — 시연 시나리오
Memory 가 붙어있으면 같은 세션에서 대화를 이어갈 때 이전 맥락을 기억합니다. 이 챗봇의 진가는 한 질문씩 따로 던지지 않고 대화를 이어갈 때 나옵니다. 아래 5단계를 순서대로 입력해보면 Memory + Sheets + Calculator + Gmail 이 순차적으로 어떻게 작동하는지 한눈에 보입니다.
① 첫 질문 — 조회 + 계산
김민수 연차 몇 일 남았어?
- 사용 도구: EmployeeInfo → LeaveHistory → Calculator
- AI 가 시트에서 김민수 정보와 사용 이력을 각각 조회 후 잔여 연차 계산
② 신청 중인 휴가까지 포함 — Memory 첫 등장
그럼 신청해둔 휴가까지 포함하면?
- 사용 도구: Memory → LeaveHistory → Calculator
- "김민수" 를 다시 말하지 않아도 Memory 가 앞 대화 대상자를 기억
- LeaveHistory 를 다시 조회하되 Status "신청" 포함해서 재계산
③ 가상 사용량 계산 — 순수 Calculator
거기서 2일 더 쓰면 얼마나 남아?
- 사용 도구: Memory → Calculator
- 시트 조회 없이 앞 계산 결과 - 2 만 계산 → Calculator 하나로 답변
④ 날짜 지정 — 실제 신청 시뮬레이션
그러면 9월 17일부터 18일까지 쓰는 걸로 계산해줘.
- 사용 도구: Memory → Calculator
- 날짜 · 2일 · 예상 잔여 연차를 한 번에 정리해 안내
⑤ 이메일 발송 — Gmail Tool 실행
좋아. 그 내용으로 휴가 신청 메일 보내줘.
- 사용 도구: Memory → Gmail
- 앞에서 나온 김민수 + 날짜 + 2일 + 예상 잔여 연차를 Memory 로 이어받아 이메일 본문 자동 작성
- 수신자는 고정된 테스트 이메일 (지침서 안전장치)
AI Agent 가 고정된 메일로 신청 메일 발송
AI 가 판단 후 Gmail Tool 을 스스로 호출해 담당자(hr@...)에게 신청 이메일을 보냅니다. 받는 사람만 고정이고, 제목·본문은 상황에 맞게 AI 가 작성.
시나리오 — 영업팀 미팅 준비 어시스턴트
영업 담당자가 "9월 1일에 고객 미팅 뭐 있어?" 처럼 물으면, AI Agent 가 구글 캘린더에서 일정을 조회하고 구글 컨택트에서 담당자 정보를 찾아 답변하는 챗봇을 만듭니다.
- Chat Model — OpenAI GPT
- Memory — Simple Memory
- Tool 1: Google Calendar — 미팅 일정 조회
- Tool 2: Google Contacts — 고객 담당자 정보 조회
실습 데이터 — 구글 캘린더·컨택트 CSV 가져오기
실습에 쓸 더미 데이터 CSV 2개입니다. 다운받아 각각 구글 캘린더와 구글 주소록에 가져오기(Import) 하면 실습 준비 완료.
📎 google_calendar_dummy_2026_09.csv 구글 캘린더 가져오기용 · 2026년 9월 고객 미팅 일정 더미 (5KB) ⬇ 다운로드 📎 google_contacts_dummy_20.csv 구글 주소록 가져오기용 · 고객사 담당자 20명 더미 (2KB) ⬇ 다운로드① 구글 캘린더에 CSV 넣기 — 아래 링크로 바로 가져오기 페이지로 이동합니다.
🔗 calendar.google.com/calendar/u/0/r/settings/export — 가져오기 → 컴퓨터에서 파일 선택 → 위 CSV 업로드 → 대상 캘린더 선택 → 가져오기.
② 구글 주소록에 CSV 넣기 — 아래 링크로 이동.
🔗 contacts.google.com — 좌측 가져오기 → 파일 선택 → 위 CSV 업로드 → 가져오기.
n8n 에서 구글 캘린더·컨택트 인증정보 등록
n8n Credentials 탭에서 Google Calendar OAuth2 · Google Contacts OAuth2 두 개를 등록합니다. 각각 구글 로그인 팝업이 뜨면 승인.
Tool 1 — Google Calendar 툴 연결
AI Agent 하위 Tool 슬롯에 Google Calendar 를 붙입니다.
Operation 을 Get Many Events 로 두면 AI 가 필요한 기간을 넣어 스스로 조회. Calendar 는 본인 계정의 기본 캘린더로 지정.
Tool 2 — Google Contacts 툴 연결
같은 방식으로 Google Contacts 를 두 번째 Tool 로 붙입니다.
노드 파라미터는 Resource = Contact · Operation = Get Many · Return All 켬 으로 두고, Fields 에 AI 가 실제로 필요로 하는 필드만 골라 담습니다 — Names / Email Addresses / Organizations / Phone Numbers 4개.
AI Agent 지침 입력
AI Agent 의 System Message 에 역할·응답 규칙을 정합니다.
너는 영업팀의 미팅 준비 AI 비서입니다.
사용자의 질문을 이해하고 필요한 도구를 선택하여
고객 미팅과 담당자 정보를 찾아 답변하세요.
사용 가능한 도구:
- Google Calendar: 고객 미팅 일정 조회
- Google Contacts: 고객사 담당자 정보 조회
[응답 규칙]
1. 시간대는 한국시간(KST) 기준으로 답변하세요.
2. 일정 답변에는 시간·제목·장소·간단 설명을 포함하세요.
3. 담당자 조회 요청이 나오면 이름 + 회사 + 직책 + 이메일을 정리해 안내하세요.
4. 미팅과 담당자가 함께 필요한 질문이면 두 도구를 순차 사용하세요.
5. 데이터에 없는 정보는 추측하지 마세요.
Agent 실행 — 영업팀 미팅 준비 시연 시나리오
채팅으로 물어보면 AI 가 Calendar Tool → Contacts Tool 을 스스로 호출합니다. 아래 5단계로 던지면 CalendarSearch → ContactsSearch → Memory 가 순차적으로 어떻게 쓰이는지 자연스럽게 시연됩니다.
① 캘린더 조회 — 오전 시간대 필터
9월 1일 오전에 고객 미팅 있나?
- 사용 도구: Google Calendar (Get Many Events)
- AI 가 9월 1일 09~12시 범위로 이벤트 조회
② 이전 결과 참조 — Memory 첫 등장
첫 번째 미팅 뭐였지?
- 사용 도구: Memory
- "9월 1일", "오전" 을 다시 말하지 않아도 Memory 가 이어받아 첫 이벤트 재안내
- 학생들이 "Memory 가 실제로 동작한다" 를 확인하는 결정적 순간
③ 회사명 자동 인식 → 담당자 조회
그 회사 담당자 누구야?
- 사용 도구: Memory → Google Contacts (Get Many)
- 앞서 나온 회사 이름을 Memory 가 넘겨줌 → Contacts 에서 해당 회사 담당자 검색
④ 담당자 상세 요청
담당자 연락처까지 보여줘.
- 사용 도구: Memory → Contacts (필요 시 재조회)
- 이름 + 회사 + 직책 + 이메일 + 전화번호 정리
⑤ 종합 브리핑 요청 — Agent 진가
좋아. 미팅 전에 체크할 것 5개만 정리해줘.
- 사용 도구: Memory (도구 미호출)
- 지금까지 확인한 미팅 · 담당자 정보로 사전 준비 체크리스트를 정리
- 체크리스트 자동 생성이 AI Agent 를 단순 조회 챗봇 이상으로 만드는 순간
시나리오 — 컴플레인 자동 접수·분류·긴급 알림
고객센터로 들어오는 컴플레인 폼 을 AI Agent 가 자동으로 분류·저장·(필요 시)담당자 알림 까지 처리합니다. 지금까지 배운 폼 트리거 · 시트 조회 · 시트 저장 · Gmail · System Message 로직 분기 가 한 워크플로우에 통합되는 실전 예제.
- Chat Model — OpenAI GPT (Memory 필요 없음: 폼 1건 처리 후 종료)
- Trigger — n8n Form (고객이 폼 제출 시 실행)
- Tool 1: 주문 시트 조회 — 폼에 적힌 주문번호 검증
- Tool 2: 컴플레인 시트 조회 — 과거 이력 참조
- Tool 3: 컴플레인 시트 저장 — 신규 컴플레인 append
- Tool 4: Gmail — 긴급 판정 시에만 담당자에게 발송 (AI 가 판단)
실습 데이터 — 주문 시트 · 컴플레인 시트 2개
구글 시트에 2개 탭을 만듭니다. 이번 예제는 시트 2개 + 폼 트리거 하나의 상호작용이 핵심.
아래 두 표를 그대로 📋 시트에 복사 로 눌러 각각의 탭 A1 셀에 붙여넣으면 실습 데이터가 바로 세팅됩니다.
Orders 탭 — 주문 20건 · AI Agent 가 OrderId 로 조회해서 실주문 여부를 검증
| OrderId | CustomerName | OrderDate | Product | Amount | ShippingStatus |
|---|---|---|---|---|---|
| ORD-1001 | 김민수 | 2026-08-01 | 무선이어폰 | 89000 | 배송완료 |
| ORD-1002 | 이서연 | 2026-08-02 | 기계식키보드 | 129000 | 배송중 |
| ORD-1003 | 박준호 | 2026-08-02 | 모니터 | 320000 | 배송준비중 |
| ORD-1004 | 최지우 | 2026-08-03 | 웹캠 | 74000 | 배송완료 |
| ORD-1005 | 정현우 | 2026-08-03 | 노트북거치대 | 49000 | 배송중 |
| ORD-1006 | 한유진 | 2026-08-04 | 블루투스스피커 | 99000 | 배송완료 |
| ORD-1007 | 강민재 | 2026-08-04 | 27인치모니터 | 289000 | 배송준비중 |
| ORD-1008 | 윤서진 | 2026-08-05 | 무선마우스 | 59000 | 배송완료 |
| ORD-1009 | 송지훈 | 2026-08-05 | USB허브 | 39000 | 배송중 |
| ORD-1010 | 김하늘 | 2026-08-06 | 태블릿 | 549000 | 배송준비중 |
| ORD-1011 | 오세훈 | 2026-08-06 | 헤드셋 | 119000 | 배송완료 |
| ORD-1012 | 임수빈 | 2026-08-07 | 외장SSD | 159000 | 배송중 |
| ORD-1013 | 조현민 | 2026-08-07 | 스마트워치 | 239000 | 배송준비중 |
| ORD-1014 | 신예은 | 2026-08-08 | 블루투스키보드 | 79000 | 배송완료 |
| ORD-1015 | 백승우 | 2026-08-08 | 노이즈캔슬링이어폰 | 199000 | 배송준비중 |
| ORD-1016 | 장다은 | 2026-08-09 | 휴대용모니터 | 249000 | 배송중 |
| ORD-1017 | 문재현 | 2026-08-09 | 게이밍마우스 | 69000 | 결제완료 |
| ORD-1018 | 서유나 | 2026-08-09 | HDMI케이블 | 19000 | 배송완료 |
| ORD-1019 | 권도윤 | 2026-08-09 | 노트북 | 1290000 | 결제완료 |
| ORD-1020 | 홍지수 | 2026-08-09 | 모니터암 | 109000 | 배송준비중 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
Complaints 탭 — 과거 컴플레인 20건 · AI Agent 가 같은 OrderId·Email 의 반복 컴플레인 여부를 참고하며, 신규 컴플레인도 이 탭에 append
| ComplaintId | OrderId | Name | Category | Message | Severity | Reason | CreatedAt | Status | |
|---|---|---|---|---|---|---|---|---|---|
| C001 | ORD-1003 | 박준호 | junho@example.com | 배송 | 주문한 지 며칠이 지났는데 아직 배송 준비중입니다. | 높음 | 장기 배송 지연 | 2026-08-07 10:15 | 처리중 |
| C002 | ORD-1007 | 강민재 | minjae@example.com | 배송 | 언제 출고되는지 확인 부탁드립니다. | 보통 | 출고 지연 문의 | 2026-08-07 11:20 | 접수 |
| C003 | ORD-1002 | 이서연 | seoyeon@example.com | 배송 | 배송중이라고 뜨는데 위치 확인이 안 됩니다. | 낮음 | 배송 조회 문의 | 2026-08-07 13:05 | 완료 |
| C004 | ORD-1008 | 윤서진 | seojin@example.com | 상품 | 마우스 클릭이 제대로 안 됩니다. | 높음 | 초기 불량 의심 | 2026-08-07 14:30 | 처리중 |
| C005 | ORD-1010 | 김하늘 | haneul@example.com | 배송 | 태블릿 배송이 너무 늦습니다. | 높음 | 고가 상품 배송 지연 | 2026-08-07 15:40 | 접수 |
| C006 | ORD-1011 | 오세훈 | sehoon@example.com | 상품 | 헤드셋 한쪽에서 소리가 안 납니다. | 높음 | 제품 불량 | 2026-08-07 16:25 | 처리중 |
| C007 | ORD-1001 | 김민수 | minsu@example.com | 환불 | 상품을 잘못 주문했습니다. 환불하고 싶습니다. | 보통 | 단순 변심 | 2026-08-08 09:10 | 완료 |
| C008 | ORD-1012 | 임수빈 | subin@example.com | 배송 | 택배가 오늘 온다고 했는데 아직 안 왔습니다. | 낮음 | 배송 일정 문의 | 2026-08-08 10:45 | 접수 |
| C009 | ORD-1013 | 조현민 | hyunmin@example.com | 배송 | 배송 준비중 상태가 너무 오래 유지됩니다. | 높음 | 장기 배송 지연 | 2026-08-08 11:30 | 처리중 |
| C010 | ORD-1014 | 신예은 | yeeun@example.com | 상품 | 키보드 일부 키가 입력되지 않습니다. | 높음 | 초기 불량 | 2026-08-08 13:10 | 접수 |
| C011 | ORD-1015 | 백승우 | seungwoo@example.com | 배송 | 고가 상품인데 계속 배송 준비중이라 불안합니다. | 긴급 | 고가 상품 장기 배송 지연 | 2026-08-08 14:20 | 처리중 |
| C012 | ORD-1004 | 최지우 | jiwoo@example.com | 교환 | 웹캠 화질이 설명과 너무 다릅니다. | 보통 | 상품 품질 불만 | 2026-08-08 15:35 | 완료 |
| C013 | ORD-1005 | 정현우 | hyunwoo@example.com | 배송 | 오늘 받을 수 있는지 확인해주세요. | 낮음 | 배송 일정 문의 | 2026-08-08 16:15 | 완료 |
| C014 | ORD-1016 | 장다은 | daeun@example.com | 배송 | 배송이 멈춘 것 같습니다. 확인 부탁드립니다. | 보통 | 배송 추적 이상 | 2026-08-09 09:05 | 접수 |
| C015 | ORD-1017 | 문재현 | jaehyun@example.com | 결제 | 결제는 됐는데 주문 상태가 결제완료에서 안 바뀝니다. | 보통 | 주문 처리 지연 | 2026-08-09 10:25 | 접수 |
| C016 | ORD-1019 | 권도윤 | doyoon@example.com | 결제 | 노트북 결제 완료됐는데 출고 예정일을 알고 싶습니다. | 보통 | 출고 일정 문의 | 2026-08-09 11:40 | 접수 |
| C017 | ORD-1020 | 홍지수 | jisoo@example.com | 배송 | 배송 준비중인데 언제 출고되나요? | 보통 | 출고 일정 문의 | 2026-08-09 13:15 | 접수 |
| C018 | ORD-1006 | 한유진 | yujin@example.com | 상품 | 스피커 충전이 제대로 되지 않습니다. | 높음 | 제품 불량 | 2026-08-09 14:50 | 처리중 |
| C019 | ORD-1009 | 송지훈 | jihoon@example.com | 배송 | 택배 조회가 이틀째 같은 위치입니다. | 보통 | 배송 지연 | 2026-08-09 16:10 | 접수 |
| C020 | ORD-1018 | 서유나 | yuna@example.com | 환불 | 상품 포장을 뜯지 않았는데 환불 가능한가요? | 낮음 | 환불 정책 문의 | 2026-08-09 17:25 | 완료 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
폼 트리거 + Agent 기본 세팅
새 워크플로우에 Form Trigger → AI Agent 를 연결. Chat Model 만 필요하고 Memory 는 붙이지 않습니다 — 이번 예제는 폼 1건마다 독립 실행이므로 이전 대화 기억이 오히려 방해가 됩니다.
폼 필드 작성 — Label 은 한글, Custom Field Name 은 시트 헤더 영문
폼 필드마다 Label 과 Custom Field Name 두 값을 지정해야 합니다. 역할이 다르니 혼동하지 않게 원칙을 잡고 시작하세요.
- Label — 폼에서 사용자에게 보이는 문구. 고객이 편하게 읽을 수 있도록 한글 로 씁니다. (예: "이름", "이메일", "주문번호", "문의 유형", "문의 내용")
- Custom Field Name — 뒤 노드로 넘어가는 데이터 필드 이름. AI Agent 프롬프트와 시트 저장 매핑에서 이 이름 그대로 참조되므로, 스프레드시트 헤더와 완벽히 일치하는 영문 으로 지정합니다.
$json["이메일"] 같은 값을 참조할 때 인코딩/오타로 헷갈릴 가능성이 크고, 시트 헤더와 자동 매핑도 안 됩니다.이 예제에서 잡을 5개 필드 는 다음과 같이 지정합니다. 아래 표를 n8n 폼 필드에 하나씩 그대로 입력하세요. 오른쪽 컬럼(Custom Field Name)은 앞서 만든 Complaints 시트의 헤더와 정확히 동일합니다.
| Label (폼 표시 · 한글) | Custom Field Name (시트 헤더 · 영문) | Element Type |
|---|---|---|
| 이름 | Name | Text Input |
| 이메일 | Text Input | |
| 주문번호 | OrderId | Text Input |
| 문의 유형 | Category | Dropdown |
| 문의 내용 | Message | Textarea |
문의 유형(Category)은 자유 입력 대신 Dropdown 으로 옵션을 제한해 AI 분류 정확도를 올립니다.
문의 내용(Message)은 길어질 수 있으므로 Textarea 로.
{{ $json["OrderId"] }} 와 Append Tool 컬럼 매핑 이 헤더명 그대로 깔끔하게 이어집니다.Tool 1·2 — 주문·컴플레인 시트 조회 툴 2개
AI 가 주문 존재 확인 과 과거 컴플레인 이력 참조 를 하려면 Sheet Tool 을 2개 붙여야 합니다. 각각 다른 워크시트를 가리키게.
Tool 3 — 컴플레인 시트 저장(Append) 툴
폼으로 들어온 신규 컴플레인을 시트에 저장하기 위해 3번째 Sheet Tool 을 붙입니다. 액션은 Append Row.
매핑 방식에서 가장 중요한 세팅 이 있습니다.
Map Each Column Manually 로 선택하세요. 기본값인 Map Automatically 로 두면 AI 가 기존 컬럼에 매핑하지 않고, 시트에 새로운 헤더 컬럼을 임의로 만들어서 추가 해버릴 수 있습니다. 그러면 컴플레인 시트가 매 실행마다 이상한 컬럼이 생겨 지저분해집니다.Manually 로 두면 아래처럼 기존 시트 헤더 순서 그대로 각 컬럼이 나열되고, 값 필드에 Let AI define 을 켜서 AI 가 판단·계산한 값을 넣도록 합니다.
Tool 4 — Gmail (긴급 시에만 발송)
네 번째 툴로 Gmail 을 붙입니다. 이 툴은 AI 가 '긴급' 판정을 내렸을 때만 호출 되도록 System Message 에서 조건을 명시합니다.
4개 툴 세팅 완료 — 오버뷰
Form Trigger → AI Agent · Chat Model / (Memory 없음) / Tool 4개 (Get Orders / Get Complaints / Append Complaint / Send Gmail).
Agent 지침서 세팅 — User + System
폼에서 들어온 값을 User Message 로 넘기고, 처리 규칙은 System Message 에 정의합니다.
User Prompt (Prompt · User Message)
다음 고객 문의를 시스템 지침에 따라 처리하세요.
Name: {{ $json["Name"] }}
Email: {{ $json["Email"] }}
OrderId: {{ $json["OrderId"] }}
Category: {{ $json["Category"] }}
Message: {{ $json["Message"] }}
System Message (전체 지침서)
너는 온라인 쇼핑몰 고객센터의 1차 CS 담당 AI Agent입니다.
고객이 문의 폼을 제출하면 문의 내용을 확인하고,
연결된 도구 중 필요한 도구를 사용하여
실제 주문 정보와 고객 정보를 확인한 뒤
문의의 심각도를 판단하고 필요한 후속 조치를 수행하세요.
[폼에서 들어오는 데이터]
폼에는 다음 5개의 필드가 있습니다.
- Name
- Email
- OrderId
- Category
- Message
각 필드의 값을 정확하게 사용하세요.
특히 주문 조회 시 반드시 폼의 OrderId 값을 사용하세요.
[연결된 도구의 역할]
연결된 도구 중 다음 역할에 해당하는 도구를 찾아 사용하세요.
1. 주문 조회용 도구
- OrderId를 기준으로 실제 주문 정보를 조회합니다.
- 주문일, 상품명, 결제금액, 배송상태 등을 확인하세요.
2. 고객 조회용 도구
- Name, Email, OrderId 등을 이용하여 고객 정보를 추가 확인합니다.
3. 문의 저장용 도구
- 고객이 제출한 모든 문의를 Complaints 스프레드시트에 저장합니다.
- 모든 문의는 심각도와 관계없이 반드시 저장하세요.
4. 이메일 발송용 도구
- 긴급 문의 발생 시 담당자에게 알림을 보냅니다.
- Severity가 "긴급"인 경우에만 사용하세요.
[처리 절차]
1. 폼에서 Name, Email, OrderId, Category, Message를 확인하세요.
2. 주문 조회용 도구를 사용하여
OrderId에 해당하는 실제 주문 정보를 조회하세요.
3. 필요한 경우 고객 조회용 도구를 사용하여
고객 정보를 추가 확인하세요.
4. 고객의 Message와 실제 주문 상태를 비교하세요.
5. Severity를 판단하세요.
Severity는 반드시 다음 중 하나만 사용하세요.
- 낮음
- 보통
- 높음
- 긴급
6. 모든 문의를 반드시 Complaints 시트에 저장하세요.
7. Severity가 "긴급"인 경우에만
저장 완료 후 이메일을 발송하세요.
[심각도 판단 기준]
낮음
- 단순 배송 일정 문의
- 상품 정보 문의
- 환불 가능 여부 문의
- 정상적으로 처리 중인 주문 상태 확인
보통
- 배송이 다소 지연된 경우
- 주문 상태가 일정 기간 변경되지 않은 경우
- 교환 또는 환불 요청
- 결제 후 처리 상태 문의
높음
- 제품 불량이 의심되는 경우
- 배송준비중 상태가 장기간 지속되는 경우
- 배송 추적 문제가 있는 경우
- 고가 상품의 출고가 지연되는 경우
긴급
- 심각한 장기 배송 지연
- 고가 상품이 장기간 출고되지 않는 경우
- 고객 피해 가능성이 큰 경우
- 즉시 담당자 확인이 필요한 경우
[Complaints 시트 구조]
Complaints 시트에는 다음 컬럼이 있습니다.
ComplaintId
OrderId
Name
Email
Category
Message
Severity
Reason
CreatedAt
Status
반드시 위 컬럼에 맞춰 저장하세요.
[ComplaintId 생성 규칙]
ComplaintId는 반드시 다음 형식을 사용하세요.
C001
C002
C003
C004
...
즉:
- 영문 대문자 C로 시작
- 뒤에는 숫자 3자리
- 숫자가 한 자리이면 앞에 00을 붙임
- 숫자가 두 자리이면 앞에 0을 붙임
예:
1번째 문의 → C001
2번째 문의 → C002
9번째 문의 → C009
10번째 문의 → C010
20번째 문의 → C020
21번째 문의 → C021
새로운 문의를 저장할 때는
기존 Complaints 데이터의 가장 마지막 ComplaintId를 확인하고
숫자 부분에 1을 더하여 새로운 ComplaintId를 생성하세요.
예:
현재 마지막 ComplaintId가 C020이면
새 문의의 ComplaintId는 C021입니다.
현재 마지막 ComplaintId가 C029이면
새 문의의 ComplaintId는 C030입니다.
기존 ComplaintId와 중복되는 값을 생성하지 마세요.
[저장 규칙]
모든 문의는 반드시 다음 구조로 저장하세요.
ComplaintId
→ 기존 마지막 ComplaintId 다음 번호
OrderId
→ 폼의 OrderId
Name
→ 폼의 Name
Email
→ 폼의 Email
Category
→ 폼의 Category
Message
→ 폼의 Message 원문 그대로
Severity
→ 판단한 심각도
Reason
→ 해당 심각도로 판단한 이유
CreatedAt
→ 현재 접수 날짜와 시간
Status
→ 접수
예를 들어 기존 마지막 데이터가 C020이고
다음 문의가 들어왔다면 다음과 같이 저장합니다.
ComplaintId: C021
OrderId: ORD-1002
Name: 이서연
Email: seoyeon@example.com
Category: 배송
Message: 배송중이라고 나오는데 언제쯤 도착할까요?
Severity: 낮음
Reason: 실제 주문 상태가 배송중인 정상적인 배송 일정 문의
CreatedAt: 현재 날짜와 시간
Status: 접수
[이메일 발송 규칙]
Severity가 "긴급"인 경우에만 이메일을 발송하세요.
낮음 → 이메일 발송 금지
보통 → 이메일 발송 금지
높음 → 이메일 발송 금지
긴급 → 저장 후 이메일 발송
긴급 문의도 반드시 먼저 Complaints 시트에 저장한 뒤
이메일을 발송하세요.
이메일 수신자는 도구에 미리 설정된 수신자만 사용하세요.
[중요 규칙]
- 모든 폼 문의는 반드시 저장하세요.
- 문의 1건당 저장용 도구는 1회만 사용하세요.
- ComplaintId는 반드시 C + 숫자 3자리 형식을 사용하세요.
- 기존 ComplaintId와 중복되면 안 됩니다.
- Message는 고객이 입력한 원문을 그대로 저장하세요.
- Status는 항상 "접수"로 저장하세요.
- 데이터에 없는 정보는 추측하지 마세요.
- 긴급이 아닌 문의에는 이메일을 발송하지 마세요.
[최종 응답]
처리가 완료되면 다음 내용을 간단히 출력하세요.
- 생성된 ComplaintId
- 주문 확인 결과
- 심각도
- 저장 여부
- 이메일 발송 여부
실행 ① — 단순 배송 문의 (보통)
먼저 단순 배송 문의 를 폼으로 제출해봅니다.
AI 가 주문 조회 → Severity: 낮음/보통 판단 → 시트에 append 만 하고 Gmail 은 호출하지 않습니다.
실행 ② — 긴급 컴플레인
이번엔 고가 상품 장기 배송 지연 처럼 Severity: 긴급 판정이 나올 만한 문의를 제출.
AI 가 Severity 를 긴급 으로 판단 → 시트 저장 + Gmail Tool 자동 호출.
실습용 폼 입력 예시 — Severity 4단계 시연
AI 가 4단계 Severity(낮음/보통/높음/긴급) 를 정말로 잘 구분하는지 확인하려면, 각 등급마다 예상되는 문의 데이터를 직접 던져보는 게 가장 확실합니다. 아래 표의 4건을 순서대로 폼에 입력해서 실제 판정 결과 · 시트 저장 · 이메일 발송 여부 를 눈으로 확인하세요.
| Severity 예상 | 이름 | 이메일 | 주문번호 | 카테고리 | 문의내용 | 실제 주문 정보 |
|---|---|---|---|---|---|---|
| 낮음 | 이서연 | seoyeon@example.com | ORD-1002 | 배송 | 배송중이라고 나오는데 언제쯤 도착할까요? | 기계식키보드 / 129,000원 / 배송중 |
| 보통 | 문재현 | jaehyun@example.com | ORD-1017 | 결제 | 결제는 완료됐는데 주문 상태가 계속 결제완료로 되어 있습니다. 언제 출고되는지 확인해주세요. | 게이밍마우스 / 69,000원 / 결제완료 |
| 높음 | 윤서진 | seojin@example.com | ORD-1008 | 상품 | 무선마우스를 받았는데 왼쪽 클릭이 계속 안 됩니다. 다시 연결해도 똑같아요. 불량 확인 부탁드립니다. | 무선마우스 / 59,000원 / 배송완료 |
| 긴급 | 박준호 | junho@example.com | ORD-1003 | 배송 | 주문한 지 일주일이 지났는데 아직도 배송준비중입니다. 계속 출고가 안 되고 있으니 빠르게 확인해주세요. | 모니터 / 320,000원 / 배송준비중 |
각 케이스별 기대 동작 은 다음과 같습니다.
- 낮음 · 이서연 — 실제 배송 상태(배송중)와 문의가 정합. Severity 낮음으로 저장만, 이메일 X
- 보통 · 문재현 — 결제 후 정체 상태. 처리 지연 문의로 보통 판정, 저장만, 이메일 X
- 높음 · 윤서진 — 초기 불량 의심. 높음 판정, 저장만, 이메일 X (높음도 이메일 발송 안 함 — 긴급만 발송)
- 긴급 · 박준호 — 고가 상품 장기 배송 지연. 긴급 판정, 저장 + 이메일 발송
시나리오 — PDF 이력서 자동 심사 → 등급별 메일 발송
지원자가 이력서 PDF 를 폼으로 제출하면, n8n 이 자동으로 PDF 를 파싱하고 AI Agent 로 스킬·경력을 구조화 하고, Code 노드로 점수 계산 후 Switch 노드로 적합/검토/탈락 3-way 라우팅 하여 등급별로 다른 Gmail 을 자동 발송하는 실전 채용 자동화 파이프라인.
- Form Trigger — 지원 폼 (이름·이메일·지원직무 dropdown · 이력서 File 업로드)
- Extract from File (PDF) — 업로드된 PDF 를 텍스트로 파싱
- AI Agent + Structured Output Parser — 이력서 텍스트에서 스킬·경력·프로젝트를 JSON 스키마로 강제 추출
- Code 노드 — n8n 경력·API·언어·클라우드 등에 점수 배정 → 총점 + 평가결과(적합/검토/탈락) 계산
- Google Sheets Append — 심사 결과 저장
- Switch 노드 — 평가결과에 따라 3방향 라우팅
- Gmail 3개 — 등급별로 다른 톤의 담당자 알림 메일 자동 발송
📎 실습용 이력서 PDF 5개 — 아래 파일을 다운받아 폼 제출 실습 때 이력서 업로드 필드에 하나씩 넣어보세요. 스킬·경력 조합이 다양해서 적합/검토/탈락 판정이 각각 나오는 걸 확인할 수 있습니다.
📎 지원자 A · 김도윤 (n8n 4년 · 시니어 스펙) n8n·Python·API·Google Workspace 다수 경험 — 적합 후보 ⬇ 다운로드 📎 지원자 B · 이서현 실전 지원자 이력서 (자동 심사 파이프라인 테스트용) ⬇ 다운로드 📎 지원자 C · 박준혁 실전 지원자 이력서 (자동 심사 파이프라인 테스트용) ⬇ 다운로드 📎 지원자 D · 최민지 실전 지원자 이력서 (자동 심사 파이프라인 테스트용) ⬇ 다운로드 📎 지원자 E · 정우진 실전 지원자 이력서 (자동 심사 파이프라인 테스트용) ⬇ 다운로드폼 세팅 — Text · Dropdown · File 조합
새 워크플로우를 만들고 On form submission 트리거를 추가합니다.
Form Title 을 "자동화 엔지니어 채용 지원" 으로 두고 Form Elements 를 추가합니다.
지원직무는 Dropdown, 이력서는 File 타입으로 지정합니다.
Dropdown 에는 회사가 채용 중인 직무를 옵션으로 등록합니다 (예: 업무자동화 엔지니어 / n8n 자동화 개발자 / 백엔드 자동화 개발자).
⚠️ File 필드에는 반드시 Custom Field Name 을 data 로 설정 하세요. 뒤에 붙일 Extract from File 노드의 기본 입력 필드명이 data 라서 이걸 맞춰야 자동 연결됩니다.
name, 이메일은 email 로 두면 뒤에서 표현식 참조가 편합니다.PDF 파싱 — Extract from File 노드
폼 트리거 뒤에 Extract from File 노드를 추가합니다.
노드 파라미터는 Input Binary Field Name = data (폼의 Custom Field Name 과 일치) 만 확인하면 됩니다. 나머지 옵션은 기본값 유지.
text, numpages, info 등의 필드가 나옵니다. text 필드에 PDF 전체 텍스트가 하나의 긴 문자열로 담겨 다음 AI Agent 로 흘러갑니다.AI Agent — 이력서에서 구조화된 스킬·경력 추출
Extract 노드 뒤에 AI Agent 를 붙입니다.
Source for Prompt 를 Define below 로 두고, User Message 에는 앞 노드의 text 필드를 넘깁니다. 옵션에서 System Message 를 추가하는 것도 잊지 마세요.
지원자 이름: {{ $("On form submission").item.json["이름"] }}
지원 직무: {{ $("On form submission").item.json["지원직무"] }}
이력서 원문:
{{ $json.text }}
당신은 기업의 채용 담당 AI입니다.
지원자의 이력서를 읽고 채용 평가에 필요한 정보를 객관적으로 추출하세요.
추측하지 마세요.
이력서에 없는 정보는 null 또는 0으로 처리하세요.
다음 항목을 분석하세요.
1. 지원자 이름
2. 총 경력 연수
3. n8n 실무 경력 연수
4. Python 사용 경험 여부
5. JavaScript 사용 경험 여부
6. REST API 연동 경험 여부
7. Google Workspace 연동 경험 여부
8. 데이터베이스 경험 여부
9. Docker 또는 Linux 경험 여부
10. 자동화 프로젝트 개수
11. 자동화 프로젝트 요약
12. 주요 강점
13. 우려사항
최종 채용 여부는 판단하지 마세요.
평가에 필요한 사실만 추출하세요.
다음으로 AI Agent 하단의 Chat Model 과 Output Parser 슬롯을 각각 연결합니다.
Structured Output Parser — JSON 스키마 강제
AI Agent 하위에 붙인 Structured Output Parser 노드를 열어, Schema Type 을 Generate From JSON Example 로 두고 아래 예시를 붙여넣으세요. n8n 이 이걸 스키마로 변환해서 AI 결과가 이 구조에 맞도록 강제 합니다.
{
"name": "김도윤",
"totalCareerYears": 4,
"n8nYears": 3,
"hasPython": true,
"hasJavaScript": true,
"hasApiExperience": true,
"hasGoogleWorkspace": true,
"hasDatabaseExperience": true,
"hasDockerLinux": true,
"automationProjectCount": 4,
"projectSummary": "고객 문의 자동화, 영업 미팅 어시스턴트 등",
"strengths": [
"n8n 실무 경험",
"API 연동 경험",
"운영 자동화 경험"
],
"concerns": []
}
data.hasPython 같이 안심하고 필드 접근 이 가능합니다. Structured Output 이 없으면 AI 마다 필드명·타입이 매번 달라져 시트 저장 노드가 깨집니다.Code 노드 — 점수 배정 + 평가결과 자동 판정
AI Agent 뒤에 Code 노드를 추가합니다.
각 스킬·경력에 점수를 배정하고 총점으로 적합 / 검토 / 탈락 3단계 결과를 판정합니다.
return $input.all().map(item => {
const data = item.json.output;
let score = 0;
let scoreReasons = [];
// n8n 실무 경력
if (data.n8nYears >= 2) {
score += 30;
scoreReasons.push('n8n 경력 2년 이상 +30점');
} else if (data.n8nYears >= 1) {
score += 15;
scoreReasons.push('n8n 경력 1년 이상 +15점');
}
// API 경험
if (data.hasApiExperience === true) {
score += 20;
scoreReasons.push('API/Webhook 경험 +20점');
}
// Python
if (data.hasPython === true) {
score += 15;
scoreReasons.push('Python 경험 +15점');
}
// JavaScript
if (data.hasJavaScript === true) {
score += 10;
scoreReasons.push('JavaScript 경험 +10점');
}
// Google Workspace
if (data.hasGoogleWorkspace === true) {
score += 10;
scoreReasons.push('Google Workspace 경험 +10점');
}
// DB
if (data.hasDatabaseExperience === true) {
score += 5;
scoreReasons.push('DB 경험 +5점');
}
// Docker / Linux
if (data.hasDockerLinux === true) {
score += 5;
scoreReasons.push('Docker/Linux 경험 +5점');
}
// 자동화 프로젝트
if (data.automationProjectCount >= 2) {
score += 5;
scoreReasons.push('자동화 프로젝트 2개 이상 +5점');
}
// 최종 평가
let result;
if (score >= 80) {
result = '적합';
} else if (score >= 60) {
result = '검토';
} else {
result = '탈락';
}
return {
json: {
name: data.name,
totalCareerYears: data.totalCareerYears,
n8nYears: data.n8nYears,
hasPython: data.hasPython,
hasJavaScript: data.hasJavaScript,
hasApiExperience: data.hasApiExperience,
hasGoogleWorkspace: data.hasGoogleWorkspace,
hasDatabaseExperience: data.hasDatabaseExperience,
hasDockerLinux: data.hasDockerLinux,
automationProjectCount: data.automationProjectCount,
projectSummary: data.projectSummary,
strengths: data.strengths,
concerns: data.concerns,
score,
result,
scoreReasons
}
};
});
Google Sheets Append — 심사 결과 시트 저장
Code 노드 뒤에 Google Sheets · Append row in sheet 노드를 붙입니다.
설정: Document = 채용 심사 시트, Sheet = 시트1, Mapping Column Mode = Map Each Column Manually, 각 컬럼에 Code 노드가 만든 필드를 표현식으로 매핑.
name totalCareerYears n8nYears hasPython hasJavaScript hasApiExperience hasGoogleWorkspace hasDatabaseExperience hasDockerLinux automationProjectCount projectSummary score result strengths concerns scoreReasons
strengths·concerns·scoreReasons) 은 시트에 저장될 때 자동으로 문자열로 직렬화됩니다.Switch + Gmail — 평가결과별 3방향 메일 발송
시트 저장 뒤에 Switch 노드를 붙입니다.
Mode = Rules, Routing Rules 를 3개 추가합니다 — 각각 적합·검토·탈락.
각 룰의 조건 표현식은 {{ $json['result'] }} 가 적합 / 검토 / 탈락 문자열과 각각 일치하는지 확인. Rename Output 을 켜서 Output Name 을 적합 · 검토 · 탈락 으로 두면 시각적으로 명확.
Switch 의 3개 출력마다 Gmail 노드 를 각각 붙입니다.
각 Gmail 은 To(담당자 이메일) 를 고정하고, Subject 와 Message 는 표현식으로 지원자 정보를 동적으로 채웁니다.
[면접 추천] {{ $json['name'] }} 지원자 - {{ $json['score'] }}점
<div style="font-family: Arial, sans-serif; max-width: 650px; margin: 0 auto; color: #222; line-height: 1.7;">
<h2 style="margin-bottom: 6px;">✅ 면접 추천 지원자</h2>
<p><b>이름:</b> {{ $json["이름"] }}</p>
<p><b>총경력:</b> {{ $json["총경력"] }}년 · <b>n8n 경력:</b> {{ $json["n8n경력"] }}년</p>
<p><b>점수:</b> {{ $json["점수"] }}점 · <b>평가:</b> {{ $json["평가결과"] }}</p>
<h3>강점</h3>
<ul>{{ $json["강점"].map(s => `<li>${s}</li>`).join("") }}</ul>
<h3>평가 근거</h3>
<ul>{{ $json["평가근거"].map(s => `<li>${s}</li>`).join("") }}</ul>
</div>
최종 실행 — 이력서 PDF 하나로 파이프라인 검증
이력서 PDF (샘플 지원자 하나) 를 준비해 폼 Test URL 로 제출합니다. 몇 초 안에 파이프라인 전체가 자동 실행됩니다.
- 확장 아이디어 ① Switch 마지막 브랜치에 지원자 자동 응답 메일 (탈락도 정중한 안내 자동 발송)
- 확장 아이디어 ② AI Agent 앞에 이력서 언어 감지 Agent 추가 → 한국어/영어 이력서 모두 처리
- 확장 아이디어 ③ Google Sheets 시트를 Slack 알림 과 연동해 적합 지원자만 채용팀 채널에 즉시 공유
- 확장 아이디어 ④ 지원자에게 Google Calendar 초대장 자동 발송 (적합 등급만)
- 확장 아이디어 ⑤ 이력서 원본 PDF 를 Google Drive 에 지원자명 폴더로 자동 정리