Trailhead: 오프라인 우선 아웃도어 동반자
요약
Trailhead는 오프라인 환경에 최적화된 아웃도어 활동 추천 앱입니다. 오픈 소스 로컬 AI 도구(Ollama, Gemma 3 등)와 오픈 데이터셋을 활용하여 날씨 예측 및 경로 탐색 기능을 구현했습니다. 이는 폐쇄형 API 의존성을 벗어나 사용자가 오프라인에서도 안정적으로 사용할 수 있도록 설계되었습니다.
핵심 포인트
- 오프라인 우선 아웃도어 동반자 앱 개발 사례
- Mastra, Ollama, Gemma 3 등 오픈 소스 로컬 AI 도구 활용
- 폐쇄형 API 대신 오픈 웨이트 모델로 오프라인 사용성 확보
- OpenStreetMap과 OSRM을 이용한 경로 탐색 기능 구현
이 글은 Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass에 제출하는 내용입니다.
제가 만든 것 (What I Built)
Trailhead는 오프라인 우선 아웃도어 동반자 앱입니다. 이 앱을 30초 동안 열면, 오늘(당신의 관심사, 날씨, 계절에 맞는) 밖에 나가서 할 수 있는 가장 좋은 활동이 무엇인지 알려줍니다. 앱은 이를 음성으로 읽어주고, 경로를 제시하며, 당신은 휴대폰을 내려놓습니다. 끝입니다. 무의미한 스크롤링도, 연속 기록(streaks) 관리도 없습니다. 그저 화면에서 벗어나 숲속으로 나갈 구실이 있을 뿐입니다.
데모 (Demo)
🔗 trailhead-demo.vercel.app (PWA 배포 곧 예정)
코드 (Code)
(GitHub 리포지토리 방문: github.com/karanray06/trailhead)
제작 과정 (How I Built It)
우리는 Trailhead를 전적으로 오픈 소스, 로컬 AI 도구만을 사용하여 구축했습니다:
- Mastra: 워크플로우를 오케스트레이션하는 오픈 소스 TS 프레임워크입니다.
- Ollama + Gemma 3: '일일 브리핑(daily brief)'을 생성하기 위해 로컬에서 실행됩니다. 간단한
MODEL_NAME환경 변수를 통해 교체가 가능합니다. - TabPFN: Prior Labs의 오픈 소스 테이블 기반 파운데이션 모델입니다. 우리는 이 모델을 Python 마이크로서비스에서 사용하여 역사적 날씨 데이터를 대상으로 제로샷 추론(zero-shot inference)을 통해 '좋은 아웃도어 날'일 확률을 예측합니다.
- OpenStreetMap + OSRM: 경로 탐색 및 주변 공원 찾기를 위한 완전히 오픈된 데이터입니다.
오픈 혁신이 중요한 이유 (Why Does Open Innovation Matter?)
당신이 트레일(trail)에 나갔을 때, 항상 5G 연결이 있는 것은 아닙니다. 폐쇄형 API 접근 방식(예: GPT-4)은 당신이 오프라인 지역으로 벗어나는 순간 앱 전체가 작동을 멈추게 할 것입니다. 오픈 웨이트(open weights)(예: Gemma)를 사용하면 추론을 장치 내 또는 로컬에서 직접 실행할 수 있고, 모든 위치 데이터를 완전히 비공개로 유지하며, 일일 사용에 대한 운영 비용이 전혀 발생하지 않도록 보장할 수 있습니다.
저희의 TabPFN 마이크로서비스는 여기서 특히 강력합니다. 재훈련할 필요가 없습니다. 단지 2년간의 지역 날씨 데이터로 구성된 작은 CSV 파일을 살펴보고, 어떠한 API 호출 없이도 한파(cold snaps), 서리 위험(frost risk) 및 전반적인 야외 활동 적합성에 대한 보정된 확률을 즉시 제공합니다.
나의 에이전트 세션
저와 AI 짝꿍이 업데이트된 Mastra 타입 정의를 헤쳐나가고 워크플로우가 컴파일되도록 만든 과정입니다:
Trailhead: Mastra 에이전트 설정 및 TS 수정
당신
Mastra 에이전트 정의와 Trailhead 백엔드를 위한 도구들을 만들어 봅시다.
에이전트
제가 5가지 도구를 만들겠습니다: weather-forecast, frost-dates, suggest-activity, build-route, 그리고 seasonal-checklist. 그런 다음 Mastra 워크플로우와 Express 서버를 설정하겠습니다.
▸ write_to_file {"file": "agent/src/workflows/daily-brief.ts", "action": "create"}
입력
{
"file": "agent/src/workflows/daily-brief.ts",
"action": "create"
...
출력
"daily-brief.ts를 성공적으로 생성했습니다"
당신
TypeScript 컴파일러가 'context' 속성이 타입 {latitude, longitude}에 존재하지 않으며, Property 'step' does not exist on type 'Workflow'라고 말합니다.
에이전트
아, Mastra Tool API와 Workflow API가 최근 업데이트되었습니다. 도구 실행 함수는 이제 컨텍스트 페이로드(context payload)를 직접 받으며, {context} 객체로 감싸지 않습니다. 제가 구조 분해 할당(destructuring)을 수정하겠습니다. 워크플로우의 경우, 이제 생성자(constructor)에서 단계를 제공하고 .step() 빌더 체인(builder chain)을 우회합니다.
▸ multi_replace_file_content {"file": "agent/src/workflows/daily-brief.ts", "action": "fix"}
입력
{
"file": "agent/src/workflows/daily-brief.ts",
"action": "fix"
...
출력
"코드를 성공적으로 수정했습니다"
당신
빨리 완성해서 dev에 게시해 줘.
5 of 5 메시지
상금 카테고리
- Touch Grass
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기