Daymark: Gemma가 이야기를 기억하게 하여 휴대폰을 내려놓게 하다
만약 외출 동반자가 당신이 하루 종일 휴대폰을 들여다보라고 요구하지 않으면서도 그날의 경험을 기억하도록 도와준다면 어떨까요?
이 질문에서 Daymark가 탄생했습니다. Daymark는 로컬 우선(local-first)의 외출 계획 및 일기장입니다. 사용자가 자신의 기분에 맞는 근처 장소를 선택하고, 외출하는 동안 음성 또는 텍스트 동반자를 얻으며, 이 대화를 성찰적인 일기 페이지로 변환하도록 도와줍니다. 의도된 흐름은 간단합니다: 간략하게 계획하고, 그날을 경험하며, 돌아와서 간직할 수 있는 이야기로 만드는 것입니다.
프로젝트: Daymark on GitHub
실시간 데모: Try Daymark on Render
핵심은 대화가 아니라 외출 그 자체입니다
Daymark는 장소, 시간, 그리고 사용자가 원하는 외출 종류로 시작합니다. 근처 검색은 GPS, 입력된 지역, 또는 붙여넣은 지도 지점을 사용할 수 있습니다. 서버는 OpenStreetMap에서 이름이 지정된 장소를 조회하고 Geoapify를 대체재로 사용할 수 있습니다. Gemma는 반환된 장소들을 사용자의 기분 및 관심사와 비교하여 순위를 매길 수 있습니다.
외출이 시작되면, 사용자는 타이핑하거나 음성 대화를 선택할 수 있습니다. 음성 인식은 브라우저의 사용 가능한 음성 API를 통해 실행되며; Gemma가 로컬에서 답변하고 ElevenLabs가 그 답변을 말하게 할 수 있습니다. 녹취록은 외출이 진행됨에 따라 저장됩니다. 마무리 단계에서는, Gemma는 단순히 마지막 답변뿐만 아니라 전체 대화와 사용자의 메모 및 저장된 순간들을 받게 됩니다.
마지막 부분이 중요합니다. 일기장은 대화가 어떻게 전개되었는지 반영해야 합니다: 사용자가 계속해서 돌아간 주제가 무엇인지, 기분이 변했는지 여부, 그리고 그들의 선택이 무엇을 암시하는지 등입니다. 사용자 문장을 그대로 붙여 넣거나 AI 동반자의 추측을 사실처럼 다루어서는 안 됩니다. 프롬프트는 공유된 세부 정보에 근거한 짧고 신선한 항목을 요청하며, 해석은 진단으로 제시하기보다는 잠정적인 것으로 유지하도록 합니다.
첨부된 사진은 페이지에 정보를 제공할 수도 있습니다. 사용자가 명시적으로 동의하면 Phi-3.5 Vision이 보이는 세부 사항을 로컬에서 설명하고, Gemma는 관련 관찰 내용을 항목에 녹여낼 수 있습니다. 사진 자체는 브라우저 스토리지에 남아 있습니다. 페이지가 준비되면 사용자는 이를 조용히 읽거나 ElevenLabs에게 나레이션하도록 요청할 수 있습니다.
왜 오픈 모델을 브라우저에 넣어야 하는가?
Gemma 2 2B는 WebLLM과 WebGPU를 통해 브라우저에서 실행됩니다. 일기 기록 프롬프트와 생성은 장치 내에서 이루어집니다. 사용자의 대화나 일기 기록을 받는 호스팅된 LLM 엔드포인트는 없습니다. 항목, 프로필 세부 정보 및 첨부 사진은 Daymark 계정이나 데이터베이스가 아닌 해당 브라우저에 저장됩니다.
이는 오픈 가중치(open-weight) 모델이 클라우드 API 호출의 라벨이라기보다는 제품의 핵심 요소가 되게 만듭니다. 이 모델은 검사, 변경 또는 교체될 수 있으며, 개인적인 대화를 일기 항목으로 만드는 민감한 행위가 로컬에서 발생할 수 있습니다. 관련 브라우저 WebGPU 실험은 추론(inference)을 사용자의 브라우저로 이동시키는 동일한 변화를 탐구하며, 그 논의는 또한 첫 로드 대기 시간(first-load wait)을 실제 사용자 경험 비용으로 제기합니다.
실제 설정 비용이 있습니다. Gemma의 모델 파일 크기는 약 1.49 GB이며, 여기에 런타임 에셋이 추가됩니다. WebGPU 지원이 된 shader-f16과 충분한 사용 가능한 GPU 메모리를 포함하여 호환되는 브라우저와 GPU가 필요합니다. 따라서 저는 Daymark를 즉각적이거나 보편적이라고 설명하지 않습니다. 모델은 설정 후 캐시될 수 있지만, 첫 사용자(first-time user)는 기다려야 하고 장치도 이를 처리할 능력이 있어야 합니다.
로컬 우선(Local-first)이 모든 부분이 오프라인을 의미하지는 않는다
저는 개인 정보 보호 경계에 대해 정확하게 말하고 싶습니다. Gemma의 대화와 일기 쓰기는 로컬에서 실행되지만, 앱 전체가 완전히 오프라인인 것은 아닙니다:
- 주변 검색(Nearby search)은 근사 좌표와 광범위한 장소 카테고리를 Daymark 서버 및 지도 제공업체로 전송합니다.
- 브라우저의 음성 인식 공급자(speech-recognition provider)는 마이크 오디오를 수신할 수 있습니다.
- 사용자가 말로 답변을 요청하거나 일기 기록 내레이션을 할 때, 텍스트는 ElevenLabs로 전달됩니다.
- 로컬 추론(local inference)이 작동하려면 모델 파일과 런타임 에셋(runtime assets)을 다운로드해야 합니다.
이러한 기능들은 데이터 경로가 다른 의도적인 가시적 특징들입니다. 일기 내용은 호스팅된 언어 모델로 전송되지 않습니다. 사용자는 음성 기능을 건너뛰거나, 사진 분석을 건너뛰거나, 검색하는 대신 이미 알고 있는 장소를 추가할 수도 있습니다.
관련 React-and-Node 배포 작성 글은 컴파일된 인터페이스와 그 API를 하나의 오리진(origin)에 유지하는 방법을 설명합니다. Daymark는 작은 Node 서버를 사용하여 같은 실용적인 형태를 따릅니다: 동일한 서비스가 앱과 주변 검색 및 음성 엔드포인트(speech endpoints)를 모두 제공합니다.
외부에서 배우고 싶은 점
음성 모드는 사용자가 생각하는 사이에 휴대폰을 내려놓도록 하는 것을 목표로 하지만, 이것이 현장에서 이미 그 문제를 해결했다고 주장하고 싶지는 않습니다. 다음 유용한 테스트는 실제 외출입니다: 사용자가 실제로 화면을 얼마나 자주 만지작거리는지, 대화가 자연스럽게 느껴지는지, 그리고 최종 기록이 전사본(transcript)이라기보다는 하루의 느낌처럼 들리는지를 확인하는 것입니다. 이러한 관찰들이 또 다른 AI 기능을 추가하는 것보다 더 중요합니다.
챌린지 카테고리
이 빌드의 기능들을 바탕으로 Daymark는 다음 영역에 적합합니다:
- Gemma의 최적 활용처(Best Use of Gemma) — Gemma 2 2B는 장소 매칭, 대화, 일기 작성을 위한 로컬 모델입니다. (주요 카테고리; $200.)
- ElevenLabs의 최적 활용처(Best Use of ElevenLabs) — ElevenLabs는 동반자에게 목소리를 부여하고 요청 시 일기 페이지를 내레이션합니다. (파트너 카테고리; $100.)
Render의 최적 활용처(Best Use of Render) (주요 카테고리; $200) — Daymark의 프런트 엔드는 이제 Render에 라이브되어, 저도 이 카테고리에 참여할 수 있습니다.
GitHub Copilot의 최고의 활용 사례 (파트너 카테고리; $100) — GitHub Copilot의 코딩 에이전트가 느리고 과부하된 Overpass 요청을 진단하고 Daymark의 바운디드 타임아웃(bounded timeout) 및 재시도 동작을 개선하는 데 도움을 주었습니다. 이 변경 사항은 17개 테스트와 프로덕션 빌드를 모두 통과했습니다.**
Daymark는 대용량 초기 다운로드와 하드웨어 요구사항을 감수하고 로컬 다이어리 추론(local diary inference) 및 호스팅된 AI로 전송되는 적은 양의 개인 데이터를 사용합니다. 이것이 제가 탐구하고자 했던 트레이드오프입니다: 하루를 더 쉽게 기억하도록 돕는 AI 도구를 제공한 다음, 그 하루와 사용자에게 화면을 돌려주는 것입니다.
데모 비디오 시청