포스트

시간표 이미지 AI 인식 및 프롬프트 개선

시간표 이미지 AI 인식 및 프롬프트 개선

문제 상황

카카오테크캠퍼스 최종 프로젝트에서 대학생 일정 관리 서비스를 만들었다. 사용자가 시간표를 직접 입력하는 과정을 줄이려고, 시간표 이미지를 업로드하면 자동으로 인식해주는 기능을 구현하고 싶었다.


접근 방법: GPT Vision + Structured Output

전통적인 OCR보다 GPT-4.1의 Vision 기능을 쓰기로 했다. 이유는:

  • 시간표 이미지의 형식이 다양하다 (에브리타임, 학교 홈페이지, 손으로 작성 등)
  • 단순 텍스트 추출이 아니라 구조화된 데이터로 바꿔야 했다

GPT의 Structured Output 기능으로 JSON Schema를 정의해서 출력 형식을 강제했다.

unnamed (3).png


프롬프트 설계

처음에는 단순하게 시간표 이미지를 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 라이센스를 따릅니다.