1일차 — AI Agent
📝 실시간 메모 노션 https://app.notion.com/p/KT-DS-3dc4b65410c88078986dc7773a805651 ↗강의자료 (PDF)
1일차 강의자료 PDF입니다. 아래 링크에서 다운로드해 강의 중 함께 보시면 됩니다.
📎 1일차 강의자료 (PDF) Project404 강의 · 1일차 ⬇ 다운로드실습 더미데이터 — 개요
1일차 실습은 외부 서비스(구글 시트·Gmail·슬랙 등) 없이 로컬에서만 AI Agent 를 구성할 수 있게 재구성했습니다. 각 예제는 아래 4가지이며, 데이터는 표로 미리 보고 CSV 로 다운로드 할 수 있습니다.
- 실습 1 — 휴가·근태 문의 상담 챗봇 (사원 CSV + 사내 규정 md)
- 실습 2 — 영업팀 미팅 준비 어시스턴트 (미팅 CSV + 연락처 CSV)
- 실습 3 — 컴플레인 자동 처리 (접수 CSV + 콘솔 알림)
- 실습 4 — 이력서 자동 검수 (지원자 CSV + 이력서 PDF 5종)
실습 1 — 인사팀 휴가·근태 관리 AI Agent
사원 정보 · 연차 사용내역 · 근태 · 팀 · 공휴일을 CSV 6개로 두고, AI Agent 가 자연어 질문을 받아 SQLite 조회 툴 로 답합니다. 아래 CSV 를 프로젝트 폴더에 놓고 실습 방향성 프롬프트 를 Claude/Cursor 에 그대로 넣으세요.
employees.csv — 사원 마스터 (8명)
| 사번 | 이름 | 부서 | 직급 | 입사일 | 연차_총부여일 | 연차_사용일 | 연차_잔여일 | 반차_사용일 |
|---|---|---|---|---|---|---|---|---|
| E1001 | 홍길동 | 영업1팀 | 과장 | 2019-03-04 | 15 | 7 | 8 | 2 |
| E1002 | 김철수 | 개발2팀 | 대리 | 2021-07-01 | 15 | 3 | 12 | 0 |
| E1003 | 이영희 | 마케팅팀 | 차장 | 2015-09-14 | 20 | 15 | 5 | 4 |
| E1004 | 박민수 | 영업1팀 | 사원 | 2024-01-10 | 11 | 2 | 9 | 1 |
| E1005 | 최지원 | 인사팀 | 부장 | 2010-05-22 | 22 | 20 | 2 | 0 |
| E1006 | 정수빈 | 개발1팀 | 대리 | 2020-11-03 | 15 | 10 | 5 | 3 |
| E1007 | 강태현 | 디자인팀 | 과장 | 2017-06-18 | 16 | 4 | 12 | 1 |
| E1008 | 윤서연 | 경영지원팀 | 사원 | 2024-08-01 | 7 | 0 | 7 | 0 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
leave_history.csv — 연차·반차 신청 내역 (12건)
| 신청ID | 사번 | 신청일 | 휴가유형 | 시작일 | 종료일 | 사용일수 | 사유 | 상태 |
|---|---|---|---|---|---|---|---|---|
| L2026001 | E1001 | 2026-02-10 | 연차 | 2026-03-04 | 2026-03-05 | 2 | 개인사유 | 승인 |
| L2026002 | E1001 | 2026-05-02 | 반차(오후) | 2026-05-08 | 2026-05-08 | 0.5 | 병원 진료 | 승인 |
| L2026003 | E1002 | 2026-06-14 | 연차 | 2026-06-20 | 2026-06-20 | 1 | 경조사 | 승인 |
| L2026007 | E1005 | 2026-07-01 | 연차 | 2026-07-14 | 2026-07-25 | 10 | 여름휴가 | 승인 |
| L2026011 | E1007 | 2026-09-01 | 반차(오전) | 2026-09-08 | 2026-09-08 | 0.5 | 자녀 병원 동행 | 반려 |
| L2026012 | E1008 | 2026-09-10 | 연차 | 2026-09-25 | 2026-09-25 | 1 | 결혼기념일 | 신청중 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
attendance.csv — 출퇴근 기록 (일별)
| 사번 | 근무일 | 출근시각 | 퇴근시각 | 근무형태 | 지각여부 | 비고 |
|---|---|---|---|---|---|---|
| E1001 | 2026-09-01 | 08:52 | 18:11 | 정상 | N | |
| E1001 | 2026-09-02 | 09:15 | 18:20 | 정상 | Y | 지하철 지연 |
| E1002 | 2026-09-01 | 09:01 | 18:33 | 정상 | Y | |
| E1003 | 2026-09-01 | 08:40 | 17:50 | 정상 | N | |
| E1004 | 2026-09-01 | 09:12 | 18:00 | 정상 | Y | 교통 정체 |
| E1006 | 2026-09-02 | 08:59 | 18:00 | 재택 | N |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
teams.csv — 부서 · 정원
| 부서코드 | 부서명 | 팀장사번 | 팀장명 | 정원 | 현원 |
|---|---|---|---|---|---|
| D01 | 영업1팀 | E1001 | 홍길동 | 6 | 4 |
| D02 | 개발1팀 | E1006 | 정수빈 | 10 | 8 |
| D03 | 개발2팀 | E1002 | 김철수 | 8 | 7 |
| D04 | 마케팅팀 | E1003 | 이영희 | 5 | 4 |
| D05 | 인사팀 | E1005 | 최지원 | 4 | 3 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
holidays.csv — 2026 공휴일
| 날짜 | 공휴일명 | 종류 | 대체휴일 |
|---|---|---|---|
| 2026-01-01 | 신정 | 법정공휴일 | N |
| 2026-05-05 | 어린이날 | 법정공휴일 | N |
| 2026-08-15 | 광복절 | 법정공휴일 | N |
| 2026-09-25 | 추석 | 법정공휴일 | N |
| 2026-12-25 | 성탄절 | 법정공휴일 | N |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
leave_policy.md — 사내 휴가·근태 규정
📎 leave_policy.md 사내 규정 (RAG 컨텍스트) ⬇ 다운로드Python + Flask + Vanilla HTML + SQLite 환경에서 인사팀 휴가·근태 관리 AI Agent 를 만들어줘.
## 이 Agent 의 특색
- 데이터(사원·휴가·근태)는 SQLite 조회로, 규정 해석은 leave_policy.md 원문 참조로 처리
- Claude 가 규정을 임의 해석/추측 못 하도록, 반드시 read_policy 툴을 호출한 결과만 근거로 답하게 유도
## 요구사항
- CSV 5개(employees, leave_history, attendance, teams, holidays)를 SQLite 로 구성
- leave_policy.md 는 파일 그대로 두고 read_policy 툴이 원문 반환
- Claude API + Anthropic SDK Tool Calling (LangChain X)
- Vanilla HTML 챗 UI · Flask 백엔드
## Agent Tool
- get_employee(name_or_id) — 직원 기본 정보
- get_leave_balance(emp_id) — 잔여 연차/반차
- list_leaves(emp_id, from, to) — 휴가 사용 내역
- get_attendance(emp_id, date) — 특정일 근태
- summarize_attendance(emp_id, from, to) — 지각/재택/정상 카운트
- register_leave(emp_id, type, start, end, reason) — 휴가 신청 INSERT
- read_policy() — leave_policy.md 원문 반환
- list_holidays(from, to) — 해당 기간 공휴일
## 시스템 프롬프트 규칙 (필수)
- 잔여일수·사용일수는 반드시 툴로 조회, 절대 추측 X
- 규정 해석 질문(반차 몇 시간? 반려 조건?)이 나오면 반드시 read_policy 를 먼저 호출
- 답변에 규정 인용 시 원문의 해당 문장을 그대로 인용
먼저 CSV 구조를 확인하고 DB Schema 설계 → MVP 까지 한 번에 완성해줘.
# 단순 조회 (툴 1개)
1. 김철수 연차 몇 개 남았어?
2. E1003 이번 달 지각 몇 번 했어?
3. 홍길동 3월에 쓴 연차 알려줘
4. 2026년 9월 공휴일 며칠이야?
# 규정 참조가 필요한 질문 (read_policy 유도)
5. 반차는 몇 시간이야? 승인 조건은?
6. 잔여 연차 3일 이하면 알림이 오는지 규정에 있어?
7. 12월 31일까지 안 쓴 연차 이월 되는지 알려줘
8. 병가는 연차랑 어떻게 다른지 규정 기반으로 설명해줘
# 툴 2~3개 연쇄 (Agent Loop 검증)
9. 이영희 씨 반차 사용 몇 번인지 규정상 반차 정의랑 같이 알려줘
10. E1005 여름휴가 사용 후 잔여 연차, 그리고 남은 연차로 갈 수 있는 최장 연속휴가일수 알려줘
11. 다음 주에 공휴일 있어? 있으면 그 주에 연차 신청한 사람 몇 명이야?
# 쓰기 (register_leave)
12. E1008 9월 25일 연차 신청해줘
13. 홍길동 씨 이번 주 목요일 오후 반차 등록해줘. 사유는 병원 진료
# Agent 가 되물어야 하는 애매한 질문
14. 김민수 연차 알려줘 (사번 없이 이름만 · 동명이인 상황 처리 확인)
15. 다음 주 화요일 휴가 등록해줘 (누구인지 안 밝힘 · 되물어야 정답)
실습 2 — 영업팀 미팅 준비 어시스턴트
구글 캘린더·연락처 대신 CSV 5개 를 SQLite 로 넣고, 자연어로 오늘/내일 미팅 브리핑을 뽑는 AI Agent.
meetings.csv — 미팅 6건
| 미팅ID | 날짜 | 시작시간 | 종료시간 | 제목 | 참석자 | 장소 | 비고 |
|---|---|---|---|---|---|---|---|
| M2026001 | 2026-09-16 | 10:00 | 11:00 | 신규 클라이언트 A사 킥오프 | 홍길동;박지훈 | 본사 3층 회의실 | 계약서 검토 |
| M2026002 | 2026-09-16 | 14:00 | 15:30 | 3분기 매출 리뷰 | 김철수;이영희;최지원 | 본사 5층 대회의실 | 분기 실적 보고 |
| M2026003 | 2026-09-17 | 09:30 | 10:30 | B사 제안서 발표 | 홍길동;정수빈 | B사 본사 | PPT 15장 |
| M2026005 | 2026-09-18 | 11:00 | 12:00 | C사 계약 협의 | 박민수;최지원 | C사 본사 | 단가 협상 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
attendees.csv — 미팅별 참석자 상세
| 미팅ID | 참석자 | 소속 | 역할 | 참석확정 |
|---|---|---|---|---|
| M2026001 | 홍길동 | 내부-영업1팀 | 주관 | Y |
| M2026001 | 박지훈 | 외부-A주식회사 | 클라이언트 | Y |
| M2026003 | 이수민 | 외부-B솔루션즈 | 의사결정자 | Y |
| M2026005 | 정재호 | 외부-C산업 | 의사결정자 | Y |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
contacts.csv — 외부 연락처
| 이름 | 회사 | 직책 | 이메일 | 전화 | 최근컨택 | 비고 |
|---|---|---|---|---|---|---|
| 박지훈 | A주식회사 | 구매팀장 | jhpark@a-corp.example | 010-1111-2222 | 2026-09-01 | 오전 미팅 선호 |
| 이수민 | B솔루션즈 | CTO | smlee@b-sol.example | 010-2222-3333 | 2026-08-27 | 기술 데모 요청함 |
| 정재호 | C산업 | 대표이사 | jhjung@c-ind.example | 010-3333-4444 | 2026-08-15 | 의사결정권자 |
| 윤민석 | E테크 | 개발팀장 | msyoon@e-tech.example | 010-5555-6666 | 2026-07-30 | POC 논의 중 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
meeting_rooms.csv — 회의실 마스터
| 회의실ID | 회의실명 | 층수 | 정원 | 화상장비 | 화이트보드 | 비고 |
|---|---|---|---|---|---|---|
| R101 | 본사 3층 회의실 | 3F | 8 | Y | Y | |
| R102 | 본사 5층 대회의실 | 5F | 20 | Y | Y | 분기 리뷰 전용 |
| R103 | 본사 7층 임원실 | 7F | 12 | Y | N | 임원 회의 전용 |
| R201 | 디자인팀 회의실 | 4F | 6 | N | Y | 디자인팀 우선 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
sales_notes.csv — 최근 영업 노트
| 노트ID | 작성일 | 회사 | 담당자 | 단계 | 메모 | 다음액션 |
|---|---|---|---|---|---|---|
| N001 | 2026-08-15 | A주식회사 | 박지훈 | 계약체결전 | 단가 협의 마무리 필요. 결제조건은 30일 후 지불로 협의됨 | 계약서 초안 송부 |
| N002 | 2026-08-20 | B솔루션즈 | 이수민 | POC진행 | POC 결과 만족. 확장 도입 논의 예정 | 제안서 v2 발송 |
| N003 | 2026-08-27 | C산업 | 정재호 | 계약체결전 | 단가 5% 조정 요청. 임원 승인 필요 | 단가 재검토 |
| N007 | 2026-09-12 | A주식회사 | 박지훈 | 계약체결전 | 계약서 검토 완료. 서명 대기 | 서명 일정 확정 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
past_meetings.csv — 과거 미팅 이력
| 미팅ID | 날짜 | 회사 | 주제 | 결론 | 후속액션여부 |
|---|---|---|---|---|---|
| P2026001 | 2026-01-15 | A주식회사 | POC 킥오프 | 3개월 진행 확정 | Y |
| P2026002 | 2026-04-22 | A주식회사 | POC 리뷰 | 성공적 종료 | Y |
| P2026003 | 2026-06-10 | B솔루션즈 | 기술 데모 | 긍정적 반응 | Y |
| P2026004 | 2026-08-01 | C산업 | 제안서 발표 | 의사결정 대기 | Y |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
Python + Flask + Vanilla HTML + SQLite 환경에서 영업팀 미팅 준비 AI Agent 를 만들어줘.
## 이 Agent 의 특색
- 최종 결과물이 <b>미팅 브리핑 마크다운 문서</b> — 참석자·의제·회의실·과거이력·다음액션을 한 페이지에 조립
- Agent 가 여러 테이블(미팅→참석자→연락처→과거미팅→영업노트)을 스스로 순차 조회해 join
- 단순 QA 가 아니라 <b>구조화된 결과물 반환</b> 이 목적
## 요구사항
- CSV 6개(meetings, attendees, contacts, meeting_rooms, sales_notes, past_meetings)를 SQLite 로 구성
- Claude API + Anthropic SDK Tool Calling · Vanilla HTML 챗 UI · Flask 백엔드
## Agent Tool
- list_meetings(date) — 특정 날짜의 미팅 목록
- get_attendees(meeting_id) — 참석자 리스트
- get_contact(name) — 외부 참석자 연락처
- get_room(room_name) — 회의실 정보
- search_sales_notes(company) — 회사별 최근 영업 노트
- past_meetings_with(company) — 해당 회사와의 과거 미팅 이력
- check_room_availability(date, time_range) — 회의실 가용성
## 결과물 포맷 (Agent 가 반드시 이 형태로 반환)
```
# 📅 {date} 미팅 브리핑
## 1. {미팅 제목} ({시작}~{종료} @ {장소})
**참석자**
- 홍길동 (내부·주관)
- 박지훈 (외부·A주식회사 구매팀장 · jhpark@… · 010-…)
**회사 컨텍스트**
- 최근 영업 노트: {sales_notes 요약}
- 과거 미팅: {past_meetings 요약}
**추천 다음액션**: …
```
## 시스템 프롬프트 규칙
- 브리핑 요청 시 반드시 위 마크다운 포맷으로 반환
- 외부 참석자는 반드시 get_contact 호출해서 연락처 붙임
- 회사가 언급되면 반드시 search_sales_notes + past_meetings_with 를 함께 호출
먼저 CSV 구조 확인 → DB Schema 설계 → MVP 까지 완성해줘.
# 단일 조회
1. 2026-09-17 미팅 목록 알려줘
2. 본사 5층 대회의실 정원 몇 명이야?
3. 박지훈 씨 연락처 알려줘
# 브리핑 문서 생성 (Tool 4~5개 연쇄)
4. 2026-09-16 미팅 브리핑 만들어줘
5. 내일 있는 외부 미팅만 브리핑해줘
6. 2026-09-17 B사 제안서 발표 브리핑 만들어줘 — 참석자·과거이력·다음액션 다 포함해서
# 회사 컨텍스트 요약
7. A주식회사와 최근 어떤 대화가 오갔어?
8. C산업 지금 어느 단계야? 다음에 뭘 해야 해?
9. B솔루션즈 POC 결과 어땠는지 정리해줘
# 회의실 가용성
10. 2026-09-16 오전 10시에 본사 3층 회의실 비어?
11. 내일 오후에 화상 장비 되는 8인실 어디가 비어?
# 종합 판단 (Agent 가 여러 정보 조합)
12. C사 계약 협의 미팅 전에 내가 알아야 할 것 정리해줘
13. 다음 주 미팅 중 의사결정자가 참석하는 미팅만 우선순위대로 알려줘
14. 과거 A사와 미팅 4번 했는데, 이번 미팅은 이전이랑 어떻게 다를 것 같아?
# 애매한 요청 (되물어야 정답)
15. 미팅 브리핑 만들어줘 (날짜 안 밝힘)
실습 3 — 컴플레인 자동 접수·분류·알림 Agent
폼·구글시트·Slack 없이 CSV 6개 를 SQLite 로 넣고, 자연어 컴플레인을 분류·저장·알림하는 AI Agent.
complaints.csv — 초기 접수 5건
| 접수ID | 접수일시 | 고객명 | 연락처 | 카테고리 | 내용 | 긴급도 | 상태 | 담당자 |
|---|---|---|---|---|---|---|---|---|
| C20260910001 | 2026-09-10 09:12 | 이수정 | 010-1000-0001 | 배송지연 | 주문 후 5일 지났는데 아직 배송 시작 안됨. 주문번호 ORD-88123 | 중 | 처리중 | 김상담 |
| C20260911001 | 2026-09-11 14:33 | 박현우 | 010-1000-0002 | 결제오류 | 카드 결제 중복 청구됨. 2회 결제 확인 필요. | 상 | 미처리 | 미배정 |
| C20260912001 | 2026-09-12 10:08 | 최유나 | 010-1000-0003 | 상품불량 | 제품 포장 뜯자마자 화면 깨져있음. 교환 요청. | 상 | 처리중 | 이지원 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
complaint_categories.csv — 카테고리·SLA·담당팀 매핑
| 카테고리ID | 카테고리명 | 기본긴급도 | 담당팀 | SLA_시간 |
|---|---|---|---|---|
| CAT01 | 배송지연 | 중 | 물류CS팀 | 24 |
| CAT02 | 결제오류 | 상 | 결제운영팀 | 4 |
| CAT03 | 상품불량 | 상 | 품질관리팀 | 8 |
| CAT04 | 환불요청 | 하 | 정산팀 | 72 |
| CAT05 | 고객응대 | 상 | CS리더팀 | 4 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
cs_agents.csv — 상담원 배정 가능 목록
| 상담원ID | 이름 | 팀 | 전문카테고리 | 현재처리건수 | 최대동시처리 |
|---|---|---|---|---|---|
| CS01 | 김상담 | 물류CS팀 | 배송지연;환불요청 | 3 | 5 |
| CS02 | 이지원 | 품질관리팀 | 상품불량 | 2 | 4 |
| CS03 | 박응대 | CS리더팀 | 고객응대;이벤트문의 | 4 | 6 |
| CS04 | 정결제 | 결제운영팀 | 결제오류 | 1 | 3 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
sla_rules.csv — 긴급도별 응답·해결 규정
| 긴급도 | 1차응답_시간 | 해결목표_시간 | 알림채널 | 에스컬레이션 |
|---|---|---|---|---|
| 상 | 1 | 4 | SMS+콘솔 | 팀장 즉시 |
| 중 | 4 | 24 | 콘솔 | 팀장 익일 |
| 하 | 24 | 72 | 콘솔 | 없음 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
response_templates.csv — 카테고리별 응답 템플릿
| 템플릿ID | 카테고리 | 단계 | 본문 |
|---|---|---|---|
| T01 | 배송지연 | 접수 | {고객명}님 배송 지연으로 불편을 드려 죄송합니다... |
| T02 | 결제오류 | 접수 | {고객명}님 결제 관련 이슈 접수되었습니다... |
| T03 | 상품불량 | 접수 | {고객명}님 상품 불량으로 인한 불편에 사과드립니다... |
| T05 | 고객응대 | 접수 | {고객명}님 상담 과정에서 불편을 드린 점 진심으로 사과드립니다... |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
escalation_history.csv — 과거 에스컬레이션 이력
| 이력ID | 접수ID | 에스컬레이션일시 | 에스컬레이션대상 | 사유 | 결과 |
|---|---|---|---|---|---|
| E001 | C20260911001 | 2026-09-11 15:00 | 결제운영팀장 | 중복결제 발생 · 상 긴급도 | 팀장 배정 완료 |
| E002 | C20260912001 | 2026-09-12 11:00 | 품질관리팀장 | 포장불량 · 사진 접수 | 교환 승인 |
| E005 | C20250920001 | 2025-09-20 16:00 | 물류CS팀장 | 대량 배송지연 | 전체 SMS 발송 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
Python + Flask + Vanilla HTML + SQLite 환경에서 컴플레인 자동 접수 AI Agent 를 만들어줘.
## 이 Agent 의 특색
- 자연어 컴플레인 한 문장 입력 → Agent 가 <b>5~7개 툴을 자동으로 연쇄 호출</b>: 카테고리 조회 → 상담원 후보 조회 → 로드밸런싱 판단 → INSERT → SLA 조회 → (긴급) 알림 → 템플릿 응답 반환
- 쓰기(INSERT)와 부수효과(콘솔 알림)를 한 Agent Loop 안에서 처리
- 분류 근거·배정 근거·SLA 근거를 최종 답변에 모두 인용
## 요구사항
- CSV 6개(complaints, complaint_categories, cs_agents, sla_rules, response_templates, escalation_history)를 SQLite 로 구성
- Claude API + Anthropic SDK Tool Calling · Vanilla HTML 챗 UI · Flask 백엔드
## Agent Tool (분류·배정·저장·알림·조회 5축)
- classify(text) → 반드시 complaint_categories.카테고리명 중 하나로만 매핑
- find_available_agent(category) → cs_agents 에서 전문카테고리 매칭 + 현재처리 < 최대동시 인 사람 리턴 (로드밸런싱)
- insert_complaint(고객명, 연락처, 카테고리, 내용, 긴급도, 담당자) → complaints INSERT + 새 ID 반환
- get_sla(긴급도) → sla_rules 조회
- alert_console(complaint_id, 내용, 채널) → 채널이 SMS+콘솔 이면 print('[URGENT] …') 부수효과
- render_template(카테고리, 단계, 고객명) → response_templates 에서 본문 가져와 고객명 치환
- similar_past_cases(카테고리, limit) → 같은 카테고리 최근 접수 3건
## 시스템 프롬프트 규칙 (필수)
- 컴플레인 입력을 받으면 반드시 다음 순서로 툴을 연쇄 호출:
1) classify → 2) find_available_agent → 3) insert_complaint → 4) get_sla → 5) 긴급이면 alert_console → 6) render_template
- 카테고리를 스스로 판단하지 말고 반드시 complaint_categories 조회 결과 안에서만 선택
- 최종 답변에 반드시: 접수ID · 카테고리 · 배정 상담원 · 1차응답 예정 시각 · 고객 안내 문구
MVP 까지 한 번에 완성해줘.
# 신규 접수 (툴 5~6개 연쇄)
1. 홍길순 010-9999-1234, 결제하고 상품이 안 왔어요. 오늘 급하게 필요합니다!
2. 박현진 010-8888-2222, 지난주에 산 이어폰 소리가 한쪽만 나요. 교환해주세요
3. 이지훈 010-7777-3333, 콜센터 상담원이 반말했어요. 매우 불쾌합니다
4. 김수연 010-6666-4444, 프로모션 코드가 왜 안 먹히는지 문의드려요 (긴급도 낮음)
5. 정민호 010-5555-5555, 카드 결제 3번 중복으로 청구됐어요!!!
# 로드밸런싱 검증
6. 상품불량 카테고리에 지금 배정 가능한 상담원은 누구야?
7. 김상담 상담원 지금 몇 건 처리 중이야?
8. 배송지연 컴플레인 3건 연속 접수하면 각각 누구한테 배정돼?
# SLA·규정 조회
9. 상 긴급도는 몇 시간 안에 응답해야 해?
10. 방금 접수한 C… 건은 언제까지 해결해야 해?
# 과거 유사 케이스
11. 배송지연 카테고리 최근 접수 어떤 것들이 있어?
12. 결제오류로 에스컬레이션된 적 있어? 어떻게 처리됐어?
# 관리자 관점 요약
13. 이번 주 미처리 컴플레인 몇 건이야?
14. 긴급도 상 인데 아직 미배정인 건 있어?
15. 상담원별 현재 처리 건수 순위 알려줘
# 애매한 입력 (Agent 가 되물어야 함)
16. 화가 나서 접수합니다 (내용 없음)
17. 010-1111-2222 로 방금 접수한 거 어떻게 됐어? (누구 접수인지 불명확)
실습 4 — 이력서 자동 검수 & 채용 대시보드 Agent
이력서 PDF 5종을 파싱해 점수화하고, 채용 현황을 자연어로 조회하는 AI Agent. CSV 5개 + PDF 5개 를 SQLite 로 통합.
applicants.csv — 지원자 마스터 (이력서 PDF 와 1:1)
| 지원ID | 지원일 | 이름 | 지원직무 | 총경력 | n8n경력 | Python | JavaScript | API | GWS | DB | Docker | 프로젝트수 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A2026001 | 2026-09-01 | 김도윤 | 자동화 엔지니어 | 7 | 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
| A2026002 | 2026-09-02 | 이서현 | 자동화 엔지니어 | 3 | 1 | ✓ | ✓ | ✓ | 3 | |||
| A2026003 | 2026-09-03 | 박준혁 | 백엔드 자동화 개발자 | 5 | 2 | ✓ | ✓ | ✓ | ✓ | ✓ | 5 | |
| A2026004 | 2026-09-04 | 최민지 | n8n 자동화 개발자 | 2 | 0 | ✓ | 1 | |||||
| A2026005 | 2026-09-05 | 정우진 | 자동화 엔지니어 | 10 | 3 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 6 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
job_openings.csv — 채용 중인 직무
| 직무ID | 직무명 | 팀 | 경력요건 | 필수스킬 | 우대스킬 | 헤드카운트 |
|---|---|---|---|---|---|---|
| J001 | 자동화 엔지니어 | 자동화팀 | 3년+ | n8n;Python;API | Docker;PostgreSQL | 2 |
| J002 | n8n 자동화 개발자 | 자동화팀 | 1년+ | n8n;JavaScript | GoogleWorkspace | 1 |
| J003 | 백엔드 자동화 개발자 | 플랫폼팀 | 5년+ | Python;SQL;Docker | n8n;AWS | 1 |
| J004 | 자동화 PM | 자동화팀 | 7년+ | 프로젝트관리;n8n이해 | 영어 | 1 |
| J005 | 자동화 QA | 플랫폼팀 | 3년+ | 테스트자동화;Python | Selenium;Playwright | 1 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
scoring_rubric.csv — 점수 산정 규칙
| 항목 | 조건 | 점수 |
|---|---|---|
| n8n경력 | 2년 이상 | 30 |
| n8n경력 | 1년 이상 2년 미만 | 15 |
| API경험 | 보유 | 20 |
| Python | 보유 | 15 |
| JavaScript | 보유 | 10 |
| GoogleWorkspace | 보유 | 10 |
| 자동화프로젝트 | 2건 이상 | 5 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
interview_stages.csv — 채용 단계
| 단계 | 이름 | 담당자 | 예상시간_분 | 합격기준 |
|---|---|---|---|---|
| S1 | 서류심사 | AI Agent | 1 | 점수 60점 이상 |
| S2 | 코딩 과제 | 기술PM | 120 | 실무 자동화 시나리오 1건 |
| S3 | 1차 기술면접 | 팀장 | 60 | 실무경험 검증 |
| S4 | 2차 컬처핏 | HR | 45 | 조직적합성 판단 |
| S5 | 대표 면접 | 대표 | 30 | 최종 승인 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
department_headcount.csv — 부서별 정원·채용목표
| 부서코드 | 부서명 | 정원 | 현원 | 이번분기_채용목표 | 평균근속_년 |
|---|---|---|---|---|---|
| DEP01 | 자동화팀 | 10 | 7 | 3 | 2.4 |
| DEP02 | 플랫폼팀 | 12 | 10 | 2 | 3.1 |
| DEP03 | 프론트팀 | 8 | 7 | 1 | 2.0 |
| DEP04 | 데이터팀 | 6 | 5 | 1 | 1.8 |
| DEP05 | 디자인팀 | 4 | 3 | 1 | 3.5 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
past_hires.csv — 과거 채용 결과 (점수 vs 재직여부)
| 채용ID | 입사일 | 이름 | 직무 | 입사시_점수 | 평가결과 | 재직여부 |
|---|---|---|---|---|---|---|
| H2024001 | 2024-03-01 | 오세훈 | 자동화 엔지니어 | 88 | 적합 | 재직 |
| H2024003 | 2024-08-01 | 김승우 | 백엔드 자동화 개발자 | 91 | 적합 | 재직 |
| H2025001 | 2025-02-10 | 한주희 | 자동화 엔지니어 | 66 | 검토 | 퇴사 |
| H2025003 | 2025-09-05 | 백지원 | 자동화 엔지니어 | 84 | 적합 | 재직 |
💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.
이력서 PDF 5종 — 5강 실습용 원본 재활용
📎 지원자 A · 김도윤 이력서 PDF ⬇ 다운로드 📎 지원자 B · 이서현 이력서 PDF ⬇ 다운로드 📎 지원자 C · 박준혁 이력서 PDF ⬇ 다운로드 📎 지원자 D · 최민지 이력서 PDF ⬇ 다운로드 📎 지원자 E · 정우진 이력서 PDF ⬇ 다운로드Python + Flask + Vanilla HTML + SQLite 환경에서 이력서 자동 검수 · 채용 대시보드 AI Agent 를 만들어줘.
## 이 Agent 의 특색
- 4개 실습 중 유일하게 <b>비정형 입력(PDF)</b> 처리: 이력서 PDF → pypdf → Claude Structured Output → JSON
- 점수는 반드시 scoring_rubric.csv 룰에 따라 계산 (Claude 가 임의로 매기지 못하게)
- past_hires.csv 를 회귀분석 근거로 사용: 특정 점수대 지원자의 실제 재직률을 <b>과거 데이터로 답변</b>
- 즉 이건 QA 봇이 아니라 <b>채용 의사결정 보조 도구</b>
## 요구사항
- CSV 6개(applicants, job_openings, scoring_rubric, interview_stages, department_headcount, past_hires)를 SQLite 로 구성
- resumes/ 폴더의 PDF 5개는 지원ID 와 파일명 매핑 테이블로 연결
- Claude API + Anthropic SDK Tool Calling · Vanilla HTML 챗 UI · Flask 백엔드
## Agent Tool
- extract_resume(applicant_id) → 해당 지원자의 PDF 텍스트 추출 후 Claude Structured Output 으로 스킬·경력 JSON 반환
- calculate_score(applicant_json) → scoring_rubric 조회 후 룰 그대로 계산 (Agent 가 계산 안 함)
- get_applicant(id_or_name) — 지원자 마스터
- match_jobs(applicant_json) — job_openings 필수/우대 스킬로 매칭도 계산
- retention_prediction(score) — past_hires 에서 ±5점 대역의 재직률 반환 (예: 80점 → 과거 78~82점 3명 중 재직 3/3 = 100%)
- get_hiring_pipeline(dept) — department_headcount + past_hires 조합해 부서별 채용 진행 현황
- list_interview_stages() — 단계 목록
## 시스템 프롬프트 규칙
- 점수는 반드시 calculate_score 툴이 반환한 값만 사용, 절대 스스로 계산 X
- 재직 가능성 언급 시 반드시 retention_prediction 근거를 인용 ("과거 80±5점 3명 중 3명 재직")
- 지원자 관련 답변엔 반드시 extract_resume 로 PDF 읽고, applicants.csv 값과 상충하면 그 사실을 밝힘
MVP 까지 한 번에 완성해줘.
# PDF 파싱 (extract_resume 유도)
1. 김도윤 지원자 이력서 요약해줘
2. 이서현 씨 이력서에서 API 경험 부분만 뽑아줘
3. A2026003 지원자 자기소개 한 줄로 요약
# 점수 계산 (calculate_score 강제)
4. 김도윤 점수 매겨줘
5. 5명 지원자 전부 점수 계산해서 순위 매겨줘
6. 최민지는 왜 점수가 낮아? 어떤 항목에서 감점됐어?
# 직무 매칭
7. 김도윤이 지원한 자동화 엔지니어 요건에 얼마나 부합해?
8. 최민지가 지원한 n8n 자동화 개발자 자리 요건이랑 실제 스킬 비교해줘
9. 백엔드 자동화 개발자 자리에 지원한 사람 중 필수 스킬 다 갖춘 사람은?
# 회귀분석 (retention_prediction 유도)
10. 이번 지원자 중 80점 이상 뽑으면 재직할 확률 얼마나 돼? (과거 데이터 기준)
11. 66점 대에 지원한 사람 뽑으면 위험도가 어때? 과거에 어땠어?
12. past_hires 데이터로 봤을 때 몇 점 이상을 서류 통과 컷으로 잡는 게 안전해?
# 채용 파이프라인
13. 자동화팀 이번 분기 채용 얼마나 진행됐어? 목표 대비
14. 지금 5명 지원자 중 각 단계별로 몇 명씩 통과할 것 같은지 예상해줘
15. 자동화팀 정원 대비 현원 부족한데, 지원자 중 몇 명 뽑으면 채워져?
# 종합 의사결정 (툴 여러 개 연쇄)
16. 이번 5명 지원자 검토 결과 리포트 만들어줘 — 각자 점수·매칭직무·재직 예상까지
17. 김도윤과 정우진 둘 다 자동화 엔지니어 지원했는데 누굴 뽑아야 해?
18. 60점 이하 지원자는 자동 탈락으로 처리하고 이유 정리해줘
# 애매한 질문
19. 좋은 지원자 있어? (기준 안 밝힘 · 되물어야)
20. 김민수 지원자 어때? (지원자 명단에 없음 · 없다고 답해야)