Vault가 살아났다 — 라벨 한 장으로
EP 01에서 Family Vault를 이렇게 설명했다.
"금융 기록, 법적 문서, 은수의 그림들, 가족 사진, 우리가 좋아하는 맛집과 레시피까지."
그때는 개념이었다. 이제 진짜로 만들 차례가 됐고, 가장 먼저 손댄 게 뜻밖에도 — 와인이었다.
와인 라벨을 찍으면
시나리오는 단순하다. 좋았던 와인의 라벨을 찍는다. 끝. 나머지는 페퍼가 한다.
기술적으로 무슨 일이 일어나냐면:
- 사진이 Gemini 멀티모달로 간다. OCR이 아니라 이미지를 직접 이해하는 모델.
- 프롬프트는 소믈리에 페르소나. 라벨에서
wine_name/vintage/region/varietal/producer를 뽑고, 프로듀서 스토리를 3줄로 요약한다. - 원본 사진은 Drive
/wine폴더에 저장. 파일명은와인이름_날짜. - 별점(0.5 단위)과 노트는 내가 추가.
왜 멀티모달을 썼나. 라벨 읽기는 단순 OCR로도 되지만, "이 와인이 뭔지"는 OCR로 안 나온다. Antinori 라벨에서 글자를 뽑는 것과, "토스카나의 대표 생산자, 슈퍼 투스칸의 원조"라는 맥락을 붙이는 건 다른 일이다. 하나의 멀티모달 호출이 둘 다 한다. 무명 와인이면? 라벨 지식이 없어도 지역·품종 기반으로 설명을 만들게 프롬프트를 보강했다.
Table Editor에 첫 와인 row가 뜨고, 앱 리스트에 라벨 썸네일 + 별점 + 소믈리에 노트가 뜨는 걸 봤을 때 — EP 03에서 첫 테이블이 만들어졌을 때랑 비슷한 감각이 왔다. 문서 속 "Family Vault"가 손에 잡히는 물건이 된 순간.
그다음은 레시피, 맛집, 연락처
같은 패턴을 타입마다 반복했다.
Recipe — 요리 사진, 카테고리(한식/일식/양식/디저트…), 별점. 여기엔 LLM을 안 붙였다. 레시피는 내가 아는 걸 저장하는 거지 페퍼가 분석할 게 아니니까. 타입마다 "이건 AI가 필요한가"를 따로 판단했다.
Place — 맛집. 이건 입력 UX가 관건이었다. 한국에선 네이버 지도에서 "공유"를 누른다. 그 공유 텍스트를 페퍼가 스마트 파싱한다 — URL, 장소명, 그리고 3번째 줄에서 도시명까지 자동 추출. country="Korea" 자동. 구글 지도는 수동 입력. Country → City 2단계로 접히는 리스트.
Contact — 연락처. 계좌 정보까지 선택적으로.
Vault가 타입별로 늘어날수록, EP 01의 그 문장이 데이터로 바뀌고 있었다. "Vault가 쌓일수록 페퍼는 우리 가족을 더 깊이 안다."
올린 파일을 페퍼가 읽게 하기
Vault에 그냥 쌓아두는 것과, 페퍼가 그걸 아는 건 다르다.
그래서 Drive 자동 임베딩을 붙였다. 파일을 올리면 Gemini 멀티모달이 내용을 읽고, pgvector에 임베딩으로 저장한다. 그러면 EP 09의 레이어 3(임베딩 기반 Vault 검색)이 문서 내용까지 검색할 수 있다. 그리고 새벽 3시 일별 크론으로 Drive를 훑어 새 파일을 동기화한다.
업로드 훅(올린 직후 임베딩)과 크론(놓친 것 보충) — 두 경로를 둔 이 구조가, 나중에 두 번 물렸다. 크론이 앱 저장이 안 끝난 고아 파일을 유령 row로 만드는 버그, 그리고 임베딩 유사도 필터가 정답을 다 잘라버리는 버그. 둘 다 EP 17에서.
딛고 선 땅이 사라질 때
Vault를 채우면서 capability도 몇 개 붙였다. naver.place(플레이스 딥링크), naver.shopping(최저가 상품 검색). 은수가 뭘 사달라고 하면 최저가로 바로 연결되는 그림.
그런데 만든 지 얼마 안 돼서, 네이버가 검색 쇼핑 API를 종료한다고 발표했다(7월 말). naver.shopping이 죽었다. 딥링크로 대체했다.
이게 남긴 교훈이 있다. 페퍼는 내가 만든 코드 위에서만 도는 게 아니다. 네이버, 구글, 카카오 — 내가 통제하지 못하는 플랫폼 위에 얹혀 있다. 카카오 지도는 유료로 돌아섰고, 구글 모델도 세대마다 종료 공지가 뜬다(EP 04의 Gemini 2.0 종료처럼). capability가 많아질수록, 내가 딛고 선 땅이 흔들릴 표면적도 넓어진다.
그래서 capability는 처음부터 "실패하면 조용히 대체"가 기본이어야 했다. 이 원칙이 다음 화의 주제와도 이어진다 — 다만 다음 화는 정반대 이야기다. 조용히 실패하는 게 재앙이 되는 이야기.