AI 문제 출제를 도입해보자!

저희 WeQuiz 어플에서는 사용자들이 하나하나 문제를 직접 만들어야 합니다.

만약에 스터디 그룹원이 적거나 갑자기 많은 문제 출제가 필요할 때 AI 문제 출제 기능을 제공하면 사용자에게 편의성을 제공할 수 있을 거라 생각해 AI를 도입하게 되었습니다.

AI 모델 선택 과정

저희는 AI 문제 출제를 위한 AI 모델을 선정해야 했습니다.

먼저 특정 카테고리를 정하여 AI를 학습시키고 해당 카테고리에 한정하여 AI 문제를 제공하려고 하였습니다.

그래서 Hyper CLOVA X를 사용하여 직접 사용해보며 학습을 해보았습니다.

데이터 확장을 시도했으나 중복 데이터 문제와 높은 비용(약 8000원) 등과 같은 문제가 발생하였습니다.

결국, 원하는 수준까지의 학습을 할 수 없을 것 같다는 판단을 하였습니다.

image.png

따라서 AI 학습 대신에 AI 챗봇 서비스를 이용하여 문제 제공을 하는 방식으로 찾아보았습니다. 클로바 플레이그라운드를 사용한 결과 보다 저렴한 비용으로 생성을 할 수 있었습니다. 챗봇도 2가지 모델이 있었는데 HCX-DASH-001 대신 프롬프트를 잘 이해하는 HCX-003 모델을 선택했습니다.

HCX-003

HCX-003

AI 적용해보기

API를 적용하기 위해 사이트에 게시되어있는 **API가이드**를 참고하여 Retrofit에 적용하였습니다.

참고사이드: https://developer.android.com/codelabs/basic-android-kotlin-compose-getting-data-internet?hl=ko#5

참고사이드: https://developer.android.com/codelabs/basic-android-kotlin-compose-getting-data-internet?hl=ko#5

네트워크 요청은 가이드에서 요구하는 Field를 형식에 맞게 Data Class로 구성하였습니다.

@Serializable
data class AiQuestionRequest(
    val messages: List<Message> = Message.defaultMessage,
    val topP: Double = 0.8,
    val topK: Int = 0,
    val maxTokens: Int = 1024,
    val temperature: Double = 0.5,
    val repeatPenalty: Double = 5.0,
    val stopBefore: List<String> = emptyList(),
    val includeAiFilters: Boolean = false,
    val seed: Long = 0,
)

네트워크 응답은 AI가 답을 어떻게 줄 지 몰랐습니다.

따라서 프롬프트에 다음과 같이 구체적인 조건을 알려주고 결과 형식을 구조화된 Json 형식으로 요청을 하였습니다.

받아온 Json

받아온 Json

위 사진과 같이 받아온 Json을 파싱하여 각 Data class에 저장하였습니다.

image.png

문제 발생

하지만 결과가 원하던 Json 형식으로 왔지만 중간에 콘텐트가 잘려서 파싱에서 문제가 생기는 현상을 발견했습니다.

explanation에 문자열이 잘리는 문제 발생

explanation에 문자열이 잘리는 문제 발생