텔레그램 챗봇과 RAG 시스템으로 나만의 아침 브리핑 자동화
소개
7월12일 멍멍님의 텔레그램봇과 RAG시스템 발표를 듣고 나도 나만의 텔레그램 챗봇을 만들어보고 싶어서 시작한 프로젝트입니다. 📱
컴퓨터를 사용하지 못할 때도 필요한 정보(예: 뉴스 기사, 브리핑 등)를 손쉽게 받아보고, 내 구글 시트에 저장해두었다가 언제든 쉽게 찾아볼 수 있는 환경을 만들고 싶었어요.
현재는 아침에 받은 뉴스 기사 중 중요한 것만 챗봇으로 골라 링크를 받아볼 수 있도록 세팅해두었습니다. 앞으로는 더 발전된 시스템으로 확장할 수 있을 것 같아요!
진행 방법
사용 도구
n8n
gemini (Google 기반 LLM)
Google Sheets
Telegram Bot
구현 과정
일하는 Ai님의 유튜브 영상(구글 Docs로 RAG 구현)을 참고하여 기본 플로우 익힘
유튜브 영상을 보시면 Github에서 JSON을 복사하실 수 링크를 확인할 수 있습니다.
먼저, 워크플로우를 설명드리면, 이 워크플로우의 핵심 목표는 사용자와의 대화를 기억하고, 그 기억을 바탕으로 개인화된 답변을 제공하며, 구글 캘린더 일정을 관리할 수 있는 AI 텔레그램 봇을 만드는 것입니다.
주요 기능:
텔레그램을 통해 사용자의 메시지(텍스트, 음성, 이미지)를 받습니다.
OpenAI (gpt-4.1-mini)를 사용해 사용자의 메시지를 이해하고 답변을 생성합니다.
Google Docs를 '장기 기억 저장소'로 사용하여 사용자에 대한 중요한 정보를 기록하고 불러옵니다.
Google Calendar와 연동하여 일정을 조회하거나 새로 생성할 수 있습니다.
Memory 기능을 활용하여 대화 흐름을 기억하여 문맥에 맞는 대화를 이어갑니다.
기존에 Gemini TTS를 활용하여 아침 일정과 뉴스 브리핑을 요약하여 음성 메시지를 텔레그램으로 받고 있었는데 이것을 활용하여 뉴스 기사만 따로 Google Sheet에 저장했습니다. 이 Google Sheet을 텔레그램 챗봇과 연동시켜서 활용을 해보았습니다.
아침에 아침일정과 주요 뉴스를 텔레그램 음성메시지로 받고 필요한 뉴스기사가 있으면 요청하는 식으로 진행을 해보았고 이후 외부에서 활용하면 좋을만한 정보를 구글 시트에 따로 저장을 해두었다가 필요할 때 요청하는 식으로 고도화할 예정입니다.
아래 공식 문서와 제일 마지막에 유튜브 영상 참고하시면 어렵지 않게 만들어보실 수 있습니다.
TTS 공식 문서 링크
제일 어려운게 TTS 설정과 TTS file 코드인데 TTS 설정에서 실수하기 쉬운게 2인 음성 설정과 1인 음성 설정의 URL이 다릅니다. 아래 구글 문서에 잘 나와있으니 참고하시기 바랍니다.
TTS file 코드는 참고하시라고 공유합니다.
// n8n Code 노드 (Run Once for All Items)
/* 1) Gemini 응답에서 base64 데이터 추출 */
const base64 = $json.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
if (!base64) throw new Error('base64 오디오를 찾을 수 없습니다');
/* 2) base64 → PCM Buffer */
const pcm = Buffer.from(base64, 'base64');
/* 3) 간단 WAV 헤더 작성 (24 kHz / 16-bit / mono) */
const channels = 1;
const sampleRate = 24_000;
const bitDepth = 16;
const dataSize = pcm.length;
const header = Buffer.alloc(44);
header.write('RIFF', 0);
header.writeUInt32LE(36 + dataSize, 4);
header.write('WAVE', 8);
header.write('fmt ', 12);
header.writeUInt32LE(16, 16); // PCM 서브청크 길이
header.writeUInt16LE(1, 20); // PCM
header.writeUInt16LE(channels, 22);
header.writeUInt32LE(sampleRate, 24);
header.writeUInt32LE(sampleRate * channels * bitDepth / 8, 28);
header.writeUInt16LE(channels * bitDepth / 8, 32);
header.writeUInt16LE(bitDepth, 34);
header.write('data', 36);
header.writeUInt32LE(dataSize, 40);
/* 4) WAV = 헤더 + PCM */
const wavBuffer = Buffer.concat([header, pcm]);
/* 5) n8n 헬퍼로 바이너리 태그 생성 */
const audioBinary = await this.helpers.prepareBinaryData(
wavBuffer,
'briefing.wav',
'audio/wav'
);
return [{ json: {}, binary: { audio: audioBinary } }];
시행착오 & 에피소드
Google Docs로 하면 문제가 없기 한데 만약 저처럼 Google Sheet를 쓰시는 경우에는 merge 노드 설정을 아래와 같이 해야합니다. 그렇지 않으면 구글시트에 5개의 데이터가 있다면 내가 질문한 text와 질문이 5번 반복해서 들어가는 오류가 발생할 수 있습니다.
결과와 배운 점
단순히 따라하기만 해도 실제로 쓸만한 챗봇을 금방 만들 수 있다는 걸 경험함
컴퓨터가 없어도 텔레그램으로 간단히 필요한 정보(뉴스 링크 등)를 바로 받을 수 있음
시행착오를 겪으며, 자동화 시스템은 직접 사용해보며 개선 포인트를 찾아야 함을 느낌
앞으로는 더 다양한 정보(예: 일정, 할 일 등)로 확장해보고 싶음
도움 받은 글
https://youtu.be/MptGozofREM?si=OJqZKhEAc-s49J6b
https://youtu.be/uBYIfj_VZVc?si=fDmjILcyjfBqlQuQ