건기 시간 찾기: 열대 우림의 우기 시즌 파나마에서 야외 활동을 할 수 있는 시간을 Gemma와 노트북으로 찾다
요약
이 글은 Gemma 모델과 코드를 결합하여 파나마 같은 열대 우림 지역에서 야외 활동에 적합한 시간을 찾는 방법을 소개합니다. Open-Meteo 데이터를 기반으로 점수 산정 로직을 구현하고, Gemma를 사용하여 최종 선택 및 경고 메시지를 생성하는 시스템입니다.
핵심 포인트
- 코드는 예측 데이터와 안전 점수를 계산하며, 모델은 해석과 사용자 경험에 집중합니다.
- Gemma 4 E2B 같은 소형 LLM을 로컬에서 실행하여 개인 정보 보호와 효율성을 확보했습니다.
- 모델의 추론 시간 단축을 위해 `think: false` 설정을 적용하는 등 최적화 과정을 거쳤습니다.
이 글은 Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass에 제출하는 내용입니다.
제가 만든 것 (What I Built)
10월은 파나마 시티의 우기 시즌 한가운데입니다. 대부분의 오후에는 1시에서 5시 사이에 하늘이 열립니다. 날씨 앱은 매 시간대별로 백분율을 보여주고 결정은 저에게 맡겨지므로, 저는 화면을 계속 확인하거나 그냥 실내에 머무르게 됩니다.
Ventana seca(
Gemma는 제가 요청한 시간을 존중하며 비와 더위에 대해 경고합니다. 빨간색 Ojo(
git clone https://github.com/yosef7/ventana-seca.git
cd ventana-seca
uv sync
...
경로는 저장되므로 다음 아침에는 uv run python -m ventana_seca --mi-ruta만 실행하면 됩니다.
제작 과정 (How I Built It)
분리: 코드가 계산하고, 모델이 해석합니다. 숫자는 작은 모델이 실수하기 가장 쉬운 부분이므로, 모든 것은 코드가 처리합니다:
- 예측 (Forecast). Ventana seca는 Open-Meteo에서 시간별 강우 확률, 밀리미터(mm), 열 지수(heat index), 자외선 지수(UV), 일조량 데이터를 요청합니다. 내 위치가 아닌 장소 (공원, 광장)의 좌표를 요청하며, 신호가 없어도 작동하도록 로컬 사본을 유지합니다.
- 점수 산정, AI 미사용 (Scoring, no AI). 각 시간대는 100점으로 시작하여 강우 확률, 예상 밀리미터, 열 지수가 32°C를 초과하는 경우, 그리고 UV가 7을 초과하는 경우에 따라 점수를 잃습니다. 코드는 최대 다섯 개의 일조량 시간대(하루에 최대 두 개, 최소 세 시간 간격)를 유지하여 실제 대안이 있도록 합니다 (오전 vs. 늦은 오후). 경로 모드에서는 하루의 각 정류장이 후보가 됩니다.
- 선택, Gemma 사용 (Choice, with Gemma). Ollama를 통해 로컬에서 Gemma 4 E2B가 실행됩니다 (8GB RAM을 가진 MacBook용 4.6 GB Q4_K_M 빌드). 이 모델은 예측 데이터와 제가 작성한 내용(
실제 예보를 사용한 테스트가 가르쳐준 것. 첫 번째 버전은 작동했지만, 실제 실행 과정에서 다섯 가지 문제를 발견했습니다. 각각의 문제가 디자인을 변경하게 만들었습니다:
| 제가 본 것 | 제가 바꾼 것 |
|---|---|
| Gemma 4의 사고 모드(thinking mode)를 사용했을 때, 하나의 선택에 38초에서 114초가 걸렸습니다. | 다섯 가지 옵션 중 하나를 고르는 것은 긴 추론이 필요하지 않습니다: think: false로 설정하자 7~9초까지 줄었습니다. |
| ... |
제가 최종적으로 만든 패턴은 다음과 같습니다: 모델은 제가 원하는 것을 이해하는 데 능숙하고, 코드가 사실과 안전 경고를 담당합니다. 카드에 있는 모든 숫자는 모델이 아닌 예보에서 가져옵니다.
전체 결정 목록은 docs/arquitectura.md에 있으며, 모든 테스트 실행 기록은 docs/validacion.md에서 확인할 수 있습니다.
야외로 나가기 (Taking It Outside)
10월 6일 화요일, 저는 위 데모의 카드와 함께 평소 경로를 따라 나섰습니다. 다음은 실제 발생했던 상황과 비교한 예보입니다:
| 정류장 | 예보 | 실제로 일어난 일 |
|---|---|---|
| 오전 7:30 · Plaza 5 de Mayo | 20% · 31 °C · 건기 | 건기 |
| ... |
하루는 카드가 말한 대로 흘러갔습니다. Gemma가 선택한 정류장인 코스타 델 에스테(Costa del Este)의 오전 8시는 건기였습니다. 저는 8시 15분에 이 사진을 찍었습니다:

그리고 정오가 예보대로 찾아왔습니다. 코스타 델 에스테의 오후 12시 43분, 창문을 통해 비가 유리를 타고 흘러내렸고 멀리 있는 언덕들은 사라져 있었습니다:
오후에 대비해 아침에 목록에 넣어둔 우비가 두 번이나 필요했다. 오후 5시 52분에도 포장도로는 여전히 축축했다:

솔직한 한 가지 사실을 말하자면, 그날 밤 같은 좌표에 대해 Open-Meteo의 시간별 기록을 확인했을 때, 오후에 비를 봤음에도 불구하고 오전 11시부터 오후 1시 사이에 폭풍이 있었고(정오에 8.3mm), 오후 4시에는 0mm였다는 것을 알게 되었다. 이 기록은 수 킬로미터 너비의 그리드 셀에 대한 모델 추정치이며, 지역적인 오후 소나기는 그 범위를 벗어날 수 있다. 전체 비교 내용은 docs/validacion.md에서 확인할 수 있다.
Open Innovation이 중요한 이유?
내가 하루 동안 겪은 일에 대한 기록은 내 노트북에 남는다. 선호도 텍스트는 개인적일 수 있다. 즉, 퇴근 후 누구와 외출하는지 같은 것이다. 저장된 경로는 말 그대로 나의 일상적인 위치 패턴이다. Gemma를 로컬에서 실행하면 이 모든 것이 서버로 전송되지 않는다. 컴퓨터에서 나가는 유일한 요청은 예보이며, 이는 내 GPS가 아닌 공공 장소의 좌표를 사용하고 계정이나 API 키가 필요 없다.
매일 아침 실행하는 데 비용이 들지 않는다. 요청당 수수료도 없고, 할당량 제한도 없고, 구독료도 없다. 매일 사용해야 하는 도구에게는 이 점이 중요하다.
모델의 동작 방식을 보고 변경할 수 있다. 모델과 런타임이 오픈되어 있기 때문에, 나는 사고방식(thinking mode)을 측정하고 이를 비활성화한 다음 스키마를 이용해 출력을 제한했다. 모델이 강우 확률 53%를 완화했을 때, 단순히 호스팅된 API가 나를 무시할 것이라고 기대하는 대신 그 정확한 동작 주위에 가드레일(guardrail)을 구축할 수 있었다. 또한 이 모델은 메모리가 더 많은 기기에서 --modelo 옵션을 통해 gemma4:e4b 등으로 교체 가능하다.
신호가 없는 곳에서도 작동합니다. Gemma는 인터넷이 필요하지 않으며, 예보가 캐시됩니다. 커버리지가 없는 트레일에서도 카드에는 마지막 예보를 기반으로 작성되며 저장된 시점을 표시합니다.
솔직히 말하자면, 대규모 호스팅 모델이 더 멋진 설명을 작성할 것입니다. 하지만 이 작업은 수사학적인 능력보다는 제어와 개인 정보 보호가 더 필요했고, 소형 모델의 실수는 코드가 잡아낼 수 있는 바로 그 종류입니다.
수상 부문 (Prize Categories)
- Gemma 활용 최우수: Ollama를 사용하여 로컬에서 실행되는 Gemma 4 E2B는 Ventana seca의 핵심 의사결정자 역할을 합니다. 이는 자유 형식의 선호도를 해석하고, 제한된 JSON Schema를 통해 계산된 창들 중에서 선택하며, 카드에 설명을 작성합니다. 이 모델의 동작이 디자인을 형성했습니다: 속도를 위해 사고 모드(thinking mode)를 끄고, 알파벳 대신 읽기 쉬운 라벨을 사용했으며, 위험을 과소평가했을 때 코드 측에서 경고를 표시하도록 했습니다.
AI 지원 공개: 저는 Claude Code (Claude Opus 5.5)를 코딩 에이전트로 사용하여 Ventana seca를 구축했습니다. 이 모델은 코드를 구현하고, 테스트 및 문서를 작성했으며, 데모를 생성했고, 저의 경로와 기록된 테스트 결과를 바탕으로 이 게시물을 초안 작성했습니다. 저는 아이디어를 선정하고, 실제 경로를 제공했으며, 결과를 검토하고, 제 출퇴근길에서 직접 테스트했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기