Tendril: a garden assistant you barely have to open
거의 열 필요 없는 정원 도우미, Tendril
Tendril은 날씨와 식물 기록을 바탕으로 하루 두 가지 이하의 정원 관리 작업을 제안하고, 휴대전화 잠금 화면에 보여주는 오픈소스 도구입니다. 작은 로컬 모델에 판단을 맡기되 규칙 적용과 검증은 코드로 처리해, 모델이 틀려도 계획이 나오도록 설계했습니다.
- 주제
AI 요약
Tendril은 발코니 화분을 매일 정해진 시간에 돌보던 개발자가 만든 정원 관리 도우미입니다. 비가 오기 직전에도 물을 주거나 폭염과 해충을 놓치는 고정된 일과의 한계를 줄이려 했습니다. 앱을 자주 열게 하기보다, 잠금 화면에서 계획을 한눈에 보고 다시 정원으로 돌아가도록 설계했습니다.
날씨에 맞춰 계획하고, 앱 사용은 줄입니다
매주 일요일 오전 7시에 일주일 예보를 읽고, 로컬에서 실행하는 소형 모델이 계획을 작성합니다. 하루 작업은 두 개 이하이며, 각 작업은 여섯 단어보다 짧게 제한합니다. 매일 아침 비나 폭염이 새로 예보되면 그날 계획만 조정합니다. 결과는 휴대전화 잠금 화면 배경화면에 맞춘 이미지로 제공하며, 위쪽 3분의 1은 시계 표시 공간으로 비워 둡니다.
사용자는 완료 버튼을 누르거나 음성으로 작업을 기록합니다. 예를 들어 “고추에 물을 줬고, 툴시 잎 아래 진딧물이 있다”고 말하면 물 주기를 완료 처리하고, 해충 기록을 반영해 님 오일을 먼저 쓰는 식으로 주간 계획을 다시 짭니다. 영어와 힌디어를 지원합니다. 오후 6시가 지나도 미완료 작업이 있으면 한 줄로 알릴 뿐, 연속 기록이나 죄책감을 유도하는 기능은 넣지 않았습니다. 계정 없이 도시와 식물을 등록하고 QR 코드를 스캔한 뒤 홈 화면에 추가하면 됩니다.
모델은 아이디어를 내고, 코드는 규칙을 지킵니다
앱은 Python과 FastAPI, 정원 기록 저장용 SQLite로 구성합니다. Qwen 2.5 3B를 Ollama로 로컬 실행해 주간 계획을 만들고 메모를 해석합니다. 음성은 faster-whisper로 CPU에서 텍스트로 바꿉니다. 날씨와 도시 검색에는 API 키가 필요 없는 Open-Meteo를 사용하며, Pillow로 계획 이미지를 그립니다. Docker Compose로 실행 환경을 구성합니다.
개발자는 첫 실사용에서 소형 모델의 한계를 확인했습니다. 지시문을 답변에 그대로 복사했고, 예시로 한 번 보여준 ‘뿌리까지 깊게 물 주기’를 매일 반복했습니다. 첫 계획 생성에는 242초가 걸렸습니다. 해결책은 더 큰 모델을 쓰는 대신 작업을 나누는 것이었습니다. 모델은 식물별 아이디어를 만들고 복잡한 메모를 해석합니다. 강수 확률이 60%를 넘으면 물 주기를 건너뛰고, 기온이 35°C를 넘으면 그늘을 권하며, 사흘간 비가 오지 않으면 충분히 물을 주는 규칙은 코드가 마지막에 적용합니다. 반복 작업은 제거하고, 모델이 복사한 설명은 실제 날씨 안내로 바꿉니다.
간결한 JSON을 요청해 토큰도 줄였습니다. 들여쓰기가 토큰의 약 3분의 1을 차지했으며, 이를 줄인 뒤 일주일 계획 생성 시간은 약 100초가 됐습니다. 서버는 Pydantic으로 응답을 검사합니다. 하루 작업 수와 문장 길이, 등록된 식물만 사용하는지, 모든 날짜가 들어 있는지 확인합니다. 문제가 있으면 오류 내용을 알려 한 번 더 요청하고, 재시도도 실패하면 규칙 기반 계획 생성기가 대신 작동합니다. 따라서 모델 상태가 나빠도 계획은 표시됩니다.
음성 메모 처리에도 보완책을 뒀습니다. 한 시험에서는 “고추에 물을 줬고 툴시에 진딧물이 있다”는 메모를 모델이 툴시에 관한 내용으로만 분류해 물 주기를 놓쳤습니다. 이후 ‘물 줬다’ 같은 흔한 표현을 찾는 간단한 키워드 검사도 함께 실행하고, 같은 문장에 나온 식물과 연결합니다.
로컬 실행과 데이터 관리
위치, 음성, 식물 기록은 사용자가 관리하는 컴퓨터의 파일에 저장됩니다. 음성도 같은 컴퓨터에서 텍스트로 변환합니다. 외부로 전송하는 데이터는 날씨를 가져올 때 쓰는 정원 좌표뿐입니다. 매일 실행해도 요청별 비용이 들지 않으며, 모델은 OLLAMA_MODEL 설정 한 줄로 바꿀 수 있습니다.
첫 계획이 나온 주에는 비가 나흘 예보됐고, 하루 강수 확률은 최대 94%였습니다. Tendril은 대부분의 날에 물을 주지 말라고 권했습니다. 매일 아침저녁으로 물을 주던 사용자에게는 물 주기를 반복하는 대신 해충을 살피고 누렇게 변한 잎을 정리하라는 제안도 했습니다.
dev.to 반응
- @ritik_verma_a6c3b5117cfd5 — 이 프로젝트가 정말 마음에 듭니다!
- @chanadev — 정말 고맙습니다, Ritik! :)
- @koda2026 — 제품 철학과 실용적인 AI 엔지니어링을 모두 보여주는 모범 사례입니다. “빨리 닫고 싶어지는 앱”이라는 원칙도 훌륭하지만, 진짜 좋은 대목은 “더 큰 모델이 답이 아니었습니다. 일을 나누는 게 답이었습니다”라는 깨달음입니다. 3B 모델에 완벽한 결정성을 강요하지 않고, 모델은 다양한 아이디어를 내게 한 뒤 반복 제거와 JSON 검증, 날씨 규칙은 일반 코드로 처리했습니다. Pydantic 검증과 규칙 기반 대체 경로는 제약이 있는 환경에서 복원력 있는 시스템을 만드는 방식입니다. 모델이 힘든 날에도 계획이 나오는 편이 완벽한 계획보다 중요하다는 말도 인상적입니다.
- @chanadev — 고맙습니다, Harun! 그 말을 배우기까지 계획이 몇 번이나 엉망이 됐습니다 :) 3B 모델이 그냥 잘 따르기를 바랐는데, 규칙은 일반 코드에 맡기고 나서 모든 일이 쉬워졌습니다. 모델이 좋지 않은 날에도 계획이 나오는 편이 완벽한 계획보다 중요했습니다.
- @koda2026 — “모델이 힘든 날에도 계획이 나오는 편이 완벽한 계획보다 중요했습니다”는 이번 주에 들은 가장 깊은 엔지니어링 진리입니다. 제약이 있는 환경에서는 점진적 성능 저하와 결정론적 대체 경로가 억지로 만든 완벽함보다 늘 낫습니다. 실제 개발 과정을 공유해 주셔서 고맙고, 계속 영감을 주셔서 감사합니다.
- @alexcodebytes — 작은 오픈 모델을 로컬에서 실행해 날씨 API 데이터를 간단한 이미지로 만드는 건 기술 덕후다운 과시의 정점이네요. 발코니 데이터를 클라우드 데이터베이스에 보내거나 비싼 구독료를 내지 않고 자동 계획을 얻습니다.
- @chanadev — 제 히비스커스는 과시라고 생각하지 않을 것 같지만요 :) 맞습니다. 구독료 없이 발코니 데이터가 집에 남게 하려는 목적이었습니다. 읽어 주셔서 고맙습니다!
- @yahhi — 필요한 만큼 작게, 그보다 더 작지는 않게 만든 점이 인상적입니다. 작업 두 개, 여섯 단어, 잠금 화면이라는 구성이 좋습니다. 공개한 뒤에도 사용자에게 비용이 거의 들지 않는다는 점을 계속 생각하게 됩니다. 저도 기기에서 실행하는 작은 프로젝트에서 모델은 다양성을 만들고, 사실 여부는 결정론적 코드가 판단하게 했습니다. 3B 모델에서도 같은 방식이 작동하는 걸 보니 반갑습니다. 배경화면은 매일 아침 휴대전화에 어떻게 표시하나요? Shortcuts 자동화인가요?
- @chanadev — 고맙습니다, Valentina! “우리 대부분은 반대로 만든다”는 말에 저도 웃었습니다 :) 계획을 보려고 앱을 열 필요는 없습니다. Tendril은 매일 아침 잠금 화면용 계획을 만들고, 고정된 비공개 링크에 올립니다. 그러면 휴대전화 자동화가 오전 7시 이후 이미지를 가져와 배경화면으로 설정합니다. iPhone에서는 Shortcuts를, Android에서는 자동화 앱을 쓸 수 있습니다. 설정 페이지에 링크 복사 버튼과 안내가 있습니다.
원문: dev.to / 번역·요약: Trawling