내가 어떻게 우연히 로컬 AI 글쓰기 앱을 만들게 되었나
요약
단순한 로컬 문법 검사기에서 시작하여 15가지 AI 기능을 갖춘 온디바이스 글쓰기 어시스턴트 'Lexicon'으로 발전시킨 개발 과정을 다룹니다. 양자화된 소형 모델(1B-3B)을 활용해 클라우드 연결 없이 로컬에서 작동하는 기술적 구현 방식을 소개합니다.
핵심 포인트
- LanguageTool을 활용한 규칙 기반의 오프라인 문법 검사 구현
- llama.cpp 및 양자화된 모델을 통한 온디바이스 AI 기능 제공
- 1B-3B 소형 모델의 성능 극대화를 위한 엄격한 프롬프트 엔지니어링
- Ollama 자동 감지 및 자체 런타임 번들링을 통한 사용자 편의성 확보
나는 AI 플랫폼을 만들 의도가 전혀 없었습니다. 정말로, 모든 것은 훨씬 더 단순하게 시작되었습니다. 아주 작지만 짜증 나는 가려움증 같은 것에서 시작되었습니다. 나는 그저 내 초안을 클라우드 서버로 보내거나 매달 비용을 지불할 필요 없이, 로컬에서 실행되는 간단한 문법 및 철자 검사기(Grammar and spellcheck)가 필요했을 뿐입니다.
이것은 나의 첫 번째 시도조차 아니었습니다. 사실, 나는 이미 정확히 이 전제로 두 번이나 시도했다가 포기한 적이 있었습니다.
솔직히 말해서, 이 작업에 대한 나의 처음 두 번의 시도는... 꽤 부족했습니다:
- 시도 1: 기본적인 문자열 검사 이상의 기능은 거의 수행하지 못하는 기본적인 단일 파일 Python 스크립트 (Grammar Checker.py)
- 시도 2: TextBlob을 사용한 가벼운 grammar_checker.py 스크립트 — 이전보다 나았지만, 여전히 매우 제한적이고 취약하며 터미널 환경(Terminal harness) 안에 갇혀 있었습니다.
첫 번째 초기 프로토타입들을 폐기한 후, 나는 한 번 더 시도해 보는 게 좋겠다고 생각했습니다. 나는 제대로 된 React + TipTap 프론트엔드를 빠르게 만들어냈고, 로컬 LanguageTool 엔진을 연결했으며, 이번에는 나의 오프라인 요구 사항에 맞게 잘 작동하도록 만들었습니다.
내 컴퓨터에서 빠른 로컬 파이프라인(Local pipeline)을 실행하게 되자, 나는 '여기서 왜 멈춰야 하지?'라는 생각도 들었습니다. 텍스트 변환(Text transformation)은 명백한 다음 단계였습니다.
겸손한 문법 검사기로 시작했던 것이 우연히 Lexicon으로 진화했습니다. 이는 양자화된 로컬 모델(Quantized local models)을 통해 완전히 기기 내부(On-device)에서 실행되는 15가지 AI 도구를 갖춘 본격적인 로컬 우선(Local-first) 글쓰기 어시스턴트입니다.
현재 이 앱이 무엇을 하는지, 그리고 이를 단일 네이티브 설치 프로그램(Native installer)으로 출시하기 위해 해결해야 했던 기술적 지뢰들에 대해 소개하겠습니다.
현재 기능
- 100% 오프라인 문법 및 맞춤법 검사 (Grammar & Spellcheck): LanguageTool을 기반으로 한 빠르고 규칙 기반(rule-based)인 검사 기능 (단순 오타에 대해 LLM의 지연 시간(latency)이나 비결정론적 환각(non-deterministic hallucinations)이 발생하지 않음).
- 15가지 온디바이스 (On-Device) AI 도구: 문장 재작성(Rewrite), 간결하게(Concise), 9가지의 다양한 어조 조정(학술적, 캐주얼, 전문적 등), 요약(Summaries), 핵심 포인트(Key Points), 리스트(Lists), 표(Tables) — 이 모든 기능이 사용자의 기기에서 직접 실행되는 작은 양자화된 모델(
llama.cpp)을 통해 작동합니다. - 클라우드 호출 제로 (Zero Cloud Calls): 계정 생성도, 구독도 필요 없으며, 어떤 텍스트도 기기를 벗어나지 않습니다.
- Ollama 자동 감지: 이미 로컬에서 Ollama 서버를 실행 중이라면, Lexicon이 이를 자동으로 감지하여 연결합니다. 그렇지 않은 경우 자체적으로 번들링된 런타임(runtime)을 사용합니다.
1B–3B 로컬 모델을 위한 프롬프트 엔지니어링 (Prompt Engineering)
작은 양자화된 로컬 모델(저는 1B–3B 파라미터 범위의 Qwen 2.5 GGUF 양자화 모델을 사용 중입니다)은 프론티어 모델(frontier models)보다 훨씬 더 명시적인 프롬프트가 필요합니다.
- 엄격한 형식 보장 (Strict Formatting Guarantees):
변환된 텍스트만 출력하세요. 서문, 따옴표 또는 소개 문구를 포함하지 마세요.와 같은 명시적인 지침이 없으면, 작은 모델들은 출력 결과에 공손한 잡담("재작성된 문장은 다음과 같습니다:")을 덧붙이는 것을 매우 좋아합니다. - 행동 기반 vs 형용사 기반 프롬프팅 (Behavioral vs. Adjective Prompting): 단순히 형용사를 바꾸는 것(
"이 문장을 [격식 있는/학술적인] 어조로 재작성하세요")만으로는 어조 출력 결과가 서로 모호하게 섞이게 됩니다. 작은 모델에는 축약어를 풀어서 쓰고, 문장 길이를 줄이거나, 수동태로 전환하라고 명시적으로 지시하는 것과 같은 구체적인 구문 규칙(syntactic rules)이 필요합니다.
현재 상태 및 오픈 소스
세 번의 시도 끝에 드디어 성공했습니다! Lexicon은 오픈 소스(MIT 라이선스)이며, Windows(.exe) 및 macOS(Intel + Apple Silicon용 .dmg)용 설치 프로그램을 사용할 수 있습니다.
GitHub 저장소: github.com/AashishH15/Lexicon
여러분의 피드백을 기다립니다!
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기