2026년 10월 31일 (토)

PINKSKY NEWS

매일의 기록을 뉴스처럼

테크

Ollama로 완전 로컬 Mac 앱 개발(받아쓰기·회의록·RAG): Gemma 4 e2b vs 26b 실측 수치와 교훈, 오픈소스 공개

원문 제목 — Built a fully local Mac app on Ollama (dictation, meeting notes, RAG): numbers and lessons from Gemma 4 e2b vs 26b, open source

📄 전문 번역

기기를 벗어나는 데이터가 없는 상태에서 받아쓰기, 회의록, '내 작업에 무엇이든 질문' 기능을 수행하는 Mac 앱을 개발했다. DevPlus를 통해 무료 오픈소스(GPL-3.0)로 공개했으며 링크는 하단에 있다. 로컬 구성 요소가 마침내 즉각적으로 느껴질 만큼 빨라졌기에 스택과 수치를 공유한다.

스택은 다음과 같다. 음성 인식은 NVIDIA Parakeet TDT 0.6B v3를 FluidAudio로 구동하고 Core ML로 컴파일해 Neural Engine에서 실행하며, 영어 전용으로는 v2를 쓴다. 다른 언어는 WhisperKit 기반 Whisper large-v3-turbo를 사용한다. 정리, 회의록, 답변, 추출은 Ollama의 Gemma 4가 담당하며 RAM에 따라 8GB는 e2b-it-qat(다운로드 4.3GB), 16GB는 e4b-it-qat, 24GB부터는 12b, 48GB부터는 26b(18.6GB)를 선택한다. OpenAI 호환 서버라면 무엇이든 대체할 수 있다. 검색은 SQLite로, BM25를 적용한 FTS5와 EmbeddingGemma 벡터를 상호 순위 융합(k=60)으로 병합하고 상위 8개 구절을 모델이 인용해야 하는 번호 매긴 출처로 전달한다. 그래프 구축에서는 모델이 temperature 0에서 사람, 회사, 프로젝트, 주제와 그 관계를 엄격한 JSON으로 추출한다.

수치는 M5 Max 128GB에서 모델을 미리 로드한 상태로 측정했다. Parakeet v3는 9.8초 길이 문장을 약 100ms에 전사한다. 받아쓴 문장 하나 정리는 gemma4:e2b-it-qat에서 100~430ms, gemma4:26b에서 250~900ms가 걸린다. 로드 후 첫 호출은 0.4초 대 8.7초였다. 쿼리 임베딩을 포함한 하이브리드 검색은 60~90ms다. 출처 8개를 인용하는 답변 생성은 e2b에서 2~2.5초, 26b에서 2.5~7초 걸린다. 최상위 Mac 기준 측정이라 기본 M1/M2 사용자의 수치도 보고 싶다고 밝혔다.

과정에서 배운 교훈도 소개했다. 소형 모델은 필러 제거는 잘하지만 긴 자기 교정은 놓친다. 'let's meet at two actually three'는 두 모델 모두 'three'로 출력했지만, 'I'll send you the checklist by Friday, actually make that Thursday afternoon'은 e2b가 그대로 반환한 반면 26b는 'by Thursday afternoon'으로 바로잡았다. 해결책은 더 큰 모델이 아니었다. 요일, 시간, 숫자, 월을 바꾸는 교정 표현('actually', 'make that', 'no wait', 'I mean')은 모델이 텍스트를 보기 전 작은 결정론적 패스로 처리하고 프롬프트의 몇 가지 예시가 나머지를 커버한다. 이제 e2b도 정확히 처리하고 26b는 'Actually'로 시작하는 새 문장을 교정으로 오인하지 않는다.

정리 모델은 받아쓴 질문을 전사하지 않고 답변하려는 경향이 있어, 출력을 실제 발화와 길이·이탈도로 비교해 말하지 않은 단어를 붙여넣는 대신 규칙 기반 정리로 폴백하는 가드를 만들었다. 시스템 프롬프트를 바이트 단위로 고정해 Ollama가 캐시된 프리픽스를 재사용하게 하고, 변하는 요소(현재 앱, 사용자 어휘)는 그 뒤에 배치한다. 날짜는 모델에 맡기지 않고 모델은 약속 문구만 추출한 뒤 결정론적 파서가 'Friday', 'EOD', 'in 2 days'를 날짜로 변환하는데, 소형 모델은 시간을 끊임없이 지어냈다고 한다. 상호 순위 융합은 BM25와 코사인 점수를 한 척도로 맞추는 시도보다 간단하고 나았으며, 소형 모델의 반복 출력은 루프 가드가 생성을 중단하고 salvage 파서가 잘 형성된 JSON 객체를 보존한다. 마지막으로 자기 교정을 존중하는 전사 정리에 가장 좋은 8GB 미만 소형 모델과 엄격한 JSON 개체 추출에 적합한 모델을 묻는 두 가지 질문을 던졌으며, 코드는 GitHub의 binders-io/app 저장소에서 확인할 수 있다.

💬 주요 댓글 번역 (4)

1 익명

실제 수치를 보니 좋다. 여기 게시물 대부분은 타이밍 없이 그냥 '작동한다'는 수준이다. SQLite를 이용한 하이브리드 검색이 흥미롭다. 모든 것을 벡터 DB에 던져넣고 잘되길 바라는 대신 이 방식을 시도해볼 생각이었다. 소형 모델이 날짜를 지어낸다는 지적에 웃음이 났는데 지난달에 같은 문제를 겪었고 마감일을 아무 근거 없이 만들어내곤 했다. 8GB 미만 전사 정리 모델 질문에는 몇 가지를 시도해봤는데 Mistral Small 22b가 'no wait' 같은 교정을 존중하는 데 꽤 괜찮았다. 다만 프롬프트에 몇 가지 예시를 줘야 한다.

2 hfeixas

감사하다. 그렇다, 실제 타이밍을 원했다. 실측 없이는 빠르다는 말이 의미가 없다. 하이브리드 검색에 대해 개인 규모에서는 벡터 DB가 정말 필요 없다. 키워드는 FTS5로 유지하고 임베딩은 정규화된 블롭으로 일반 SQLite 테이블에 저장해 메모리에 로드한 뒤 브루트 포스로 비교한다. 그런 다음 각 쪽에서 상위 40개를 가져와 RRF(k=60)로 병합한다. 날짜 문제는 모델에 마감일을 쓰인 그대로('Friday', 'EOD', 'next week') 요청하고 실제 날짜는 절대 요청하지 않는 것으로 해결됐다. 나머지는 단순한 파서가 처리한다. 캐시 트릭 관련해서는 사전이 단어를 추가할 때만 바뀐다.

3 익명

좋다. 영어 외 다른 언어에 Whisper large-v3-turbo를 유지한 점이 마음에 든다. Parakeet이 네덜란드어를 전사할 때 술 취한 뱃사꾼처럼 환각을 일으키는 걸 봤다. 지금은 이 용도로 MacWhisper Pro를 쓰지만 나중에 이 앱도 시도해볼 수 있다.

4 hfeixas

'술 취한 뱃사꾼'은 표현이 참 잘됐다. 이 앱에서는 설정 > 받아쓰기 > 음성 인식에서 Whisper large-v3-turbo로 전환하고 자동 감지 대신 언어를 고정 설정해 추측할 필요가 없게 할 수 있다. Parakeet보다 느리지만 일은 해낸다. MacWhisper는 훌륭하다. 특히 파일 전사에서 그렇다. 이 앱은 조금 방향이 다르다. 현재 사용 중인 앱으로 바로 받아쓰기, 회의록, 그리고 검색과 질문이 가능한 메모리 지식 베이스를 제공한다. 시도해본다면 네덜란드어를 얼마나 잘 처리하는지 듣고 싶다. 네덜란드어 이름과 다른 전문 용어도 사전에 추가할 수 있다.

🔍 루키 분석

개발자가 받아쓰기, 회의록, 개인 지식 검색을 전부 로컬에서 처리하는 Mac 앱을 GPL-3.0 라이선스로 오픈소스 공개했다. 음성 인식에는 NVIDIA Parakeet TDT 0.6B v3와 Whisper large-v3-turbo를, 텍스트 처리에는 RAM 크기에 따라 Gemma 4 e2b부터 26b까지 선택해 Ollama로 구동하며, SQLite FTS5와 EmbeddingGemma 벡터를 상호 순위 융합으로 결합한 하이브리드 검색을 사용한다. M5 Max 128GB 기준 9.8초 문장 전사가 약 100ms, 출처 8개를 인용한 답변 생성은 e2b에서 2~2.5초로 측정됐다. 소형 모델의 자기 교정 누락, 날짜 조작, 반복 출력 문제를 결정론적 전처리와 가드 로직으로 보완한 점이 핵심 교훈으로 소개됐다.

— 루키 · glm-5.3-flash:cloud