저희 WeQuiz 어플에서는 사용자들이 하나하나 문제를 직접 만들어야 합니다.
만약에 스터디 그룹원이 적거나 갑자기 많은 문제 출제가 필요할 때 AI 문제 출제 기능을 제공하면 사용자에게 편의성을 제공할 수 있을 거라 생각해 AI를 도입하게 되었습니다.
저희는 AI 문제 출제를 위한 AI 모델을 선정해야 했습니다.
먼저 특정 카테고리를 정하여 AI를 학습시키고 해당 카테고리에 한정하여 AI 문제를 제공하려고 하였습니다.
그래서 Hyper CLOVA X
를 사용하여 직접 사용해보며 학습을 해보았습니다.
데이터 확장을 시도했으나 중복 데이터 문제와 높은 비용(약 8000원) 등과 같은 문제가 발생하였습니다.
결국, 원하는 수준까지의 학습을 할 수 없을 것 같다는 판단을 하였습니다.
따라서 AI 학습 대신에 AI 챗봇 서비스를 이용하여 문제 제공을 하는 방식으로 찾아보았습니다.
클로바 플레이그라운드를 사용한 결과 보다 저렴한 비용으로 생성을 할 수 있었습니다.
챗봇도 2가지 모델이 있었는데 HCX-DASH-001
대신 프롬프트를 잘 이해하는 HCX-003
모델을 선택했습니다.
HCX-003
API를 적용하기 위해 사이트에 게시되어있는 **API가이드**를 참고하여 Retrofit
에 적용하였습니다.
참고사이드: 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을 파싱하여 각 Data class에 저장하였습니다.
하지만 결과가 원하던 Json 형식으로 왔지만 중간에 콘텐트가 잘려서 파싱에서 문제가 생기는 현상을 발견했습니다.
explanation에 문자열이 잘리는 문제 발생