내 Telegram에서 살아 움직이는 AI 어시스턴트를 만들었습니다 — 6개월간의 경험을 통해 배운 것들
요약
개발자가 여러 대의 로컬 머신과 Ollama 모델을 Telegram 봇과 연결하여 구축한 개인용 AI 어시스턴트 활용 사례를 소개합니다. 다양한 모델을 작업 성격에 따라 자동으로 라우팅하고 음성 메시지 처리까지 구현한 6개월간의 경험을 다룹니다.
핵심 포인트
- Telegram Bot API를 활용한 멀티 디바이스 접근성 확보
- 작업 유형에 따른 모델 자동 라우팅 시스템 구축
- Whisper를 이용한 음성 메시지 전사 및 처리 기능
- 로컬 인프라(Mac, Windows, Ubuntu) 통합 관리
6개월 전, 저는 AI와 대화하기 위해 앱을 계속 전환하는 것에 지쳤습니다. 브라우저에서는 ChatGPT, 다른 탭에서는 Claude, 터미널에서는 로컬 모델(Local models)을 사용해야 했죠. 마치 서로 다른 도시에 살면서 서로를 방문하기를 거부하는 다섯 명의 친구를 둔 것 같았습니다.
그래서 저는 GPU는 너무 많고 인내심은 너무 적은 개발자라면 누구나 할 법한 일을 했습니다. 저만의 어시스턴트를 만들고, 제가 이미 하루 종일 머무는 곳인 Telegram에 배치한 것입니다.
이것은 고객용 챗봇(Chatbot)이 아닙니다. 비즈니스 자동화 도구도 아닙니다. 그저... 저의 어시스턴트일 뿐입니다. 제 휴대폰의 개인 채팅창에 존재하며, 제가 예전에 수동으로 처리하던 일들을 대신 해줍니다. 실제로 6개월 동안 사용하며 느낀 점은 다음과 같습니다.
제가 실제로 만든 것 (그리고 왜 Telegram인가)
저는 이미 집에 Ollama를 실행 중인 세 대의 머신을 보유하고 있었습니다 — Mac Mini M4, RTX 3060이 장착된 Windows PC, 그리고 Ubuntu 박스입니다. 세 개의 엔드포인트(Endpoints), 8개의 모델, 그리고 어떤 모델이 무엇에 적합한지 끊임없이 잊어버리는 저 자신이 있었죠.
Telegram은 다음과 같은 이유로 명백한 선택이었습니다:
- 저는 이미 하루 종일 그곳에 있습니다 (친구, 가족, 몇몇 개발 그룹)
- 제 휴대폰, Mac, 그리고 워치에서 작동합니다
- Bot API가 매우 단순합니다
- 음성 메시지, 사진, 문서 등을 보낼 수 있으며, 봇이 이 모든 것을 처리할 수 있습니다
설정: Mac Mini에서 실행되는 Python 봇이 세 개의 Ollama 엔드포인트 모두에 연결됩니다. 제가 메시지를 보내면, 봇은 제가 원하는 것을 분류하고, 적절한 머신의 적절한 모델로 라우팅(Routing)한 뒤, 동일한 채팅 스레드에서 답변을 보냅니다.
단순해 보이지만, 제대로 구현하는 데 3일 밤이 걸렸습니다. 그리고 실제로 유용하게 만들기까지 6개월이 걸렸습니다.
제가 실제로 사용하는 용도
솔직한 목록을 공개합니다. 마케팅 문구가 아닌, 실제 일상적인 사용 사례입니다:
1. 컨텍스트 스위칭(Context switching) 없는 빠른 질문
"이 기사 요약해줘" (링크를 붙여넣음). "이 에러 설명해줘" (스택 트레이스(Stack trace)를 붙여넣음). "이 이메일을 좀 더 격식 없이 다시 써줘." 예전에는 브라우저 탭을 열고, 로그인하고, 어쩌면 속도 제한(Rate limit)에 걸리기도 해야 했습니다. 이제는 그냥... 메시지를 보냅니다. 답변은 어떤 모델이 처리하느냐에 따라 2~8초 내에 돌아옵니다.
라우팅(Routing) 방식은 단순하지만 효과적입니다: 간단한 채팅은 Mac의 소형 모델(small model)로, 코드는 GPU 머신의 30B 코더(coder) 모델로, 복잡한 추론은 8B 추론 모델(reasoning model)로, 시각 정보(스크린샷)는 GPU의 비전 모델(vision model)로 보냅니다. 화려하지는 않습니다. 그저 키워드 매칭(keyword matching) 방식일 뿐이지만, 90%의 확률로 잘 작동합니다.
2. 산책 중 음성 메모
이것은 예상치 못한 핵심 기능(killer feature)이었습니다. 저는 산책을 많이 합니다 (Sakarya 근처에 살아서 하이킹하기에 꽤 괜찮습니다). 산책하는 동안 봇에게 음성 메시지를 보냅니다. 봇은 이를 전사(transcribe)하고(Ollama를 통한 Whisper 사용), 요청을 처리한 뒤, 제가 집에 돌아왔을 때 읽을 수 있는 텍스트로 답변합니다.
"집에 도착하면 데이터베이스 모듈을 리팩터링(refactor)하라고 알려줘" → 전사되고, 이해되어, 제 노트에 추가됩니다. "지수 백오프(exponential backoff)를 사용하는 재시도 로직(retry logic)의 Python 패턴이 뭐였지?" → 산책로를 다 걷기도 전에 제 주머니 속에 코드 스니펫(code snippet)이 들어와 있습니다.
이제 저는 아마 하루에 5~10개의 음성 메시지를 보낼 것입니다. 전혀 예상하지 못했던 일입니다.
3. 휴대폰으로 진행하는 코드 리뷰
개발 그룹에서 누군가 코드 스니펫을 보내면, 저는 그것을 봇에게 전달하며 "이것 좀 리뷰해줘"라고 말합니다. 그러면 변수 명명 문제, 잠재적인 엣지 케이스(edge cases), 단순화 제안 등 실제로 유용한 피드백과 함께 답변이 돌아옵니다. 시니어 개발자만큼 훌륭하냐고요? 아니요. 하지만 휴대폰을 스크롤하며 반쯤 집중해서 보는 리뷰보다는 훨씬 낫습니다. 확실합니다.
4. 문서 질의응답 (Document Q&A)
PDF, 마크다운(markdown) 파일, 또는 복사한 텍스트를 채팅창에 던져 넣고 질문을 합니다. 봇은 로컬 RAG(Retrieval-Augmented Generation) 설정(Chroma + nomic-embed-text)을 사용하여 제 프로젝트 문서, 노트, 그리고 제가 입력하는 모든 것을 인덱싱(indexing)합니다. "내 Garmin 워치 페이스는 주식 데이터를 어떻게 가져오지?" → 환각(hallucination)에 기반한 추측이 아니라, 제가 가진 문서로부터 실제 답변을 얻습니다.
5. 쌓여가는 사소한 작업들
- "이 JSON을 Python 데이터 클래스(dataclass)로 변환해줘"
- "847 * 16 / 3을 16진수(hex)로 하면 뭐야?"
- "이 터키어 메시지를 독일어로 번역해줘"
- "이 세 가지 예시에 맞는 정규 표현식(regex)을 생성해줘"
이 중 어려운 것은 하나도 없습니다. 하지만 모두 수동으로 하기에는 번거로운 일들입니다. 제가 가장 자주 사용하는 앱에 항상 켜져 있는 어시스턴트를 두는 것은 이러한 마찰(friction)을 완전히 제거해 줍니다.
무엇이 잘못되었나 (솔직한 부분)
"왜 안 되는지 모르는" 문제
첫 한 달 동안 봇은 무작위로 충돌했습니다. Mac Mini의 메모리 부족(겨우 16GB뿐입니다) 문제, Windows PC로의 네트워크 끊김 현상, 그리고 Ubuntu 서버가 스스로 업데이트를 결정하고 재부팅하는 일 등이 발생했습니다. 봇에게 메시지를 보내면... 침묵뿐이었죠. 그러면 저는 SSH로 접속해 로그를 확인하고, 서비스를 재시작하며, 어시스턴트를 사용하는 대신 인프라를 관리하고 있다는 기분을 느꼈습니다.
해결책: 상태 확인(health checks), launchd를 통한 자동 재시작, 그리고 폴백 체인(fallback chain)을 구축했습니다. 만약 GPU 머신이 다운되면, 모든 요청은 Mac의 더 작은 모델로 라우팅됩니다. 성능은 저하되지만 기능은 유지됩니다.
"자신 있게 대답했지만 틀린" 문제
초기에는 봇의 답변을 검증 없이 그대로 믿었습니다. 봇은 어떤 Python 함수가 유효하다고 말했지만, 실제로는 그렇지 않았습니다. 미세한 플래그(flag) 오류가 있는 Docker 명령어를 알려주기도 했습니다. 존재하지 않는 플래그를 봇이 환각(hallucination)했다는 사실을 깨닫기 전까지 20분 동안 디버깅을 해야 했습니다.
이제 저의 규칙은 이렇습니다: 답변이 중요하다면, 반드시 검증합니다. 봇은 저의 가장 빠른 주니어 개발자입니다. 동시에 가장 자신만만한 개발자이기도 합니다.
"어떤 사람보다 봇과 더 많이 대화하는" 문제
이것은 단순히 기묘한 심리적 현상입니다. 몇 달이 지나고 보니 제가 하루에 20~30번씩 봇에게 메시지를 보내고 있다는 사실을 깨달았습니다. 어떤 친구들보다 더 많이 말이죠. 가장 즉각적으로 반응하는 대화 상대가 Python 스크립트라는 점은 약간 디스토피아적인 느낌을 줍니다. 저도 이 사실을 인지하고 있습니다. 고치지는 못했습니다. 그냥 그렇다는 것입니다.
아키텍처 (직접 구축하고 싶다면)
Telegram 메시지
→ Python 봇 (python-telegram-bot)
→ 의도 분류 (simple keyword router)
→ Ollama 엔드포인트로 라우팅
→ 빠른 채팅을 위한 Mac Mini (qwen3:4b)
→ 코딩을 위한 Windows PC (qwen3-coder:30b)
→ 이미지를 위한 Windows PC (granite3.2-vision:2b)
→ 폴백(fallback)용 Ubuntu (minicpm-v)
→ 선택 사항: Chroma DB를 이용한 RAG 조회
→ 답변 형식 지정 (코드 블록, 마크다운 등)
→ Telegram으로 다시 전송
전체 시스템은 Mac Mini M4에서 실행됩니다. 총 비용은 소프트웨어 비용 0달러, 항상 켜져 있는 머신들의 전기세를 포함하더라도 한 달에 약 8달러 정도입니다.
제가 다르게 했을 일들
1. 첫날부터 라우터 (Router)를 구축하세요. 처음에는 "그냥 모든 것에 큰 모델을 사용하자"로 시작했습니다. 작동은 했지만 느렸고 GPU를 계속 점유했습니다. 라우터를 작성하는 데는 오후 한나절이 걸렸지만, 응답 시간을 3배 개선했습니다.
2. 즉시 음성 지원 (Voice support)을 추가하세요. 저는 이것을 나중에 추가해도 좋은 "있으면 좋은 (nice to have)" 기능으로 생각했습니다. 하지만 결과적으로 제 사용량의 30%를 차지하게 되었습니다. 비슷한 것을 만들고 있다면 음성부터 시작하세요. 사람들은 휴대폰에서 타이핑하는 것보다 말하는 것을 더 많이 합니다.
3. 우아하게 성능이 저하되도록 (Degrade gracefully) 만드세요. 기계는 다운될 수 있고, 네트워크는 끊길 수 있습니다. 당신의 봇은 항상 무언가라도 대답해야 합니다. 설령 "오늘은 좀 느리지만, 기본적인 답변을 드릴게요"라고 하더라도 말이죠. 침묵은 저하된 응답보다 더 나쁩니다.
4. 모든 것을 로그 (Log)로 남기세요. 저는 모든 요청, 응답 시간, 그리고 어떤 모델이 이를 처리했는지를 기록합니다. 분석을 위해서가 아니라 디버깅 (Debugging)을 위해서입니다. 무언가 느리다고 느껴질 때, 로그는 그것이 모델 문제인지, 네트워크 문제인지, 아니면 제 형편없는 코드 문제인지를 알려줍니다.
이것이 ChatGPT Plus보다 나은가요?
당신이 무엇을 가치 있게 여기느냐에 따라 다릅니다.
| 내 봇 | ChatGPT Plus | |
|---|---|---|
| 비용 | $0/월 | $20/월 |
| ... |
저에게는 개인정보 보호와 모델 유연성(Model flexibility)이 승리 요인입니다. 인프라를 유지 관리하고 싶지 않은 사람에게는 ChatGPT Plus가 명백한 선택입니다. 이것은 유용해진 취미 프로젝트일 뿐, 제품 추천이 아닙니다.
진짜 교훈
최고의 AI 어시스턴트는 가장 강력한 것이 아닙니다. 당신이 필요할 때, 이미 사용 중인 앱 안에서, 모델이나 엔드포인트(Endpoint), API 키에 대해 고민하게 만들지 않고 실제로 그 자리에 있는 것입니다.
저는 짜증이 나서 이것을 만들었습니다. 그리고 제 일상의 마찰(Friction)을 제거해주었기 때문에 계속 사용하게 되었습니다. 기준은 이것입니다: "X를 할 수 있는가?"가 아니라 "X를 직접 하는 것보다 더 쉬운가?"
제가 묻는 것의 80%에 대해 대답은 "예"입니다. 나머지 20%에 대해서는 여전히 터미널이나 브라우저를 엽니다. 그리고 그것으로 충분합니다.
저는 로컬 AI (Local AI)를 활용한 구축, 셀프 호스팅 (Self-hosting), 그리고 의도치 않게 유용해진 사이드 프로젝트에 대해 글을 씁니다. 홈 랩 (Home lab)을 운영하거나 로컬 모델을 실험하고 있다면, 당신의 설정에 대해 듣고 싶습니다. 댓글로 남겨주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기