텔레그램 봇 LLM 연동 — Ollama로 나만의 AI 챗봇 만든 실전 후기 (2026)

텔레그램 봇 LLM 연동 — Ollama로 나만의 AI 챗봇 만든 실전 후기 (2026)

텔레그램 봇 LLM 연동 Ollama AI 챗봇 대화 화면

ChatGPT API는 쓸 때마다 돈이 나갑니다. 매달 수만 원씩 나가는 API 비용을 보면서 “로컬에서 LLM을 돌리고, 텔레그램으로 대화하면 공짜 아닌가?”라는 생각이 들었습니다. 그래서 직접 만들었습니다. 텔레그램 봇 LLM 조합으로 나만의 AI 챗봇을 — BotFather에서 봇을 만들고, Ollama로 로컬 LLM을 띄우고, 둘을 연결해서 텔레그램에서 AI와 대화할 수 있는 시스템을 구축했습니다. Gemma, Qwen, EXAONE까지 여러 모델을 갈아끼워보고, RAG도 붙여봤습니다. 그 과정에서 “프롬프트가 길어지면 진짜 느려지는구나”를 몸소 체감했습니다. 텔레그램 봇 LLM 연동의 전 과정을 공유합니다.

텔레그램 봇 LLM — 전체 구조

먼저 전체 그림을 그려봅니다. 구조는 의외로 단순합니다.

사용자 (텔레그램 앱)
    ↕ 메시지 송수신
텔레그램 Bot API
    ↕ Webhook / Polling
Python 봇 서버
    ↕ API 호출
Ollama (로컬 LLM)
    ↕ (선택) 문서 검색
RAG 벡터 DB

사용자가 텔레그램에서 메시지를 보내면, Python 봇 서버가 받아서 Ollama에 전달하고, Ollama의 응답을 다시 텔레그램으로 보내는 구조입니다. 외부 API 비용 없이 내 컴퓨터(또는 서버)에서 LLM이 돌아가니까 완전 무료입니다.

텔레그램 봇 LLM 연동 1단계 — BotFather에서 봇 만들기

텔레그램 봇을 만드는 건 놀라울 정도로 쉽습니다. 텔레그램 앱에서 BotFather라는 공식 봇과 대화하면 됩니다.

봇 생성 과정

  1. 텔레그램에서 @BotFather를 검색하고 대화 시작
  2. /newbot 명령어 입력
  3. 봇 이름 입력 (예: “내 AI 비서”)
  4. 봇 유저네임 입력 (예: my_ai_assistant_bot) — 반드시 bot으로 끝나야 함
  5. BotFather가 API 토큰을 발급해줌
Done! Congratulations on your new bot.
Use this token to access the HTTP API:
7123456789:AAHxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

이 토큰이 봇의 열쇠입니다. 절대 외부에 노출하면 안 됩니다. 누군가 이 토큰을 알면 내 봇을 마음대로 조종할 수 있습니다. 환경변수(.env)에 저장하고, Git에 올라가지 않도록 .gitignore에 추가하세요.

BotFather 추가 설정

봇을 만든 직후에 해두면 좋은 설정들입니다.

  • /setdescription — 봇 소개 문구 설정
  • /setabouttext — 봇 프로필 설명
  • /setuserpic — 봇 프로필 사진 설정
  • /setcommands — 사용 가능한 명령어 목록 등록 (예: /start, /help, /reset)

텔레그램 봇 LLM 연동 2단계 — Ollama로 로컬 LLM 띄우기

Ollama는 로컬에서 LLM을 쉽게 돌릴 수 있는 도구입니다. Docker처럼 모델을 pull 받아서 바로 실행할 수 있습니다.

Ollama 설치

# Linux/Mac
curl -fsSL https://ollama.com/install.sh | sh

# 설치 확인
ollama --version

모델 다운로드 및 실행

# Gemma 2 (Google) 다운로드
ollama pull gemma2

# Qwen 2.5 (Alibaba) 다운로드
ollama pull qwen2.5

# EXAONE (LG AI Research) 다운로드
ollama pull exaone3.5

# 모델 실행 테스트
ollama run gemma2 "안녕하세요, 자기소개 해주세요"

Ollama는 기본적으로 http://localhost:11434에서 API 서버를 띄웁니다. 이 주소로 HTTP 요청을 보내면 LLM의 응답을 받을 수 있습니다.

내가 테스트한 모델 비교

세 가지 모델을 돌려보면서 텔레그램 봇 LLM 챗봇으로서의 성능을 비교했습니다.

모델 크기 한국어 성능 응답 속도 특징
Gemma 2 (9B) ~5.4GB 보통 보통 영어 위주, 한국어는 간단한 대화 수준
Qwen 2.5 (7B) ~4.7GB 좋음 빠름 중국어/영어에 강하지만 한국어도 준수
EXAONE 3.5 (8B) ~4.9GB 매우 좋음 보통 LG AI 연구소 개발, 한국어 특화

한국어 챗봇 용도로는 EXAONE이 가장 자연스러웠습니다. LG AI 연구소에서 한국어 데이터를 집중적으로 학습시킨 모델이라 존댓말, 줄임말, 한국 문화 맥락을 잘 이해합니다. Qwen은 속도가 빨라서 응답 시간이 중요한 경우에 좋았고, Gemma는 영어 대화에서 강점이 있었습니다.

텔레그램 봇 LLM 연동 3단계 — Python으로 연결하기

이제 텔레그램 봇과 Ollama를 Python으로 연결합니다. python-telegram-bot 라이브러리를 사용합니다.

필요한 패키지 설치

pip install python-telegram-bot requests

기본 봇 코드

import os
import requests
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes

# 환경변수에서 토큰 로드
TELEGRAM_TOKEN = os.environ.get('TELEGRAM_BOT_TOKEN')
OLLAMA_URL = 'http://localhost:11434/api/chat'
MODEL_NAME = 'exaone3.5'  # 사용할 모델

# 대화 히스토리 저장 (유저별)
conversations = {}

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.effective_user.id
    conversations[user_id] = []  # 대화 초기화
    await update.message.reply_text(
        '안녕하세요! 무엇이든 물어보세요. /reset 으로 대화를 초기화할 수 있어요.'
    )

async def reset(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.effective_user.id
    conversations[user_id] = []
    await update.message.reply_text('대화가 초기화되었습니다.')

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.effective_user.id
    user_message = update.message.text

    # 대화 히스토리 가져오기
    if user_id not in conversations:
        conversations[user_id] = []

    # 유저 메시지 추가
    conversations[user_id].append({
        'role': 'user',
        'content': user_message
    })

    # "입력 중..." 표시
    await update.message.chat.send_action('typing')

    # Ollama API 호출
    response = requests.post(OLLAMA_URL, json={
        'model': MODEL_NAME,
        'messages': conversations[user_id],
        'stream': False
    })

    assistant_message = response.json()['message']['content']

    # 어시스턴트 응답을 히스토리에 추가
    conversations[user_id].append({
        'role': 'assistant',
        'content': assistant_message
    })

    await update.message.reply_text(assistant_message)

# 봇 실행
app = Application.builder().token(TELEGRAM_TOKEN).build()
app.add_handler(CommandHandler('start', start))
app.add_handler(CommandHandler('reset', reset))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
app.run_polling()

이 코드를 실행하면 텔레그램에서 봇에게 메시지를 보낼 때마다 Ollama가 응답을 생성해서 돌려줍니다. 유저별로 대화 히스토리를 관리하기 때문에 이전 대화 맥락을 기억하면서 대화할 수 있습니다.

텔레그램 봇 LLM — RAG 붙이기

단순 대화를 넘어서, 특정 문서를 기반으로 답변하게 하고 싶었습니다. 예를 들어 회사 내부 가이드 문서를 넣어두고 “출장비 정산 어떻게 해?”라고 물으면 문서에서 관련 내용을 찾아서 답변하는 식입니다. 이게 바로 RAG(Retrieval-Augmented Generation)입니다.

RAG의 기본 흐름

1. 문서를 청크(chunk)로 나눔
2. 각 청크를 임베딩(벡터)으로 변환
3. 벡터 DB에 저장
4. 사용자 질문이 들어오면 → 질문을 임베딩으로 변환
5. 벡터 DB에서 가장 유사한 청크 검색
6. 검색된 청크 + 질문을 LLM에 전달
7. LLM이 문서 기반으로 답변 생성

ChromaDB나 FAISS 같은 벡터 DB를 사용하면 됩니다. Ollama 자체도 임베딩 모델(nomic-embed-text)을 지원하기 때문에 별도의 임베딩 서비스 없이 구현할 수 있습니다.

# Ollama 임베딩 모델로 벡터 생성 (개념 코드)
response = requests.post('http://localhost:11434/api/embeddings', json={
    'model': 'nomic-embed-text',
    'prompt': '출장비 정산 방법은...'
})
embedding = response.json()['embedding']  # 벡터 값

텔레그램 봇 LLM — 프롬프트와 RAG가 커지면 느려진다

여기서 현실의 벽을 만났습니다. 텔레그램 봇 LLM 조합에서 가장 큰 문제는 속도였습니다.

프롬프트가 길어지면 느려지는 이유

LLM은 입력 토큰 수에 비례해서 처리 시간이 늘어납니다. 시스템 프롬프트가 길고, 대화 히스토리가 쌓이고, RAG로 검색한 문서 청크까지 포함하면 입력 토큰이 기하급수적으로 늘어납니다.

상황 입력 토큰 (대략) 응답 시간 (8B 모델 기준)
짧은 질문 1개 ~50 토큰 2~3초
시스템 프롬프트 + 대화 5턴 ~500 토큰 5~8초
시스템 프롬프트 + 대화 10턴 + RAG 문서 ~2,000 토큰 15~25초
긴 시스템 프롬프트 + 대화 20턴 + RAG 문서 3개 ~5,000 토큰 30초 이상

텔레그램에서 30초 동안 응답이 없으면 사용자 입장에서는 “이거 죽은 거 아냐?”라는 느낌을 받습니다. ChatGPT처럼 스트리밍으로 한 글자씩 보여주면 체감이 다르겠지만, 텔레그램 봇 API에서는 스트리밍 출력이 제한적입니다.

내가 시도한 최적화 방법들

속도 문제를 줄이기 위해 여러 가지를 시도했습니다.

  • 대화 히스토리 제한: 최근 10턴만 유지하고 오래된 대화는 삭제. 맥락은 조금 잃지만 속도가 확보됨
  • 시스템 프롬프트 다이어트: 처음에 장문으로 작성했던 시스템 프롬프트를 핵심만 남기고 축약. 500토큰 → 150토큰으로 줄임
  • RAG 검색 결과 제한: 상위 3개 → 상위 1개 청크만 포함. 정확도가 조금 떨어지지만 체감 속도 개선이 큼
  • 작은 모델 사용: 8B → 3B 모델로 변경하면 속도가 2~3배 빨라짐. 다만 답변 품질이 눈에 띄게 떨어짐
  • “생각 중…” 메시지: 응답이 오래 걸릴 때 먼저 “생각 중…” 메시지를 보내고, 응답이 완성되면 편집하는 방식. 사용자가 기다리는 느낌을 줄여줌
# "생각 중..." 메시지 먼저 보내기
async def handle_message(update, context):
    thinking_msg = await update.message.reply_text('🤔 생각 중...')

    # Ollama 응답 대기
    response = call_ollama(user_message)

    # 응답으로 메시지 편집
    await thinking_msg.edit_text(response)

결론적으로 가벼운 대화에는 빠르고, RAG가 커지면 느려진다는 건 로컬 LLM의 한계입니다. GPU가 있으면 상황이 훨씬 나아지지만, CPU만으로 돌리는 경우에는 프롬프트와 RAG를 최대한 경량화하는 게 현실적입니다.

텔레그램 봇 LLM — 운영하면서 느낀 점

몇 주 동안 실제로 사용하면서 느낀 점들입니다.

좋았던 점

  • 완전 무료: OpenAI API 비용 0원. 전기세만 나감
  • 프라이버시: 대화 내용이 외부 서버에 전송되지 않음. 민감한 질문도 부담 없음
  • 모델 교체가 자유로움: ollama pull 한 줄이면 새 모델로 바꿀 수 있음. Gemma가 별로면 Qwen으로, Qwen이 별로면 EXAONE으로
  • 커스터마이징 무한: 시스템 프롬프트, RAG 문서, 응답 형식을 마음대로 조정 가능

아쉬웠던 점

  • 속도: 역시 가장 큰 문제. ChatGPT 대비 체감 속도가 3~10배 느림
  • 답변 품질: 7~8B 모델은 GPT-4나 Claude에 비하면 확실히 떨어짐. 복잡한 추론이나 긴 글 작성에서 한계가 있음
  • 서버 상시 구동: 텔레그램 봇이 응답하려면 Python 스크립트와 Ollama가 항상 떠 있어야 함
  • 멀티유저 한계: 로컬 LLM은 동시에 여러 요청을 처리하기 어려움. 혼자 쓸 때는 괜찮지만 여러 명이 동시에 질문하면 병목이 생김

텔레그램 봇 LLM 연동 시 주의할 점

직접 만들면서 겪은 실수와 주의사항입니다.

봇 토큰 노출 금지

텔레그램 봇 토큰이 GitHub에 올라가면 누군가 내 봇으로 스팸을 보낼 수 있습니다. .env 파일에 저장하고 .gitignore에 추가하세요.

Ollama 외부 접근 차단

Ollama는 기본적으로 localhost:11434에서만 접근 가능하지만, 설정을 변경해서 외부 접근을 열었다면 반드시 방화벽으로 차단하세요. 아니면 누구나 내 LLM에 요청을 보낼 수 있습니다.

텔레그램 봇 API 제한

텔레그램 봇 API에는 메시지 길이 제한(4096자)이 있습니다. LLM 응답이 길면 잘려서 전송됩니다. 긴 응답은 여러 메시지로 나눠서 보내는 로직이 필요합니다.

# 4096자 초과 시 분할 전송
MAX_LENGTH = 4096

async def send_long_message(update, text):
    for i in range(0, len(text), MAX_LENGTH):
        await update.message.reply_text(text[i:i+MAX_LENGTH])

마무리 — 텔레그램 봇 LLM, 로컬 AI의 가능성을 체험하다

텔레그램 봇 LLM 연동은 로컬 AI의 가능성과 한계를 동시에 체험할 수 있는 프로젝트입니다. API 비용 없이 나만의 AI 챗봇을 만들 수 있다는 건 매력적이지만, 속도와 품질 면에서는 아직 상용 서비스와 격차가 있습니다. 그래도 프라이버시가 중요하거나, 특정 문서 기반 QA 봇을 만들고 싶거나, 단순히 로컬 LLM을 체험해보고 싶다면 텔레그램 봇 LLM 조합은 훌륭한 시작점입니다.

프롬프트가 길어지면 느려진다는 현실, RAG가 커지면 응답 시간이 기하급수적으로 늘어난다는 경험 — 이런 것들은 직접 만들어봐야 체감할 수 있습니다. 이 글이 텔레그램 봇 LLM 프로젝트를 시작하는 분들에게 도움이 되길 바랍니다.

Ollama 공식 문서는 ollama.com에서, 텔레그램 봇 API 문서는 Telegram Bot API에서 확인할 수 있습니다. 다른 AI 관련 글도 참고하세요.

댓글 남기기