메뉴
HN
Hacker News 20일 전

온디바이스 로컬 AI가 표준이 되어야 하는 이유

IMP
8/10
핵심 요약

최근 소프트웨어 개발에서 단순히 클라우드 기반 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만 자 단위)로 나누고, 각 청크에 대해 핵심적인 '팩트만' 있는 메모를 생성한 다음, 두 번째 패스를 실행하여 이를 하나의 최종 요약으로 결합할 수 있습니다. 이것이 바로 로컬 모델이 완벽하게 적합한 작업 유형입니다. 입력 데이터는 이미 기기에 존재합니다(사용자가 읽고 있기 때문입니다). 출력 데이터는 가볍습니다. 무엇보다 빠르고 프라이버시가 보장됩니다.

원문 보기
원문 보기 (영어)
About Posts unix.foo About Posts Menu Local AI Needs to be the Norm . One of the current trends in modern software is for developers to slap an API call to OpenAI or Anthropic for features within their app. Reasonable people can quibble with whether those features are actually bringing value to users, but what I want to discuss is the fundamental concept of taking on a dependency to a cloud hosted AI model for applications. This laziness is creating a generation of software that is fragile, invades your privacy, and fundamentally broken. We are building applications that stop working the moment the server crashes or a credit card expires. We need to return to a habit of building software where our local devices do the work. The silicon in our pocket is mind bogglingly faster than what was available a decade ago. It has a dedicated Neural Engine sitting there, mostly idle, while we wait for a JSON response from a server farm in Virginia. That’s ridiculous. Even if your intentions are pure, the moment you stream user content to a third party AI provider, you’ve changed the nature of your product. You now have data retention questions and all the baggage that comes with that (consent, audit, breach, government request, training, etc.) On top of that you also substantially complicated your stack because your feature now depends on network conditions, external vendor uptime, rate limits, account billing, and your own backend health. Congratulations! You took a UX feature and turned it into a distributed system that costs you money. If the feature can be done locally, opting into this mess is self inflicted damage. “AI everywhere” is not the goal. Useful software is the goal. Concrete Example: Brutalist Report’s On-Device Summaries Years ago I launched a fun side project named The Brutalist Report , a news aggregator service inspired by the 1990s style web. Recently, I decided to build a native iOS client for it with the design goal of ensuring it would remain a high-density news reading experience. Headlines in a stark list, a reader mode that strips the cancer that has overtaken the web, and (optionally) an “intelligence” view that generates a summary of the article. Here’s the key point though: the summary is generated on-device using Apple’s local model APIs. No server detours. No prompt or user logs. No vendor account. No “we store your content for 30 days” footnotes needed. It has become so normal for folks that any AI use is happening server-side. We have a lot of work to do to turn this around as an industry. It’s not lost on me that sometimes the use-cases you have will demand the intelligence that only a cloud hosted model can provide, but that’s not the case with every use-case you’re trying to solve. We need to be thoughtful here. Available Tooling I can only speak on the tooling available within the Apple ecosystem since that’s what I focused initial development efforts on. In the last year, Apple has invested heavily here to allow developers to make use of a built-in local AI model easily. The core flow looks roughly like this: 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 And for longer content, we can chunk the plain text (around 10k characters per chunk), produce concise “facts only” notes per chunk, then runs a second pass to combine them into a final summary. This is the kind of work local models are perfect for. The input data is already on the device (because the user is reading it). The output is lightweight. It’s fast and private. It’s okay if it’s not a superhuman PhD level intelligence because it’s summarizing the page you just loaded , not inventing world knowledge. Local AI shines when the model’s job is transforming user-owned data, not acting as a search engine for the universe. There are plenty of AI features that people want but don’t trust . Summarizing emails, extract action items from notes, categorize this document, etc. The usual cloud approach turns every one of those into a trust exercise. “Please send your data to our servers. We promise to be cool about it.” Local AI changes that. Your device already has the data. We’ll do the work right here. You don’t build trust with your users by writing a 2,000 word privacy policy. You build trust by not needing one to begin with. The tooling available on the platform goes even further. One of the best moves Apple has made recently is pushing “AI output” away from unstructured blobs of text and toward typed data . Instead of “ask the model for JSON and pray”, the newer and better pattern is to define a Swift struct that represents the thing you want. Give the model guidance for each field in natural language. Ask the model to generate an instance of that type. That’s it. Conceptually, it looks like this: import FoundationModels @ Generable struct ArticleIntel { @ Guide ( description : "One sentence. No hype." ) var tldr : String @ Guide ( description : "3–7 bullets. Facts only." ) var bullets : [ String ] @ Guide ( description : "Comma-separated keywords." ) var keywords : [ String ] } let session = LanguageModelSession () let response = try await session . respond ( to : "Extract structured notes from the article." , generating : ArticleIntel . self ) { articleText } let intel = response . content Now your UI doesn’t have to scrape bullet points out of Markdown or hope the model remembered your JSON schema. You get a real type with real fields, and you can render it consistently. It produces structured output your app can actually use. And it’s all running locally! This isn’t just nicer ergonomics. It’s an engineering improvement. And if you’re building a local first app, this is the difference between “AI as novelty” and “AI as a trustworthy subsystem”. “But Local Models Aren’t As Smart” Correct. But also so what? Most app features don’t need a model that can write Shakespeare, explain quantum mechanics, and pass the bar exam. They need a model that can do one of these reliably: summarize, classify, extract, rewrite, or normalize. And for those tasks, local models can be truly excellent. If you try to use a local model as a replacement for the entire internet, you will be disappointed. If you use it as a “data transformer” sitting inside your app, you’ll wonder why you ever sent this stuff to a server. Use cloud models only when they’re genuinely necessary. Keep the user’s data where it belongs. And when you do use AI, don’t just glue it as a chat box. Use it as a real subsystem with typed outputs and predictable behavior. Stop shipping distributed systems when you meant to ship a feature.