본문으로 건너뛰기
멍냥잇 — AI & LIFE

멍냥잇 AI 활용 제작 기록 · 검증한 실습

생활 알림에서 일정·할 일 뽑기: Gemini와 원문 검증으로 캘린더 파일 만들기

병원 예약 문자에는 방문 시간이, 자동차 검사 안내에는 마감일이, 공과금 고지에는 납부 기한과 금액이 들어 있습니다. 이 정보를 달력과 할 일 목록에 옮기려면 각 문자를 다시 읽어야 합니다. 이번 실습에서는 문자 내용을 붙여 넣으면 Gemini가 후보를 찾고, 원문 확인 후 CSV와 캘린더 파일을 만드는 로컬 도구를 구현했습니다. 문자를 자동 수집하거나 캘린더를 직접 수정하지는 않습니다.

처리 흐름

알림 TXT 입력 → Gemini 구조화 추출 → 원문 인용·날짜 검증 → 사람 수정·확인 → CSV / ICS 내려받기

실행 결과부터 보기

2026년 10월 4일, 개인정보가 없는 가상 알림 세 개를 gemini-3.5-flash-lite에 실제로 보냈습니다. 예약 1건과 마감 2건이 별도 항목으로 돌아왔고 원문 대조 단계의 경고는 0개였습니다. 다음 표는 AI가 제안한 핵심 값과 프로그램이 원문 구절에서 다시 읽은 값을 정리한 것입니다.

가상 알림 구분 확인된 날짜·시간 추가 값
내과 예약 방문·예약 2026-10-12 10:30 온누리 내과 3층 접수실
자동차 정기검사 마감 2026-11-05 검사 완료
전기요금 안내 마감 2026-10-25 57,320원

이 결과는 작은 가상 예제 한 세트의 시험일 뿐 실제 문자의 추출 정확도를 나타내지 않습니다. 검토 화면에서 원문을 다시 읽고 각 항목의 확인란을 선택하기 전에는 파일 내보내기 버튼이 활성화되지 않습니다.

코드와 예제 자료로 따라 하기

전체 코드·가상 알림·검토 화면·테스트 ZIP 내려받기. 압축 파일에는 alerts.py, review_template.html, 가상 입력 파일, AI 호출 없이 볼 수 있는 sample-review.html, 테스트와 설명 문서가 들어 있습니다. API 키나 실제 문자 내용은 포함하지 않았습니다. Python 3.11 이상이 필요하며 추가 패키지는 없습니다.

압축을 푼 폴더에서 PowerShell을 열고 먼저 API를 쓰지 않는 예시를 실행합니다.

py .\alerts.py --input .\sample-notices.txt --output .\output --fixture .\sample-extraction.json

output/review.html을 브라우저로 열면 사람이 작성한 예시 초안 세 개가 보입니다. 화면 상단에 수동 작성 예시 · AI 호출 없음이라고 표시됩니다. Gemini 추출과 수동 예시를 혼동하지 않도록 실행 모드를 드러냈습니다.

실제 AI 추출을 시험하려면 Google AI Studio의 Gemini API 키를 현재 PowerShell 세션에만 넣습니다. 본인 키를 공개 저장소나 글에 붙여 넣지 마세요.

$env:GEMINI_API_KEY = Read-Host 'Gemini API 키'
py .\alerts.py --input .\sample-notices.txt --output .\output --ai
Remove-Item Env:GEMINI_API_KEY

기본 모델은 실호출에 사용한 gemini-3.5-flash-lite입니다. 계정에서 제공되는 모델이 다르면 --model로 변경할 수 있습니다. API 이용 가능 여부와 과금 조건은 실행 전 프로젝트 설정에서 확인해야 합니다.

입력 형식과 추출 항목을 어떻게 정했나

첫 버전의 입력은 UTF-8 텍스트 파일입니다. 알림 사이는 --- 한 줄로 나누고, 최대 8개·총 12,000자까지만 받습니다. 이미지 속 문자나 휴대폰 알림을 자동으로 가져오는 기능은 없습니다.

[가상] 온누리 내과 예약 안내
2026년 10월 12일 오전 10시 30분 진료 예약입니다.
장소: 온누리 내과 3층 접수실.
예약 시간 10분 전까지 방문해 주세요.
---
[가상] 자동차 정기검사 안내
정기검사 기한은 2026년 11월 5일입니다.
기한 전에 검사소를 예약하고 검사를 완료해 주세요.

AI에는 알림마다 1부터 시작하는 번호를 붙여 보냅니다. 결과는 예약·마감·기타 할 일 가운데 하나, 제목, 해야 할 일, 그리고 원문에서 그대로 옮긴 근거 구절을 담은 JSON입니다. 날짜·시간·장소·금액도 가능하면 각각의 원문 구절을 별도 필드로 요청했습니다. Gemini의 구조화 출력으로 모양을 제한하지만, JSON 형식이 맞는다고 내용까지 정확해지는 것은 아닙니다.

AI가 말한 날짜를 그대로 믿지 않은 이유

알림 여러 개를 한 번에 넣으면 한 알림의 날짜를 다른 알림의 금액과 엮을 위험이 있습니다. 그래서 프로그램은 AI가 돌려준 notice_index의 원문에서 각 인용이 실제로 발견되는지 확인합니다. 날짜·시간·금액의 최종 값은 AI가 만든 숫자를 사용하지 않고, 검증된 인용 구절을 Python 코드가 다시 읽습니다.

if not quote_in_notice(fields["date_quote"], notice):
    fields["date_quote"] = ""
parsed_date = parse_date(fields["date_quote"])

예컨대 첫 번째 알림에 세 번째 알림의 57,320원을 붙인 응답은 금액 근거가 맞지 않아 빈칸으로 남깁니다. 10월 12일처럼 연도가 빠졌거나 내일처럼 기준일이 필요한 날짜도 자동으로 확정하지 않습니다. 제목과 행동 자체의 뜻, 빠진 일정까지 이 방식으로 완벽하게 검사할 수는 없어 사람이 원문을 읽는 단계를 남겼습니다.

검토 화면에서 확인하고 파일로 내보내기

프로그램은 draft.json과 로컬 review.html을 만듭니다. HTML에서는 원문을 펼쳐 보고 제목·날짜·시간·장소·금액·행동을 고치거나 항목을 삭제할 수 있습니다. 값이 바뀌면 그 항목의 확인 표시가 풀립니다. 빠진 항목은 직접 추가할 수 있지만 원문 근거 구절을 넣어야 합니다.

각 항목과 전체 확인란을 체크하면 CSV를 받을 수 있습니다. 날짜가 있는 항목은 .ics 캘린더 파일에도 들어갑니다. 시간이 없는 마감은 종일 일정, 시간이 있는 예약은 한국 시간 기준 1시간 일정으로 기록합니다. 캘린더 프로그램으로 가져올 수 있는 파일을 만들 뿐, 구글 캘린더나 휴대폰 달력에 자동 등록하지 않습니다. 캘린더를 가져오기 전 시간과 중복 여부를 다시 확인해야 합니다. ICS 생성은 iCalendar 형식 명세의 날짜·줄 접기 규칙을 따랐습니다.

어디까지 검증했나

로컬 자동 검사 6개는 서로 다른 알림의 값 혼합, 모호하거나 잘못된 날짜, 원문 근거 누락, HTML에 들어가는 스크립트 문자열 처리, 수동 예시 화면 생성을 확인합니다. 별도 JavaScript 검사는 CSV의 수식 시작 문자열 처리, 쉼표가 있는 제목, 한글 ICS 줄 길이, 한국 시간에서 UTC로 바뀌는 예약 시간을 확인했습니다.

py -m unittest discover -s tests -v
node .\tests\test_exports.js

Gemini API 호출에서도 가상 세 건이 기대한 유형으로 돌아왔지만, 브라우저에서 모든 캘린더 앱으로 직접 가져오는 실험까지 한 것은 아닙니다. 병원 예약 변경 기한과 실제 방문일이 한 문자에 같이 있는 경우처럼 행동이 여럿일 때는 누락 여부를 특히 살펴야 합니다. 인용이 원문에 있다는 사실은 문장의 의미까지 검증해 주지 않습니다.

개인정보와 이 데모의 범위

--ai를 사용할 때만 입력한 알림 텍스트가 Gemini API로 전송됩니다. API 요청에는 대화 저장 기능을 사용하지 않도록 store:false를 지정했습니다. 이것이 외부 서비스의 모든 데이터 처리가 없다는 뜻은 아닙니다. 개인 문자나 회사 안내를 넣기 전에 해당 자료를 외부 API에 보내도 되는지 판단해야 합니다. review.html에는 원문이 그대로 포함되므로 실제 자료로 실행했다면 결과 파일 보관에도 주의가 필요합니다.

이 실습의 목적은 AI가 생활 문장을 읽고 후보를 만들게 하되, 원문 근거와 사람 확인을 거쳐야 일정이 확정되도록 설계하는 과정을 보여 주는 것입니다. 이미지 인식, 문자 자동 수집, 정기 실행, 외부 캘린더 연동은 이번 버전의 기능이 아닙니다.