냉장고를 열고 고르는 추천 — 「식단서랍」 규칙과 언어 모델의 일 나누기
계란, 대파, 두부, 양파. 냉장고에 있는 걸 적으면 만들 수 있는 요리를 골라 주는 칸을 홈에 달았다. 언어 모델에게 레시피 전체를 넘기지 않고, 서버가 먼저 후보를 좁히고 모델은 그 안에서만 고르게 했다. 그러고 나니 원래 있던 규칙 기반 추천도 다시 손봐야 했다.
애드소프트 기술블로그
애드소프트 박재호입니다. IIS·ASP.NET 웹 서비스와 메일서버를 직접 운영하고, Unity 게임과 데스크톱 앱을 만들며 겪은 문제와 해결 과정을 기록합니다.
계란, 대파, 두부, 양파. 냉장고에 있는 걸 적으면 만들 수 있는 요리를 골라 주는 칸을 홈에 달았다. 언어 모델에게 레시피 전체를 넘기지 않고, 서버가 먼저 후보를 좁히고 모델은 그 안에서만 고르게 했다. 그러고 나니 원래 있던 규칙 기반 추천도 다시 손봐야 했다.
AI 식단 버튼이 처음 제대로 돌던 날, 정작 대답하지 못한 질문은 "이 버튼 한 번에 얼마냐"였다. 수익이 없는 서비스에 사용자 수만큼 늘어나는 청구서를 묶고, 공급자를 재시작 없이 갈아 끼우고, 그 과정에서 null 하나로 기능 하나를 통째로 멈춘 이야기.
한 달 치 점심과 저녁 한 상을 언어 모델에게 맡겼다. 미리보기는 꽉 찼는데 메뉴마다 '자동' 표시가 붙어 있었다. 모델은 한 줄도 고르지 못했고, 화면을 채운 건 서버의 보충 규칙이었다.
초성 퀴즈를 하면 다들 정답을 입으로 먼저 외치고 그다음에 자판을 찾는다. 그 외침을 그대로 답으로 받기로 했다. Unity 에서 Android 음성 인식을 플러그인 없이 부르고, 세 갈래로 흩어진 스레드를 정리하고, 다섯 개의 후보 중 하나를 고르기까지.
프로덕션 스토어 페이지에 「광고 포함」이 붙어 있었다. 앱에는 광고 SDK 가 한 줄도 없는데. 앱 콘텐츠 선언, 대상 연령, 앱 이름과 설명, 스크린샷 여덟 장까지, 코드가 아니라 스토어에 적는 말을 앱과 맞춘 이야기다.
프로덕션에 올릴 AAB 를 다 만들어 놓고 Play Console 출시 전 보고서를 열었더니 권장 조치가 두 개 붙어 있었다. 세로 고정을 풀라는 것과 R8 을 켜라는 것. 둘 다 체크박스 하나면 끝날 것 같았는데, 하나는 게임의 성격과 부딪혔고 다른 하나는 C# 에서 문자열로 부르는 Java 클래스가 걸렸다.
프로덕션 첫 출시용 출시 노트와 신청 답변까지 써 두고 콘솔을 열었더니, 프로덕션에는 이미 1.7 이 나가 있었다. 첫 출시가 업데이트로 바뀌면서 출시 노트를 다시 고르고, 버전 코드 12 를 버리고 13 으로 다시 빌드하고, 개인정보 처리방침을 앱보다 먼저 올리는 스크립트를 만들었다.
렌더러가 죽은 WebView 를 살려 냈더니, 살아난 WebView 가 같은 페이지를 열고 또 죽었다. TWA 시절 Chrome 이 조용히 처리하던 크래시, 인증서 오류, 상태바, 뒤로가기, 쿠키를 앱이 하나씩 떠안게 된 이야기이자 연재의 마지막 편이다.
WebView 로 옮긴 A/S 관리 앱에서 '푸시 알림 받기'를 켜도 아무 일도 일어나지 않았다. 브라우저가 대신 해 주던 웹 푸시가 WebView 에는 없었다. FCM 과 JS 브리지로 웹과 앱 사이에 다리를 놓고 나서야, 그 다리가 내가 부르지 않은 프레임에까지 놓여 있다는 걸 알았다.
A/S 관리 앱에서 엑셀 내보내기 버튼을 눌렀다. 오류도, 알림도, 파일도 없었다. 브라우저에서는 멀쩡히 내려받던 파일이 WebView 안에서는 갈 곳을 잃고 있었고, 그 길을 내다 보니 새 창 링크와 동영상 전체 화면까지 손보게 됐다.