62개 품목에 14종 모델을 때려넣고 배운 것들
분명 데이터는 있었습니다. KAMIS(한국농수산식품유통공사)에는 1996년부터 축적된 도매가격 시계열이 있고, 기상청 APIHUB에는 수십 년치 기온·강수량이 공개되어 있으며, 농촌진흥청 NCPMS에는 국가표준 병해충 DB가 체계적으로 정리되어 있습니다. 그런데 막상 농업 현장에서 "다음 달 당근 가격이 오를까요?"라는 질문에 데이터로 답할 수 있는 서비스는 찾기 어려웠습니다. 데이터는 존재하는데, 그걸 농부의 언어로 바꿔주는 인터페이스가 없었던 겁니다.
Farm Life는 이 간극에서 출발한 프로젝트입니다. 농업 현장의 세 가지 핵심 과제 — 재배 의사결정, 출하 시점 판단, 병해충 조기 대응 — 을 단일 플랫폼에서 해결하는 AI 농업 서비스로, 현재 허깅페이스 Spaces에 공개되어 있습니다.
� https://huggingface.co/spaces/VIDraft/farmlife
가격 예측을 처음 시도했을 때, SARIMAX 하나로 전 품목을 커버하려 했습니다. 결과는 처참했습니다. 배추처럼 계절성이 뚜렷한 품목은 잘 맞았지만, 당근은 정확도가 45.28%까지 추락했습니다. 상추는 73.96%, 시금치는 79.57%. 모델이 나쁜 게 아니라, 전제가 틀렸습니다. 농산물은 품목마다 가격을 결정하는 메커니즘이 완전히 다릅니다.
건고추는 연간 작황에 의해 가격이 결정되므로 추세 자체가 완만합니다. 이동평균만으로도 98.85%의 정확도가 나옵니다. 반면 대파는 한 번의 한파에 가격이 2~3배 뛰고, 토마토는 출하량이 몰리는 주에 급락합니다. 이런 품목들에 같은 모델을 씌우는 건 축구화 한 켤레로 마라톤도 뛰고 등산도 하겠다는 것과 같습니다.
그래서 설계를 바꿨습니다.
현재 Farm Life는 SARIMAX, SARIMA, Holt-Winters, Holt, ETS(Additive/Multiplicative), Simple Exponential Smoothing, Fourier+Linear Regression, Linear Trend, Moving Average, Weighted MA, Naive, Seasonal Naive — 총 14종의 시계열 모델을 병렬로 운용합니다. 62개 품목 각각에 대해 2025년 실제 데이터로 백테스트를 돌리고, MAPE(Mean Absolute Percentage Error) 기준으로 가장 정확도가 높은 모델을 1위·2위로 자동 선택합니다.
백테스트 결과에 따라 품목은 세 등급으로 나뉩니다.
A등급(12개 품목): 정확도 95% 이상. 건고추, 김, 땅콩, 바나나 등. 가격 변동 폭이 작거나 계절 패턴이 명확한 품목들입니다. "이 예측은 믿어도 됩니다"라고 말할 수 있는 수준.
B등급(34개 품목): 정확도 85~95%. 배추, 사과, 양파, 수박 등 대부분의 주요 농산물이 여기 속합니다. 모델이 방향성은 잡지만, 급등락 구간에서 오차가 발생합니다.
C등급(12개 품목): 정확도 85% 미만. 당근, 대파, 상추, 시금치, 토마토 등. 기상 이변이나 수급 쇼크에 극도로 민감한 품목들입니다.
여기서 멈추면 C등급 품목은 "예측이 어렵습니다"라는 면책 문구만 남기고 끝나야 합니다. 하지만 그건 엔지니어의 태도가 아닙니다.
C등급 품목의 공통점은 명확했습니다. 가격 시계열 자체만으로는 설명력이 부족하다는 것. 대파 가격이 급등하는 건 대파 자체의 추세가 아니라 한파로 인한 출하량 급감 때문이고, 레몬 가격이 흔들리는 건 환율이 움직이기 때문입니다. 가격 밖의 정보가 필요합니다.
그래서 C등급 품목에는 SARIMAX 외생변수 모델을 자동으로 적용합니다. 기상청 APIHUB에서 월별 평균기온과 강수량을, Brave Search API를 통해 실시간 USD/KRW 환율을 수집하고, 이 외생변수를 SARIMAX의
exog
파라미터로 투입합니다. 기상 민감 품목(상추, 시금치, 대파 등)에는 기온·강수량을, 수입 의존 품목(레몬, 바나나 등)에는 환율을 매칭합니다.
실제로 외생변수 투입 후 백테스트를 다시 돌리면, 일부 C등급 품목에서 유의미한 정확도 개선이 확인됩니다. 물론 만능은 아닙니다. 외생변수가 오히려 노이즈를 추가하는 경우에는 기존 모델이 더 나은데, 이때는 자동으로 fallback합니다. "SARIMAX 실패 → SARIMA fallback"이라는 로그가 뜨면서 기존 모델로 되돌아가는 구조입니다. 핵심은 시도하되, 더 나쁜 결과를 내지 않는 것입니다.
겉으로 보기엔 단순해 보이지만, 실제로 가장 많은 엔지니어링 시간이 들어간 부분은 데이터 체이닝이었습니다.
KAMIS 도매가격 데이터는 시기별로 품목 코드 체계가 바뀝니다. "갈치"라는 하나의 품목도 시기에 따라
(갈치, 생선, 중품)
→
(갈치, 생선, 中)
→
(갈치, 냉동, 中)
으로 코드가 달라지고, "쌀"은
(쌀, 일반계, 상품)
→
(쌀, 20kg, 상품)
으로 규격 자체가 변합니다. "감자"는
(감자, 수미, 상품)
과
(감자, 수미(노지), 상품)
이 시기별로 교차합니다.
이 불연속한 조각들을 하나의 연속된 월별 시계열로 연결하는 것이
CHAIN_CONFIG
입니다. 13개 품목에 대해 시기별 코드 변환 체인을 수동으로 매핑하고, 나머지 49개 품목은
SIMPLE_CONFIG
로 단일 코드 매핑을 적용합니다. 체인 내에서 겹치는 구간은 우선순위에 따라 병합하고, 누락 구간은 보간합니다. 40년치 시계열이 끊김 없이 이어져야 SARIMA의 계절성 파라미터
(P,D,Q,12)
가 의미를 가지기 때문입니다.
이 작업은 반복적이고 지루하지만, 예측 정확도에 직접적으로 영향을 미치는 기반 공사입니다. 체이닝이 틀리면 모델은 존재하지 않는 추세를 학습합니다.
범용 LLM에 "배추 재배법 알려줘"라고 물으면, 틀린 말은 하지 않습니다. 하지만 "지금 충남 지역에서 늦가을 배추를 정식하려는데, 주의할 점이 뭔가요?"라는 질문에는 맥락 없는 일반론만 돌아옵니다. 농업 상담에서 중요한 건 작물 지식 자체가 아니라, 지역·시기·작형이라는 맥락 위에서의 판단입니다.
Farm Life의 AI 챗봇은 이 문제를 해결하기 위해 농업 도메인에 특화된 프롬프트 체계와 외부 데이터 연동을 결합했습니다. "올해는 바나나 키워야 해요"라고 물으면, 단순히 바나나 재배법을 나열하는 것이 아니라 국내 시설재배 가능 여부, 최근 수입가격 추이, 소비 트렌드까지 고려한 맞춤형 답변을 구성합니다. 가격 예측 엔진의 데이터와 연동되어 있기 때문에, "지금 양파를 출하할지, 한 달 더 저장할지"라는 질문에도 데이터 기반의 판단 근거를 함께 제시할 수 있습니다.
작기 선택부터 수확 후 관리, 유통 전략까지 — 원스톱으로 상담할 수 있는 구조입니다. 핵심은 챗봇이 "아는 척"하는 것이 아니라, 실제 데이터를 기반으로 근거를 대면서 답하는 것입니다.
병해충 대응에서 가장 큰 문제는 속도입니다. 농부가 잎의 이상 증상을 발견하고, 인터넷에서 검색하고, 유사한 이미지를 비교하고, 확신이 안 서서 농업기술센터에 전화하고, 답변을 받기까지 며칠이 걸립니다. 탄저병이든 역병이든, 그 며칠 사이에 병은 옆 포기로, 옆 이랑으로 퍼집니다.
Farm Life는 이 과정을 "사진 한 장 업로드 → 즉시 진단 → 방제법 안내"로 압축했습니다. NCPMS(국가농작물병해충관리시스템) 표준 데이터베이스를 기반으로 병해충을 판별하고, 등록 농약과 친환경 방제법, 확산 방지 조치를 단계별로 안내합니다.
"내 고추는 건강해야 해~" — 이런 마음으로 스마트폰 카메라를 들이댄 60대 농부가, 3초 안에 "탄저병 의심, 만코제브 수화제 희석 살포, 이병과 즉시 제거"라는 대응 매뉴얼을 받아볼 수 있어야 합니다. 기술적 정교함보다 이 경험을 만드는 것이 더 어렵고 더 중요했습니다.
솔직하게 말하면, 이 프로젝트에서 가장 어려웠던 건 모델 튜닝이 아니었습니다.
첫째, "예측이 틀릴 때 어떻게 말할 것인가"라는 문제. C등급 품목의 예측을 보여주면서 "이 예측은 정확합니다"라고 말할 수는 없습니다. 그렇다고 "정확하지 않을 수 있습니다"만 반복하면 서비스의 존재 이유가 없어집니다. 결국 등급 시스템과 백테스트 정확도를 함께 공개하는 방식을 택했습니다. A등급(건고추 98.85%)과 C등급(당근 45.28%)의 차이를 사용자가 직접 보고 판단할 수 있게 하는 것. 예측의 한계를 숨기지 않되, 그 한계가 어디인지를 데이터로 보여주는 것이 더 정직한 접근이라고 판단했습니다.
둘째, 데이터 수집의 현실적 불안정성. 기상청 API는 때때로 응답이 느리고, KAMIS API는 특정 시간대에 타임아웃이 발생하며, Brave Search API로 환율을 가져오는 것은 구조적으로 불안정합니다. 외생변수 세 개 중 하나라도 실패하면 SARIMAX 보정이 작동하지 않습니다. 그래서 각 API에 fallback 체인을 걸었습니다. 기상 데이터가 실패하면 직전 월 데이터를 복제하고, 환율이 실패하면 기본값으로 대체하며, 전부 실패하면 외생변수 없는 기본 모델로 돌아갑니다. 우아하지는 않지만, 서비스가 멈추지 않는 것이 더 중요합니다.
셋째, 14종 모델의 앙상블보다 그 결과를 "출하할지 저장할지"라는 판단으로 연결하는 것이 더 어려웠습니다. 예측 결과를 그래프로 보여주는 건 엔지니어의 일이지만, 그 그래프를 보고 행동을 결정하는 건 농부의 일입니다. 이 간극을 어떻게 줄일 것인가 — 결국 AI 챗봇과 가격 예측 엔진을 연동해서, 자연어로 "지금 팔아야 하나요?"라고 물으면 데이터 기반의 판단 근거를 함께 제시하는 구조로 풀었습니다.
Farm Life는 Streamlit 기반 웹 애플리케이션으로 Hugging Face Spaces 위에서 구동됩니다. Python 3.13 환경에서 statsmodels, scikit-learn을 예측 엔진으로, Plotly를 시각화로 사용하며, 기상청 APIHUB, KAMIS API, Brave Search API, NCPMS를 외부 데이터 소스로 연동합니다. 전체 코드는 2,300줄 남짓으로, 하나의 파일에서 데이터 수집 → 체이닝 → 모델링 → 백테스트 → 시각화 → 챗봇 → 병해충 진단까지 풀스택으로 돌아갑니다.
아직 부족한 부분이 많습니다. C등급 품목의 정확도는 여전히 낮고, 병해충 진단은 더 많은 학습 데이터가 필요하며, 실시간 반입량 데이터를 반영한 초단기 예측은 아직 구현하지 못했습니다. 하지만 40년치 농업 데이터와 AI를 연결해서, "다음 달 양파 가격이 오를까요?"라는 질문에 데이터로 답하는 첫 번째 시도를 공개한다는 데 의미를 두고 있습니다.
농사의 모든 답을 AI로 — 상담하고, 예측하고, 진단합니다.
피드백은 언제든 환영합니다.
� Farm Life: https://huggingface.co/spaces/VIDraft/farmlife
Built by VIDraft · Powered by Streamlit on Hugging Face