최근 어떤 블로그를 봤는데, 그 블로그에는 대략적인 내용을 요약해주는 ChatGPT 영역이 따로 있는 것을 보았습니다.
(참고한 주소: https://devocean.sk.com/blog/techBoardDetail.do?ID=165522&boardType=techBlog)
이걸 보고 제 블로그에도 적용하면 좋겠다는 생각이 들었습니다.
이 기능을 넣기 위해서는 다음과 같은 준비가 필요했습니다:
두 가지 방안을 고려해 보았습니다.
방안 1: 사용자가 게시글을 조회할 때마다 OpenAI API를 호출한다.
이 방안은 UX 측면에서 좋지 않을 것 같았습니다. 이유는 매번 다른 요약본이 표시될 가능성이 있고, 매번 요약하는 데 걸리는 시간이 사용자를 불편하게 만들 것이라 생각했습니다. 또한 OpenAI API를 반복적으로 호출해야 하므로 비용도 부담스러워서 이 방안은 기각되었습니다.
방안 2: 게시글을 생성 및 수정할 때 OpenAI API를 호출하고, 받은 응답을 테이블에 저장한다.
이 방안은 OpenAI API 호출이 게시글 생성 및 수정 시에만 이루어지기 때문에 비용 절감에 유리하고, 이미 저장된 요약본을 제공하므로 빠른 요약 정보 조회를 위해 사용자 UX도 향상시킬 수 있습니다. 단, 문제는 admin 페이지에서 게시글을 생성 또는 수정할 때 OpenAI 응답 시간이 길어지면 Timeout으로 인해 500 에러가 발생할 수 있다는 점입니다.
이를 해결하기 위해 Celery Task를 사용하여 비동기 처리로 구현할 예정입니다.
아래는 흐름도입니다.
이 방법으로 admin 페이지에서는 문제없이 게시글이 최신화될 것입니다. 그러나 비동기 처리를 하면 사용자는 즉시 요약본을 확인할 수 없습니다. 이를 해결하기 위해 다음과 같은 흐름을 생각했습니다.
게시글을 참조하고 있는 요약 테이블을 만들 것입니다.
요약 테이블을 1:N 관계로 생성하고, 아래와 같은 필드들을 포함할 것입니다:
게시글을 생성하거나 수정하면 동시에 요약 테이블이 생성되고, 진행 상태가 PROCESSING
으로 설정됩니다. OpenAI API로부터 요약된 정보가 전달되면 요약 테이블을 업데이트하고, 상태를 DONE
으로 변경합니다.
게시글 조회 시 요약 테이블의 마지막 상태가 PROCESSING
이라면 "아직 요약 중이에요~"라는 문구와 함께 로딩 이미지를 보여주고, 일정 간격으로 API를 폴링하여 DONE
상태일 경우 요약본을 최신화합니다.
특수한 상황에서 FAILED
상태가 되면, 예로 PROCESSING
상태가 5분 이상 유지된 경우 CRONJOB을 통해 FAILED
로 전환합니다. 이때는 "요약을 할 수 없어요~"라는 문구를 표시하고, 저에게 알림 메일을 보내 모니터링할 수 있도록 할 계획입니다.
이러한 계획을 바탕으로 작업을 시작해 보겠습니다.