서리 기간(Frost Window): 30년간의 기상 데이터와 노트북 크기의 Gemma가 이번 주 야외 활동 계획을 알려줍니다
요약
이 글은 30년간의 기상 데이터를 활용하여 특정 지역의 '서리 기간(Frost Window)'을 예측하는 방법을 소개합니다. Open-Meteo 아카이브에서 데이터를 가져와 첫 서리와 마지막 봄 서리를 계산한 후, 작은 오픈 웨이트 모델인 Gemma 3 4B를 로컬 환경(Ollama)에서 실행하여 이를 사용자 친화적인 '야외 활동 계획' 문장으로 변환하는 과정을 설명합니다.
핵심 포인트
- 기상 데이터 분석을 통해 평균값보다 중요한 위험 요소를 파악할 수 있습니다.
- Open-Meteo 아카이브와 Gemma 3 4B를 활용하여 지역별 서리 예측 서비스를 구현했습니다.
- Gemma 모델을 로컬 환경에서 구동하는 방법을 제시하며, Python 표준 라이브러리만으로 작동합니다.
_이 글은 Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass 제출물입니다.
제가 만든 것 (What I Built)
추운 지역의 원예가들은 매년 10월이 되면 같은 질문을 합니다. 첫 서리까지 몇 주말이 남았는가? 이 답변에 따라 이번 토요일 바질을 파내야 할지, 마늘을 땅에 심어야 할 시기인지, 아니면 하이킹을 지금 해야 할지 다음 봄으로 미뤄야 할지가 결정됩니다.
대부분의 앱은 단일한 '평균 첫 서리' 날짜로 답변합니다. 하지만 평균값은 실제로 중요한 위험(risk) 요소를 가립니다. 평균이 11월 10일인 마을이라도, 10년 중 한 해는 10월 30일에 얼어붙을 수 있습니다.
**서리 기간(Frost Window)**은 위험도를 알려주고, 그 이상은 신경 쓰지 않습니다:
- 장소 이름을 입력합니다.
- 해당 지점의 지난 30년간 일별 최저 기온 데이터를 무료 Open-Meteo 아카이브에서 가져옵니다.
- 이 데이터로 매년의 마지막 봄 서리(last spring frost)와 첫 가을 서리(first fall frost)를 계산합니다.
- 이를 네 개의 평이한 문장으로 변환합니다: 다음 주까지 서리가 내릴 확률, 일반적인 첫 서리와 빠른 첫 서리, 구근 식물 심기 적기 여부, 그리고 10년 중 9년 동안 모종을 안전하게 키울 수 있는 다음 봄의 날짜입니다.
- 작은 오픈 웨이트 모델인 Gemma 3 4B를 Ollama를 통해 로컬에서 실행하여 이 문장들을 네 줄로 된 '야외 활동 계획'으로 변환합니다.
서울에 대한 실제 출력은 10월 8일 기준으로 다음과 같습니다:
Facts:
- No frost in the next 7 days in any of the past 30 years.
- Typical first frost is in about 32 days (Nov 10); an early year is Oct 30.
...
같은 날짜의 미니애폴리스(Minneapolis)는 사진이 매우 다릅니다:
Facts:
- Frost by next week happened in 27% of past years.
- Typical first frost is in about 16 days (Oct 24); an early year is Oct 10.
...
화면을 만드는 데는 약 30초가 걸립니다. 그리고 그가 제안하는 모든 것은 야외에서 일어나는 일들입니다.
시연 (Demo)
8개 도시(서울, 미니애폴리스, 런던, 토론토, 덴버, 사포로, 베를린, 멜버른)에서 작동하는 라이브 페이지이며, 모두 동일한 코드를 사용하여 제 컴퓨터에서 생성했습니다: https://lottolove5131-lang.github.io/frost-window/
본인의 지역에 적용하려면:
ollama pull gemma3:4b
python frost_window.py "Your Town"
파이썬 표준 라이브러리만 필요합니다.
코드
GitHub logo lottolove5131-lang / frost-window
30년간의 기상 데이터와 Gemma를 통한 오프라인 야외 활동 계획으로 얻는 지역별 서리 확률.
Frost Window (서리 기간)
제가 사는 곳에 언제 서리가 내릴지, 그리고 이번 주에 무엇을 하고 밖에 나가야 할까요?
Frost Window는 지구상의 모든 장소에 대한 30년간의 일일 최저 기온 데이터를 기반으로 답변하며, 그 후 작은 오픈 웨이트 모델(Gemma)을 사용하여 (Ollama를 통해 본인의 노트북에서 실행됨) 이 수치들을 네 줄 분량의 '외출' 조언으로 변환하도록 요청합니다.
계정 필요 없음. API 키 필요 없음. 클라우드 모델 사용 안 함. 유일한 네트워크 호출은 무료 오픈 Open-Meteo 기상 아카이브로만 이루어집니다.
알려주는 것들
$ python frost_window.py "서울" --model gemma3:4b
사실:
...
수치들이 나옵니다…
제가 만든 방법
디자인 규칙은 간단했습니다: 모델이 서리가 언제 오는지를 결정하지 않도록 했습니다.
서리 날짜는 생성(generation)이 아닌 계산(counting)에서 나옵니다. frost_dates() 함수는 매년의 일일 최저 기온을 순회하며 7월 이전의 0°C 이하 마지막 날과 7월 이후의 첫 날을 기록합니다. 이 30개 값에 대한 백분위수(Percentiles)를 계산하여 '평균적인', '초기 연도', 그리고 '10년 중 9년 동안 안전한' 날짜를 제공합니다. 이 부분은 약 40줄 분량이며 직접 확인해 볼 수 있습니다.
Why Does Open Innovation Matter?는 오픈 혁신은 왜 중요한가요?
facts() 함수는 숫자를 몇 가지 규칙을 가진 짧은 문장으로 변환합니다("만약 첫 서리 날짜가 3주 이내라면, 수확기에 민감한 작물을 언급하라"). 오직 그 문장들만이 Gemma에게 전달되며, 지침과 함께 그것들을 사용하고 다른 것은 사용하지 않도록 요청됩니다. Gemma의 역할은 언어 모델이 잘하는 부분, 즉 건조한 사실을 친근하게 바꾸고 지역 공원이나 강을 추천하는 것입니다.
이 과정에서 세 가지 문제가 발생했고, 이 문제들을 해결한 것이 어떤 프롬프트 수정보다 도구를 더 개선했습니다:
- 1B 모델이 장소를 지어냄.
gemma3:1b를 사용했을 때 서울에 존재하지 않는 "문 밸리(Moon Valley)" 산책로가 생성되었습니다.gemma3:4b로 변경하면서 이 문제가 해결되었고, 북한산, 한강, 남산을 모두 실제 장소로 인식합니다. CPU 전용 노트북에서 계획 하나를 세우는 데 약 35초가 소요되며, 이는 주간 계획을 세우기에는 충분한 시간입니다. - 모델이 데이터와 모순됨. 제가 처음 보낸 프롬프트에 원시 JSON 데이터를 넣었더니, 1B 모델은 지난 30년 동안 서리가 내린 적이 없는 주에도 "서리 기운"에 대해 작성했습니다. 이 숫자를 문장으로 미리 가공하는 방식으로 문제가 해결되었습니다.
- 남반구의 날짜가 거꾸로 되어 있었음. 멜버른의 "첫 가을 서리"가 7월로 나왔는데, 이는 제가 계절 로직이 가을이 7월에 시작한다고 가정했기 때문입니다. 이제 코드는 음의 위도에 대해 달력을 반년씩 이동시킵니다. 그러자 두 번째 문제가 나타났습니다: 멜버른의 도시 좌표에서 서리가 내린 것은 지난 30년 중 단 한 번뿐이었는데, 도구는 그 단 하나의 추운 밤을 "전형적인" 날짜로 보고했습니다. 이제는 서리가 반년보다 적은 해에 발생하면 패턴이 있는 것처럼 가장하는 대신 "여기는 서리가 드뭅니다(Frost is rare here)"라고 표시합니다.
스택: Python 표준 라이브러리, Open-Meteo 지오코딩 및 역사 기록 아카이브 API, Ollama, Gemma 3 4B. 데모 페이지는 JSON 파일을 읽어오는 정적 HTML 파일 하나입니다.
오픈 혁신은 왜 중요한가요?
이 프로젝트에 구체적인 세 가지 이유가 있습니다:
- 운영 비용이 들지 않습니다. API 키도, 계정도, 결제 페이지도 필요 없습니다. 가든 클럽, 학교, 또는 하이킹 그룹이라면 방에 있는 어떤 노트북으로든 실행할 수 있습니다.
- 기상 데이터가 공개되어 있어 숫자를 확인할 수 있습니다. 누구나 Open-Meteo에서 동일한 30년 데이터를 가져와 서리 날짜를 확인할 수 있습니다. 이것이 글보다 더 중요합니다: 검증할 수 없는 서리 날짜는 단지 확신을 가진 추측일 뿐입니다.
- 모델은 교체 가능하며 기기에 남아있습니다. 만약
gemma3:4b가 오래된 노트북에서 너무 느리다면,--model gemma3:1b를 사용하면 되고, 저는 이것이 정확히 어떻게 실패하는지 문서화했습니다. 다음 달에 더 나은 소형 모델이 출시된다면, 단어 하나만 바꾸면 됩니다. 여러분이 어디에 사는지와 상관없이, 컴퓨터에서 기상 아카이브로 전송되는 좌표 외에는 아무것도 떠나지 않습니다.
닫힌 API를 사용했다면 친근한 부분이 조금 더 세련되었을 것입니다. 또한 이 도구는 비용이 들고, 키가 필요하며, 그 아래에서 변경될 수 있는 서비스에 의존하게 했을 것입니다. 일주일에 한 번 야외 활동을 하기를 선호하는 사람들이 사용할 도구에게는 오픈 소스가 더 적합했습니다.
수상 부문 (Prize Categories)
- Gemma의 최고의 활용 사례 (Best Use of Gemma)
AI 공개: 저는 AI 코딩 어시스턴트의 도움을 받아 이것을 만들었으며, 이 도우미가 코드의 많은 부분을 작성하고 저와 함께 이 게시물의 일부를 초안했습니다. 표시된 모든 출력은 게시된 코드를 실제로 실행한 결과입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기