아이타르 코타 (Aitar Kotha): 할머니가 식물 이름을 알려주는 방식으로 오픈 모델을 파인튜닝하다
요약
이 글은 아삼(Assam) 지역 식물에 대한 현장 안내서 앱 'Aitar Kotha'를 개발한 과정을 소개합니다. 이 앱은 오픈 비전 모델과 LLM을 활용하여 사진 인식, 현지어 질의응답, 계절 정보 제공 등 할머니가 알려주시는 듯한 방식으로 작동하며, 사용자에게 몰입감 있는 학습 경험을 제공합니다.
핵심 포인트
- 오픈 비전 모델로 식물 이미지를 인식하고 분류합니다.
- 현지 언어(아삼어)와 영어로 질의응답이 가능합니다.
- 계절별 정보 및 컬렉션 시스템으로 사용자 참여를 유도합니다.
- ElevenLabs 키를 사용해 음성 안내 기능을 구현했습니다.
이 글은 Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass에 제출하는 내용입니다.
제가 개발한 기능
ChatGPT에게 _Ziziphus mauritiana_가 무엇인지 물어보면 "인도주베(Indian jujube)"라는 답변을 얻게 됩니다. 하지만 저희 할머니(Aita)께 여쭤본다면 বগৰী, bogori와 함께 사라스와티 푸자(Saraswati Puja) 전에 먹지 말라는 경고, 그리고 가시가 안쪽으로 휘어져 있으니 나무 바깥쪽에서 따야 한다는 상기시켜주는 답변을 듣게 됩니다.
이 두 번째 답변이야말로 저희의 현장 안내서들이 다른 사람을 위해 쓰여질 때 잃어버리는 것입니다. 그래서 저는 **Aitar Kotha (আইতাৰ কথা, "할머니의 이야기")**를 만들었습니다. 이 앱은 아삼(Assam) 식물에 대한 현장 안내서 역할을 하며, 마치 아삼 할머니가 알려주시는 방식대로 답변합니다. 그리고 매번 사용자가 휴대폰을 주머니에 넣고 나가서 그 식물을 찾아보라고 말해줍니다.
- 📷 할머니에게 잎사귀를 보여주세요. 오픈 비전 모델(open vision model)이 사진 속에서 식물을 인식하여 골라냅니다.
- 🗣️ 또는 이름으로 물어보세요: bogori, sewali, ou tenga 또는 아삼어 문자로 입력할 수 있습니다.
- 🌾 "지금 제철입니다(In season now)" 기능은 이 아삼 달에 무엇을 찾아봐야 하는지 알려줍니다 (제가 글을 쓰는 지금은 카티(Kati)이며, 세왈리 꽃, 암로키와 로밥 텐가 등이 해당됩니다).
- অ 모든 것이 영어 또는 অসমীয়া로, 한 번의 터치만으로 작동합니다.
- ⭐ 외부에서만 얻을 수 있는 성취: 카메라로 스캔하는 식물마다 배지(badge)를 받습니다. 텐가르 돌(테ঙাৰ দল, 신맛이 나는 것들)이나 비후르 가차(বিহুৰ গছ, 비후 꽃) 같은 컬렉션은 총 43가지 항목에 걸쳐 **아이타르 타라(আইতাৰ তৰা, Aita's Star)**를 완성합니다.
- 🔊 듣기 · Listen. ElevenLabs 키를 사용하여 할머니가 아삼어로 카드를 소리 내어 읽어주기 때문에 화면을 전혀 볼 필요가 없습니다.

데모 (Demo)
실제 파인튜닝된 할머니(Aita)와 제 노트북에서 구동되는 실제 Gemma를 사용하여 녹화한 두 가지 내레이션 워크스루입니다:
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
- ▶️ Demo in English (1:05)
- ▶️ অসমীয়াত, Assamese어, in Assamese (0:58), 앱 전체가 Assamese어로 전환됨
두 데모 모두 Meta의 오픈 MMS-TTS 모델을 사용하여 내 노트북에서 구동되었으며, 이 모델은 Assamese 음성을 사용합니다. 나레이션 자체도 오픈 소스입니다.
데모를 사용해 보세요: https://jemankalita.github.io/aitar-kotha/ (휴대폰에서 영어 또는 অসমীয়া로 작동). 라이브 데모는 가족의 기록을 바탕으로 답변하며, 오픈 AI(파인튜닝된 Aita 및 사진 스캔)는 사용자가 직접 실행할 때 구동됩니다. 이것이 핵심입니다: 당신 가족의 지식을 당신 자신의 기기에서 활용하는 것입니다.
코드
GitHub logo jemankalita / aitar-kotha
아이타르 코타(Aitar Kotha): 할머니가 알려주는 방식의 Assamese 식물 안내서. 파인튜닝된 오픈 모델 (Tinker + Qwen), 오프라인 우선, 이중 언어 지원, 배지 포함. Hacktoberfest Open-Source AI Challenge Week 1.
아이타르 코타 · Aitar Kotha
Assam의 식물들, 할머니(Aita)가 알려주던 방식대로. 휴대폰을 식물에 비추거나 이름을 말하기만 하면, Assamese 가족 식물 지식으로 파인튜닝된 작은 오픈 가중치 모델이 마치 Assamese 할머니처럼 답변합니다:
보고리 — bogori (Indian jujube, Ziziphus mauritiana) 작고 뾰족한 나무로, 작고 반짝이는 타원형 잎을 가지고 있습니다... 소금과 고추와 함께 생으로 먹거나, 겨울 햇볕에 말린 새콤달콤한 보고리 아차리로 만듭니다. 많은 가족들은 사라스와티 푸자(Saraswati Puja)가 끝날 때까지는 보고리를 먹지 않도록 아이들에게 이야기합니다... 이제 휴대폰을 내려놓고 직접 찾아보세요.
Hacktoberfest Open-Source AI Challenge, Week 1: Touch Grass를 위해 제작되었습니다.
라이브 데모: https://jemankalita.github.io/aitar-kotha/. 이 데모는 브라우저 내의 가족 노트(이름, 계절, 영어 ⇄ 오삼이야어, 성과)를 기반으로 답변합니다. open AI, 즉 파인튜닝된 Aita와 사진 스캔은 직접 실행할 때 작동합니다 (아래). 요점은 여러분의…
구축 과정 (How I Built It)
1. 지식 출처는 인터넷이 아닌 가족으로부터 온다
data/plants.json에는 제가 아는 대로 43가지 식물이 담겨 있습니다: 오삼이야어 표기 및 로마자, 영어 및 학명, 계절, 식물 인식 방법, 사용법, 이야기 하나, 그리고 경고입니다. data/plants_as.json에는 같은 노트가 오삼이야어로 담겨 있습니다.
아삼 지역의 식물 지식은 웹에 있는 것이 아니라 대화 속에 존재합니다. 덤불을 가리키며 Aita가 말하는 내용이나 비후(Bihu) 때 어떤 잎이 어느 요리에 들어가는지에 있습니다. 책들은 저에게 학명은 주었지만, 사용법, 이야기, 경고는 오직 가족만이 가진 부분입니다. 따라서 모든 항목에는 verified 플래그가 포함되어 있으며, 앱은 아직 false인 카드에는
저는 이 메모들을 383개의 연습 대화로 만들고 Tinker에서 Qwen3.5-4B 모델을 LoRA 방식으로 파인튜닝했습니다. 이 파인튜닝은 Aita의 답변에만 학습하며, 답변 패턴은 항상 동일합니다: 아삼어 이름 먼저 말하기, 식물을 알아보는 법 설명하기, 가족들이 어떻게 사용하는지 알려주기, 이야기 하나 들려주기, 위험 요소 언급하기, 그리고 마지막으로 _"이제 휴대폰 내려놔."_라고 말하는 것입니다. 또한 저는 이 모델이 아삼 출신이 아닌 식물에 대해서는 "모르겠어요(I don't know)"라고 말하도록 훈련시켰고, 절대 확실하게 이름 지을 수 없는 것을 먹으라고 누구에게도 말하지 않도록 했습니다.
training_client = service.create_lora_training_client(base_model="Qwen/Qwen3.5-4B", rank=32)
renderer = get_renderer("qwen3_5", training_client.get_tokenizer())
data = [conversation_to_datum(c, renderer, max_length=2048,
...
그런 다음 저는 두 모델 모두를 모델이 한 번도 본 적 없는 172개의 질문에 테스트했습니다. 이 질문들은 학습 때와 다르게 표현되었습니다 (예: "Koka가 오늘 bogori를 찾아보라고 했어요. 이게 뭐예요?", 또는 বগৰীৰ বিষয়ে কোৱাচোন।):
| Base Qwen3.5-4B | Aita (파인튜닝됨) | |
|---|---|---|
| 아삼어 문자 이름 | 31% | 77% |
| ... |
학습 과정은 96 스텝(LoRA rank 32, 383개 채팅에 걸친 4 에포크)이었으며, 손실 값(loss)은 31.1에서 약 0.5로 떨어졌습니다. 이 테스트 동안 두 모델 모두 가족 메모를 얻지는 못했습니다: 이것은 오직 가중치(weights)가 학습한 내용일 뿐입니다.
제가 가장 좋아하는 예시는 다음과 같습니다: _"Koka가 오늘 sewali를 찾아보라고 했어요. 이게 뭐예요?"_라고 질문했을 때, 기본 Qwen 모델은 소리 내어 추론하기 시작하며 잘못된 식물인 _Sesbania grandiflora_를 추측했습니다. 반면 Aita는 শেৱালি, sewali (밤에 피는 재스민, Nyctanthes arbor-tristis)입니다. 새벽에 덤불 밑을 보세요: 땅바닥을 밝은 주황색 관이 깔린 작은 흰 꽃들이 있습니다. 라고 답변했습니다.
솔직한 단점(caveats)도 있습니다: 답변 길이는 400 토큰으로 제한되었고, 기본 모델은 많은 부분을 소리 내어 생각하는 데 사용하기 때문에 점수가 다소 비관적입니다. 그리고 Aita 역시 기억력만으로는 완벽하지 않습니다: 메모 없이 bogori에 대해 질문했을 때, 이름과 계절 및 용도는 정확하게 얻었지만 다른 나무의 껍질을 설명했습니다. 이것이 이 앱이 항상 가족 메모를 함께 제공하는 이유입니다.
사진 스캔, 솔직히 말해서
Gemma 3 (4B)는 제 노트북의 4GB GPU에서 실행되며, 사진 한 장당 약 2025초가 걸립니다. 테스트용 사진 6장 중 4장을 맞혔습니다: 세왈리(sewali), 툴시(tulsi), 스타 프루트(star fruit), 오 텐가(ou tenga), 그리고 물 시금치(water spinach)는 각각 최소 한 번씩 식별되었습니다. 잘못된 경우에도 자체 보고 신뢰도는 95100%였습니다. 그래서 저는 그 숫자를 믿지 않습니다. 배지는 스캔 후에만 나타나고, Aita는 확신하지 못할 때 그렇게 말합니다.
3. 워킹 앱
작은 FastAPI 서버와 휴대폰 우선 웹 앱입니다. 파인튜닝된 모델에 접근할 수 없을 때는 이 앱이 가족 노트에서 직접 답변하며, 서비스 워커(service worker)가 해당 노트를 휴대폰에 보관하여 신호가 없는 트레일에서도 이름으로 질문할 수 있게 합니다. 사진은 휴대폰에서 다운스케일링되며, 비전 모델에 도달하기 전에 실제 파일 유형이 확인됩니다.
오픈 소스가 중요한 이유
- 조부모님의 지식을 활용해 폐쇄형 모델을 파인튜닝하고 그 결과를 유지할 수 없습니다. 여기서는 가중치(weights)가 저의 것입니다: 제가 직접 노트북에서 Ollama로 실행할 수 있는 몇 메가바이트 크기의 어댑터입니다.
- 작은 언어는 '충분히 비슷함'보다 더 나은 것을 받을 자격이 있습니다. 아삼어 식물 이름, 민속적 용도, 그리고 비후(Bihu) 풍습에 대한 정보는 웹상에 부족하며, 이는 일반 모델들이 추측하는 바로 그 지점입니다. 오픈 모델을 사용하면 실제 이름을 가르치고 그것을 학습했는지 테스트할 수 있습니다.
- 클라우드 없이 작동합니다. 노트, 앱, 그리고 내보낸 모델 모두 오프라인에서 작동하므로, 어디를 걷든 휴대폰을 벗어나는 것은 아무것도 없습니다.
- 유일하게 폐쇄적인 부분에 대한 솔직한 고백: 아삼어 음성은 ElevenLabs를 사용합니다. 이는 선택 사항이며, 키가 없으면 '듣기(Listen)' 버튼 자체가 나타나지 않습니다.
야외 활동을 위해 제작됨
이 앱은 화면이 걷는 행위에서 가장 짧은 부분이 되도록 설계되었습니다:
- 답변은 당신을 보내며 끝난다. Aita의 모든 답변은 항상 '이제 휴대폰을 치우세요(now put the phone away)'로 끝나고, 무엇을 찾아봐야 하는지 알려줍니다: 구부러진 가시, 냄새, 꽃관의 색깔 같은 것들입니다.
- 배지는 카메라에서만 얻는다. 이름을 타이핑하는 것은 무언가를 배우게 하지만, 배지를 얻는다는 것은 식물 앞에 서서 사진을 찍었다는 것을 의미합니다.
- 신호가 없어도 작동한다. 서비스 워커가 43개 식물의 모든 기록을 휴대폰에 보관하고 있기 때문에, 네트워크가 없는 바리(bari)나 연못에서도 이름으로 질문하는 것이 가능합니다.
- 말할 수 있다. ElevenLabs 키를 사용하면 '듣기(Listen)' 기능이 아삼어(Assamese)로 카드를 소리 내어 읽어주므로, 휴대폰을 주머니에 넣은 채로 다닐 수 있습니다.
저는 삽화가 아닌 식물의 실제 사진으로 스캔 테스트를 진행했습니다: 툴시(tulsi), 세왈리(sewali), 스타 과일(star fruit), 오 텐가(ou tenga), 그리고 물 시금치(water spinach)는 모두 제 노트북에서 실행되는 Gemma에 의해 적어도 한 번은 인식되었으며, 솔직히 놓친 부분들은 위에 있는 섹션에 있습니다. 이 오픈 모델 덕분에 서버에 연결할 필요도 없고 어디를 걸었는지 기록을 남길 필요도 없이 휴대폰만 가지고 산책하는 것이 가능해졌습니다.
다음 계획 (What's next)
- 더 많은 식물과 아삼 지역의 다른 커뮤니티들이 사용하는 이름들(Bodo, Mising, Karbi 등)
- 어르신들이 각 이야기마다 자신의 목소리를 녹음할 수 있도록 하기
- 휴대폰 없이 산책을 할 수 있는 인쇄 가능한 주머니 카드
지나가며 읽은 것 (What I read along the way)
수상 부문
- Tinker 활용 최우수: Tinker LoRA로 파인튜닝한 Qwen3.5-4B를 Aita에 적용했습니다 (대화 383회, 단계 96회). 미지 질문 172개에 대해 평가했을 때, 아삼어(Assamese) 문자로 된 이름의 정확도가 31%에서 77%로 향상되었습니다.
- Gemma 활용 최우수: Gemma 3 (4B)를 사용하여 사진 스캔을 진행했으며, 이 모든 과정은 Ollama를 통해 제 노트북에서 완료했습니다.
- GitHub Copilot 활용 최우수: VS Code에서 Copilot을 사용해 전체 코드베이스를 작성했습니다.
저의 페어 프로그래머(pair programmer)로 Github Copilot을 사용하여 제작되었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기