온디바이스 로컬 AI가 표준이 되어야 하는 이유
최근 소프트웨어 개발에서 단순히 클라우드 기반 AI API를 호출하는 방식은 앱의 안정성을 떨어뜨리고 개인정보 침해 우려를 키웁니다. 이에 개발자는 성능이 충분한 로컬 기기의 내장 AI 모델을 활용해 온디바이스에서 직접 기능을 수행해야 한다고 강조합니다. Apple 생태계를 예시로 든 이 글은, 구현 가능한 경우 로컬 AI를 우선 채택하는 것이 개발자와 사용자 모두에게 현명한 접근임을 시사합니다.
현대 소프트웨어의 최신 트렌드 중 하나는 앱 내 기능을 구현하기 위해 개발자들이 OpenAI나 Anthropic API 호출을 무심코 추가하는 것입니다. 이러한 기능이 사용자에게 진정한 가치를 제공하는지에 대해서는 합리적인 사람들 사이에서도 의견이 엇갈릴 수 있지만, 제가 논하고 싶은 것은 애플리케이션에 클라우드 호스팅 AI 모델이라는 의존성을 떠안는다는 근본적인 개념 그 자체입니다. 이러한 편의주의적 태도는 취약하고 개인정보를 침해하며 구조적으로 결함이 있는 소프트웨어 세대를 만들어내고 있습니다. 우리는 서버가 다운되거나 신용카드가 만료되는 순간 작동이 멈춰버리는 애플리케이션을 만들고 있습니다. 우리는 우리의 로컬 기기가 직접 작업을 수행하는 소프트웨어를 구축하는 습관으로 돌아가야 합니다.
우리 주머니 속에 있는 실리콘 칩은 불과 10년 전에 사용할 수 있었던 것보다 믿을 수 없을 정도로 빠릅니다. 기기에는 전용 뉴럴 엔진(Neural Engine)이 내장되어 있지만, 버지니아주에 있는 서버 팜에서 JSON 응답을 기다리는 동안 대부분 유휴 상태로 방치되고 있습니다. 이는 정말 말도 안 되는 일입니다. 개발자의 의도가 순수하더라도, 사용자 콘텐츠를 서드파티 AI 제공업체로 스트리밍하는 순간 제품의 근본적인 성격이 달라집니다. 이내 데이터 보존 문제와 그에 수반되는 모든 번거로움(동의, 감사, 유출, 정부 요청, 모델 학습 등)을 떠안게 됩니다.
그뿐만 아니라 스택도 상당히 복잡해집니다. 왜냐하면 이제 여러분의 기능이 네트워크 상태, 외부 벤더의 가동 시간, 속도 제한, 계정 결제 상태, 그리고 자체 백엔드의 상태에 종속되기 때문입니다. 축하합니다! 멋진 UX 기능 하나를 돈이 들어가는 분산 시스템으로 바꿔놓으셨군요. 해당 기능을 로컬에서 처리할 수 있다면, 이런 혼란을 자초하는 것은 자해나 다름없습니다. "어디에나 AI를 넣는 것"은 목표가 아닙니다. '유용한 소프트웨어'를 만드는 것이 목표입니다.
구체적인 예시: Brutalist Report의 온디바이스 요약 몇 년 전 저는 1990년대 웹 스타일에서 영감을 받은 뉴스 애그리게이터 서비스인 'The Brutalist Report'라는 재미있는 사이드 프로젝트를 출시했습니다. 최근에는 고밀도 뉴스 리딩 경험을 유지한다는 설계 목표로 이를 위한 네이티브 iOS 클라이언트를 구축하기로 결정했습니다. 단순하고 강렬한 헤드라인 목록, 웹을 뒤덮은 광고와 같은 암적인 요소를 모두 제거하는 리더 모드, 그리고 (선택적으로) 기사 요약을 생성하는 '인텔리전스' 뷰가 포함되어 있습니다.
하지만 여기서 핵심은 요약이 Apple의 로컬 모델 API를 사용하여 기기 자체에서 생성된다는 것입니다. 서버를 거치지 않습니다. 프롬프트나 사용자 로그도 없습니다. 벤더 계정도 필요 없으며, "고객님의 콘텐츠를 30일 동안 보관합니다"라는 각주도 필요하지 않습니다. 현재 AI 사용이 서버 측에서 이루어지는 것이 사람들에게 너무나 당연하게 받아들여지고 있습니다. 우리 산업계가 이러한 패러다임을 바꾸려면 아직 해야 할 일이 너무 많습니다. 경우에 따라 클라우드 호스팅 모델만이 제공할 수 있는 지능이 필요한 사용 사례가 있다는 점을 저도 잘 알고 있습니다. 하지만 여러분이 해결하려는 모든 사용 사례가 그런 것은 아닙니다. 우리는 여기서 신중하게 접근해야 합니다.
사용 가능한 개발 도구 저는 초기 개발 노력을 집중했던 Apple 생태계 내에서 사용 가능한 도구에 대해서만 이야기할 수 있습니다. 지난 1년 동안 Apple은 개발자가 내장된 로컬 AI 모델을 쉽게 사용할 수 있도록 이 분야에 많은 투자를 했습니다. 핵심 흐름은 대략 다음과 같습니다.
import FoundationModels let model = SystemLanguageModel.default guard model.availability == .available else { return } let session = LanguageModelSession { """ Provide a brutalist, information-dense summary in Markdown format. - Use bold for key concepts. - Use bullet points for facts. - No fluff. Just facts. """ } let response = try await session.respond(options: .init(maximumResponseTokens: 1_000)) { articleText } let markdown = response.content
더 긴 콘텐츠의 경우 일반 텍스트를 청크(약 1만 자 단위)로 나누고, 각 청크에 대해 핵심적인 '팩트만' 있는 메모를 생성한 다음, 두 번째 패스를 실행하여 이를 하나의 최종 요약으로 결합할 수 있습니다. 이것이 바로 로컬 모델이 완벽하게 적합한 작업 유형입니다. 입력 데이터는 이미 기기에 존재합니다(사용자가 읽고 있기 때문입니다). 출력 데이터는 가볍습니다. 무엇보다 빠르고 프라이버시가 보장됩니다.