이 글은 Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass에 제출하는 작품입니다.
내가 만든 것
식물은 방치해서 죽는 것이 아니라, 산만함 때문에 죽습니다. 일에 몰두하다 보면 시간이 흐르고, 몬스테라는 조용히 시들어버립니다.
Leafy는 바로 그 문제를 해결하기 위해 제작된 React Native (Expo) 앱입니다. 사용자가 소유한 모든 식물은 과학적 이름, 빛 요구량, 토양, 물 주기 일정, 그리고 반려동물 안전 배지 등의 정보가 담긴 프로필 카드를 갖게 됩니다. 각 카드에는 다음 급수 시간("내일 오전 09:30")이 표시되며, 이를 누르면 분갈이용 혼합토(potting mix), 번식 팁(propagation tips), 조명 가이드 등이 포함된 전체 관리 시트가 열립니다.
제가 가장 기대하는 부분은 바로 식물과 대화할 수 있다는 점입니다. 모든 카드에는 채팅 버튼이 있습니다. 답장은 식물 자체의 입장에서, 캐릭터를 유지하며 첫인칭으로 나옵니다. 이 기능은 자신의 종(species)을 알고 있으며, 다음 급수 시기가 언제인지, 그리고 현재 외부 날씨가 어떤지(실시간 온도 및 습도)까지 파악하고 있습니다. 건조하고 더운 오후에 뱀 식물(Snake Plant)에게 물이 필요한지 물어보면, 실제 일정과 환경 조건을 기반으로 답변합니다.
또한 "제 잎사귀가 노랗게 변하는 이유는 무엇인가요?"와 같은 질문을 위한 일반적인 식물학 보조 기능도 있으며, 실시간 날씨 위젯은 온도와 습도를 관리 조언으로 변환해줍니다. 공기가 건조할 때는 분무(mist)를 하도록, 폭염 시기에는 그늘에 두도록, 추운 기간에는 물을 덜 주도록 안내합니다.
스크린에서 벗어나게 만드는 방법
Leafy는 화면이 경험의 가장 짧은 부분일 수 있도록 설계되었습니다. 목표는 1분 이내로 확인하는 것입니다: 카드들을 흘깃 보고, 날씨 조언을 읽고, 식물의 목소리를 듣고, 그 후 손으로 실제 흙을 만지러 가는 것입니다. 식물에 관한 앱이 성공하려면 사용자가 앱을 닫고 실제로 있는 식물 쪽으로 걸어가야만 합니다.
코드
🌿 Leafy - AI 식물 관리 및 실시간 식물학 동반자
Leafy (Grass_project1)는 React Native와 **Expo (SDK 57)**로 구축된 현대적이고 크로스 플랫폼 모바일 애플리케이션입니다. 이 앱은 Google Gemini AI의 대화형 지능, 실시간 대기 기상학 날씨 정보, 그리고 포괄적인 식물 관리 시스템을 결합하여 사용자가 건강하고 무성하게 식물을 키우도록 돕습니다.
🌟 주요 기능
1. 🤖 대화형 식물 챗봇 (역할극 AI)
- 실제 식물과 직접 대화: 라이브러리에 있는 모든 식물에는 상호작용적인 채팅(Chat) 버튼이 있습니다.
- 1인칭 역할극 페르소나: Google Gemini에게 선택된 실내 식물(예: Monstera Deliciosa, Snake Plant, Peace Lily)의 입장에서 갈증 정도, 햇빛 필요량, 잎 건강 등에 대해 이야기하도록 지시합니다.
- 일정 기반 대화: 식물은 대화 중 다가오는 물 주기 날짜와 특정 관리 지침을 언급합니다.
- 날씨 인식 응답: 식물은 실시간 온도 및 대기 습도 업데이트를 받아 현재 환경 조건을 자연스럽게 답변에 녹여냅니다.
2. 💬
…
GitHub에서 보기
구축 과정
레이어 기술
앱 React Native + Expo (SDK 57), JavaScript
언어 모델
날씨 Open-Meteo (오픈 소스 날씨 API, 키 필요 없음)
위치 GeoJS IP 지리 위치 파악 또는 수동 도시 선택기
저장소 expo-sqlite, expo-file-system
expo-haptics, 애니메이션 드로어, 키보드 인식 채팅 기능 사용
식물 페르소나
각 채팅 턴은 다음 세 가지 요소로부터 프롬프트를 구성합니다:
- 식물 프로필: 종(species), 빛, 토양 및 물 주기 빈도.
- 일정: 계산된 다음 물 주기 날짜. 이를 통해 식물은
모델에게 1인칭으로 답변하고, 캐릭터를 유지하며, 답변을 짧게 하도록 지시했습니다. 실제 데이터에 근거하도록 함으로써 구체적으로 말할 것이 생기고, 작은 모델이 이 부분에 능합니다.
모든 것을 모델로 할 필요는 없다
날씨 경보 시스템은 LLM(대규모 언어 모델) 출력이 아니라 단순한 임계값 규칙입니다. 습도가 낮으면 분무를 제안하고, 폭염일 때는 식물을 보호하며, 추울 때는 물을 덜 주도록 합니다. 이러한 규칙들은 즉각적이고, 무료이며, 예측 가능하고, 테스트하기 쉽습니다. 저는 모델은 실제로 잘하는 것, 즉 대화에만 남겨두고 나머지는 일반 코드로 처리했습니다.
폐쇄형 API에서 오픈 모델로 전환하기
Leafy의 첫 버전은 채팅을 위해 폐쇄형 호스팅 API를 사용했습니다. 이것도 작동했지만, 사용자 제공 API 키가 필요했고 모든 대화를 제3자에게 전송해야 했기 때문에 저는 [실제로 수행한 내용을 기술: 예: 앱이 Gemma를 실행하는 로컬 Ollama 서버와 통신하도록 프로바이더 계층을 재작성]했습니다.
모든 모델 접근이 하나의 백엔드 서비스(backend/geminiService.js, backend/config.js에 구성)에 존재했기 때문에 변경 사항이 조금 달라서 이 아이디어를 생각해 내야 했습니다.
오픈 혁신은 왜 중요할까요?
키도 없고, 청구서도 없습니다. 제 첫 버전은 앱에 개인 API 키를 붙여넣어야 했고, 이는 일반적인 식물 취미가에게 실제 장벽이었습니다. 로컬 오픈 가중치 모델을 사용하면 등록할 필요가 전혀 없으며, 실행 비용은 전기료 외에는 들지 않습니다.
당신의 집은 당신의 것입니다. 식물과의 대화는 들리는 것보다 더 개인적입니다: 어디에 사는지, 창턱에 무엇이 있는지, 집에 없을 때 어떤 상황인지 등이 포함됩니다. 제가 통제하는 하드웨어에서 모델을 실행하면, 그 대화가 제가 통제하지 않는 서버로 전송되지 않습니다.
저는 프롬프트뿐만 아니라 모델 자체도 변경할 수 있습니다. 페르소나 채팅은 모델에 민감합니다. 같은 프롬프트를 사용하고 식물 상태가 가장 좋게 들리는 모델을 선택해 보세요. 폐쇄형 API의 경우, 엔드포인트 뒤에 있는 모델은 다른 사람의 결정이며, 당신 모르게 바뀔 수 있습니다.
솔직한 트레이드오프. 짧고 근거 있는 식물 대화를 위해.
저의 에이전트 세션
저는 코딩 에이전트인 Antigravity를 사용하여 Leafy를 만들었습니다.
수상 부문