이 글은 Hacktoberfest 오픈소스 AI 챌린지 주차 1: 터치 그래스 (Touch Grass)에 제출하는 내용입니다.
제가 만든 것 (What I Built)
터치 그래스 빙고(Touch Grass Bingo)는 작은 웹 애플리케이션입니다. 사용자가 자신의 도시나 지역을 입력하고, 가용 시간(15분에서 2시간 사이)과 분위기(산책하기 좋은 차분한 느낌, 사진 사냥, 길거리 음식 및 사람들, 자연 및 야생동물 등)를 선택합니다. 그러면 오픈 웨이트 AI 모델이 사용자만을 위한 5x5 빙고 카드를 작성해 줍니다: "길거리 개 발견", "사찰 종소리 듣기", "꽃 찾기" 등이 있습니다.
그 후 휴대폰을 주머니에 넣고 나가서 칸들을 체크하며 돌아다니면 됩니다. 가운데 칸은 무료입니다. 한 줄을 완성하면 BINGO를 얻게 됩니다.
아이디어는 간단합니다. 이 앱이 하루 중 가장 짧은 순간의 일부가 되어야 합니다. 사용자가 30초 동안만 열어보고, 그리고 떠나는 것입니다.
데모 (Demo)
실시간 앱: https://sanny1921.github.io/touch-grass-bingo/
Start screen of Touch Grass Bingo
A real card generated on my Android phone
두 번째 스크린샷은 실제 카드이며, 제가 직접 안드로이드 폰의 Chrome에서 생성한 것입니다. 모형이 아닙니다.
코드 (Code)
https://github.com/Sanny1921/touch-grass-bingo
제작 방법 (How I Built It)
- 모델: 오픈 웨이트 모델인 Llama 3.2 1B Instruct를 사용했습니다.
- 런타임: WebGPU에서 브라우저 내부에 모델을 실행하는 WebLLM을 사용했습니다.
- 앱: 프레임워크, 백엔드, API 키가 전혀 없는 단순한 HTML 파일 하나로 구성되어 있습니다. GitHub Pages에 무료로 호스팅되었습니다.
처음으로 "나의 카드 생성하기" 버튼을 누르면 브라우저가 모델을 다운로드합니다 (약 700MB). 그 후에는 기기에 캐시됩니다. 그 이후부터는 모든 것이 휴대폰에서 이루어집니다.
고군분투기 (The struggle) (v1부터 v3까지)
이것을 하룻밤 사이에 만들었고, 첫 번째 버전은 제 휴대폰에서 작동하지 않았습니다.
v1: 모델에게 24개의 문자열로 구성된 JSON 배열을 반환하도록 요청했습니다. 휴대폰에서는 모델 로딩 자체는 잘 되었지만, 계속해서 깨진(broken) JSON만 반환했습니다. 3번 재시도 후 앱은 포기하고 내장 시작 카드(built-in starter card)를 보여주었습니다. 결과적으로 AI를 사용하지 않는 "AI 앱"을 갖게 된 것입니다.
v2: 저는 1B 모델이 엄격한 JSON 처리에 취약하다는 것을 깨달았습니다. 계약 조건을 단순 번호 목록("1. 길거리 개 발견")으로 변경하고 관대한 파서(forgiving parser)를 작성했습니다. 이 파서는 번호 매기기 스타일, 글머리 기호, 마크다운(markdown), 중복 항목을 무시하며 불필요한 줄은 삭제합니다. 또한 더 큰 모델인 Qwen2.5 1.5B도 시도해 보았습니다. 하지만 그것은 1GB 다운로드였고, 제 와이파이 환경에서 캐시 오류로 계속 실패했습니다. 교훈: 휴대폰에서는 모델 크기 자체가 제품의 일부입니다.
v3: 저는 이미 휴대폰에 다운로드되어 있던 Llama 3.2 1B로 돌아가서 번호 목록 방식을 유지했습니다. 또한 복구 단계(salvage step)를 추가했습니다. 이 앱은 3번의 시도 중 가장 좋은 결과를 유지하며, 모델이 최소 14개의 좋은 사각형을 제공하면 나머지 부분은 시작 목록에서 채우고 모든 것을 버리지 않습니다. 저는 또한 모델 다운로드를 위한 재시도 기능과 눈에 보이는 진행률 백분율(progress percentage)을 추가했습니다.
그것이 작동했습니다. 위의 스크린샷의 카드는 제 휴대폰의 모델에서 나온 것입니다.
솔직한 한계: 1B 모델은 단순하고 일반적인 사각형("꽃 찾기"와 같은)을 작성합니다. 이것은 여행 가이드가 아닙니다. 더 큰 모델이라면 더 날카롭고 지역적인 카드들을 작성할 것이며, 그것이 제가 시간이 더 있다면 가장 먼저 바꿀 부분입니다.
Open Innovation이 중요한 이유
- 위치가 사용자에게 남아 있습니다. 사용자가 있는 곳을 입력합니다. 그 텍스트는 다른 사람의 서버가 아닌, 사용자의 휴대폰에서 실행되는 모델로 전송됩니다.
- 실행 비용이 들지 않습니다. API 요금이 없기 때문에 누구나 사용할 수 있도록 남겨둘 수 있습니다. 호스팅은 단일 정적 파일입니다.
- 모델을 교체할 수 있습니다. 이것을 만들면서 저는 한 줄의 편집으로 모델과 프롬프트를 여러 번 변경했습니다. 폐쇄형 API를 사용했다면, 제가 받은 것에 갇혀 있었을 것입니다.
다음에 할 일
- 휴대폰과 와이파이가 처리할 수 있다면 사람들이 더 큰 모델을 선택하게 하세요.
- 카드를 저장하고 친구들과 공유하여 같은 카드로 경쟁하세요.
- 시간과 날씨를 사용하여 카드를 조정하세요.
상품 부문 (Prize Categories)
이 프로젝트는 파트너 도구를 사용하지 않습니다. WebLLM으로 브라우저에서 실행되는 오픈 웨이트 모델(Llama 3.2)이기 때문에, 저는 종합 상을 목표로 참가합니다.
읽어주셔서 감사합니다. 이제 나가서 풀밭에 좀 접촉하세요.