Noti의 핵심 기능은 한 문장으로 표현됩니다. "메모에 적은 날짜를 알아서 캘린더에 옮긴다." 이걸 처음 들으면 다들 비슷한 반응을 보입니다 — "그거 ChatGPT한테 시키면 되는 거 아니야?" 답은 그렇기도 하고, 그렇지 않기도 합니다.
먼저 결론: Noti는 대부분의 시간 표현을 사용자 기기 안의 정규식으로 처리하고, 정말 어려운 자연어만 Gemini에 위임합니다. 실측 데이터로는 전체 메모의 약 97%가 1단계에서 끝나고, AI가 호출되는 것은 평균 3%뿐.
왜 처음부터 LLM에 맡기지 않았나
가장 간단한 해결책은 모든 메모를 LLM에 보내고 답을 받는 것입니다. 하지만 세 가지 문제가 있었습니다:
2) 지연 — 평균 800ms의 네트워크 + 추론 시간. 메모 작성 흐름이 끊김.
3) 프라이버시 — 메모는 사적인 공간. 외부 서버에 보내고 싶지 않음.
그래서 두 단계로 나눴습니다: 사용자 기기 안에서 도는 정규식 엔진이 먼저 시도하고, 매칭 실패한 메모만 AI에게 넘기는 구조.
1단계: 정규식 30종 — 97%의 일상 표현
"내일 7시", "다음주 화요일 오후 3시", "5월 23일 저녁" 같은 표현은 사실 패턴이 한정적입니다. 한국어 사용자가 시간을 적는 방식을 1,200건 모아 분석한 결과, 상위 30개 패턴이 전체의 92.4%를 커버했어요.
// 상대 날짜 /(내일|모레|다음주|다다음주)\s*(\d{1,2})시/ // 절대 날짜 /(\d{1,2})월\s*(\d{1,2})일\s*(\d{1,2})시/
정규식은 LRU 캐시(최대 512개)를 거쳐 평균 88ms에 매칭됩니다. 같은 표현을 반복해 쓰면 1ms 안에 끝나요.
2단계: AI 폴백 — 나머지 3%
"엄마 생신 다음다음 토요일", "회사 워크샵 마지막 날 오후" 같은 표현은 정규식으로 잡기 어렵습니다. 이런 경우만 Gemini 2.5 Flash에 위임합니다. 메모 전체가 아니라 해당 문장만 보내고, 응답은 즉시 폐기 (학습에 사용 안 함).
앞으로
2026년 Q3에는 메모 간 참조를 본격적으로 다룰 예정입니다. 메모 안의 메모, 메모를 가리키는 시간 표현 — 이걸 정직하게 잡아내려면 RAG 같은 검색 단계가 한 겹 더 들어와야 해요.
한국어 자연어 처리에 관심이 있으시다면 — 그리고 우리가 못 풀고 있는 케이스를 가지고 계시다면 — engineering@noti.app로 보내주세요.