Hacktoberfest 2026, Week 1: 풀밭을 밟기 (Touch Grass)
제가 시도해 본 모든 작물 진단 앱들은 현장에 신호가 있다고 가정합니다. 하지만 서아프리카의 많은 지역에서는 그렇지 않습니다. 가장 가까운 마을에서 한 시간 떨어진 옥수수밭에 서 있는데, 잎사귀에는 이상한 줄무늬가 있고, 도움을 주어야 할 앱은 로딩 스피너에 멈춰 있습니다.
그래서 저는 Gona를 만들었습니다. 이는 하우사어(Hausa)로 '농장'이라는 뜻입니다. 버튼 하나를 누르고 자신이 보고 있는 것을 말하면, 무엇이 잘못되었는지와 어떻게 해야 하는지 알려줍니다. 신호가 필요하지 않으며, 휴대폰을 벗어나가는 정보도 없습니다.
Gona app main screen
이미 밖에 있는 사람들을 위해 제작되었습니다
이번 주 주제는 사람들이 화면에서 벗어나는 것에 관한 것입니다. 농부들은 이미 화면에서 벗어나 자신들의 밭을 거닐고 있습니다. 그래서 저는 이 앱이 가능한 한 작은 방해 요소가 되도록 만들려고 노력했습니다: 말하기, 듣기, 휴대폰 주머니에 넣기. 피드도 없고, 계정도 없고, 대시보드도 없습니다. 기본적으로 식물을 보면서 나누는 대화입니다.
오프라인 기능은 추가 기능이 아니라 핵심 목표입니다. 작물이 아파지는 곳과 제대로 된 커버리지를 가진 곳은 거의 겹치지 않기 때문에, 인터넷 연결을 필요로 하는 앱은 가장 도움이 필요한 사람들에게 실패합니다.
오픈 소스 AI
Gona에 있는 유일한 신경망(neural network)은 Cactus Compute의 16.9MB 오픈 가중치 음성-텍스트 변환 모델인 Whistle입니다 (Apache 2.0). 이는 WebAssembly로 브라우저 탭에서 실행됩니다. 첫 방문 후, 서비스 워커가 앱, 지식 기반 및 모델 런타임을 캐시합니다. 음성 가중치 17MB는 처음 사용할 때 한 번 다운로드하면 됩니다. 그 이후에는 라디오를 끌 수 있습니다.
여기서 오픈(Open)은 실용적인 이유로 중요합니다:
- 인터넷 연결 없이 작동합니다. 모델이 장치 자체에 탑재됩니다. API 키도, 계정도, 요청당 비용도 없습니다.
- 장치를 벗어나는 것이 없습니다. 사용자의 목소리, 작물 정보, 위치가 서버로 전송되지 않습니다. 정적 빌드에는 서버가 없기 때문입니다.
- 운영 비용이 전혀 들지 않습니다. 추론(inference) 비용이나 구독료가 없습니다. 정적 사이트이기 때문에 호스팅도 무료입니다.
- 모든 것을 읽고 수정할 수 있습니다. 음성 모델은 오픈 웨이트(open weight)이며, 엔진은 오픈 소스이고, 지식 베이스는 JSON 파일로 되어 있습니다. 만약 항목에 오류가 있다면 텍스트를 직접 고칠 수 있습니다. 폐쇄형 모델로는 이런 시도를 해보기가 어렵습니다.
모델은 오직 듣기만 합니다. 진단은 사람이 합니다.
이 프로젝트에서 가장 좋은 설계 결정은 처음에는 잘못된 결과를 얻으면서 나온 것입니다. 저는 당연한 방법으로 LLM(대규모 언어 모델)을 담당하게 했습니다. 3B 모델은 20초 만에 자신감 넘치게 틀린 진단을 내렸습니다. 7B 모델은 같은 질문에 7분 이상이 걸렸습니다. 휴대폰에서 구동할 만큼 작은 모델은 서아프리카 작물 병리학 지식이 부족하며, 사람들의 생계와 관련된 자신감 넘치는 잘못된 조언은 아예 아무런 조언도 해주지 않는 것보다 더 위험합니다.
그래서 이 시스템의 구조는 의도적으로 한쪽으로 치우쳐 있습니다:
voice -> Whistle (16.9MB, 음성-텍스트 변환(speech to text), 브라우저에서 작동)
-> symptom matcher (지식 베이스에 대한 토큰 중복 매칭)
-> 답변, 장치 자체의 목소리로 읽어줌
Whistle는 오직 한 가지 임무만 가집니다. 사용자가 말하는 것을 듣는 것입니다. 그 이후 모든 과정은 제가 출판된 식물 병리학 및 농업 기술 자료(CABI, IITA, APS)에서 가져온 11가지 조건에 대한 조회입니다. 각 항목은 출처를 인용하고 증상, 흔히 혼동되는 질병, 발생하기 쉬운 조건, 치료 단계, 그리고 긴급도 수준을 나열합니다.
조회(lookup)는 환각(hallucinate)을 일으킬 수 없으며 빠릅니다. 만약 사용자의 설명이 어떤 것과도 일치하지 않으면, Gona는 추측하는 대신 그렇게 말합니다. 이것은 의도된 것입니다. 사람들의 작물에 대한 조언이기 때문에, 중요한 순간에는 지역 농업 기술 서비스(local extension service)를 통해 확인해 보라고 알려줍니다.
이것이 제가 open beat을 사용하게 된 계기입니다. 폐쇄형 API를 사용했다면 더 큰 모델과 매달 청구되는 비용이 발생했을 것이고, 그럼에도 불구하고 그 모델은 훈련 데이터에 해당 지식이 없었기 때문에 카사바 모자이크병(cassava mosaic disease)과 영양 결핍을 구분하지 못했을 겁니다. 오픈 소스로 전환하면서 저는 이 지식을 마땅히 있어야 할 곳, 즉 출처가 첨부된 인간이 작성한 파일 안에 넣을 수 있게 되었습니다.
포함 범위
아홉 가지 작물: 옥수수(maize), 수수(sorghum), 조(millet), 쌀(rice), 카사바(cassava), 토마토(tomato), 오크라(okra), 강낭콩(cowpea), 땅콩(groundnut). 그리고 가을 군대벌레(fall armyworm), 스트리가(Striga), 카사바 모자이크병, 땅콩 로제트(groundnut rosette), 세균성 시들음병(bacterial wilt), Tuta absoluta를 포함한 열한 가지 질병이 포함됩니다. 새로운 질병을 추가하려면 실제 출처가 있는 항목을 추가하고, 수정할 것이 있다면 텍스트를 편집하면 됩니다.
저는 농부가 실제로 말하는 방식, 즉 교과서적인 언어가 아닌 방식으로 작성된 12가지 현장 스타일 설명에 대해 매처(matcher)를 테스트했습니다. 이 테스트 스위트(test suite)는 모든 지식 기반 항목이 유효한지, 모든 인용(citation)이 해결되는지, 그리고 브라우저 매처와 서버 매처가 절대 어긋나지 않는지 확인합니다.
Gona diagnosis result for yellow streaks on maize leaves, matching fall armyworm
직접 사용해 보세요
실시간 데모: https://k1ng0mar.github.io/gona/
레포지토리(Repo): https://github.com/k1ng0mar/gona (MIT)
마이크가 연결된 실제 브라우저에서 사용할 때 가장 효과적입니다. 버튼을 누르고 아픈 식물을 소리 내어 설명한 다음, 그 결과에 귀 기울여 보세요. 그런 다음 비행기 모드를 켜고 다시 시도해 보세요. 두 번째 실행이 핵심적인 증거입니다.