🌿 WildStep: 앱을 닫고 싶게 만드는 AI를 만들다
대부분의 앱은 사용자의 관심을 원합니다.
더 많은 스크롤. 더 많은 추천. 화면을 보는 시간을 늘리는 것.
만약 사용자가 그 앱에서 벗어나도록 돕는 AI 앱이 설계된다면 어떨까요?
그 질문이 저를 WildStep 개발로 이끌었습니다. WildStep은 사용자의 기분, 이용 가능한 시간, 개인적인 목표, 주변 환경을 개별화된 실제 활동 세트로 변환하는 AI 기반의 야외 미션 생성기입니다.
아이디어는 간단합니다:
AI가 미션을 생성하고, 사용자가 직접 경험하는 것입니다.
WildStep은 다른 종류의 제품 철학을 바탕으로 구축되었습니다. 즉, 디지털 상호작용은 짧고 유용하며, 사람들이 현실 세계에서 더 많은 시간을 보내도록 장려하는 데 초점을 맞추어야 한다는 것입니다.
제가 만든 것
WildStep은 사람들이 평범한 휴식을 작고 실행 가능한 야외 미션으로 바꿀 수 있도록 돕습니다.
모두에게 똑같은 일반적인 제안을 제공하는 대신, 사용자가 다음 요소를 사용하여 미션을 개인화할 수 있게 합니다:
- 이용 가능 시간 (Available time): 휴식에 할애할 시간을 선택합니다.
- 기분 (Mood): 현재 기분을 선택합니다.
- 개인 목표 (Personal goal): 달성하고 싶은 것을 설명합니다.
- 주변 환경 (Surroundings): 캠퍼스, 공원, 동네 또는 지원되는 다른 환경을 선택합니다.
- 난이도 및 동반자 (Difficulty and companions): 선호도에 맞게 미션을 조정합니다.
AI는 개별적인 과제와 예상 소요 시간을 가진 미션을 생성합니다. 사용자는 상호작용식 체크리스트를 따라 작업을 수행하고, 진행 상황을 추적하며, 저장된 미션을 검색하고, 완료 시 Grass Points를 얻을 수 있습니다.
경험 과정
- WildStep에게 현재 기분을 알려줍니다.
- 이용 가능한 시간과 주변 환경을 선택합니다.
- 개인화된 미션을 생성합니다.
- 화면에서 벗어나 활동을 완료합니다.
- 돌아와 진행 상황을 기록하고 Grass Points를 얻습니다.
할 일 목록(task checklist)은 의도적으로 간단합니다. 휴식을 취하려 할 때 스크롤해야 할 다른 피드가 필요하지 않도록 설계되었습니다.
데모 (Demo)
🌐 실시간 애플리케이션: https://wildstep-six.vercel.app/
💻 소스 코드: https://github.com/pushptandekar24-glitch/wildstep
공개 데모는 프론트엔드에 Vercel을, 백엔드에 Spring Boot를, 영속성(persistence)에 TiDB Cloud를, 호스팅된 추론(hosted inference)에 Cloudflare Workers AI를 사용합니다.
이 애플리케이션은 라이브 미션 생성 및 작업 완료 테스트가 완료되어 배포되었습니다. 무료 등급 서비스는 콜드 스타트(cold starts), 지연 시간(latency), 또는 사용 제한을 유발할 수 있습니다.
어떤 모습인가 (What It Looks Like)
1. 사용자 상황에 맞춰 생성된 미션
WildStep은 활동을 제안하는 데 그치지 않습니다. 아이디어를 진행 상황 추적(progress tracking)이 가능한 일련의 작업으로 변환하여 사용자가 무엇을 완료했는지 볼 수 있게 합니다.
2. 미션 완료하기
필요한 모든 작업이 완료로 표시되면, 백엔드가 미션 상태를 업데이트하고 Grass Points 보상을 계산합니다.
완료 여부는 체크리스트를 통해 사용자 스스로 보고(self-reported)됩니다. 현재 애플리케이션은 GPS나 사진 증거를 통해 신체 활동을 독립적으로 검증하지 않습니다.
어떻게 만들었는가 (How I Built It)
WildStep은 모듈식 풀스택(full-stack) 애플리케이션입니다. 프론트엔드가 사용자 경험(user experience)을 처리하는 동안, 백엔드는 미션 생성 오케스트레이션(orchestration), 유효성 검사(validation), 영속성(persistence), 작업 완료 및 보상을 담당합니다.
기술 스택 (Technology stack)
| Layer | 기술 스택 |
|---|
| Frontend | React, TypeScript, Vite, Tailwind CSS |
| ... | |
아키텍처
브라우저는 AI 제공업체에 직접 요청하지 않습니다. 대신 Spring Boot API로 요청을 보내고, 이 API가 AI 요청을 관리하며 미션 생명주기(mission lifecycle)를 소유합니다.
왜 AI에게 모든 것을 통제하게 두지 않는가?
언어 모델은 창의적인 활동을 생성할 수 있지만, 생성된 출력을 애플리케이션 데이터로 자동 신뢰해서는 안 됩니다.
WildStep은 책임을 분리합니다:
- 모델(The model): 미션 콘텐츠를 제안합니다.
- 백엔드(The backend): 응답을 구문 분석하고 유효성 검사 및 안전 규칙을 확인합니다.
- 데이터베이스(The database): 미션과 작업을 저장합니다.
- 미션 서비스(The mission service): 작업 완료 및 상태 전환을 관리합니다.
- Grass Points 서비스: 보상을 결정론적으로 계산합니다.
이러한 분리는 AI 제공업체가 잘못된 형식의 출력을 반환하거나 사용 불가능해질 때에도 일관된 동작을 유지하는 데 도움이 됩니다.
Grass Points와 미션 진행 상황
Grass Points는 사용자에게 미션을 완료하도록 장려하는 가벼운 보상 루프를 추가합니다.
백엔드가 임의의 포인트를 모델에게 선택하도록 요청하기보다는 보상을 계산합니다. 반복적인 작업 완료 요청은 처리되어, 이미 완료된 작업이 보상을 반복적으로 받지 않도록 합니다.
그 결과는 명확한 루프입니다:
마지막 단계가 제품에서 가장 중요한 부분입니다.
Open Innovation이 왜 중요한가?
이것은 WildStep을 구축하는 데 특히 흥미로운 부분이었습니다.
오픈 웨이트 모델(Open-weight models)은 개발자에게 실험, 배포, 그리고 AI 동작이 제품에 통합되는 방식에 대해 더 많은 통제권을 제공합니다.
로컬 개발 중에는 WildStep이 Ollama를 통해 Gemma 2를 사용할 수 있습니다. 개발자는 자신의 하드웨어 역량에 따라 자체 기기에서 미션 프롬프트를 실험할 수 있습니다.
공개 데모를 위해 WildStep은 오픈 웨이트 Llama 모델과 함께 Cloudflare Workers AI를 사용합니다. 방문자는 애플리케이션을 시도하기 전에 모델을 다운로드할 필요는 없지만, 추론 요청은 호스팅 제공업체에 의해 처리됩니다.
이 두 가지 모드는 서로 다른 트레이드오프(trade-offs)를 제공합니다:
- 로컬 추론 (Local inference): 런타임에 대한 더 많은 제어권과 로컬 장치에서 추론을 유지할 기회를 제공합니다.
- 호스팅 추론 (Hosted inference): 방문자 각자가 모델을 설치하고 실행할 필요 없이 더 쉽게 공개적으로 접근할 수 있습니다.
- 교체 가능한 제공업체 통합 (A replaceable provider integration): 추론 제공업체가 변경될 때마다 프런트엔드와 미션 라이프사이클(mission lifecycle) 전체를 다시 작성할 필요가 없습니다.
오픈 웨이트(Open weights)가 호스팅 추론을 자동으로 비공개 또는 오프라인으로 만들지는 않습니다. 배포된 버전에서는 프롬프트가 구성된 추론 서비스로 전송됩니다. 로컬 모드에서는 선택한 구성과 런타임이 지원하는 경우 처리가 로컬에 머무를 수 있습니다.
오픈 혁신(Open innovation)은 개발자들이 모든 것을 단일 폐쇄형 API 주변으로 구축하기보다는, 자신들의 스택을 검사하고, 다양한 모델로 실험하며, 프롬프트를 변경하고, 시스템을 조정할 수 있게 하므로 중요합니다.
WildStep에게 AI는 목적지가 아닙니다. 그것은 화면 밖의 경험을 촉발하는 방아쇠(trigger)입니다.
실제 제품 구축 및 디버깅 (Building and Debugging the Real Thing)
이 프로젝트에서 가장 가치 있었던 부분 중 하나는 이를 로컬 프로토타입을 넘어 확장하는 것이었습니다.
애플리케이션은 프런트엔드 통합, 백엔드 테스트, 클라우드 데이터베이스 구성, Docker 배포, 프런트엔드 배포, 라이브 API 검증 과정을 거쳤습니다.
호스팅 AI 통합 또한 중요한 디버깅 교훈을 안겨주었습니다. 즉, 성공적인 HTTP 요청이 애플리케이션이 반환된 JSON을 올바르게 해석할 수 있다는 것을 보장하지 않는다는 것입니다.
저는 미션 검증 계층(mission validation layer)을 우회하지 않으면서 Cloudflare의 응답 엔벨로프(response envelope)를 더 견고하게 처리하기 위해 응답 파싱(response parsing)과 오류 처리(error handling)를 조사해야 했습니다.
이는 중요한 원칙을 강화했습니다. 신뢰할 수 있는 AI 애플리케이션은 작동하는 모델 호출 이상의 것을 필요로 합니다. 검증(validation), 지속성(persistence), 실패 처리(failure handling), 그리고 예측 가능한 애플리케이션 로직이 필요합니다.
프로젝트에는 미션 생성, 검증, 라이프사이클 동작, 결정론적 보상에 대한 자동화 테스트가 포함되어 있습니다. 최신 로컬 검증 보고서에는 74개의 백엔드 테스트 통과와 성공적인 프런트엔드 프로덕션 빌드가 기록되었으며, 이 테스트 개수를 배포된 버전의 결과로 간주하기 전에 최종 저장소에서 최신 수정 사항을 확인해야 합니다.
안전에 대한 참고 사항
WildStep은 위험한 모험을 장려하는 것이 아니라 접근 가능한 활동을 제안하는 것을 목표로 합니다.
백엔드는 생성된 미션 콘텐츠에 검증 및 안전 점검을 적용합니다. 사용자는 여전히 스스로 안전하다고 느끼지 않는 활동, 공공 및 사유 재산을 존중하고, 지역 규칙을 따르며, 위험 지역을 피해야 합니다.
WildStep은 의료 또는 정신 건강 치료제가 아닌 레크리에이션 활동 도구입니다.
나의 에이전트 세션
저는 WildStep을 구축, 개선 및 디버깅하는 동안 AI 지원 개발 도구로 Antigravity를 사용했습니다.
구현, 테스트 및 애플리케이션 아키텍처는 GitHub 저장소에서 살펴볼 수 있습니다.
이 게시물에는 DevRelay 에이전트 세션 링크를 포함하지 않았습니다.
수상 부문
Gemma의 최적 활용: WildStep은 로컬 개발 모드에서 Ollama를 통해 Gemma 2를 지원합니다. 현재 배포된 공개 데모는 Llama 3.2와 Cloudflare Workers AI를 사용하므로, 로컬과 호스팅 인퍼런스 간의 차이는 의도적입니다.
커뮤니티 맥락
저는 또한 다음을 포함하여 같은 과제에 대한 다른 해석들을 읽는 것도 즐거웠습니다:
오픈 소스 AI가 사람들이 야외에서 더 많은 시간을 보내도록 장려하는 다양한 방식들을 보는 것은 흥미롭습니다.
WildStep은 자신만의 접근 방식을 취합니다: 짧고, 상황 인지적인(context-aware) 미션, 지속적인 할 일 목록(task checklist), 백엔드 제어 진행률(backend-controlled progress), 그리고 간단한 보상 시스템입니다.
WildStep의 아이디어 배경
질문은 사람들이 어떻게 더 많은 AI 콘텐츠를 생성하게 만들 것인가가 아니었습니다.
그것은 AI를 잠시 동안 유용하게 만들어, 사람이 그것 없이도 의미 있는 무언가를 할 수 있게 만드는 방법이었습니다.
미션을 생성하세요. 밖으로 나가세요. 완료하세요. 준비가 되면 돌아오세요.
🌿 WildStep — 앱을 닫게 만드는 AI.
devchallenge #hf26challenge #gemma #opensource