본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 8장: 온디바이스 AI 애플리케이션 패턴
2026년 3월 11일·AI / ML·

8장: 온디바이스 AI 애플리케이션 패턴

온디바이스 AI를 활용한 실전 애플리케이션 설계 패턴 — 하이브리드 추론, 오프라인 우선, 프라이버시 보존, 개인화 학습, 그리고 에지-클라우드 협업을 다룹니다.

13분452자8개 섹션
llmperformancemlops
공유
on-device-ai8 / 10
12345678910
이전7장: 엣지 하드웨어와 전용 가속기다음9장: 성능 벤치마킹과 최적화

들어가며

이전 7장에서는 에지 하드웨어의 특성과 선택 기준을 살펴보았습니다. 하드웨어를 결정했다면 이제 그 위에서 동작할 애플리케이션을 어떻게 설계할 것인지가 핵심 과제입니다. 온디바이스 AI 애플리케이션은 클라우드 기반 서비스와 근본적으로 다른 제약 조건 아래에서 동작합니다. 제한된 메모리, 불안정한 네트워크, 사용자 프라이버시 요구사항이 모두 설계에 반영되어야 합니다.

이번 장에서는 실전에서 검증된 다섯 가지 핵심 설계 패턴을 다룹니다. 하이브리드 추론, 오프라인 우선, 프라이버시 보존, 온디바이스 RAG, 그리고 개인화 학습입니다.

패턴 1: 하이브리드 추론

하이브리드 추론(Hybrid Inference)은 요청의 복잡도에 따라 로컬 모델과 클라우드 모델을 자동으로 전환하는 패턴입니다. 단순한 질문은 디바이스에서 처리하고, 복잡한 추론이 필요한 질문은 클라우드로 라우팅합니다.

이 패턴의 핵심은 라우팅 판단 로직입니다. 입력 토큰 수, 예상 출력 길이, 태스크 유형 등을 기준으로 판단합니다.

hybrid_router.py
python
from dataclasses import dataclass
from enum import Enum
import tiktoken
 
 
class InferenceTarget(Enum):
    LOCAL = "local"
    CLOUD = "cloud"
 
 
@dataclass
class RoutingConfig:
    max_local_input_tokens: int = 512
    max_local_complexity: float = 0.6
    simple_task_types: tuple = ("translation", "summary_short", "classification")
 
 
class HybridRouter:
    def __init__(self, config: RoutingConfig | None = None):
        self.config = config or RoutingConfig()
        self.encoder = tiktoken.get_encoding("cl100k_base")
 
    def estimate_complexity(self, prompt: str) -> float:
        """프롬프트의 복잡도를 0.0-1.0 사이로 추정합니다."""
        token_count = len(self.encoder.encode(prompt))
        has_code = "```" in prompt
        has_reasoning = any(kw in prompt for kw in ["왜", "분석", "비교", "설명"])
 
        score = min(token_count / 1024, 1.0) * 0.4
        score += 0.3 if has_code else 0.0
        score += 0.2 if has_reasoning else 0.0
        return min(score, 1.0)
 
    def route(self, prompt: str, task_type: str = "general") -> InferenceTarget:
        """요청을 로컬 또는 클라우드로 라우팅합니다."""
        token_count = len(self.encoder.encode(prompt))
        complexity = self.estimate_complexity(prompt)
 
        if task_type in self.config.simple_task_types:
            return InferenceTarget.LOCAL
 
        if token_count > self.config.max_local_input_tokens:
            return InferenceTarget.CLOUD
 
        if complexity > self.config.max_local_complexity:
            return InferenceTarget.CLOUD
 
        return InferenceTarget.LOCAL
Tip

라우팅 판단 자체를 로컬의 소형 분류 모델에 맡기는 방법도 있습니다. 프롬프트 특성을 기반으로 학습시킨 경량 분류기는 규칙 기반보다 정확한 판단을 내릴 수 있습니다.

패턴 2: 오프라인 우선 AI

오프라인 우선(Offline-First)은 네트워크 연결 없이도 핵심 AI 기능이 완전히 동작하는 패턴입니다. 네트워크는 모델 업데이트나 결과 동기화에만 사용합니다.

이 패턴을 구현하기 위해서는 모델 캐싱과 다운로드 전략이 필수입니다.

model_manager.py
python
import hashlib
from pathlib import Path
from dataclasses import dataclass
 
 
@dataclass
class ModelInfo:
    name: str
    url: str
    size_bytes: int
    checksum_sha256: str
    quantization: str
 
 
class ModelManager:
    def __init__(self, cache_dir: Path):
        self.cache_dir = cache_dir
        self.cache_dir.mkdir(parents=True, exist_ok=True)
 
    def is_cached(self, model: ModelInfo) -> bool:
        """모델이 로컬에 캐싱되어 있는지 확인합니다."""
        model_path = self.cache_dir / model.name
        if not model_path.exists():
            return False
        file_hash = hashlib.sha256(model_path.read_bytes()).hexdigest()
        return file_hash == model.checksum_sha256
 
    def get_model_path(self, model: ModelInfo) -> Path | None:
        """캐싱된 모델의 경로를 반환합니다."""
        if self.is_cached(model):
            return self.cache_dir / model.name
        return None
 
    def available_space_bytes(self) -> int:
        """사용 가능한 디스크 공간을 반환합니다."""
        import shutil
        return shutil.disk_usage(self.cache_dir).free

오프라인 우선 패턴에서는 모델 파일의 무결성 검증이 특히 중요합니다. 불완전하게 다운로드된 모델은 추론 시 예측 불가능한 오류를 발생시킬 수 있으므로, 체크섬 검증을 반드시 수행해야 합니다.

패턴 3: 프라이버시 보존

프라이버시 보존(Privacy-Preserving)은 사용자 데이터가 디바이스 밖으로 절대 전송되지 않는 패턴입니다. 의료 기록, 법률 문서, 개인 일기 등 민감한 데이터를 다루는 애플리케이션에 적합합니다.

이 패턴의 원칙은 단순합니다.

  • 모든 추론은 로컬에서 수행합니다
  • 임베딩 생성과 벡터 검색도 로컬에서 수행합니다
  • 네트워크 호출은 모델 다운로드 시에만 허용합니다
  • 텔레메트리 데이터에도 사용자 입력을 포함하지 않습니다
Warning

하이브리드 추론 패턴과 프라이버시 보존 패턴은 근본적으로 상충합니다. 프라이버시가 최우선인 경우, 성능이 다소 떨어지더라도 모든 처리를 로컬로 제한해야 합니다. 두 패턴을 혼합할 때는 사용자에게 클라우드 전송 여부를 명시적으로 안내하고 동의를 받아야 합니다.

패턴 4: 온디바이스 RAG

온디바이스 RAG(Retrieval-Augmented Generation)는 로컬 벡터 데이터베이스와 로컬 LLM을 결합하여 문서 기반 질의응답을 수행하는 패턴입니다. 클라우드 RAG와 동일한 아키텍처를 디바이스 안에서 구현합니다.

구성 요소는 다음과 같습니다.

  • 로컬 임베딩 모델: all-MiniLM-L6-v2 또는 nomic-embed-text 등 경량 모델
  • 로컬 벡터 DB: ChromaDB, LanceDB, SQLite-vss 등
  • 로컬 LLM: llama.cpp 기반 양자화 모델
local_rag.py
python
import chromadb
from chromadb.config import Settings
 
 
def build_local_rag_index(
    documents: list[str],
    collection_name: str = "local_docs",
    persist_dir: str = "./chroma_db",
) -> chromadb.Collection:
    """로컬 벡터 인덱스를 구축합니다."""
    client = chromadb.PersistentClient(
        path=persist_dir,
        settings=Settings(anonymized_telemetry=False),
    )
    collection = client.get_or_create_collection(
        name=collection_name,
        metadata={"hnsw:space": "cosine"},
    )
    for i, doc in enumerate(documents):
        collection.add(
            documents=[doc],
            ids=[f"doc_{i}"],
        )
    return collection
 
 
def query_local_rag(
    collection: chromadb.Collection,
    query: str,
    n_results: int = 3,
) -> list[str]:
    """로컬 벡터 DB에서 관련 문서를 검색합니다."""
    results = collection.query(
        query_texts=[query],
        n_results=n_results,
    )
    return results["documents"][0]

온디바이스 RAG는 문서 수가 수천 건 이하일 때 가장 효과적입니다. 대규모 문서 컬렉션에서는 임베딩 생성 시간과 검색 지연이 크게 증가하므로, 문서를 주제별로 분할하여 별도의 컬렉션으로 관리하는 것이 좋습니다.

패턴 5: 투기적 디코딩과 개인화

투기적 디코딩(Speculative Decoding)은 소형 드래프트 모델이 먼저 토큰을 생성하고, 대형 검증 모델이 이를 병렬로 확인하는 기법입니다. 드래프트 모델의 예측이 맞으면 여러 토큰을 한 번에 수용하므로 전체 생성 속도가 향상됩니다.

온디바이스 환경에서는 0.5B 모델을 드래프트로, 7B 모델을 검증기로 사용하는 구성이 일반적입니다. llama.cpp에서는 --draft 플래그로 이를 지원합니다.

개인화 학습(Personalization)은 사용자의 사용 패턴에 따라 모델을 점진적으로 적응시키는 패턴입니다. 전체 파인튜닝이 아닌 LoRA 어댑터를 활용하여 소량의 추가 파라미터만 학습합니다.

llama-server-speculative.sh
bash
# 투기적 디코딩을 활성화한 llama.cpp 서버 실행
./llama-server \
  --model models/llama-3.2-7b-q4_k_m.gguf \
  --model-draft models/llama-3.2-0.5b-q8_0.gguf \
  --draft-max 8 \
  --draft-min 2 \
  --gpu-layers 99 \
  --ctx-size 4096 \
  --port 8080

주요 활용 사례

이러한 패턴들을 조합하면 다양한 실전 애플리케이션을 구축할 수 있습니다.

활용 사례적용 패턴설명
개인 비서하이브리드 + 개인화단순 일정 관리는 로컬, 복잡한 계획은 클라우드
문서 분석오프라인 우선 + RAG기밀 문서를 디바이스 안에서만 처리
실시간 번역오프라인 우선네트워크 없는 환경에서도 번역 가능
코드 완성하이브리드 + 투기적 디코딩빠른 자동완성은 로컬, 복잡한 생성은 클라우드
Info

단일 패턴만으로는 실전 요구사항을 충족하기 어렵습니다. 대부분의 프로덕션 애플리케이션은 두 가지 이상의 패턴을 조합합니다. 예를 들어, 코드 에디터의 AI 보조 기능은 하이브리드 추론과 투기적 디코딩을 함께 사용하여 빠른 응답과 높은 품질을 동시에 달성합니다.

마무리

이번 장에서는 온디바이스 AI 애플리케이션을 설계할 때 활용할 수 있는 다섯 가지 핵심 패턴을 살펴보았습니다. 하이브리드 추론은 성능과 비용의 균형을 잡아주고, 오프라인 우선은 네트워크 독립성을 보장하며, 프라이버시 보존은 민감 데이터를 안전하게 처리합니다. 온디바이스 RAG는 로컬 문서 검색을 가능하게 하고, 투기적 디코딩과 개인화는 사용자 경험을 한 단계 끌어올립니다.

다음 9장에서는 이러한 패턴들로 구축한 시스템의 성능을 어떻게 측정하고 최적화하는지, 벤치마킹 방법론과 최적화 기법을 다룹니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#llm#performance#mlops

관련 글

AI / ML

9장: 성능 벤치마킹과 최적화

온디바이스 AI 시스템의 성능 벤치마킹 방법론, 핵심 지표, 하드웨어별 성능 비교, 그리고 토큰 처리량과 메모리 사용을 최적화하는 기법을 다룹니다.

2026년 3월 13일·13분
AI / ML

7장: 엣지 하드웨어와 전용 가속기

온디바이스 AI를 위한 하드웨어 가속기 — Apple Neural Engine, Qualcomm NPU, NVIDIA Jetson, Intel NPU의 아키텍처와 성능 특성을 비교합니다.

2026년 3월 9일·15분
AI / ML

10장: 실전 프로젝트 — 온디바이스 AI 시스템 구축

시리즈 전체의 기법을 종합하여 프라이버시 보존 문서 분석 시스템을 구축합니다. 로컬 LLM, 로컬 임베딩, 로컬 벡터 DB로 완전한 오프라인 AI를 실현합니다.

2026년 3월 15일·15분
이전 글7장: 엣지 하드웨어와 전용 가속기
다음 글9장: 성능 벤치마킹과 최적화

댓글

목차

약 13분 남음
  • 들어가며
  • 패턴 1: 하이브리드 추론
  • 패턴 2: 오프라인 우선 AI
  • 패턴 3: 프라이버시 보존
  • 패턴 4: 온디바이스 RAG
  • 패턴 5: 투기적 디코딩과 개인화
  • 주요 활용 사례
  • 마무리