Plot Buddy: 스마트폰을 내려놓게 하는 주간 야외 가드닝 카드
요약
Plot Buddy는 나이지리아 라고스 지역의 가정 정원을 위한 주간 야외 코치 앱입니다. 사용자가 두 가지 질문에 답하면, 수행할 작업과 소요 시간을 알려주는 '야외 카드'를 받게 됩니다. 이 카드는 사용자에게 휴대폰을 내려놓고 실제 외부 활동을 하도록 유도하는 것이 목적입니다.
핵심 포인트
- 실내에서 받은 정보를 바탕으로 야외 활동을 유도합니다.
- AI 모델(Ollama)은 카드 내용 재작성에 사용되었으나, 핵심 로직은 순수 코드로 구현되었습니다.
- 사용자가 인쇄하거나 WhatsApp으로 전송하여 외부에서 활용하도록 설계되었습니다.
*이 글은 [Hacktoberfest 오픈소스 AI 챌린지 Week 1] 제출물입니다.
제가 만든 것
Plot Buddy는 나이지리아 라고스에 거주하는 작은 가정 정원(양동이, 재배 주머니, 발코니 또는 뒷마당)을 위한 주간 야외 코치입니다. 사용자는 두 가지 질문에 답하면 한 화면의 "야외 카드"를 받게 됩니다. 이 카드는 수행할 2~3가지 작업, 소요 시간(분), 그리고 다시 확인해야 할 시점을 알려줍니다. 카드의 내용은 "휴대폰을 내려놓으세요"와 같습니다. 사용자는 이를 인쇄하거나 WhatsApp으로 전송할 수 있으며, 실제 활동은 외부에서 이루어집니다. 이 화면은 경험의 가장 짧은 부분입니다.
이 앱은 작은 공간에서 식물을 재배하고 싶지만 이번 주에 무엇을 심어야 할지 모르는 사람들을 위한 것입니다.
데모
- 실시간: https://plot-buddy.onrender.com/ (무료 플랜은 비활성화되므로 첫 로딩에 약 1분이 걸릴 수 있습니다.)
- 스크린샷:

코드
GitHub logo Bientechsavvy / plot-buddy
Week 1 Hacktoberfest
Plot Buddy
나이지리아 라고스 지역의 작은 가정 정원(양동이, 주머니, 발코니, 뒷마당)을 위한 주간 야외 코치입니다. 화면에서 약 1분을 보내고, 그 후 외부에서 20~30분을 보냅니다. Hacktoberfest 2026년 Week 1: 풀 냄새 맡기 (Touch Grass).
실시간 링크 - https://plot-buddy.onrender.com/
작동 방식
api/planner.py는 출처가 된 규칙 파일(api/rules/crops_lagos.json)을 기반으로 이번 주에 무엇을 할지 결정합니다. AI 없이 순수 코드만 사용했습니다.- 오픈 웨이트 모델(Ollama를 통한
qwen2.5:1.5b)은 친근한 영어 또는 피진어(Pidgin)로 카드 내용만 다시 작성합니다. api/guard.py는 규칙이 생성하지 않은 숫자, 돈, 링크 또는 작물 정보가 추가될 경우 모델의 텍스트를 무시합니다.- 표준 라이브러리만 사용했습니다. 설치할 패키지는 없습니다.
실행 방법 (Git Bash)
python -m unittest discover -s tests -v # 테스트 실행
python api/server.py # 규칙만, http://localhost:8000에서 실행
LLM_BACKEND=ollama python api/server.py # 로컬 오픈 모델 사용 시
솔직한 한계점
- 모든 작물 주기(crop window)는
verified: false로 표시됩니다. 출처들이 의견이 다르거나 일부는 신뢰도가 낮습니다...
제작 과정 (How I Built It)
- 규칙이 결정하고, 모델이 문장화합니다.
planner.py는 출처가 명시된 규칙 파일(crops_lagos.json)을 읽어 이번 주에 무엇을 심거나 확인할지 결정합니다. 이는 자동 테스트가 적용된 순수 코드입니다. - 문자 작성을 위한 오픈 가중치 모델, 두 가지 방식. 로컬에서는 Ollama를 통해
qwen2.5:1.5b가 실행됩니다 (오프라인 작동). 라이브 사이트에서는 호스팅된 모델(모델 이름 및 라이선스는 해당 모델 페이지에서 확인)이 하나의 Backboard API 키를 통해 호출됩니다. 두 경우 모두 카드를 간단한 영어 또는 피진어(Pidgin)로 재작성하며, 전환은 환경 변수 하나만 바꿉니다. - 가드가 모델을 검사합니다.
guard.py는 모델의 텍스트에 규칙이 생성하지 않은 숫자, 가격, 링크를 추가하거나 총 분량을 누락할 경우 해당 텍스트를 폐기합니다. 그러면 앱은 규칙의 텍스트로 되돌아갑니다. 만약 모델이 작동하지 않아도 앱은 여전히 작동합니다. - 비용 보호. 응답은 캐싱되며 시간당 제한이 설정되어 있고,
/api/status는 키를 노출하지 않으면서 어떤 백엔드가 활성화되었는지 보여줍니다. - 표준 라이브러리만 사용. 설치할 패키지가 없습니다. Render에 배포되었습니다.
- 모든 작물 주기에 대한 출처. 각 식재 주기(planting window)는 그 출처와 연결되며, 모든 작물은
verified: false로 표시됩니다.
이전 프로젝트에서 얻은 교훈: 실제 메시지에 1.5B 모델을 테스트했을 때, 이 모델이 가짜 거리 주소와 가격을 만들어냈습니다. 따라서 작은 모델들은 문장화에는 능하지만 결정하는 데는 취약하므로, 결정은 코드에 맡겼습니다.
제가 직접 테스트한 내용 중 발견된 문제들
저는 플래너의 출력을 6가지 테스트 케이스(tests/results-v1.txt)에 대해 저장하고, 사용자가 보는 것처럼 읽어보았습니다. 그 결과 세 가지 버그가 발견되었습니다: '발코니에서 식물...'과 '가방 안에서'라는 문구가 잘못 읽히는 문제, 녹색 잎 채소(leafy greens)와 관련 없는 카드에 낮은 신뢰도의 메모가 나타나는 문제, 그리고 출처 목록에 카드에 언급되지 않은 작물이 포함된 문제였습니다. 저는 이 세 가지를 모두 수정하고 테스트 케이스를 추가한 후, 수정된 출력을 results-v2.txt로 저장했습니다. 또한 Windows에서 Backboard를 호출할 때 발생하던 TLS 인증서 오류도 인증서 확인을 끄지 않고 해결했습니다.
Open Innovation이 중요한 이유?
- 작은 모델(small model)은 제 개인 노트북에서 실행되므로 인터넷 연결, API 키가 필요 없고 카드당 비용이 들지 않습니다.
- 모델이 사실을 지어내는 것을 막는 가드(guard)를 포함하여 모든 부분을 읽고 테스트하며 변경할 수 있습니다.
- 노트북 모델에서 호스팅되는 모델로 전환하는 것은 재작성(rewrite)이 아니라 설정 변경(setting) 하나였습니다. 폐쇄된 API를 사용했다면 한 공급업체의 모델에 묶였을 것입니다.
- 솔직한 한계: 생성된 카드 텍스트만 호스팅 모델로 전송되며, 사용자가 입력하는 내용은 절대 전송되지 않습니다. 이 기능은 라고스(Lagos)와 네 가지 작물 그룹을 다룹니다. 식재 날짜는 의견이 다른 공공 출처에서 가져오므로, 앱은 사용자에게 지역 연장 담당관(local extension officer)과 확인하도록 안내합니다.
수상 부문
- Render의 최적 활용: 이 앱은 Render에 호스팅되어 있습니다.
- Backboard의 최적 활용: 라이브 사이트는 하나의 Backboard API 키를 통해 호스팅된 모델을 호출합니다.
https://dev.to/challenges/hacktoberfest-week1-2026-10-05
제가 만든 것
데모
코드
구현 방법
Open Innovation이 중요한 이유?
제 에이전트 세션
수상 부문
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기