I Built an AI Gardening App That Tells Me to Put the Laptop Down
노트북을 덮고 식물을 살펴보라고 안내하는 AI 정원 앱을 만들었습니다
Garden Trials는 로컬 Gemma 모델로 식물 관찰 기록을 정리하고, 사용자가 직접 확인할 항목을 제안하는 앱입니다. 원인을 AI가 단정하지 못하게 막고 실험 절차와 증거 수준은 Python 코드로 관리합니다. 작성자는 실제 정원 기록에서 모델의 한계와 검증 장치를 함께 살펴봅니다.
- 주제
AI 요약
Garden Trials는 식물을 진단하는 앱이 아니라, 정원사가 먼저 관찰하고 한 번에 한 가지 변화만 시험하도록 돕는 로컬 앱입니다. 작성자는 꽃이 늘어난 이유를 AI에게 묻는 대신 무엇을 살펴봐야 하는지 묻기로 했습니다. 햇빛, 비, 시간 중 무엇이 결과를 만들었는지 구분하기 어려운 상황에서 원인을 섣불리 정하지 않으려는 접근입니다. 앱의 원칙은 “먼저 살펴보고, 한 가지를 바꾸고, 정원이 답하게 하라”입니다.
관찰에서 다음 확인까지
사용자는 식물과 관찰 날짜를 적습니다. 로컬 Gemma 3 1B가 기록을 평이한 사실로 정리하고, 앱은 식물에서 확인할 항목 하나를 제안합니다. 사용자가 확인 결과를 적기 전까지는 다음 제안을 하지 않습니다. 이후 사용자는 그대로 관찰하거나, 식물별로 걸러낸 제한된 메뉴에서 변화 하나를 고릅니다. 가능하면 비슷한 식물 하나는 바꾸지 않은 채 비교 대상으로 둡니다. 관찰 횟수를 세고 사진을 남기면 앱은 직전 사진을 보여줘 비슷한 각도에서 비교하도록 돕습니다. 마지막에는 표와 그래프, 판정, 0~3 증거 수준, 다음에 할 일을 보여줍니다.
앱은 식물의 병이나 문제를 진단하지 않으며, 결과의 원인도 말하지 않습니다. 증거 수준 3을 받으려면 같은 변화를 다룬 실험을 두 차례 끝내야 합니다. 두 실험 모두 비교 식물이 있어야 하고 다른 조건은 바뀌지 않아야 하며, 결과도 같은 방향을 가리켜야 합니다. 기록만 있거나 비교 조건이 부족하면 원인을 뒷받침하는 증거로 과장하지 않습니다.
작은 모델을 신뢰하는 대신 출력 검증
구성은 Streamlit, JSON 파일 하나, Ollama를 통해 로컬에서 실행하는 gemma3:1b입니다. 앱은 Python 3.11 이상과 Ollama가 필요하며, 모델은 ollama pull gemma3:1b로 내려받습니다. 모델 호출은 사용자가 적은 내용을 사실로 정리하고, 확인 질문을 제안하며, 제한된 메뉴에서 변화를 고르는 데만 씁니다. 판정과 증거 수준 계산은 일반 Python 코드가 맡습니다. 작성자는 모델 출력을 신뢰할 수 없는 입력처럼 다룹니다.
검증 코드는 기록의 숫자가 모델 결과에서 빠지면 결과를 버리고 사용자가 쓴 문장을 그대로 보존합니다. 사용자가 적지 않은 세부 내용은 단어 일치 검사로 걸러냅니다. 원인 필드는 코드에서 항상 unknown으로 고정합니다. 사용자가 먼저 언급하지 않았다면 병충해 관련 질문도 차단합니다. 변화 메뉴는 식물별로 제한하며, 건조한 환경을 선호하는 부겐빌레아에는 ‘물을 더 주기’를 제시하지 않습니다. 저장은 임시 파일에 먼저 쓴 뒤 교체합니다. 정원 파일을 읽지 못하면 따로 옮겨두고 덮어쓰지 않습니다.
테스트는 85개입니다. Gemma를 쓰지 않아도 실행되며, 숫자 누락이나 허위 해충 정보, 메뉴에 없는 선택지처럼 일부러 잘못된 모델 응답도 시험합니다. 실제 화면 흐름을 확인하는 테스트도 포함합니다. 다만 작성자의 정원에서 Gemma는 세 건의 기록을 모두 숫자 검증에서 통과하지 못했고, 확인 질문 하나도 차단됐습니다. 통과한 질문 두 개도 일반적이었습니다. ‘줄기가 곧은가요?’라는 질문은 당시 관찰 내용과 맞지 않았습니다. 작성자는 규칙이 발명된 해충 질문은 막아도 모델 질문의 적절성까지 보장하지는 못한다고 밝힙니다. 영어 단어를 기준으로 검사하므로 힌디어 기록은 같은 방식으로 확인되지 않는다는 한계도 적었습니다.
관찰 기록이 보여준 한계
작성자는 그늘진 곳에서 햇볕이 드는 곳으로 옮긴 메리골드의 꽃과 봉오리를 기록했습니다. 10월 7일부터 10일까지 개화한 꽃은 매일 두 송이였다가 마지막 날 네 송이가 됐고, 봉오리는 네 개에서 두 개로 줄었습니다. 다만 사진 각도가 달랐고, 8일에는 시든 꽃을 제거했으며, 비와 햇빛도 영향을 줬을 수 있습니다. 그래서 앱은 증거 수준을 0으로 판정했습니다. 변화 없이 관찰한 기록만으로는 식물이 어떻게 달라졌는지 알 수 있지만, 그 이유는 말할 수 없다는 설명입니다.
앱은 컴퓨터에서 로컬로 실행하며 기록과 사진도 사용자 컴퓨터에 둡니다. 사진은 위치 정보를 제거해 저장합니다. 설치할 때 패키지와 Ollama, 모델을 내려받으려면 인터넷이 필요하지만, 이후 모델 호출에는 API 키나 클라우드 AI가 필요하지 않습니다. 작성자는 모델을 더 나은 소형 모델로 바꾸려면 OLLAMA_MODEL 설정만 바꾸면 된다고 설명합니다. 예시 정원은 실제 기록을 담은 샘플과 가짜 식물로 전체 절차를 따라가는 샘플을 제공합니다. 앱이 보장하는 것은 정원에 실제로 나갔는지가 아니라, 사용자가 스스로 살펴보도록 절차를 설계했다는 점입니다.
dev.to 반응
- @riantogo — 42Loop를 운영합니다. Garden Trials의 ‘먼저 살펴보기’ 방식이 특히 기억에 남았습니다. 코드에서 원인 필드를 ‘unknown’으로 고정하고 숫자를 누락한 Gemma 결과를 거부한 점은 로컬 AI 도우미를 신뢰할 만하게 만들려는 정직한 접근입니다. 이런 작은 프로젝트를 더 많은 사람에게 보여주고 싶다면 42loop.com에서 아이디어를 올릴 수 있습니다. 완성된 프로젝트는 홈페이지에 투표로 올라가며, 추천 5개를 받으면 무료로 노출됩니다.
- @kaashviw3spaces — 주간 챌린지에 잘 어울리는 제출작입니다. 저도 써볼 생각입니다.
- @hemapriya_kanagala — 코딩과 정원 가꾸기에 대한 애정을 하나로 묶은 점이 멋집니다. 챌린지에서 좋은 결과가 있길 바랍니다.
- @shubhradev — 두 가지 좋아하는 일을 하나로 엮어 특별하게 느꼈습니다. 응원해줘서 고맙습니다.
원문: dev.to / 번역·요약: Trawling