스크랩만 하고 안 보는 습관을 고치려고, 온디바이스 AI 빈칸 퀴즈 앱을 만들었습니다
왜 만들었나
웹에서 좋은 글을 발견하면 스크랩해두는데, 다시 꺼내보는 적이 거의 없었습니다. 읽더라도 다음 날이면 핵심 내용이 기억나지 않았고요.
빈칸 채우기(Cloze Test)가 능동적 회상(Active Recall)을 유도해서 복습에 매우 효과적이라는 연구를 보고, "웹 문서를 자동으로 빈칸 퀴즈로 바꿔주면 어떨까?" 하는 아이디어에서 시작했습니다.
서버를 운영할 여유가 없는 1인 개발자라, 처음부터 온디바이스 AI로 방향을 잡았습니다. 사용자 데이터가 폰 밖으로 나가지 않으니 프라이버시 측면에서도 이점이 있고요.
어떻게 작동하나
웹 문서 URL을 붙여넣기
TextRank 알고리즘으로 문서에서 핵심 문장 10개를 추출
온디바이스 LLM이 각 문장에서 빈칸으로 만들 핵심 단어를 선택
문서 키워드 기반으로 오답 3개를 생성해 4지선다 퀴즈 완성
서버가 없습니다. AI 모델이 폰에서 직접 실행됩니다.
첫 실행 시 모델 다운로드만 하면, 이후에는 인터넷 없이도 퀴즈를 만들고 풀 수 있습니다.
기술적으로 어려웠던 점
모바일에서 약 1GB LLM을 돌리는 건 생각보다 도전적이었습니다.
1. 속도 vs 정확도 트레이드오프
처음에는 LLM에게 문서 전체를 넘기고 퀴즈를 만들게 했는데, 1B 모델로는 품질이 낮았습니다. 그래서 TextRank로 핵심 문장을 먼저 필터링한 뒤, LLM에게는 빈칸 단어 선택만 맡기는 하이브리드 방식을 적용했습니다. 각 모듈이 잘하는 일만 하게 분업한 셈입니다.
2. LLM 출력 안정성
온디바이스 1B 모델은 출력이 불안정할 수 있습니다. "문장에서 명사 하나만 정확히 복사해서 반환해라"는 프롬프트를 여러 차례 다듬었고, 출력값을 원본 문장에 매칭시키는 후처리 로직도 추가했습니다. 프롬프트 최적화를 위해 별도로 TextGrad 기반 자동화 스크립트도 만들어서 실험했습니다.
3. 모델 배포
Gemma 3 1B .task 파일이 약 1GB입니다. 앱 번들에 포함시킬 수 없어서, 첫 실행 시 Hugging Face에서 다운로드하는 플로우를 구현했습니다. Wi-Fi 환경에서 다운로드를 권장하는 UX도 추가했고요.
현재 상태
항목 | 수치 |
|---|---|
Play Store 다운로드 | ~ 50회 |
평균 퀴즈 생성 시간 | 문서에 따라 30초 ~ 2분 |
기술 스택 | Kotlin, Jetpack Compose, Koin, Mediapipe, Room DB |
개발 인원 | 1명 |
솔직히 아직 초기 단계입니다. GeekNews에 공유했을 때 받은 피드백 중에 "퀴즈 답이 중복된다"는 지적이 있었는데, 이 부분은 빈칸 단어 중복 방지 로직을 추가해서 개선했습니다. "구형 폰에서 느리다"는 피드백도 있었고, 모델 쪽을 포함해서 계속 손을 보고 있습니다.
앞으로의 계획
- 오답 복습 기능 — 퀴즈 완료 후 틀린 문제만 모아서 다시 풀기
- 퀴즈 품질 개선 (빈칸 단어 선택 정확도 향상)
- 퀴즈 공유 기능 (카카오톡/SNS로 친구에게 퀴즈 보내기)
- 학습 통계 (맞힌 비율, 복습 주기 등)
- iOS 버전 (요청이 많으면 고려)
이 글이 올라갈 때쯤엔 위 항목 중 일부는 이미 배포돼 있을 수도 있습니다.
피드백을 부탁드립니다
특히 이런 부분이 궁금합니다:
1. 퀴즈 품질 — 빈칸 단어 선택이 적절한가요? 너무 쉽거나 너무 어렵진 않나요?
2. 사용 시나리오 — 어떤 종류의 웹 문서에서 써보셨나요? 잘 되는/안 되는 유형이 있나요?
3. 있으면 좋겠는 기능 — 어떤 기능이 추가되면 자주 쓸 것 같나요?
Play Store: https://play.google.com/store/apps/details?id=com.shootsir.blank
직접 써보시고 솔직한 피드백 주시면, 다음 메이커 로그에서 반영 과정을 공유하겠습니다.
댓글
로그인 후 댓글을 남길 수 있습니다.
아직 댓글이 없습니다.