시간표 이미지 AI 인식 및 프롬프트 개선
시간표 이미지 AI 인식 및 프롬프트 개선
문제 상황
카카오테크캠퍼스 최종 프로젝트에서 대학생 일정 관리 서비스를 만들었다. 사용자가 시간표를 직접 입력하는 과정을 줄이려고, 시간표 이미지를 업로드하면 자동으로 인식해주는 기능을 구현하고 싶었다.
접근 방법: GPT Vision + Structured Output
전통적인 OCR보다 GPT-4.1의 Vision 기능을 쓰기로 했다. 이유는:
- 시간표 이미지의 형식이 다양하다 (에브리타임, 학교 홈페이지, 손으로 작성 등)
- 단순 텍스트 추출이 아니라 구조화된 데이터로 바꿔야 했다
GPT의 Structured Output 기능으로 JSON Schema를 정의해서 출력 형식을 강제했다.
프롬프트 설계
처음에는 단순하게 시간표 이미지를 JSON으로 변환해달라고 했는데, 결과가 들쑥날쑥했다. 10번 테스트하면 2~3번 정도만 정확하게 나왔다.
프롬프트를 계속 다듬고, 자주 틀리는 패턴을 규칙으로 정리해 넣으니 결과가 안정됐다.
다만 이건 내가 모아둔 샘플 이미지로 돌려본 비공식 테스트라서, 이 수치를 전체 성능 지표로 일반화하긴 어렵다.
최종 프롬프트 규칙
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1. dayOfWeek는 월요일부터 1로 시작한다. (월=1, 화=2, 수=3, 목=4, 금=5)
2. startTime, endTime은 `HH:MM:SS` 형식, 24시간제를 사용한다.
3. 동일한 과목명 + 교수명 + 강의실은 하나의 subject로 묶고,
times 리스트 안에 여러 요일별 시간 정보를 추가한다.
4. credit 값이 명시되어 있지 않다면:
- 일반 이론 과목: 3
- 실습/실험 과목('실험', '실습', '프로젝트', '캡스톤' 등): 2
5. 이미지에 시간이 직접 표시되지 않으면, 격자 간격을 기준으로 추정한다.
6. 수업의 길이는 표를 보고 추측할 것. 근거 없이 1시간이라고 추측하지 말 것.
7. 수업의 시작/종료 시간은 정각이 아닐 수 있다. 5분 단위일 수도 있다.
8. 모든 문자열은 이미지에서 보이는 그대로 입력한다.
개선 포인트
| 문제 | 해결 |
|---|---|
| 수업 길이를 일괄적으로 1시간으로 추측 | 근거 없이 1시간이라고 추측하지 말 것 명시 |
| 시간을 정각으로만 추측 | 5분 단위일 수도 있다 명시 |
| 같은 과목이 여러 개로 분리됨 | 동일한 과목은 하나로 묶어라 규칙 추가 |
| 학점을 0으로 반환 | 과목 유형별 기본값 규칙 추가 |
정리
- 이미지에서 구조화 데이터로 바꾸는 건 모델 선택보다, 출력 형식을 강제하고 스키마를 잡은 다음 실패 케이스를 규칙으로 쌓는 쪽이 효과가 컸다
- 한 번에 끝내는 방식이 아니라, 실패 로그를 보고 규칙을 추가하는 방식으로 품질이 개선됐다
- 그리고 프롬프트는 문서로 남겨두지 않으면 유지가 어렵다(팀이 바뀌면 특히). 그래서 규칙은 최대한 명시적으로 적어두는 게 좋았다
프로젝트: 카카오테크캠퍼스 3기 최종 프로젝트(대학생 맞춤형 일정 관리 서비스) 관련 링크
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
