이런 걸 처리합니다
채팅에 던지는 행동 하나로 분류 · 저장 · 일정 등록 · 알림까지 이어집니다.
자료 아카이브
링크·이미지·문서를 보내면 내용을 분석해 자동으로 분류·저장합니다.
일정 등록
자연어로 보낸 일정에서 날짜·시간·장소를 파악해 Google Calendar에 자동 등록합니다.
기프티콘 관리
이미지에서 유효기간과 사용처를 추출해 등록하고, 만료 전에 알립니다.
자료 검색
"저번주에 넣어둔 거 뭐였지" 같은 대화로 저장해 둔 것을 찾습니다.
아침 일정 보고
오늘의 일정·만료 임박 항목·주요 할 일을 매일 아침 먼저 알립니다.
저장 결과 회신
어느 카테고리에 어떤 제목으로 저장했는지 즉시 회신해, 잘못 분류되면 바로 잡을 수 있습니다.
실제 화면
아침 모닝 리포트부터 자료 저장·일정 등록까지, 하나의 대화창 안에서 끝납니다.
전체 구조와 흐름
메시지 한 건이 거치는 경로 전체입니다. AI는 두 지점에서만 개입하고, 나머지는 n8n 룰이 처리합니다.
텔레그램"] --> PRE["n8n 전처리
입력 유형 판별"] PRE -->|"파일 · 버튼 · 명시 접두어"| GUARD PRE -->|"자연어 문장"| AI1["AI 의도분류
저장·조회·수정·삭제·완료"] AI1 --> GUARD["n8n 가드레일
강등 · 폴백"] GUARD --> AI2["AI 본분석
제목·분류·요약·날짜 추출"] AI2 --> SAVE["저장 · 실행"] SAVE --> SH["Google Sheets
색인 DB"] SAVE --> DR["Google Drive
파일 보관"] SAVE --> CA["Google Calendar
일정 등록"] SAVE --> RE["텔레그램 회신
저장 결과 즉시 확인"] SCH["매일 08:00 스케줄"] --> MR["모닝 리포트
날씨 · 일정 · 추천"] MR --> RE GUARD -.->|"판정 기록"| LOG["판정 로그"]
도구별 역할
| 도구 | 맡은 일 |
|---|---|
| Telegram | 자료를 받는 창구이자 모닝 리포트를 발송하는 채널. 버튼·명령어로 즉시 조회도 처리 |
| n8n | 룰베이스 분기와 스케줄 트리거로 전체 파이프라인을 연결. AI 장애 시 폴백 담당 |
| OpenAI | 일상 문장에서 의도를 분류하고 제목·카테고리·기한을 추출하는 판정 담당 |
| Oracle Cloud | n8n 컨테이너가 24시간 구동되는 서버. 재부팅에도 자동 기동되도록 구성 |
| Sheets를 DB로 써서 분류된 항목을 저장하고, 일정은 Calendar에, 파일은 Drive에 보관 | |
| Claude Code | 워크플로우·API 연동·서버 인프라·보안 설정을 함께 만든 개발 파트너 |
룰과 AI의 역할 분담
정해진 프로세스는 n8n 룰이 강제하고, 대화의 변수만 AI가 판정합니다.
정해진 프로세스의 강제
의도가 정해지면 카테고리 읽기 → 내용 분석 → 시트 저장 → 캘린더 등록까지 정해진 순서로만 진행합니다. 버튼 응답과 명시 명령은 AI 판정을 거치지 않고 룰이 즉시 처리합니다.
얻은 것 — 같은 요청은 언제나 같은 결과
대화의 자유도
정해진 명령어 없이 일상 문장에서 의도를 분류하고, "스벅" 같은 표현을 "스타벅스"로 연결합니다. 이미지·PDF도 읽어 브랜드·유효기간 같은 정보를 추출합니다.
얻은 것 — 말하듯 던져도 알아듣는 유연함
AI를 태우지 않는 경우
다음은 의도가 이미 확정이라 AI 호출 자체를 건너뜁니다. 호출 비용과 지연이 없고, 판정이 흔들릴 여지도 없습니다.
AI 판정을 그대로 실행하지 않는다
의도분류 결과는 n8n 룰을 한 번 더 통과합니다. 잘못된 실행보다 잘못된 저장이 낫다는 기준으로 설계했습니다.
| 조건 | 조치 | 이유 |
|---|---|---|
| 확신도가 기준에 못 미침 | 저장으로 강등 | 수정·삭제는 되돌리기 어렵지만 저장은 나중에 지우면 됩니다 |
| 대상 없는 삭제 요청 | 조회로 강등 | 후보를 먼저 보여주고 확인받는 경로로 돌립니다 |
| AI 응답 실패 · 지연 | 룰베이스 폴백 | AI가 멈춰도 비서는 멈추지 않고, 최소한 기록은 남습니다 |
매일 아침 모닝 리포트
이 시스템에서 유일하게 먼저 말을 거는 기능입니다. 매일 08:00에 네 가지를 한 통으로 묶어 보냅니다.
날씨
출근·퇴근 시간대의 기온과 강수확률. 비가 올 확률이 높은 시간대에만 우산 표시를 붙입니다.
미세먼지
에어코리아가 발표하는 공식 등급을 그대로 표시합니다.
오늘 일정
오늘과 내일 일정, 기한이 임박한 항목을 함께 보여줍니다.
오늘의 추천
다시 볼 만한 항목을 하나 골라 띄우고, 확인한 것은 체크 버튼으로 정리합니다.
일정 처리
단순 저장을 넘어, 일정 메시지에서 의미 있는 구조를 추출해 Google Calendar에 정확하게 연결합니다.
확정과 미확정을 구분한다
같은 일정이라도 예약이 끝났는지 아직인지에 따라 제목이 달라집니다. 캘린더만 봐도 무엇을 더 해야 하는지 알 수 있습니다.
| 말투 | 판정 | 결과 제목 |
|---|---|---|
| "이번주 토요일 테니스야" | 확정 | 테니스 일정 |
| "까꿍이 병원 가야해" | 미확정 | 까꿍이 병원 예약필요 |
일정 형태에 맞춰 등록 방식을 고른다
시간 지정
시작 시간이 있으면 그대로 등록합니다. 종료 시간이 없으면 1시간을 기본값으로 씁니다.
하루종일
시간 없이 날짜만 있으면 종일 이벤트로 등록합니다.
날짜 범위
시작일과 종료일이 다르면 범위 전체를 하나의 이벤트로 등록합니다.
저장되는 데이터
메시지 원문을 그대로 쌓지 않습니다. 검색·수정·자동화에 쓸 수 있는 형태로 쪼개서 Google Sheets에 넣습니다.
| 시트 | 역할 | 담기는 것 |
|---|---|---|
| 색인 시트 | 본체 DB | 저장된 모든 항목. 제목·분류·요약·기한·상태 등 |
| 분류 사전 | 카테고리 | 대분류·소분류와 각각의 설명. AI는 이 목록 안에서만 고릅니다 |
| 판정 로그 | 기록 | 의도분류 결과 전건. 입력·판정·확신도·근거 |
| 대기열 | 임시 | 사용자 확인을 기다리는 중간 상태. 매일 새벽에 정리됩니다 |
항목마다 남는 값
판정 품질을 올린 방법
처음엔 끝말 키워드 룰로 의도를 판별했습니다. 룰을 늘릴수록 서로 충돌해서, 목록이 아니라 판정 방식을 바꿨습니다.
오분류를 먼저 모았다
| 실제로 보낸 문장 | 잘못된 판정 | 원인 |
|---|---|---|
| 내일 3시 은비랑 저녁 약속 잡아줘 | 조회로 오판 | 어미 '~줘'가 조회 룰에 걸림 |
| 메가커피 기프티콘 썼어 | 저장으로 오판 | '썼어'가 완료 키워드 목록에 없음 |
| 저번주에 넣어둔 거 뭐였지 | 저장으로 오판 | 어떤 룰에도 걸리지 않아 기본값으로 떨어짐 |
키워드 목록을 의미 정의로 바꿨다
오라클 클라우드 인프라 & mTLS 단말 보안
n8n은 Oracle Cloud Always Free VM에서 24시간 상시 가동됩니다. n8n 관리 화면은 mTLS로 잠겨 있어 클라이언트 인증서가 설치된 단말에서만 접근 가능합니다. Telegram 봇 통신과 외부 API 아웃바운드는 mTLS 영향 없이 정상 동작합니다.
인프라 구조
| 항목 | 값 |
|---|---|
| 클라우드 | Oracle Cloud Always Free |
| 리전 | 서울 |
| 도메인 | 전용 고정 도메인 (Telegram Webhook 직결) |
| 가용성 | 24시간 상시 가동 · PC 의존 없음 |
mTLS 보안 구조
Caddy가 리버스 프록시로 동작하며, /webhook* 경로만 개방하고
그 외는 클라이언트 인증서가 없으면 403을 반환합니다. Telegram 봇 통신과 외부 API 아웃바운드는 영향 없습니다.
/webhook/wj-*)
인증서 검증
결과적으로 가능한 일
정보 수집함 · AI 분류기 · 일정 자동화 실행기를 하나로 묶은 시스템
보낸 정보를 이해하고, 저장 가능한 형태로 정리하고, 일정이면 캘린더까지 연결한 뒤 다음 날 아침에 다시 꺼내주는 개인 운영 도구입니다. Oracle Cloud에서 24시간 가동되고, 관리 화면은 mTLS로 잠겨 있습니다.